update twig, some cleanup/docu, update ordermail example for MIME
authorKonrad Rosenbaum <konrad@silmor.de>
Fri, 8 Jul 2016 20:06:50 +0000 (22:06 +0200)
committerKonrad Rosenbaum <konrad@silmor.de>
Fri, 8 Jul 2016 20:06:50 +0000 (22:06 +0200)
twig
www/inc/classes/basevars.php
www/inc/rendering/order_listing.php [deleted file]
www/inc/rendering/twig_extensions.php
www/index.php
www/template/en/ordermail.txt

diff --git a/twig b/twig
index 27f3428..42f758d 160000 (submodule)
--- a/twig
+++ b/twig
@@ -1 +1 @@
-Subproject commit 27f3428b08c7f656d6824359a9d9dee3f5fce31b
+Subproject commit 42f758d9fe2146d1f0470604fc05ee43580873fc
index 23b40ec..385926c 100644 (file)
@@ -110,9 +110,6 @@ public static function initPriv(){
        $basevars['script']['changeInvoiceAddress']=$BaseUrl."?mode=changeInvoiceAddress";
        $basevars['script']['changeDeliveryAddress']=$BaseUrl."?mode=changeDeliveryAddress";
        $basevars['script']['customerResetLogin']=$BaseUrl."?mode=customerResetLogin";
-       //$basevars['script']['orderOverview']=$BaseUrl."?mode=orderOverview";
-       //$basevars['script']['editShippingAddress']=$BaseUrl."?mode=editShippingAddress";
-       //$basevars['script']['editOrderComments']=$BaseUrl."?mode=editOrderComments";
        $basevars['script']['setlanguage']=$BaseUrl."?mode=setlanguage&lang=";
        // form elements
        $basevars['inputnames']['amountTickets']="amountTickets";
diff --git a/www/inc/rendering/order_listing.php b/www/inc/rendering/order_listing.php
deleted file mode 100644 (file)
index ec554fc..0000000
+++ /dev/null
@@ -1,256 +0,0 @@
-<?php
-// (c) Konrad Rosenbaum, 2007-2011
-// (c) Peter Keller, 2007/8
-// protected under the GNU AGPL version 3 or at your option any newer
-// see COPYING.AGPL
-
-
-/** creates the login to an order */
-function createOrderLogin()
-{
-       global $parser;
-       
-       $error = ErrorManager::singleton();
-       
-       // delete last web session
-       $session = new WebSession();
-       $session->destroySession();
-       
-       $localParser = new Parser("orderlogin.html");
-       
-       $localParser->setVar("fieldEMAIL", "ms_email");
-       $localParser->setVar("radioIS_CUSTOMER", "ms_isCustomer");
-       $localParser->setVar("fieldPASSWORD", "ms_password");
-       $localParser->setVar("buttonCONTINUE", "ms_loginContinue");
-       
-       if (!empty($_POST["ms_email"])) {
-               $localParser->setVar("valueEMAIL", $_POST["ms_email"]);
-       } else {
-               $localParser->setVar("valueEMAIL", "");
-       }
-       
-       // set error message
-       if ($error->exists()) {
-               $localParser->setVar("IS_ERROR", "true");
-               $localParser->setVar("ERRORAREA", $error->getAllFormatted());
-       }
-       
-       // create page
-       $parser->setVAR("PAGE", $localParser->parseFile("orderlogin.html"));
-}
-
-/** creates the view to register a new customer */
-function createCustomerRegistration()
-{
-       global $parser;
-       
-       $error = ErrorManager::singleton();
-       
-       $localParser = new Parser("customerregistration.html");
-       
-       $email = "";
-       
-       // check if email is set and is an correct eMail-Address
-       if (isset($_GET["email"]) && isEmail($_GET["email"])) {
-               $email = $_GET["email"];
-               
-               // set new POST-Url
-               $fullUrl = $parser->getVar("FULLURL");
-               $newUrl = substr($fullUrl, 0, (strpos($fullUrl, "&")) - strlen($fullUrl));
-               $localParser->setVar("FULLURL", $newUrl);
-       }
-       
-       // if email not available and no error, then it must be an intrusion
-       if (empty($email) && !$error->exists()) {
-               redirectHome();
-               exit();
-       }
-       
-       // set input fields
-       $localParser->setVar("fieldCUST_EMAIL", "ms_custEmail");
-       $localParser->setVar("fieldCUST_NAME", "ms_custName");
-       $localParser->setVar("fieldCUST_ADDRESS", "ms_custAddress");
-       $localParser->setVar("fieldCUST_CONTACT", "ms_custContact");
-       $localParser->setVar("fieldCUST_PASSWD", "ms_custPasswd");
-       $localParser->setVar("fieldCUST_PASSWD2", "ms_custPasswd2");
-       $localParser->setVar("buttonCUST_REGISTER", "ms_custRegister");
-       
-       // set data
-       if (!$error->exists()) {
-               $localParser->setVar("CUST_EMAIL", $email);
-               $localParser->setVar("CUST_NAME", "");
-               $localParser->setVar("CUST_ADDRESS", "");
-               $localParser->setVar("CUST_CONTACT", "");
-       } else {
-               $localParser->setVar("CUST_EMAIL", $_POST["ms_custEmail"]);
-               $localParser->setVar("CUST_NAME", $_POST["ms_custName"]);
-               $localParser->setVar("CUST_ADDRESS", $_POST["ms_custAddress"]);
-               $localParser->setVar("CUST_CONTACT", $_POST["ms_custContact"]);
-       }
-       
-       // set error message
-       if ($error->exists()) {
-               $localParser->setVar("ERROR", "true");
-               $localParser->setVar("ERRORAREA", $error->getAllFormatted());
-       }
-       
-       // create page
-       $parser->setVAR("PAGE", $localParser->parseFile("customerregistration.html"));
-}
-
-/**creates the overview of an order */
-function createOrderOverview()
-{      
-       global $parser;
-       
-       $error = ErrorManager::singleton();
-       $lang = LanguageManager::singleton();
-
-       $p = new Parser("orderoverview.html");
-       
-       // check if loggedin
-       $session = new WebSession();
-       if (!$session->isAuthorized()) {
-               redirectHome();
-               exit();
-       }
-       
-       // set costumer data
-       $customer = $session->getCustomer();
-       $p->setVars($customer->getParserData());
-       
-       // set cart overview
-       $cart = new Cart($_COOKIE[COOKIE_CART]);
-       if ($cart->isValid()) {
-               // renew cart
-               $cart->renewCart();
-               
-               $shippingAddress = "";
-               $comments = "";
-               
-               if (!isEmpty($shippingAddress = $cart->getShippingAddress()))
-                       $shippingAddress .= " [<a href=index.php?mode=editShippingAddress>".i18n("Change")."</a>]";
-               else
-                       $shippingAddress = "[<a href=index.php?mode=editShippingAddress>".i18n("Add")."</a>]";
-               
-               if (!isEmpty($comments = $cart->getOrderComments()))
-                       $comments .= " [<a href=index.php?mode=editOrderComments>".i18n("Change")."</a>]";
-               else
-                       $comments = "[<a href=index.php?mode=editOrderComments>".i18n("Add")."</a>]";
-               
-               $p->setVar("CUST_SHIPPINGADDRESS", $shippingAddress);
-               $p->setVar("CUST_COMMENTS", $comments);
-       }
-       
-       $tablerows = "";
-       $totalsum = 0;
-       $hiddenfields = "";
-       
-       // get tickets from cart
-       foreach ($cart->getTickets() as $ticket)
-       {
-               $cartRowTmpl = $p->getVar("ROW");
-               $event = $ticket->eventObject();
-               
-               // set event details
-               $p->setVars($event->getParserData());
-               
-               // set amount
-               $p->setVar("AMOUNT", $ticket->getAmount());
-               
-               // set row sum
-               $rowsum = $ticket->getAmount()*$event->getDefaultPrice();
-               $p->setVar("ROWSUM", $lang->getPrice($rowsum));
-               
-               $totalsum += $rowsum;
-               
-               $tablerows .= $p->parse($cartRowTmpl);
-       }
-       
-       // if no tickets in cart set EMPTYROWS and disable order button
-       if (count($cart->getTickets()) == 0) {
-               $tablerows = $p->getVar("EMPTYROWS");
-               $p->setVar("attribDISABLED", "disabled=\"disabled\"");
-       } else {
-               $p->setVar("attribDISABLED", "");
-       }
-       
-       $p->setVar("TABLEROWS", $tablerows);
-       $p->setVar("TOTALSUM", $lang->getPrice($totalsum));
-       
-       // set edit links
-       $p->setVar("linkCHANGE_CART", "index.php?mode=cart&isOrder=true");
-       
-       // set buttons
-       $p->setVar("buttonORDERTICKETS", "ms_orderTickets");    
-       
-       // create page
-       $parser->setVAR("PAGE", $p->parseFile("orderoverview.html"));
-}
-
-/** creates the form to edit the shipping address */
-function editShippingAddress()
-{
-       global $parser;
-       
-       $p = new Parser("editshippingaddress.html");
-       
-       // check if loggedin
-       $session = new WebSession();
-       if (!$session->isAuthorized()) {
-               redirectHome();
-               exit();
-       }
-       
-       // get shipping address
-       $cart = new Cart($_COOKIE[COOKIE_CART]);
-       if ($cart->isValid()) {
-               $p->setVar("SHIPPINGADDRESS", $cart->getShippingAddress());
-       }
-       
-       // set input fields
-       $p->setVar("fieldSHIPPINGADDRESS", "ms_shippingAddress");
-       
-       // set buttons
-       $p->setVar("buttonSAVE_SHIPPINGADDRESS", "ms_saveShippingAddress");
-       $p->setVar("buttonCANCEL_SHIPPINGADDRESS", "ms_cancelShippingAddress");
-       
-       // create page
-       $parser->setVAR("PAGE", $p->parseFile("editshippingaddress.html"));
-}
-
-/** creates the form to edit the order comments */
-function editOrderComments()
-{
-       global $parser;
-       
-       $p = new Parser("editordercomments.html");
-       
-       // check if loggedin
-       $session = new WebSession();
-       if (!$session->isAuthorized()) {
-               redirectHome();
-               exit();
-       }
-       
-       // get shipping address
-       $cart = new Cart($_COOKIE[COOKIE_CART]);
-       if ($cart->isValid()) {
-               $p->setVar("COMMENTS", $cart->getOrderComments());
-       }
-       
-       // set input fields
-       $p->setVar("fieldCOMMENTS", "ms_comments");
-       
-       // set buttons
-       $p->setVar("buttonSAVE_COMMENTS", "ms_saveComments");
-       $p->setVar("buttonCANCEL_COMMENTS", "ms_cancelComments");
-       
-       // create page
-       $parser->setVAR("PAGE", $p->parseFile("editordercomments.html"));
-}
-
-
-//eof
-return;
-?>
\ No newline at end of file
index 8cc1c3d..c21b856 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-// (c) Konrad Rosenbaum, 2007-2011
+// (c) Konrad Rosenbaum, 2007-2016
 // protected under the GNU AGPL version 3 or at your option any newer
 // see COPYING.AGPL
 
@@ -19,6 +19,8 @@ class LangFilterExtension extends Twig_Extension
                return array(
                        'asMoney' => new Twig_Filter_Method($this, 'getPrice', $safe),
                        'asMoneyPlain' => new Twig_Filter_Method($this, 'getPricePlain', $safe),
+                       'asMoneyHtml' => new Twig_Filter_Method($this, 'getPriceHtml', $safe),
+                       'asMoneyClient' => new Twig_Filter_Method($this, 'getPriceClient', $safe),
                        'asDate'  => new Twig_Filter_Method($this, 'getDate'),
                        'asTime'  => new Twig_Filter_Method($this, 'getTime'),
                        'asDateTime'  => new Twig_Filter_Method($this, 'getDateTime'),
@@ -32,6 +34,16 @@ class LangFilterExtension extends Twig_Extension
                $flags=LanguageManager::UseThousandSeparator | LanguageManager::MoneyShowCurrency | LanguageManager::MoneyCurrencyPlain;
                return $this->lang->getPrice($i,$flags);
        }
+       public function getPriceHtml($i)
+       {
+               $flags=LanguageManager::UseThousandSeparator | LanguageManager::MoneyShowCurrency | LanguageManager::MoneyCurrencyHTML;
+               return $this->lang->getPrice($i,$flags);
+       }
+       public function getPriceClient($i)
+       {
+               $flags=LanguageManager::UseThousandSeparator | LanguageManager::MoneyShowCurrency | LanguageManager::MoneyCurrencyClient;
+               return $this->lang->getPrice($i,$flags);
+       }
        public function getDate($i){return $this->lang->getDate($i);}
        public function getTime($i){return $this->lang->getTime($i);}
        public function getDateTime($i){return $this->lang->getDateTime($i);}
index 174197a..660744b 100644 (file)
@@ -44,75 +44,63 @@ $page="(internal error: no page text yet, probably no template defined)";
 try{
        //get page template and process it
        switch($mode){
-               case "eventDetails":
+               case "eventDetails": // show details of an event
                        $page=EventRender::createEventDetails();
                        break;
-               case "eventOrder":
+               case "eventOrder": // process of ordering tickets
                        WebCart::addTickets();
                        break;
-               case "mycart":
+               case "mycart": // show users current cart (make sure he/she has one)
                        //make sure cart exists
                        WebCart::getOrCreateCart();
                        //fall through to show it
-               case "cart":
+               case "cart": // show current cart (can be called from anywhere in order process)
                        $page=WebCart::createCartOverview();
                        break;
-               case "removeItem":
+               case "removeItem": // remove something from cart
                        WebCart::removeItem();
                        break;
-               case "vouchers":
+               case "vouchers": // allow user to select voucher value to be added to cart
                        $page=WebCart::createVoucherOverview();
                        break;
-               case "voucherOrder":
+               case "voucherOrder": // add selected voucher to cart, then redirect to cart
                        WebCart::addVoucher();
                        break;
-               case "shop":
+               case "shop": // redirect to main page - anchor for flow resets
                        redirectHome();
                        break;
-               case "checkout":
+               case "checkout": // redirection target during checkout from login/register pages
                        $page=WebCart::checkout();
                        break;
-               case "orderLogin":
+               case "orderLogin": // log in or register to be able to checkout
                        $page=WOCustomer::loginPage("Order");
                        break;
-               case "customerLoginOrder":
+               case "customerLoginOrder": // log in with a known customer login
                        $page=WOCustomer::checkLogin("checkout",true);
                        break;
-               case "customerRegistrationOrder":
+               case "customerRegistrationOrder": // log in with new customer data
                        $page=WOCustomer::registerCustomer("checkout",true);
                        break;
                case "changeDeliveryAddress":
-               case "changeInvoiceAddress":
+               case "changeInvoiceAddress": // change addresses
                        $page=WebCart::changeAddressPage($mode);
                        break;
-               case 'placeOrder':
+               case 'placeOrder': // convert cart to order
                        $page=WebCart::placeOrder();
                        break;
-               case "customerResetLogin":
+               case "customerResetLogin": // reset login page (link came via mail)
                        $page=WOCustomer::resetLoginPage();
                        break;
-/*             case "orderOverview":
-                       orderTickets();
-                       createOrderOverview();
-                       break;
-               case "editShippingAddress":
-                       saveShippingAddress();
-                       editShippingAddress();
-                       break;
-               case "editOrderComments":
-                       saveOrderComments();
-                       editOrderComments();
-                       break;*/
-               case "setlanguage":
+               case "setlanguage": // mini-links to change browser language
                        LanguageManager::setLanguage();
                        break;
-               case "compile":
+               case "compile": // internal: compile the templates (the method asks for admin credentials)
                        TemplateCompiler::execute();
                        break;
-               case "index":
+               case "index": // show the index page
                        $page=$twig->loadTemplate("index.html")->render($basevars);
                        break;
-               default:
+               default: // if in doubt: show the event page, customers will probably like it ;-)
                        $page=EventRender::createEventList();
                        break;
        }
index 9525d07..2a8c342 100644 (file)
@@ -8,6 +8,11 @@ and after that the body of the mail.
 #}
 Order {{order.orderid}} Details at MagicSmoke.silmor.de 
 From: no-reply@localdomain.com
+Content-Type: multipart/alternative; boundary="------boundary-aYAmoTT04MIpviI"
+MIME-Version: 1.0
+
+ This is a multi-part message in MIME format.
+--------boundary-aYAmoTT04MIpviI
 Content-Type: text/plain; charset="utf-8"
 Content-Transfer-Encoding: 8bit
 
@@ -17,20 +22,20 @@ Your order number {{order.orderid}} is currently at the status {{order.str_statu
 
 {% if order.invoiceaddress|isObject %}
 Your order will be invoiced to the following address:
-{{order.invoiceaddress.name}}
-{{order.invoiceaddress.addr1}}
-{{order.invoiceaddress.addr2}}
-{{order.invoiceaddress.city}} {{order.invoiceaddress.state}}
-{{order.invoiceaddress.zipcode}} {% if order.invoiceaddress.country|isObject %}{{order.invoiceaddress.country.name}}{% endif %}
+{{order.invoiceaddress.name|raw}}
+{{order.invoiceaddress.addr1|raw}}
+{{order.invoiceaddress.addr2|raw}}
+{{order.invoiceaddress.city|raw}} {{order.invoiceaddress.state|raw}}
+{{order.invoiceaddress.zipcode|raw}} {% if order.invoiceaddress.country|isObject %}{{order.invoiceaddress.country.name|raw}}{% endif %}
 {% endif %}
 
 {% if order.deliveryaddress|isObject %}
 Your order will be delivered to the following address:
-{{order.deliveryaddress.name}}
-{{order.deliveryaddress.addr1}}
-{{order.deliveryaddress.addr2}}
-{{order.deliveryaddress.city}} {{order.deliveryaddress.state}}
-{{order.deliveryaddress.zipcode}} {% if order.deliveryaddress.country|isObject %}{{order.deliveryaddress.country.name}}{% endif %}
+{{order.deliveryaddress.name|raw}}
+{{order.deliveryaddress.addr1|raw}}
+{{order.deliveryaddress.addr2|raw}}
+{{order.deliveryaddress.city|raw}} {{order.deliveryaddress.state|raw}}
+{{order.deliveryaddress.zipcode|raw}} {% if order.deliveryaddress.country|isObject %}{{order.deliveryaddress.country.name|raw}}{% endif %}
 {% endif %}
 
 
@@ -43,7 +48,7 @@ payment due : {{order.amountdue|asMoneyPlain}}
 Detailed listing:
 
 {% for ticket in order.tickets %}
-Ticket: {{ticket.event.title}} ({{ticket.pricecategory.name}}) {{ticket.price|asMoneyPlain}} ({{ticket.str_status}})
+Ticket: {{ticket.event.title|raw}} ({{ticket.pricecategory.name|raw}}) {{ticket.price|asMoneyPlain}} ({{ticket.str_status|raw}})
 {% endfor %}
 {% for voucher in order.vouchers %}
 Voucher (Value: {{voucher.value|asMoneyPlain}}): {{voucher.price|asMoneyPlain}}
@@ -70,3 +75,312 @@ The order has been shipped {{order.senttime|asDateTime}}.
 
     with best regards,
     your MagicSmoke team
+
+--------boundary-aYAmoTT04MIpviI
+Content-Type: multipart/related; boundary="iKETDhtPafV07ewA9JlUOMitE"
+Content-Transfer-Encoding: 8bit
+
+--iKETDhtPafV07ewA9JlUOMitE
+Content-Type: text/html; charset="utf-8"
+Content-Transfer-Encoding: 8bit
+
+
+<h2>Hello {{customer.title}} {{customer.name}}!</h2>
+
+<p>Your order number {{order.orderid}} is currently at the status {{order.str_status}}.</p>
+
+{% if order.invoiceaddress|isObject %}
+<p>Your order will be invoiced to the following address:</p>
+<p>{{order.invoiceaddress.name|e}}<br/>
+{{order.invoiceaddress.addr1|e}}<br/>
+{{order.invoiceaddress.addr2|e}}<br/>
+{{order.invoiceaddress.city|e}} {{order.invoiceaddress.state|e}}<br/>
+{{order.invoiceaddress.zipcode|e}} {% if order.invoiceaddress.country|isObject %}{{order.invoiceaddress.country.name|e}}{% endif %}
+</p>
+{% endif %}
+
+{% if order.deliveryaddress|isObject %}
+<p>Your order will be delivered to the following address:</p>
+<p>{{order.deliveryaddress.name|e}}<br/>
+{{order.deliveryaddress.addr1|e}}<br/>
+{{order.deliveryaddress.addr2|e}}<br/>
+{{order.deliveryaddress.city|e}} {{order.deliveryaddress.state|e}}<br/>
+{{order.deliveryaddress.zipcode|e}} {% if order.deliveryaddress.country|isObject %}{{order.deliveryaddress.country.name|e}}{% endif %}
+</p>
+{% endif %}
+
+<h3>Payment information</h3>
+<p>
+<table frame="1" border="1">
+<tr><td>total price:</td><td>{{order.totalprice|asMoneyHtml}}</td></tr>
+<tr><td>already paid:</td><td>{{order.amountpaid|asMoneyHtml}}</td></tr>
+<tr><td>payment due:</td><td>{{order.amountdue|asMoneyHtml}}</td></tr>
+</table>
+</p>
+
+<p>Please send the money to our account no. 456D-EADC-AT07 at Smelly Bank LLC, New York.</p>
+
+<h3>Detailed listing:</h3>
+
+<p><table frame="1" border="1">
+{% for ticket in order.tickets %}
+<tr><td>Ticket: {{ticket.event.title}} ({{ticket.pricecategory.name}})</td>
+  <td>Start: {{ticket.event.start|asDateTime}}</td>
+  <td>{{ticket.price|asMoneyHtml}}</td>\
+  <td>({{ticket.str_status}})</td></tr>
+{% endfor %}
+{% for voucher in order.vouchers %}
+<tr><td>Voucher</td>
+  <td>{% if voucher.validtime|isNull %}
+       Valid unlimited.
+      {% else %}
+       Valid till: {{voucher.validtime|asDate}}
+      {% endif %} </td>
+  <td>{{voucher.price|asMoneyHtml}}</td>
+  <td>Value: {{voucher.value|asMoneyHtml}}</td></tr>
+{% endfor %}
+{% for item in order.items %}
+<tr><td>{{item.amount}}x </td><td>{{item.productname}}</td><td>{{item.totalprice|asMoneyHtml}}</td></tr>
+{% endfor %}
+{% if order.shippingtype|isObject %}
+<tr><td>Shipping:</td>
+  <td>{{order.shippingtype.description}}</td>
+  <td>{{order.shippingcosts|asMoneyHtml}}</td>
+  <td>&nbsp;</td></tr>
+{% endif %}
+</table></p>
+
+
+<p>The order was created {{order.ordertime|asDateTime}}.</p>
+
+{% if not order.senttime|isNull %}
+{% if order.senttime > 0 %}
+<p>The order has been shipped {{order.senttime|asDateTime}}.</p>
+{% endif %}
+{% endif %}
+
+<p></p>
+<p></p>
+<p></p>
+
+<img src="cid:logo_png" align="right"/>
+ &nbsp; with best regards,<br/>
+ &nbsp; your MagicSmoke team
+
+--iKETDhtPafV07ewA9JlUOMitE
+Content-ID: <logo_png>
+Content-Transfer-Encoding: base64
+Content-Type: image/png; name="logo.png"
+
+iVBORw0KGgoAAAANSUhEUgAAAIAAAAAyCAYAAACUPNO1AAAABmJLR0QA/wD/AP+gvaeTAAAACXBI
+WXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1wYeEDgTc24NbgAAABN0RVh0Q29tbWVudABNYWdpYyBT
+bW9rZSu+IOAAACAASURBVHja7bx5lCRXfef7ubFHZGbt1dWburWD1JJaK5IQwoAlYFjkAR+GxYDB
+mOcBBAgwZjyYAWwfG5tnzGMYPPLYgAFjMAxgg0ASYB5aQBixSAhtrV7Ue+1VucR+731/3IjIrJYa
+PDPMmffemTgnT1YulbH8tu/v+/veEFt3/7YG0BqEJbAtG8uy0IDAQmtNlhd4nk8QhCilUVrjuh6e
+H+C5HkmaoJSm3+sRRRGtdkS/16Pf7zE1OU6vt45lQZYmKFnguQ6WDYPVPSTdwyiZowFLWGit0AjA
+AnT1ACHAsW0cx8Z1HWzLxrYtLMs8tNbYtoXjONi2Y75jWyilyfMCpRRaK4SozrV61lqTZTlFUVLK
+krKUKK3R2hwFgF3td3JinCgKCXwPz3OxbXMMAGUpkVJWzwqN+Y36vaIoybKMLMvJi6LZtzkujVIa
+IcDzXCbGx4haEZtmp9g8N8vszBR+tU8hzFG5jgOAZVkIIdBaU0pJmmbEccLqWpf1bo9ut0+a5qRZ
+xsrKGssra+R5Qb05lmVjHMCYXGkQCGzbhsoQge2SZzlSQdTqkCQJwnKxbQ8vaJFkEj9wiZMC128R
+hh16vYTxiRniNCaKxkiSPkoL2p0O05MtxqOCctM0cd+j2xvQ7Q7o9Xvkha72q6B2BcvCcWx83ycM
+/Ma4VuWsjuMYx3BqwzsIC2QpSdMcKSVKqcZQujKwUpqyLCmlrBxAopRuPheAEMI4vVKsrXfp9we4
+rovj2NU1MsdrjKBM2FgWtm0MU5Zm32VZkmU5pawcRGssy8LzXMY6bTqdFlOT40xPTdLptAiCgE2b
+ppkY79Butwh8vwkEbWICpRRSmd+T1bGXRUmSpkxOjjM/v0RZSNa7fbrdHkVRNg7UOIAQAiFMtA1/
+WGNZ4DguIHAsG8v2KEqJlBC1xilLheUEuF4L11e0Wi26/YwgHMMLW5RqkR3btnDo0FEUilIKZqan
+OOPUGcbbDmrwINHcNtrtFllWcODRgxw6Ms+x4/PEg8QYQBgjO45NKwpot1uMj3fwXBMJtmNjWSYj
+uK5jMoRtHDrLM9LURLZlmSito7EsS7SGoixQSlNUr6WU1X5FFRDDC22iOUUIges6WJYxtBgxeO2o
+xmlGM4NCKYVt24RhgO/7RFHAWKdNqxXRabfodFq02xHjYx3GxtqEYUgUBub7novruli2hVIKVf2e
+VNWzNA5WlpK8KHBcB9d1kVKR5TllWeI6DnlRsHnzLGVZUuQF/UGMY85TY9lWlYKpMoJASo3newjL
+xnEdikKSFZJWpwVZiWWHuF6LyakWURSwuNSjNTaDZVsIO2RlrWB8YhMrywuMj4+ze9dWdm5rYxcH
+8JwdaCy0kuRFzhn2DkAQBT4HDh6lP0iwbRvfd+m0W0xNTjA9NUGnHWFVF9mxHVzXrkqDQ52zi7wg
+SVwsK0ZKiVQSVT1AGuPLknIkcuoMUUeIEBZo1WTH0c9rJxGCJvsIQVOKhBBIqZrs5LqCMAxoRSHt
+dotOxxg9CAJ836PdigjDgHY7qowe4vsevueZjFadb13uhCsq5zKOm6Zpk6kc20E5GseRtKKQLZs3
+MdZpUxQlRVESJwm9fszq6jqe7+FkeYZjOzjCxbYw6VNYVeW1KEpJEPg4jo8XuCRJTporNs1tpz9I
+8YJxpmY8fN/mwKEJJqe30F1f55xzL+TYscOUssDxfC69aCc7tgaEaj+tzhjtdpt2y8dxbBaXVknT
+jDCMeGTfYeK0IOoP6HTaJio6HSYmxuiMtWlHIZZtYVuiMoLAri68Rpu0n6UIYSK3KIrK+MpEuVKU
+UiKUaMqASfucEPm6ybWjabN2hjoTwLBk2raF6zp4nlcZ3sF1HILAJwh8WlFIp9Oi1YqIwhDfN5Ht
++x5hEBCGPp7nYlmiOgLdZKU6+m3bxqrOHZwmussya5zSti2CwMe2LXzfY3ysQ54XJGlKt9unP0jI
+8wKtNY5AUBQFpZQ4jovnWRXQ8hDCRiOQChzh4PsRYTRJt5dQKof22CbcYJzpTS20dglafbaeMkev
+l3LK9llO3d4h7h5jy9xZtAJJW+xj29adjI+1cWxBHCdkecHszDRLy2ts37aVMAxBg+PatFotACbG
+O7TCAM+va6+FGgFaaF3VdkWOxi5NWXAccwGU0pRSUZvW1EyNEBKogeGw9tebqAxeA63RLFBHpOs4
+eJ5LEPjGkGGA57oEgYfr1gZ28VyPKAqMM/h+AyJN+bCbrFEUZYVNJFmWN45lMI6L4yiUYzdlTWs2
+4JYaIDq2ro7DJ8tysixnEMcsLC6zvt5lECcGA/hBAFqbOiIVcRzjuh4BFr7v4vshCBstbKSyaI+N
+05nYwvGFVS66+GwGicfE1BT92GJ6ruTSS+bI+wNmJlt4tmbmzHPw7Jz+4vcIwog4TkGrKv0FOK4B
+N2EYECcZ27dvY3ZuG/1+TJYO8DwD7kQDgDRSlsb4VTSjaaK8jlUhBK7nYuc5nucSKr+6sArXdSlL
+abKHbVGWcmh0IYZlgI04YFgeRGOU2vh1hEdR2Ly2LasBjCYr1MCxAnDS/FZRlBWKNyDNElazL6vq
+QEZLgue6JvtUiLB2Uq1NhyYrPJCmKWma0+316Xb7dHt94iRtOg7LsnDqmuV6Hr5lIr4sFXGSkGYl
+7Y5Fuz1B1BpH4ZAVmm2bJ5nbdjoHjw648ilbcVow5sOuc7ex+1y46pLTue8ekNk4raBkfv+32brz
+QmS8j1arTeD7OJ4PWuFZNpbjY9s27bKkLAuwPHrdLnHsI8uiylAlqqxAnCyr+qdR0kRwvZVSVa2b
+iSzXcY3RHRfbzqsTN9Hrey5FadJ3DfQYMbpWekOrpkdKQm2ouvWsoz+KQsLARLjruk23UpcHy7JQ
+2kS6lKIBcE19b05GjHQ/XuXcoilDxuiiKmuyuR71Q1bdRpplpsOpPq/LUllKLEvjyLJEWHZV7sxF
+CwIP2/EQlkOalcwvLDE5ZTG3ZQfjk9MUZcTm2Ul2nr2J9RjGNsPLngk3fR3iAubnwbZh56k+Kwtd
+ZrecisOAsc0X4tjg2AAKrTRKS7RSqKqFQktsUWJbJWWR0x8MjAOUBWUh0RgUPGoMRiJTKYWwhtjA
+81xzQcoS33cpCg+tNZ7nNmhaadW0ZkNULcnzvInOx9tGsYElrGHdd90GHJoUbjdOZ1miAtsapUCp
+kjwfOpfSymSACkCGod90FkJQGVZWGWyIW8pSIqsS5bnuhtICkOc5WZ5X3IHBL1ma45SyRCiFEDZS
+amxbYTkaFwvP8xgbG8cP2thOxJGj86z1FJddsYPOhIsdwhWXw+4zYTuw40zopzA9BbM7YW0ROp1x
+piZa2KLAEhIhNAIDzvKyaIiRNO4hy5g0TSmKgn5/wCAekCYJaZqRFzlSqqr2DmuwBVjV37XRAWxR
+ZQDXxfc8wqoW1oDI9MQGD4CuAKNBykmWkcQp/f6gcoiNbWHtKHlR4Dg2ZVk2UWhInwLLEo3hzN+G
+u3Adp4l2yxINSSSVavgKy7JwXBeravOcCmdoDVmeN85acw11616ndaU1tmUjPNEYXGtDiDl20mAP
+pZQBgXVNUkojlcaSmrLU5IXCySV5KYhaHttP2cn07Da0aPGNb/W4/u0dOrNwdsXbnXUabAMcYN9x
+aLcgCjxs4VLkFkWek+UZRZ6TpCnxYEC/O0+/36PIc0pp+tOilOSZYa+yvKDIjbMoKZuL59gWjisQ
+toXGcBmmlTWR4rrOSCqs2LiajCnlhqivDV+UJVmaYvVtlII0zZr91ddoNE3X/yuEoNcbNPvLwxA/
+zwkLA/o8z2scQSmN41iNE9fHqbRCqWFGcWwDZMMKXDq2TVGWJElGnudN3a8zirCsqgMw2aaOfoPj
+3IZvmJ2dYmFhGddzOH58Ecf3fcOo2TaW7SCEbR6WA8JBWC5aafr9Ad3BQeaXEqbnBE84dyuZgtPG
+wasO+uzquQ+cvhl6BawtQ68nyJKCJEko8pw4SYnjhDhOGcQeWdamKHKULMnSPkWWkqUDisI4gSyL
+KhIlYDzfqi5ewwK6bhXxw9SLFjiWBUKgMQ/Lsip2rqZpywZJl1ICVkUKqarPr/HBsMcfTekGvUvi
+OKEoCpIkw/cHBBUmaLdbVfbxq3bawStcA2wrMKmriJVCjaRu8D3TIjqOTSkl8SChP4irDGOcsj5X
+xxlGteu6aF3iOE7T3ga+D+MmQ8RxysT4GP1+jJNlKUJY5mENjW/ZLpbtYdngeh6O6+CHHYJ2Bz+I
+SFL44Y9BtGB6J2wdqY09oLcC/XWIexDHfdaP302SxCRJQhLHDOKYbrdPHMdVr64bQFMTM8ZIqvlb
+1+yEEFiWTV4oLKsgCHykBN8X2LZAStBaNXMAKcuR31QNdVpTwEVRkmY5WZqTpBl5VfdNT25R+nJD
++m8ir0LeNZBL05w0NUDT972K5cxptaKqTTTlqMYKozT2z8IXZWkcbDBISNIaxYvq/wQ1A+Y4Aqsq
+a8PfFIxCmJpLKEtpjsXzvOqEHCzbRggHYdlN9AvLQaMpioKs6KKtFjNzDrvPh9++Dr54BIoTDn4O
+CKZM9Fsu+EGbsc2X4yV9vDjGGSSIwQDCPvYgJs8zZJkboFeWSFmYqJc5djmgzHs1LK8GOqKp22Ah
+MGnV9xzaLdNRaK3pD2LieEBWpUwDmKj2oSqO3jCF5nc1nutAFOC5DlpFVVbYyAYaqlw0vXueF6Rp
+ShynFGWJlKbc1CjeRLnZX54XBiQ2HIBVOZpB+7ZtYdcDLqAoJGU5IEkykw1HuhylLLSlN5SmGqsM
+2cqq/hcG9+R50QzH8qIwGQAECAutRVUOXBzHx/U0fuiZAc7MFk49fZx+OsNqN+ZXr2tz/Y2w43R4
+0TZjn8MYMGgBR45Cuw1rqyCVZn29z9LB28gLhaRNVrokiawmZGll/AItZdUZaAQWlh0StEJAYVsG
+QFoCLAssYcpBu2Xar/GxFq0oxLIEcZJSFBKpuiRJhpJqiHW02mDQuucPAg+qTkIp1XSEozOCmjOo
+WzCT9g3zmOdFNVfQG1rR2hA1l2AynjGazg2OMK2obPiCsqxbxdjMNqqJpWgAr276frvKAFIqtCUQ
+ldPmuSkVtbMnScogTkgSQ8ClaY4jwIAny0zRHNfD80L8IKTVHkfjECcphw8fYnI6QouEuD/gbW8b
+49SzA84/G/YDZ2JQvzcLATC3CR55GPJUIrRkrBPgnvpkev0e66vHGcw/QNZbJ02KKk2rpoevL6BV
+ARstzLNVES++7xEEnkmrnkcY+rRbEX7g4bluRQuD53ugIc/Lapo5ZA9N3VeNY5iULpqa63h+Baas
+DZE02n7Wwxa32mdZShzHtNS+7zE21qbdihoyqD63sjTlqXbIRKfYtk1R+ESRqrCBCQ4hBFaV0ZSU
+VZYWTddSl7ayNOWkLg2jE8karBrsldLrx2SpySiO57vYtovjuLiej8CikCXr3XXWu32mpjexY8ck
+h49k3PeTfYxPbiYtbNpjk0yPBawtwQMJOKdCfxUmx2AQQ6cFs9MwHSqSzGLvIQvXDtAqRcsxHOdC
+xvOMlYWH6PfWSeI+ZalRSo7ULEPfOraoTkzguhZRaOprbXTf97CEQJaSuChJs4wkyZBSVkSMoJSS
+spr+1RmgJpIMBWuipWbx2u0I1zW/bYCy2JBmawO4qdMY1nEc0iyrOAGbKAqaaeZw7lCPo8vq/4aj
+4TwvTEucZgRh2GQRt2ohaxaxUKpB/YKNQ6mh4U0pqZ2llJJur8/q6jpLSyusd/usr3dxXNcQIqtH
+7qTIB6AVs6c/j+mpKZQWHLr/8xz8qWb7rl8jHgzwgwg/nGCiozi4t2Bp0WVuFnrHYdsErK9C0oXl
+BRhra46uOMyO5Yy1NJ0QjjjjOLaEYhHyHhPjbTzPJ2tPkCZ9siyhLPINEWIuhEAI3aR/MHigLArK
+wmSQoiyRpSRJM5SSJEmG49gEvotSPklCU/frmkyVyk2LZhzB81zAsGZhGBAGAa7rNOnXRHFJlhcb
+ZgSOYxOVIVqrhv07kTvQeigAGa3VsqKBy7IkjlOCJMWu8INjGx7A81zT31ct5XByqxsHsSyTMWrj
+C2Gcf9CPWV5Z4/j8IisrayYLZDkimtqtEYKos5WJLZcShBFJnDK/7yZs22PTmS9g6cBX0apk265X
+E7YmmJyaIysEW7fvwPXaPOnyNocPWOzavsyZp0+TZ5pWZAzlORo0bJ2WZLkkz1LW1rscWchYXznC
+oLda1aWUPM/JK6BS5BllaRB8PZ62LAvXNTP1MDTpvzaAlEbJo5SiLMqmjtfgJ01zsixr6rSsRSCl
+GRPXOgHXdel0WkxOjDMxMUYUBs3gZsiXqEYBVJeBWvFTdxX1vL52lg3dTFNK9AZqt1YJ1RnBHgGK
+Q82DiXTNxulljTXqbGNbdiMWieOEbrfPwtIyi4sr9AdJw3A6k9ueTBhNoDSsHbub/tqjOG5Ia/IM
+ssExDv3kY7TGtxJNPRHH1thCsrR4hB07trNw7CBBOMYD93Xo910e/d5H+LVXv9XQyDgINO6ES1nC
+oQXB5ikby4Ioiti+SUIRYDubse1FHMciz0wKdWxBKrShdAvLoHQpkbLAtkUFmhyEKBuGq+br617Y
+/G0TRS5CUFG7psuomcAsz0mS1IgmipKyNJx+FJn5fOAPBzh1BNdGHJ0JjGYHxynw/RrAyYpzFw3m
+GKWb62eTzTbSzaZbkdi2bpy1TvGj9d2yrIYJHRJKujnPJM2aYVCvN2AQJ5RlOSSctNbMH/gn8myA
+bTsE0TQaRXfxfizbYWz6LGQZ05l+IlqVdNeXmJqe48jhIwRBG1tIHt2XEoYOD93/IHv2zXPaKZMs
+LSXMTI2TZDkTYyFaaw7Na2YnXJTKabXH2HGKxfHjx/HsDlEUkKZJNcHKiBPXAJU0oyhLlNZYlYe7
+jk3gD+nRut83qd1EtJFbGTrbqUaqo21fnhekWU4SJ8SJmZrlRYFbAU0hhNlvNZptZFcVVw+MKHJk
+Mz/QWjWysxqgWcJCoUaAJA1/MBr9oyWhzg6mczB9SlmCEKqikMUGSnmUL+gPYpLEXMcsM6xrPpKZ
+NkjClg/fgSUEnhdh2S55uo5UJa4b4ngRebLCpjP+FUrmxFlGGLUZ9FdRWoAuGR8XLBxfYHJykv6g
+x579C0x0bFxbcfjIPGOdNlpBFHr4Hix3bTZPjZMmAyYmxvE8l+PHjtHr94lCvxI2piRxTJrlDAZG
+1VNfPNdx8XxTDwPfQ0pJfxDT7Q7oK2kQf140QxgDzuyGi7eEha44hCRJSVoRcVWChoZTG+YFhj0s
+mzbOsuwmYmuSqe4CRtvGUsrHCD9Hs4jW6rEahJHBVt2dnNjfa1070lDrWJeiusTlecEgThjEQ/HH
+422O43hYtocsE/I8RqDxvBbCslGqZHbntcgyp7tyD63p3UBJMkhxXJ+kzOivO/TWl/FdzerKMktL
+azywB87c0WFp4VGUPJUsz9m6ZZaiNGmq24etMx7pIMV3fSanZijKkjRJcG2B12kThYHpsdvRhtbQ
+rWbhnmfIlLwoCMMQx3YATVfV41XRsIZC1HXUbeq5UoowDEiSlLFOmzTNKlGoqhi9lH6/38wOyhEu
+wB6ZvQ8FpkOSqD7WOtXW5E0tIK2fh9FuPquJqkb92TyLDY6x8f+GWWOohFYNB3AiQfQYB9Bakmdd
+wMYSYLuRYcWwmdr+VMoypzv/PRy3he/ZDHorWLaPQOH5Af3eKmU+IE08sixj/6EFyjJBlTFlnhLn
+8yCW0FoxPbOZLDNz6G5fc9rWgKXVNdPK2AFr64vkRY7nmlpsWTZBEFT1jgYA1TN44xBOJQTV1RDI
+Jc/zRnHr+37jNDWIqtOm1powCCqlrmwiM89zer0Bnuuwtt6j1+sPgaYaSsKGGoKhxLxu7WrDj2oJ
+6pq9kerVG+xd8x+V1vikmeFE40MF/OqxthxS3iczPoAj5ZC1EsJGK4nt+ExsvZI8XmKw+hACQWfr
+hSRJnyJdxQtnKVRJEHjEcRetC/Ksj1aSLBnw4MMrrK+NMzvlog/vJRzfSdI7xqlnXcLU1AxaK1pR
+wL7DOadsbtFbX8Z22kxOz7Fv3yPM95fxXJdW5GM7Dq1WRCsKKxWw1Sh46zQfBD5am1643W41n9XD
+lvp79evRCzmKyoepvKTdNkLXMAwIAs+UiyQz9bQCnbXhh8phtZFkUhtbvhNlZaNAcnTGUMlBRr5z
+cicYsoxyiBsq6jcviqasnWyz3WD6PbbtVWIMheOGjM1dRrK+j6R7ALRibO5JCAGD1QcRwsF2I9AK
+2xakSVzp6jRrx3/MxKbz6a8dIU41692Y1fn7UNYUxw49wKC3jO2NE4UhUpY4rsMggU7bJUtjPC/C
+8wKOHTvG4SPH6HYHrKyuM+j3DelSMV2NLFoOJddUjOZQhGE1gona+Fa18MX01vZwoUkt3hhJl1Ip
+XMeumMbAyLs8tyopAmGJRrVTp+86vddZYtSphsMYfYIY9cSWkOq465ExGxXBI9qH2mHEyHHnRcFg
+YNq+OEmrCerJN9uLtr5HVytwHDeiM3MBg5X7yJMVk2L9cfzWHP2l+9C6xHJCZN7DCzoopVg/fjde
+tAlQrC/ez/jsOawe+x5+aytJkrA8v4fe2mFy1Wbh6MPE/XVa45tohS0sW2DZDhqHTjvA8wS24xNF
+LZYWFxkM+vQHMRqr6uFzZGlQsEG1hkbOsrwBQDXq7Xb79PoDBoOYfn9APDBov5QleV6a8YcQGzSA
+o2sAjJPJDem75gIsyyRnx3GwbLEBsNX1elir2aAfODGFD49h+NqwjnaTver2z3Ed49y10MS2sKug
+ENZwFdQgTuj3DYg2vidO+nC0luYPNySaPJvB6v2URVJFlEM0+QTi1T2UxcCgXyUpsmVaY1soi5I8
+WUarAlmY31FljiwSs9xLSpR2WVo8TmlvJV2fp9vrkxQuVz/1GZyyfRtR4FCUkJUOnchj3HGx7W1c
+eNFl3HPPDzh+/Bj9Xh9Zze17/ZixTot2u2XWD9WpGCgLo8wZDBLSLKs492Hb08i2XZcoCky/H9Rz
+eruZFGpNJVHbaLxabiV9I1+TsiTPTWdhWXWXIClLKjbQeoye8ERlcZ3iR6O8XvFkRC5DRrGJfGE1
+ztV0BpwoDlX8SzYHBLYb4He2k6ztQZZpdVA2fms7ae8QebJkRBVaUCQLeK2tSGnqi5IFWhaouqbK
+HKVKZJlXJ27EjL3F+xDCZnl5mfzH/wTC4+qrr8J15vA9hzBok5cQeBFTk0ZiUlRLu5aW5xvFrOu6
+1cVXDX1b19ha3l6rZuo5vRk0DVF8vYQsikKiyCzYCHwf1zNg0aRNQZHnTVSlqan/SVKzfUUDChlZ
+QjYkjPQJFPDGVq8edG00vDADOcfGdtxGQVQbv9Yejg6vRgdTytaN/u/n1f6h8sjxcf0Jst5hpMya
+VTG2G4CW5PH8cKGkBlkMsN0WssyJ1/chhIVSRZNqyjJHIMji49hOy/yTEMgyw4tmkUnK+toq9979
+VbIs44orLmf3ru2sLCfIsTHcyRYah/HxDnObt3LeBRfx3e/cydraEnleEAYBUhqWzfdcI+0qS2Ow
+CvQYhi+rBkBlo/4xqp9h327bFoHvE4Z+lQmMhKuWaYlqpFoUJb3+wLCGWU5RFs0krlbnNiKTyuHq
+CdyonLw25BCYWk2LWjtBs8TN9TZ0GifrAmpnqAkro4FIf2bvv8EBLMejSFeRMm9WuViOhxvMkg2O
+omRhlkkJG1VNsAQaKQuKZNnwBbKkLIxoQ5YZCEHWP4zf3tEsmFSqoEhXje5AlfR76zx47zcpyxyt
+LuWCc7aTehaljLABhUMrCtm27RQuvexK7rzj26yuLJFFRiaW5wVjY50qdZt0XK+NMyLSSk5elQGN
+uUBFZVCDkMuKPzdlwfddvEp/byjWoe6v3mftZDW4sqtlaY8la4aCjNEU7lTrGUfBauMU1vC9uv/3
+ffcxJaNe0dywlMqc18rqOqur6wzitOIeRp3lJDyALFKUKhv4KWwH2wnJ4+ONUzTLpLTCcVtoVVLk
+PZQssGxD7RbJkjG0LKvnAln0RrxQGIWP41flRNLvrbL3oe+jtcRzFOefcxrdbo9Op4VtWYRRB9f1
+qtbman78w++zurJkNHhJgm1bRFFUKWqM0agWWpRlSa6hlGVDu8rKcKNOMlqTLcuMUGvJlm0NhZwN
+tz9SSgTDhaJmNiGwLKdabMuGYU/FulUtq25kW/ZIN1KXEUNDy0rMQeNglrA2KHuSJCGp6HLDhprF
+H6PLv39uBlCyGKlNRhiiZGYiGQ31yVRyLCeYMVr2+DhKGQeQeY8yXwc0ebpUgZ0SLfNmjb9p30w2
+EVT9sID++jz79twDKiXyNaejieM+s7PThL6HH/hMT7ZpR2ezeXacPQ8/RK+3huNYGyKuBndhYNRB
+vX4fuzvAEhCnGWpEADraSjWEjRzqEIQA23EaHcIomKujvnaUWs411O6Lx8ixRqeIdeTWIo5ayJoX
+YsMqoVEmz7aN6lcrRZ7XeoeUfj9uHCDN8kpYc7Laf2Lp0DUTWEWAZWNZTgWw8qH2rupR7/3+F5mZ
+maTdMtTs6lqX0574NDSgZIZWks1zs+z96d837RLAkaMLnHPxdc0BKFVi2W6zrEmpgv7aUfbvs/jK
+V2Oe/cync+aZZ7C4oJicnCQKfbygg+cHKA1FUXLvvfdw2s5tvPTFz+W7d/2Im27+NpYVYrt2ZRSz
+2DIKQ/r9AWvrXbqVbNtM2Kxmgiel5ClXXcorXvorTE9NEIYBR48t8LG/+TyveuULmZ9f5nfe+SfN
+vL9eC+j7/uMqb4bAb0gqFUVBHKfESUqSmHUPRrJtlom7jsOX/v4/Mzc301y3cy589pA9tC10hWNq
+aXtetcCjg6f/tk3UXUB1LxDLNiuEVImWpk82B2Cj0Zx36fMZG5vk6N5vkqQZkxNjPOdZT+OmW+9C
+LHjLBgAADaVJREFUFgO0krzkRc9laXmNuU3TAPzgR/fzjOf8JqOhpZVEV6IGpRVCG3zQWzvC/gMW
+t9x8MzzrWs488yz6/QGnn35q1RYZqdrE1Aw7Tz2Tyy97Ar7n8eQrLuaD/+lv8D1zB40wCBgb6zA5
+MUYUhlXaDWi3+nR7A3r9AVlaq3Yk1z7jKn7nra/lbf/uj7ntzruRUvG0q5/Ee9/1JsbHOnxj4U4j
+3KxW8XqeWeTpVat/Ntw/QI0SU8b4SZLS6w8qBXTSpPDh+NjGtmwuuuI6vvG1T3DuE88E4Nj84gax
+54kDpROHSCeP9J/bBtKsB1CqRKty49yiWoQphCBOzWffvv1unn3tVbz8Zb/CTbfeZXp+rXjly67j
+7/7+Jm64/pWNKNHc8qUqAwiUNg4mmjuTSNACRU5v7RCPlH30LbfybODss89mbW2dmZlpNBZeEKHX
+1tmydRv7D68wPT3Ol7/6LQ4dnm9IG9u2K02+uZWLH3jMTk9WN2Bokxc5/d6AXt9I03/95S9kaXmV
+H93zAFEYUJaSO777A65/y+/zsRvfZ2Rivm/W/IV+tYw7MDdsqPBBPRHMshxLyAZb5HlBXKXqODb1
+ehTImcFT2TCE3W6/MUyW5RvQ/78E0T8W7IkT3nusczhmIYhVrbY16/SaGyQ0O9Zm3aDbBuDWb9zB
+s6+9imdd8xRmpidYWl7jwguewLnnnMkrf/N3Gwcwdx1RbBCmYwCgwGABzdDJFAWD/ip7Hk6rmzNo
+zjnnXGwbLtq1jdkpn5VtAffvWSZNEj77pe9y6623URSSPDOYpZQlK1I1EzjPc2m3W0xNjrF1yyYm
+xjts374FKSW9/oBNs1PYts1vv/k13PrN29nzyEHSLGPvvoP87Wf+gVN3bm/EnUHTKnoVMGOk/TPC
+jzwvKiVQvqEeG8f0kUo29y4aysHkY4w8Wk7++zd90teiWoHsCMsyRlFlZfxqVFlFrOkAQFhW8wO3
+fOMO4B3Yts2Lf/WZfPjGz/Dylzyfu/75Hh58eO/GHVYnEAQ+b3vzq3nB86+h1QoZH+uwsLjM5794
+M+/7P2802UJJXvxvnsdrX/0izjpzJ45jWkGlNMeXEorSRWvBk3ZvxnMtrrn6DN742udy7fNfx959
+exnvtHjT61/BM6+5quLRLW7++u28+w/+I4cOH+Pe+x4mDHwuOO8JPOmy8zltx3YWl1bYPDfL857z
+dJ73nKeT5wUPPryP2++8my99+esATE6M8+E/fzeTk+PNmd34V5/hJS96Lp1Om4OHjvDxT32BX3vx
+dZxx+g7iJOXr37yTj9z4yWaWsHluhuv/7Sv4pasvRypFnuf8/X/9Kh/88MeJ46S6J9LG7fiB7zAx
+PtY4wsFDx3jC7mcCcMbpO/iD/3ADV115MbZtc+zYAn/2oY/ymc/ddNKFrI/LJbRmLtbR9G4dTp6v
+w8nzqsf5Opy6QEdTu5vn9qbL9NiWq7TWWkfTu/WDD+3VWmv9k/se1pPbrtRLy6v6dW96j46mL9T1
+9p3v/lC3Zy/VrdlL9F/+9We11lrvP3BIBxPn6ouv/JXmex/40Ed1MLFLv+0df9y8d+XTX6Z3PuEa
+vb7e01prnSS5vvX2A/qff7Kqf3h/V8dJ2Xz399//af2Cl75VHzu+qLXW+nff9Wc6nLpAf/bzX9Va
+a/1XH/+cbs1cqMOp3Tqc2q07my7WZ+z6Zf2rL3uj/ptPfUHneaEfbzt2fEG//d//iX7DDe/RN7z9
+D/XRYwvNZ8fnF3V/EDevFxaWdZKkOk2z5r0/+OP/pH/p2pfqF7749Xp5ZU1rrfXr3vQf9I6zrtYf
+/otPaq21vuuff6RnT7lMd2Z36+/c9cPmf/2JXfqMXb+stdb6W7fdpc86/xrtT+zS/sQuveuS5+jV
+tXUtpdQXXnGd3rTjCr221tVaa/3q3/p3zff8iV06nDpfh1Pn62j6guYRTp2vg8nztD+xS1vDEebj
+6NLqCK56Xl21jFopbv76bQCct+ss3vHW1xCFAZ/74i0npPu6xiumpiYAaLfNXT8eePCR5juXXXI+
+oHnec57evLfnkf0srazyyN6DAPi+QzwY0F1fJ8sL5AjqPeecc/nDd9/A5rkZ1td7/F8f+SRKaa57
+7jMA2L5tc8UIyqY2Hz4yz9duuY23vOOPefErbuAHP7qPNMs2HPvmuVl+45W/ysz0BO1WRJ7nzWdf
+vumfeP8H/kvzemyszTve+Sf8xX/5dPPeaTu3IaXija9/JVOT4yyvrHHL129Da82nP/uPAFx+2YW8
+6uUvbO50Um++7/GxG9/HX370szz3Bf8HBw8daz77w3ffwMT4GD+9fw8PPLiX9W6PPXsPAPDbb37N
+Bnp5eDMK2TxGW1pHa4VWJxkZ6rqHtxCWg6qIIa0Vt3z9dt78hlcB8Dtv+Q0+/dkv0+sNKsn20IFM
+O2nx+hvey+e+cDNra+v8xq+/iMuftHs4pKkA4S1fv42nPfVyAF7+kufz+S/ewumnnwLA/Q/u4777
+7mPXrl1VyzXW/P/01CRnn2FWJx4+utCshnntG97FU59yKR/5y08/bh2UUnHggW+x84lP59t3fI+z
+zzyNa5/xZC679AKedMkFzM3NcPppp9DtDZolVfV2x3fu3jBoOnDwCAcOHsH13Oa9QpZ0e30uv8yc
+66HDxyoquWTv/oPN9375GVfx4f/8qQ0V+xN/9adcfdWlppuJAnq9QfPZNU+/CoCzzjyVe//5ywgh
+mKwcbGZmqlmEcuIo+vG7AK1GIf9jjF8TQYbvH0qb7vzuDxgMElqtECEEn/jbL7JBIbEBzGhO2baZ
+N73+FTz5iov4j3/xCd73/ht55ctesAEcfvDDH2fz5lne/IZX8UfvfQtve/OrOT6/yD985Zt84EMf
+p9Uew7IEF+zeXQkgTBsWRVHj7fXiy6Io+dwXbuFzX7j5Z4KkTqfFb77qRXzoI5/gR/c8wI/vfQDb
+tpmbm+bhe24FBN/57g/wPJcsG2aA4/NLjWTdoPaM5eU1tmyOm/fyrGBtrdsoOpRUzYy+biHrpeAn
+Gqq+L+B5u87mbz/2Z7zgxW9owGJ9c6p773uIpz3r5RsGS6O6gxOHUI+3WaNGPfHimIGIAVNaK6LI
+HJTtOOR5yf992/eM9z96hNvv/P7j/07lAJ/95J/z5Csu4sGH9vE7//5PWVxa3jAgEULwrt+9vskq
+T9z9TM4+/1ouufKFvP7N7+WRRw7w0IMP8eWvfJmf3vfTEZ0dLC+vsLpuLvyWzTMIMRRYbJqd4hN/
+9Sc/sz/+vXe8jjNOO6U5XCkVS0trFEXJ939wL4ePHOfwkePkxTADLCwusbC4Moz2omRhcdkYvHaK
+PKc/iLn9DnNttm2dMyROXnDK9i3N97717bsec0z/+sWvbwDdM3/5KXzw/e9sANyd3/1hAwTrbgRg
+65Y5Pnbj+5pZxb+kg7BOFhlND9q0kopXvPQ6AHadcxYAN3/jDgA+9Xf/2OwsioLmV+oVNmiY2zRT
+3QzKrJF/wXXPar63Zcss1//bl/PkKy5q3nv04duIV35Cf+lHHN9/B9/82sfZsWMLDz34EF/60hfI
+83Qk+lK+cvNd5HlBqxXyljf+OqCJooCPfPDd/OBHP/2ZJEmrFXLzP36Uq668uLnIb7/hNdi2xbve
+++d0ewNW17oblnEvL6+yuro+jDip6Hb7zW1Y6t9J04x3/N6fsrbeZW5uhmc/86kA/NZrXgLAPT95
+oMENQeA3/+u6Du98zwea16999b/hzW/4dSzL4r1/9GHyvGB6aoK33/AaylLSbrX467/4I26/8/v/
+ba1jMHGuHj526XDyPB1M7NLBxLk6nDxPR9MX6tbMxXpxaaVBqP3+QIeT5+mzL3iWVkrpJ+z+V9qf
+OFfv3X9Id7v9DUj64KGjOpy6QL/mde/UR47Oa621fvChvfpTf/cP+vq3vEcfO76g+/2BfuNbf19f
+ePnz9aMHj+iTbffe95AOJ89vfmd4PIm+8ukv10971q/pm772Lb2+3tPHji/qn96/R//eez+og8kL
+tD9x/sjjvOqxSxdFoZ/zr1+r33DDe/VP79+jDx0+po8cndff+NZ39FOveUlzbQ4dPrZhn/PzS3p+
+fql5XRSFfuo1L9Vr693mvbIs9ee/eLMOJs7Vuy5+tv7M576iFxaX9ZGj8/rAo4f1n37gL/XM9kt1
+MHGuPnjo6IbfX1hcbrqaelNKNaj+6mtepm++9Tbd6w30kaPz+u4f/kT/1vXv2tAB/EseIpg4V5+M
+OTI3i7CHWaFaR1/f2FkIu1E5S1UADoIS2/FRskRpWd3ezR65ye1QA6eHd+NDIPjaP/w1T3vq5bzj
+997P1279dgUQLa6+6jI+9GfvIklSprdfbm4zF4bs3LGDU045hUOHDvHoo4+SJPHj0B7Wz4h+/XPY
+8pOrah5P5jW6cvh/jMCp75L8P39zTn5RRMMWjS5g0BvkyHWG1487/txICP08tkpz6cXnA7Bv/0Ee
+3rO/uZiXXXIBAB/9xH9tji1NEvbu3cv+/fubRZ1Dzf3IjR5RI3ce/8Vd1Mdj7U72+r9vEydh8n6x
+jnFCBvhfuz31KU/i7W/5TS7cfW4zSLEsiwOPHubTn/0yn/z0l35BF/f//ZvG+jl0rvj/nwP87+3x
+HOBkpeoXkw2s/32p/7+wiccx9i8mA/w/VEUEq97e4c0AAAAASUVORK5CYII=
+
+--iKETDhtPafV07ewA9JlUOMitE--
+
+--------boundary-aYAmoTT04MIpviI--