From 6a691e8b3d19a9edd75290b9b023d29ec11cb1be Mon Sep 17 00:00:00 2001 From: Thierry Ducrest Date: Mon, 14 Feb 2022 10:08:43 +0100 Subject: [PATCH 01/17] Add ebill_postfinance --- ebill_postfinance/README.rst | 130 ++ ebill_postfinance/__init__.py | 1 + ebill_postfinance/__manifest__.py | 38 + ebill_postfinance/data/ir_cron.xml | 14 + ebill_postfinance/data/mail_activity_type.xml | 10 + ebill_postfinance/data/transmit.method.xml | 10 + .../messages/invoice-2003A.jinja | 238 +++ .../messages/invoice-yellowbill.jinja | 235 +++ .../messages/ybInvoice_V2.0.4.xsd | 1395 +++++++++++++++++ .../migrations/14.0.1.1.0/pre-migrate.py | 18 + ebill_postfinance/models/__init__.py | 5 + ebill_postfinance/models/account_move.py | 138 ++ .../models/ebill_payment_contract.py | 71 + .../ebill_postfinance_invoice_message.py | 388 +++++ .../models/ebill_postfinance_service.py | 154 ++ ebill_postfinance/models/sale_order.py | 19 + ebill_postfinance/readme/CONFIGURE.rst | 13 + ebill_postfinance/readme/CONTRIBUTORS.rst | 1 + ebill_postfinance/readme/DESCRIPTION.rst | 1 + ebill_postfinance/readme/INSTALL.rst | 2 + ebill_postfinance/readme/ROADMAP.rst | 10 + ebill_postfinance/readme/USAGE.rst | 5 + .../security/ir.model.access.csv | 5 + .../static/description/index.html | 470 ++++++ ebill_postfinance/tests/__init__.py | 2 + ebill_postfinance/tests/common.py | 228 +++ .../tests/examples/credit_note_yb.xml | 176 +++ .../tests/examples/invoice_qr_yb.xml | 192 +++ .../tests/examples/yellowbill_qr_iban.xml | 173 ++ .../fixtures/cassettes/test_ping_service.yaml | 1057 +++++++++++++ .../cassettes/test_search_invoices.yaml | 564 +++++++ .../fixtures/cassettes/test_upload_file.yaml | 561 +++++++ .../tests/test_ebill_postfinance.py | 50 + .../test_ebill_postfinance_message_yb.py | 57 + ...ebill_postfinance_message_yb_creditnote.py | 63 + .../views/ebill_payment_contract.xml | 56 + .../ebill_postfinance_invoice_message.xml | 81 + .../views/ebill_postfinance_service.xml | 136 ++ ebill_postfinance/views/message_template.xml | 8 + 39 files changed, 6775 insertions(+) create mode 100644 ebill_postfinance/README.rst create mode 100644 ebill_postfinance/__init__.py create mode 100644 ebill_postfinance/__manifest__.py create mode 100644 ebill_postfinance/data/ir_cron.xml create mode 100644 ebill_postfinance/data/mail_activity_type.xml create mode 100644 ebill_postfinance/data/transmit.method.xml create mode 100644 ebill_postfinance/messages/invoice-2003A.jinja create mode 100644 ebill_postfinance/messages/invoice-yellowbill.jinja create mode 100644 ebill_postfinance/messages/ybInvoice_V2.0.4.xsd create mode 100644 ebill_postfinance/migrations/14.0.1.1.0/pre-migrate.py create mode 100644 ebill_postfinance/models/__init__.py create mode 100644 ebill_postfinance/models/account_move.py create mode 100644 ebill_postfinance/models/ebill_payment_contract.py create mode 100644 ebill_postfinance/models/ebill_postfinance_invoice_message.py create mode 100644 ebill_postfinance/models/ebill_postfinance_service.py create mode 100644 ebill_postfinance/models/sale_order.py create mode 100644 ebill_postfinance/readme/CONFIGURE.rst create mode 100644 ebill_postfinance/readme/CONTRIBUTORS.rst create mode 100644 ebill_postfinance/readme/DESCRIPTION.rst create mode 100644 ebill_postfinance/readme/INSTALL.rst create mode 100644 ebill_postfinance/readme/ROADMAP.rst create mode 100644 ebill_postfinance/readme/USAGE.rst create mode 100644 ebill_postfinance/security/ir.model.access.csv create mode 100644 ebill_postfinance/static/description/index.html create mode 100644 ebill_postfinance/tests/__init__.py create mode 100644 ebill_postfinance/tests/common.py create mode 100644 ebill_postfinance/tests/examples/credit_note_yb.xml create mode 100644 ebill_postfinance/tests/examples/invoice_qr_yb.xml create mode 100644 ebill_postfinance/tests/examples/yellowbill_qr_iban.xml create mode 100644 ebill_postfinance/tests/fixtures/cassettes/test_ping_service.yaml create mode 100644 ebill_postfinance/tests/fixtures/cassettes/test_search_invoices.yaml create mode 100644 ebill_postfinance/tests/fixtures/cassettes/test_upload_file.yaml create mode 100644 ebill_postfinance/tests/test_ebill_postfinance.py create mode 100644 ebill_postfinance/tests/test_ebill_postfinance_message_yb.py create mode 100644 ebill_postfinance/tests/test_ebill_postfinance_message_yb_creditnote.py create mode 100644 ebill_postfinance/views/ebill_payment_contract.xml create mode 100644 ebill_postfinance/views/ebill_postfinance_invoice_message.xml create mode 100644 ebill_postfinance/views/ebill_postfinance_service.xml create mode 100644 ebill_postfinance/views/message_template.xml diff --git a/ebill_postfinance/README.rst b/ebill_postfinance/README.rst new file mode 100644 index 000000000..bfc34cc91 --- /dev/null +++ b/ebill_postfinance/README.rst @@ -0,0 +1,130 @@ +================= +eBill Postfinance +================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:3929253635a7ba24e2f067c4f492eb4bc8c0c54bd6f4ae12e8a8e23053528304 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fl10n--switzerland-lightgray.png?logo=github + :target: https://github.com/OCA/l10n-switzerland/tree/14.0/ebill_postfinance + :alt: OCA/l10n-switzerland +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/l10n-switzerland-14-0/l10n-switzerland-14-0-ebill_postfinance + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/l10n-switzerland&target_branch=14.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module implements the exchange of electronic invoices with the Postfinance web service. + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +This module needs the Python library `ebilling_postfiance` which can be installed from Pypi. +More information can be found at ``_. + +Configuration +============= + +Create a service +================ + +First you need to be registred on 'Postfinance eBill service ' +To create a service go to `Accounting - Configuration - Payments - Postfinance eBill Service` + +Configure a customer and create his contract +============================================ + +The contracts specific to Postfinance e-billing are located in `Accounting - Customers - eBill Postfinance Contract` +Create a contract for a customer with his PayerId and make sure that the contract is active by being in `Open` state with valid start/end dates. + +Set `Customer Invoice Transmission Method` on the customer to Postfinance. + +Usage +===== + +To use this module, you need to: + +#. Configure the service, customers and contracts as described in the CONFIGURATION section. +#. Create an invoice for a customer with an open Postfinance contract. +#. Validate the invoice, and click the Send eBill button. + +Known issues / Roadmap +====================== + +ToDo + +* Add option to import the contract subscription (csv) +* Add the download of this csv from web service, but what is the endpoint ? + + +Nice to have + +* Add a link to the failed job in the chatter message. +* Add an action on partner to create a ebilling contract. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Camptocamp + +Contributors +~~~~~~~~~~~~ + +* Thierry Ducrest + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-TDu| image:: https://github.com/TDu.png?size=40px + :target: https://github.com/TDu + :alt: TDu + +Current `maintainer `__: + +|maintainer-TDu| + +This module is part of the `OCA/l10n-switzerland `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/ebill_postfinance/__init__.py b/ebill_postfinance/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/ebill_postfinance/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/ebill_postfinance/__manifest__.py b/ebill_postfinance/__manifest__.py new file mode 100644 index 000000000..53ebd3dc9 --- /dev/null +++ b/ebill_postfinance/__manifest__.py @@ -0,0 +1,38 @@ +# Copyright 2022 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "eBill Postfinance", + "summary": """Postfinance eBill integration""", + "version": "14.0.1.1.0", + "license": "AGPL-3", + "author": "Camptocamp,Odoo Community Association (OCA)", + "maintainers": ["TDu"], + "website": "https://github.com/OCA/l10n-switzerland", + "depends": [ + "account", + "account_invoice_export", + "base_ebill_payment_contract", + "l10n_ch_base_bank", + "l10n_ch_qriban", + "queue_job", + "sale", + "sale_stock", + ], + "external_dependencies": { + "python": [ + "zeep", + "ebilling_postfinance", + ] + }, + "data": [ + "data/ir_cron.xml", + "data/transmit.method.xml", + "data/mail_activity_type.xml", + "security/ir.model.access.csv", + "views/ebill_payment_contract.xml", + "views/message_template.xml", + "views/ebill_postfinance_service.xml", + "views/ebill_postfinance_invoice_message.xml", + ], +} diff --git a/ebill_postfinance/data/ir_cron.xml b/ebill_postfinance/data/ir_cron.xml new file mode 100644 index 000000000..f8c11d528 --- /dev/null +++ b/ebill_postfinance/data/ir_cron.xml @@ -0,0 +1,14 @@ + + + + eBill Postfinance - Check invoices state on server + 1 + hours + -1 + + + + code + model.cron_update_invoices() + + diff --git a/ebill_postfinance/data/mail_activity_type.xml b/ebill_postfinance/data/mail_activity_type.xml new file mode 100644 index 000000000..399b38052 --- /dev/null +++ b/ebill_postfinance/data/mail_activity_type.xml @@ -0,0 +1,10 @@ + + + + eBill Postfinance Error + fa-warning + 0 + 99 + warning + + diff --git a/ebill_postfinance/data/transmit.method.xml b/ebill_postfinance/data/transmit.method.xml new file mode 100644 index 000000000..0fecfd649 --- /dev/null +++ b/ebill_postfinance/data/transmit.method.xml @@ -0,0 +1,10 @@ + + + + Postfinance + postfinance + + + + + diff --git a/ebill_postfinance/messages/invoice-2003A.jinja b/ebill_postfinance/messages/invoice-2003A.jinja new file mode 100644 index 000000000..7f9873da0 --- /dev/null +++ b/ebill_postfinance/messages/invoice-2003A.jinja @@ -0,0 +1,238 @@ + + + + + + {{ client_pid }} + + + 41010106799303734 + + {{ transaction_id }} + + +
+ + + + + + {{ invoice.name }} + {{ format_date() }} + + + + {{ format_date(invoice.date_invoice) }} + + + {{ format_date(invoice.date_invoice) }} + + + + + {{ invoice.name }} + {{ format_date(invoice.date_invoice) }} + + + {% for order in invoice_lines.sale_line_ids.mapped('order_id') if order.postfinance_ebill_client_order_ref %} + {%- if loop.index0 < 5 %} + + + {{ order.postfinance_ebill_client_order_ref }} + {{ format_date(order.date_order) }} + + + {%- endif %} + {% endfor %} + {% for picking in invoice_lines.sale_line_ids.move_ids.mapped('picking_id')[:9] %} + {%- if picking.state != 'cancel' %} + + + {{ picking.name }} + {%- if picking.date_done %} + {{ format_date(picking.date_done) }} + {%- endif %} + + + {%- endif %} + {% endfor %} + {% for ref in invoice.get_postfinance_other_reference() %} + + + {{ ref.no|truncate(35, True, "") }} + + + {% endfor %} + + + {#- Doc says vat number or business identitfiaction number #} + {%- if invoice.company_id.vat %} + {{ invoice.company_id.vat }} + {%- endif %} + {%- if invoice.payment_reference %} + {{ invoice.payment_reference }} + {%- endif %} + + {{ client_pid }} + + + + {{ biller.name }} + + + {{ (biller.street or '')|truncate(35, True, "") }} + {%- if biller.street2 %} + {{ biller.street2|truncate(5, True, "") }} + {% endif %} + + {{ biller.city or ''}} + {{ biller.zip or '' }} + {{ biller.country_id.code or 'CH' }} + + + {%- if payment_type in ['isr', 'esp'] %} + {{ bank_account }} + {{ bank.bank_id.clearing }} + {%- elif payment_type == 'qr' %} + {{ bank_account }} + {{ bank_account[4:9] if bank_account else ''}} + {%- endif %} + + + + + {{ ebill_account_number }} + + + + {%- if customer.name != customer.commercial_company_name and customer.commercial_company_name %} + {{ customer.commercial_company_name|truncate(35, True, '') }} + {%- endif %} + {{ (customer.name or "")|truncate(35, True, "") }} + + + {{ (customer.street or "")|truncate(35, True, "") }} + {%- if customer.street2 %} + {{ customer.street2|truncate(35, True, "") }} + {%- endif %} + + {{ customer.city or ""}} + {{ customer.zip or ""}} + {{ customer.country_id.code or 'CH' }} + + + {%- if delivery %} + + + + {%- if delivery.name != delivery.commercial_company_name and delivery.commercial_company_name %} + {{ delivery.commercial_company_name|truncate(35, True, '') }} + {%- endif %} + {{ (delivery.name or "")|truncate(35, True, "") }} + + + {{ (delivery.street or "")|truncate(35, True, "") }} + {%- if delivery.street2 %} + {{ delivery.street2|truncate(35, True, "") }} + {%- endif %} + + {{ delivery.city or '' }} + {{ delivery.zip or '' }} + {{ delivery.country_id.code or 'CH' }} + + + {%- endif %} +
+ {% for line in invoice_lines %} + + {%- if line.product_id %} + + {{ line.product_id.default_code or ''}} + {{ line.product_id.default_code or ''}} + + {%- endif %} + + 1011 + {{ (line.product_id.name or line.name or "")[:35] }} + {%- if (line.product_id.name or line.name or "")|length > 35 %} + {{ (line.product_id.name or line.name)[35:]|truncate(34, True) }} + {%- endif %} + + {% for order in invoice_lines.sale_line_ids.mapped('order_id') %} + {%- if order.postfinance_ebill_client_order_ref %} + + + {{ order.postfinance_ebill_client_order_ref }} + {{ format_date(order.date_order) }} + + + {%- endif %} + {% endfor %} + {{ line.quantity }} + {{ line.price_subtotal|round(2) }} + {{ line.price_subtotal|round(2) }} + {{ line.price_total|round(2) }} + + {{ line.price_subtotal|round(2) }} + + {% for tax in line.tax_ids %} + {%- if loop.index == 1 %} + + {{ tax.amount}} + {{ tax._compute_amount(line.price_subtotal, line.price_unit)|round(2) }} + + {%- endif %} + {% else %} + + 0 + + {% endfor %} + + {% endfor %} + + + {{ invoice.amount_total|round(2) }} + + + {{ invoice.amount_tax|round(2) }} + + + {{ invoice.amount_untaxed|round(2) }} + + {% if amount_by_group %} + {% for taxgroup in amount_by_group %} + + + {{ taxgroup[2]|round(2) }} + + {%- if taxgroup[0] %} + {{ taxgroup[0] }} + {%- else %} + 0 + {%- endif %} + {{ taxgroup[1]|round(2) }} + + {% endfor %} + {%- else %} + + + {{ invoice.amount_untaxed|round(2) }} + + 0 + 0 + + {% endif -%} + + + + {{ date_due }} + + + {% include discount_template ignore missing %} + + + {{- pdf_data | safe -}} + + +
+
diff --git a/ebill_postfinance/messages/invoice-yellowbill.jinja b/ebill_postfinance/messages/invoice-yellowbill.jinja new file mode 100644 index 000000000..c4e6e9dd4 --- /dev/null +++ b/ebill_postfinance/messages/invoice-yellowbill.jinja @@ -0,0 +1,235 @@ + + +
+ {{ invoice.company_id.name }} + IPECeBILLServer + CreateybInvoice + 1 + 2.0 + 0 + Odoo + 14.0 +
+ + {% set ref = namespace(position = 0) %} + + {{ message.service_id.biller_id }} + {{ ebill_account_number }} + {{ format_date(invoice.date_invoice) }} + {{ transaction_id }} + PDFAppendix + + + +
+ {{ 'BILL' if invoice.move_type == 'out_invoice' else 'CREDITADVICE' }} + {{ invoice.name }} + {{ format_date(invoice.date_invoice) }} + + VAT + +
+ {{ biller.name }} + {{ (biller.street or "")|truncate(50, True, "") }} + {%- if biller.street2 %} + {{ (biller.street2)|truncate(50, True, "") }} + {%- endif %} + {{ biller.zip or "" }} + {{ biller.city or "" }} + {{ biller.country_id.code or 'CH' }} + {%- if biller.email %} + {{ biller.email }} + {%- endif %} + {%- if biller.phone %} + {{ biller.phone }} + {%- endif %} + {%- if biller.mobile %} + {{ biller.mobile }} + {%- endif %} +
+ {%- if invoice.company_id.vat %} + {{ invoice.company_id.vat|replace("-", "")|replace(".", "") }} + {%- endif %} +
+
+ + + {{ customer.id }} +
+ {{ (customer.commercial_company_name or customer.name)|truncate(50, True, "") }} + {{ (customer.street or "")|truncate(50, True, "") }} + {%- if customer.street2 %} + {{ (customer.street2)|truncate(50, True, "") }} + {%- endif %} + {{ customer.zip or "" }} + {{ customer.city or "" }} + {{ customer.country_id.code or 'CH' }} + {%- if customer.email %} + {{ customer.email }} + {%- endif %} + {%- if customer.phone %} + {{ customer.phone }} + {%- endif %} + {%- if customer.mobile %} + {{ customer.mobile }} + {%- endif %} +
+ {# {%- if invoice.company_id.vat %} #} + {# {{ invoice.company_id.vat|replace("-", "")|replace(".", "") }} #} + {# {%- endif %} #} +
+
+ {%- if False %} + {# So is this where the invoice is sent and not who it is for ? #} + +
+
+
+ {%- endif %} + {%- if delivery %} + +
+ {{ (delivery.commercial_company_name or delivery.name)|truncate(50, True, "") }} + {{ delivery.zip or "" }} + {{ delivery.city or "" }} + {{ delivery.country_id.code or 'CH' }} + {%- if delivery.email %} + {{ delivery.email }} + {%- endif %} + {%- if delivery.phone %} + {{ delivery.phone }} + {%- endif %} + {%- if delivery.mobile %} + {{ delivery.mobile }} + {%- endif %} +
+
+ {%- endif %} + + {# Not sure what is this ? #} + {{ format_date(invoice.date_invoice) }} + {{ format_date(invoice.date_invoice) }} + + {{ invoice.currency_id.name }} + + + {%- if saleorder|length == 1 %} + {% if saleorder.postfinance_ebill_client_order_ref %} + {% set ref.position = ref.position + 1 %} + + {{ ref.position }} + OrderReference + {{ saleorder.postfinance_ebill_client_order_ref }} + + {%- endif %} + {{ format_date(saleorder.date_order) }} + {%- endif %} + + + {{ (customer.lang or "en")|truncate(2, True, "") }} + + {{ date_due }} + {{ payment_type|upper }} + Yes + {% if payment_type == 'iban' %} + + {%- if bank.bank_id.clearing %} + {{ bank.bank_id.clearing }} + {%- endif %} + {{ bank.bank_id.name[:50] }} + {{ bank_account }} + {%- if invoice.payment_reference %} + {{ invoice.payment_reference }} + {%- endif %} + + {%- endif %} + +
+ + {% for line in invoice_lines %} + + {# discount, shipping and rounding go here too #} + NORMAL + {{ loop.index }} + {{ (line.product_id.name or line.name or "")[:255] }} + {%- if line.product_id %} + {{ line.product_id.default_code or ''}} + {%- endif %} + {{ line.quantity or 0 }} + {{ line.product_uom_id.name or "PCE"}} + 1 + {% for tax in line.tax_ids %} + {%- if loop.index == 1 %} + + + {{ tax.amount|round(2)|replace(",", ".") }} + {{ tax._compute_amount(line.price_subtotal, line.price_unit)|round(2) }} + {{ line.price_subtotal|round(6) }} + {{ line.price_total|round(6) }} + + {{ tax._compute_amount(line.price_subtotal, line.price_unit)|round(2) }} + + {%- endif %} + {% endfor %} + {{ line.price_total|round(6) }} + {{ line.price_subtotal|round(6) }} + + {% for order in line.sale_line_ids.mapped('order_id') %} + {% set ref.position = ref.position + 1 %} + + {{ ref.position }} + OrderNumberBySupplier + {{ order.name }} + + {%- if order.postfinance_ebill_client_order_ref %} + {% set ref.position = ref.position + 1 %} + + {{ ref.position }} + OrderNumberByBuyer + {{ order.postfinance_ebill_client_order_ref }} + + {%- endif %} + {% endfor %} + + {% for picking in line.sale_line_ids.move_ids.mapped('picking_id') %} + {%- if picking.state != 'cancel' %} + {% set ref.position = ref.position + 1 %} + + {{ ref.position }} + DeliveryNoteNumber + {{ picking.name }} + + {%- endif %} + {% endfor %} + + {% endfor %} + + + {% if amount_by_group %} + + {% for taxgroup in amount_by_group %} + + {{ taxgroup[0]|replace(",", ".") or "0" }} + {{ taxgroup[1]|round(2)|round(6) }} + {{ taxgroup[2]|round(6) }} + {{ taxgroup[2]|round(6) + taxgroup[1]|round(6) }} + + {% endfor %} + {{ invoice.amount_tax|round(6) }} + + {% endif -%} + {# #} + {# #} + {# #} + {# #} + {{ invoice.amount_untaxed * amount_sign }} + {{ invoice.amount_total * amount_sign }} + {# #} + {{ invoice.amount_total * amount_sign }} + +
+ + {{- pdf_data | safe -}} + + +
diff --git a/ebill_postfinance/messages/ybInvoice_V2.0.4.xsd b/ebill_postfinance/messages/ybInvoice_V2.0.4.xsd new file mode 100644 index 000000000..1ef840eb9 --- /dev/null +++ b/ebill_postfinance/messages/ybInvoice_V2.0.4.xsd @@ -0,0 +1,1395 @@ + + + + + + + + + complextype delivery + + + + + N [17], modulo-checked sender ID, assigned by yellowbill (e.g.: "41100000000002256") + + + + + + + + + + ReceiverID + + + + N [17], modulo-checked receiver ID + + + + + + + + + + + + + + + + + + + AN [15], Number of bill run, if more than one bill run per period. Length is maximum 15 characters. + + + + + + + + Date [yyyy-mm-dd] must be equal to DocumentDate in node bill. + + + + + AN [50] unique transaction identification assigned by sender. This ID is being used in the PDF- and XML-bill filename. Length is maximum 50 characters. + + + + + + + + + + [PDF;PDFSystem;PDFAppendix] type of bill detail, usualy PDF = PDF-Format; PDFSystem = PDF generated by yellowbil; PDFAppendix = PDF delivered by sender embedded in Appendix node + + + + + + + + + + + + deprecated + + + + + + + + + + + + complextype ybinvoice + + + + + node delivery info + + + + + node bill + + + + + node appendix data + + + + + + + complextype BillHeader + + + + + [BILL; CREDITADVICE; REMINDER] type of document + + + + + + + + + + + + + [partial, final] subtype of document + + + + + + + + + + + + AN [70] document identification by sender (e.g. bill no. 527-45-678-78) + + + + + + + + + + additional document reference defined by sender. + + + + + [yyyy-mm-dd] Date of document. Must be equal to DeliveryDate in node DeliveryInfo + + + + + Identification and information about sender + + + + + + EBPP network identification + + + + + Flag to show, if biller has to declare VAT information or not. + + + + + + + + + + + + + + + Identification and information about receiver + + + + + + EBPP network identification + + + + + + + + + Indications of receiver party + + + + + Information about delivery + + + + + This value is mandatory, if there is no entry in lineitem of node billlineitem + + + + + AN [3] currency code ISO 4217; Permitted: CHF, EUR, AUD, CAD, DKK, GBP, JPY, NOK, SEK, USD + + + + + + + + + + + + + + + + + + + + + order- and account references + + + + + enumerated references has to use a ReferenceType according to manual e-bill + + + + + [de, fr, it, en] Standard 2-letter language code ISO 639 (e.g.: German=de, French=fr, Italian=it, English=en) + + + + + + + + + + + + + payment information + + + + + + [yyyy-mm-dd] Due date for payment (e.g.:"2004-07-25") + + + + + [ESR;DD;CREDIT;OTHER;IBAN] method of payment + + + + + + + + + + + + + + [Yes;No] case-sensitive. Indication wether amount is changeable upon payment or not (default:"Yes") + + + + + + + + + + + Orange inpayment slip (ESR) + + + + + + N [2]-[6]-[1] or [9] Orange inpayment slip (ESR) customer number of sender (e.g. "01-123456-1" or "011234561"). First two positions must be "01" for CHF or "03" for EUR + + + + + + + + + + N [27] Reference number of orange inpayment slip (ESR) + + + + + + + + + + + + + International payment instruction + + + + + + AN [11] bank identifier code + + + + + + + + + + AN [50] name of the bank + + + + + + + + + + AN [34] internatinoal bank account number + + + + + + + + + + AN [50] name of the creditor + + + + + + + + + + AN [140] reference + + + + + + + + + + [BEN;OUR;SHA] case-sensitive. Indication by whom the bank charges has to be paid. + + + + + + + + + + + + + + + node instalments + + + + + + + + + + + + + AN [255] bill header freetext + + + + + + + + + + complextype Network + + + + + AN [30] network identification + + + + + + + + AN [30] unique network identification. If sender = BillerID; if receiver = EBPP network ID (eBill-account-ID) + + + + + + + + + + complextype Address + + + + + AN [50] companyname, must correspond to Tax register entry. Mandatory for VAT validity. + + + + + + + + AN [70] Name of company division + + + + + + + + AN [10] Mr. / Mrs. / Title + + + + + + + + AN [50] familyname + + + + + + + + AN [50] givenname + + + + + + + + AN [50] Address 1. Address1 or POBox has to be filled out. + + + + + + + + AN [50] Address 2 + + + + + + + + AN [50] PoBox, Address1 or POBox has to be filled out. + + + + + + + + AN [10] Postal code + + + + + + + + AN [50] city + + + + + + + + A [2] ISO Standard 3166-1 (CH, DE, etc.) + + + + + + + + + + AN [255] e-mail + + + + + + + + AN [70] contact information + + + + + + + + AN [70] contact information + + + + + + + + + + complextype Party + + + + + AN [50] senders or receivers customer identification + + + + + + + + + AN [50] VAT number of sender or receiver. Mandatory for sender if attribute TaxLiability is VAT. + + + + + + + + additional reference, e.g. delivery number + + + + + + + complextype AchievementDate + + + + + [yyyy-mm-dd] Startdate of achievement range + + + + + [yyyy-mm-dd] enddate of achievement range. End date can be equal, but not earlier to start date + + + + + + + complextype LineItem + + + + + [NORMAL, LINEITEMALLOWANCEANDCHARGE, GLOBALALLOWANCEANDCHARGE, SHIPPINGANDHANDLING, ROUNDING] type of lineitem + + + + + + + + + + + + + + AN [70] position of lineitem + + + + + + + + AN [50] description of product group as title + + + + + + + + AN [50] description of product subgroup as title + + + + + + + + This value is mandatory, if there is no entry in node AchievementDate of node billheader + + + + + AN [255] description of product or service + + + + + + + + AN [70] product-, article or achievementnumber, assigned by sender + + + + + + + + N [18] European/International Article Number + + + + + + + + + + N [13].[6] quantity + + + + + + + + AN[20] +must be agreed with the billRecipient + + + + + + + + + + + N [17].[2] quantity delivered per price (default = 1) + + + + + + + + N [17].[6] price incl. VAT per price unit + + + + + N [17].[6] price excl. VAT per price unit + + + + + tax detail per line item + + + + + N [17].[6] sum of BaseAmountInclusiveTax values (node TaxDetail) + + + + + + + + N [17].[6] sum of all BaseAmountExclusiveTax values (node TaxDetail) + + + + + + + + order- and account references + + + + + enumerated references + + + + + additional Lineitem reference defined by sender. + + + + + informations about allowance and charges, only allowed if LineItemType is "GLOBALALLOWANCEANDCHARGE" oder "LINEITEMALLOWANCEANDCHARGE" + + + + + + N [17].[6] indication as amount + + + + + + + + N [2].[2] indication in % + + + + + + + + Qualifiers the kind of allowance or charge + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AN [255] free text per line item + + + + + + + + + + complextype TaxDetail + + + + + N [2].[2] percantage of tax rate (e.g. 7.60) + + + + + + + + N [17].[6] effective tax amount per tax rate + + + + + + + + N [17].[6] baseamount exclusive tax per tax rate + + + + + + + + N [17].[6] baseamount inclusive tax per tax rate + + + + + + + + + + complextype Tax + + + + + taxdetails per tax rate + + + + + N [17].[2] sum of tax amounts + + + + + + + + + + complextype Tax + + + + + taxdetails per tax rate + + + + + N [17].[6] sum of tax amounts + + + + + + + + + + complextype Summary + + + + + + Discount on payment (Skonto) + + + + + + + N [2] number of days when discount rate is allowed + + + + + + + + [yyyy-mm-dd] + + + + + + N [2].[2] Discount rate in % (Skontosatz in %) + + + + + + + + + + + N [17].[2] overall total amount excl. tax + + + + + + + + N [17].[2] overall total amount incl. tax. Must correspond to TotalAmount in PaymentData + + + + + + + + N [17].[6] amount of rounding + + + + + + + + bill summary freetext + + + + + N [17].[2] total of prepaid amount + + + + + + + + N [17].[2] total amount incl. tax with subtraction of prepaid amount. + + + + + + + + + + complextype Bill + + + + + node bill header + + + + + + + + + + node bill line items + + + + + + detail information per position + + + + + + + + node bill summary + + + + + + + systemnode + + + + + + node envelope header + + + + + node envelope body + + + + + + + + + complextype AccountAssignment + + + + + order reference has to use "OrderReference" as ReferenceType + + + + + AN [20] order position number + + + + + + + + [yyyy-mm-dd] date of based order + + + + + AN [70] article, achievement or product number, assigned by receiver + + + + + + + + AN [70] description of cost type + + + + + + + + AN [70] description of account type + + + + + + + + AN [70] account number + + + + + + + + AN [70] name or identification of company division + + + + + + + + AN[70] name or identification of the building + + + + + + + + AN[70] name or identification of the machine + + + + + + + + AN [70] name or identification of the job + + + + + + + + AN [70] name or identification of the project + + + + + + + + + + complextype Header + + + + + AN [70] sender companyname (e.g.: "Muster AG") + + + + + + + + AN targetsystemname (value: "IPECeBILLServer") + + + + + + + + + + AN usecasename (value: "CreateybInvoice") + + + + + + + + + + + N IPEC systemID (value: "1") + + + + + + + + + + N ybInvoice-version (value: "2.0") + + + + + + + + + + + N IPEC systemID (value: "0") + + + + + + + + + + + + + + + + + + + + + + + + + + complextype Reference + + + + + AN [50] position (number) of reference + + + + + + + + AN [50] type of reference + + + + + + + + AN [70] value of reference + + + + + + + + + + complextype Reference + + + + + AN [50] position (number) of reference + + + + + + + + AN [50] type of reference + + + + + + + + + + + + + + + + + + + + + AN [70] value of reference + + + + + + + + + + complextype Appendix + + + + + Any attachment as Base64 String. In case of BillDetailsType= PDFAppendix, the PDF bill detail has to be placed here with MimeType=x-application/pdfappendix. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Einzelrate, die der Rechnungsempfänger zur Zahlung freigeben kann. Die maximale Anzahl der Raten pro Ratengruppe ist auf 99 eingeschränkt. + + + + + + + complextype Instalment + + + + + + + + + + + + N [17].[2] amount of instalment inclusive tax + + + + + + + + [yyyy-mm-dd] Due date for payment (e.g.:"2004-07-25") + + + + + + N [27] Reference number of orange inpayment slip (ESR) + + + + + + + + + + + + AN [140] reference + + + + + + + + + + + diff --git a/ebill_postfinance/migrations/14.0.1.1.0/pre-migrate.py b/ebill_postfinance/migrations/14.0.1.1.0/pre-migrate.py new file mode 100644 index 000000000..286ab4dda --- /dev/null +++ b/ebill_postfinance/migrations/14.0.1.1.0/pre-migrate.py @@ -0,0 +1,18 @@ +# Copyright 2023 Camptocamp SA (http://www.camptocamp.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +def migrate(cr, version): + if not version: + return + + cr.execute( + """ + UPDATE ebill_postfinance_invoice_message + SET payment_type = 'iban' + WHERE payment_type = 'qr'; + UPDATE ebill_postfinance_invoice_message + SET payment_type = 'esr' + WHERE payment_type = 'isr'; + """ + ) diff --git a/ebill_postfinance/models/__init__.py b/ebill_postfinance/models/__init__.py new file mode 100644 index 000000000..ab63cba5e --- /dev/null +++ b/ebill_postfinance/models/__init__.py @@ -0,0 +1,5 @@ +from . import account_move +from . import ebill_payment_contract +from . import ebill_postfinance_invoice_message +from . import ebill_postfinance_service +from . import sale_order diff --git a/ebill_postfinance/models/account_move.py b/ebill_postfinance/models/account_move.py new file mode 100644 index 000000000..51d46afe7 --- /dev/null +++ b/ebill_postfinance/models/account_move.py @@ -0,0 +1,138 @@ +# Copyright 2019 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import base64 +import logging + +import odoo +from odoo import _, api, fields, models +from odoo.exceptions import UserError +from odoo.tools.pdf import merge_pdf + +_logger = logging.getLogger(__name__) + + +class AccountMove(models.Model): + + _inherit = "account.move" + + @api.onchange("partner_id", "company_id") + def _transmit_method_partner_change(self): + super()._transmit_method_partner_change() + if self.move_type not in ("out_invoice", "out_refund"): + return + postfinance_method = self.env.ref( + "ebill_postfinance.postfinance_transmit_method" + ) + if self.transmit_method_id == postfinance_method: + contract = self.partner_id.get_active_contract(self.transmit_method_id) + if contract: + self.partner_bank_id = contract.postfinance_service_id.partner_bank_id + + def _export_invoice(self): + """Export invoice with the help of account_invoice_export module.""" + postfinance_method = self.env.ref( + "ebill_postfinance.postfinance_transmit_method" + ) + if self.transmit_method_id != postfinance_method: + return super()._export_invoice() + message = self.create_postfinance_ebill() + if not message: + raise UserError(_("Error generating postfinance eBill")) + message.send_to_postfinance() + self.invoice_exported = True + return "Postfinance invoice generated and in state {}".format(message.state) + + def create_postfinance_ebill(self): + """Generate the message record for an invoice.""" + self.ensure_one() + contract = self.partner_id.get_active_contract(self.transmit_method_id) + if not contract: + return + # Generate PDf to be send + pdf_data = [] + # When test are run, pdf are not generated, so use an empty pdf + pdf = b"" + report_names = ["account.report_invoice"] + payment_type = "" + if self.move_type == "out_invoice": + payment_type = "iban" + if contract.payment_type == "qr": + report_names.append("l10n_ch.qr_report_main") + elif self.move_type == "out_refund": + payment_type = "credit" + for report_name in report_names: + r = self.env["ir.actions.report"]._get_report_from_name(report_name) + pdf_content, _ = r._render([self.id]) + pdf_data.append(pdf_content) + if not odoo.tools.config["test_enable"]: + if len(pdf_data) > 1: + pdf = merge_pdf(pdf_data) + elif len(pdf_data) == 1: + pdf = pdf_data[0] + message = self.env["ebill.postfinance.invoice.message"].create( + { + "service_id": contract.postfinance_service_id.id, + "invoice_id": self.id, + "ebill_account_number": contract.postfinance_billerid, + "payment_type": payment_type, + "ebill_payment_contract_id": contract.id, + } + ) + attachment = self.env["ir.attachment"].create( + { + "name": "postfinance ebill", + "type": "binary", + "datas": base64.b64encode(pdf).decode("ascii"), + "res_model": "ebill.postfinance.invoice.message", + "res_id": message.id, + "mimetype": "application/x-pdf", + } + ) + message.attachment_id = attachment.id + return message + + def postfinance_invoice_line_ids(self): + """Filter invoice line to be included in XML message. + + Invoicing line that are UX based (notes, sections) are removed. + + """ + self.ensure_one() + return self.invoice_line_ids.filtered(lambda r: not r.display_type) + + def get_postfinance_other_reference(self): + """Allows glue module to insert in the
+ + Add to the list ref, object strucutred like this: + + {'type': other reference allowed types, + 'no': the content of desired + } + """ + self.ensure_one() + return [] + + def log_invoice_accepted_by_system(self): + """ """ + self.activity_feedback( + ["ebill_postfinance.mail_activity_dws_error"], + feedback="It worked on a later try", + ) + self.message_post(body=_("Invoice accepted by the Postfinance system")) + self.invoice_export_confirmed = True + + def log_invoice_refused_by_system(self): + """ """ + activity_type = "ebill_postfinance.mail_activity_dws_error" + activity = self.activity_reschedule( + [activity_type], date_deadline=fields.Date.today() + ) + values = {} + if not activity: + message = self.env.ref("ebill_postfinance.rejected_invoice")._render( + values=values + ) + activity = self.activity_schedule( + activity_type, summary="Invoice rejected by Postfinance", note=message + ) diff --git a/ebill_postfinance/models/ebill_payment_contract.py b/ebill_postfinance/models/ebill_payment_contract.py new file mode 100644 index 000000000..6e9070c95 --- /dev/null +++ b/ebill_postfinance/models/ebill_payment_contract.py @@ -0,0 +1,71 @@ +# Copyright 2019 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class EbillPaymentContract(models.Model): + _inherit = "ebill.payment.contract" + + postfinance_billerid = fields.Char(string="Biller ID", size=20) + is_postfinance_contract = fields.Boolean( + compute="_compute_is_postfinance_contract", store=False + ) + postfinance_service_id = fields.Many2one( + comodel_name="ebill.postfinance.service", + string="Service", + ondelete="restrict", + ) + is_postfinance_method_on_partner = fields.Boolean( + compute="_compute_is_postfinance_method_on_partner" + ) + payment_type = fields.Selection( + selection=[("qr", "QR"), ("isr", "ISR")], + string="Payment method", + default="qr", + help="Payment type to use for the invoices sent," + " PDF will be generated and attached accordingly.", + ) + + @api.depends("transmit_method_id") + def _compute_is_postfinance_contract(self): + transmit_method = self.env.ref("ebill_postfinance.postfinance_transmit_method") + for record in self: + record.is_postfinance_contract = ( + record.transmit_method_id == transmit_method + ) + + @api.depends("transmit_method_id", "partner_id", "postfinance_service_id") + def _compute_is_postfinance_method_on_partner(self): + transmit_method = self.env.ref("ebill_postfinance.postfinance_transmit_method") + for record in self: + record.is_postfinance_method_on_partner = ( + record.partner_id.customer_invoice_transmit_method_id == transmit_method + ) + + def set_postfinance_method_on_partner(self): + transmit_method = self.env.ref("ebill_postfinance.postfinance_transmit_method") + for record in self: + if record.partner_id: + record.partner_id.customer_invoice_transmit_method_id = transmit_method + + @api.constrains("transmit_method_id", "postfinance_billerid") + def _check_postfinance_biller_id(self): + for contract in self: + if not contract.is_postfinance_contract: + continue + if not contract.postfinance_billerid: + raise ValidationError( + _( + "The Postfinacnce Account ID is required for a Postfinance contract." + ) + ) + + @api.constrains("transmit_method_id", "postfinance_service_id") + def _check_postfinance_service_id(self): + for contract in self: + if contract.is_postfinance_contract and not contract.postfinance_service_id: + raise ValidationError( + _("A Postfinance service is required for a Postfinance contract.") + ) diff --git a/ebill_postfinance/models/ebill_postfinance_invoice_message.py b/ebill_postfinance/models/ebill_postfinance_invoice_message.py new file mode 100644 index 000000000..3af477674 --- /dev/null +++ b/ebill_postfinance/models/ebill_postfinance_invoice_message.py @@ -0,0 +1,388 @@ +# Copyright 2019-2022 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import logging +import os +from datetime import datetime + +import pytz +from jinja2 import Environment, FileSystemLoader +from lxml import etree + +from odoo import _, api, fields, models +from odoo.exceptions import UserError +from odoo.modules.module import get_module_root + +from odoo.addons.base.models.res_bank import sanitize_account_number + +_logger = logging.getLogger(__name__) + +MODULE_PATH = get_module_root(os.path.dirname(__file__)) +INVOICE_TEMPLATE_2003 = "invoice-2003A.jinja" +INVOICE_TEMPLATE_YB = "invoice-yellowbill.jinja" +TEMPLATE_DIR = [MODULE_PATH + "/messages"] +XML_SCHEMA_YB = MODULE_PATH + "/messages/ybInvoice_V2.0.4.xsd" + +DOCUMENT_TYPE = {"out_invoice": "EFD", "out_refund": "EGS"} + + +class EbillPostfinanceInvoiceMessage(models.Model): + _name = "ebill.postfinance.invoice.message" + _description = "Postfinance message send to service" + + service_id = fields.Many2one( + comodel_name="ebill.postfinance.service", + string="Service used", + required=True, + ondelete="restrict", + readonly=True, + ) + ebill_payment_contract_id = fields.Many2one(comodel_name="ebill.payment.contract") + invoice_id = fields.Many2one(comodel_name="account.move", ondelete="restrict") + transaction_id = fields.Char(string="Transaction Id") + file_type_used = fields.Char() + submitted_on = fields.Datetime(string="Submitted on") + attachment_id = fields.Many2one("ir.attachment", "PDF") + state = fields.Selection( + selection=[ + ("draft", "Draft"), + ("sent", "Sent"), + ("error", "Error"), + ("processing", "Processing"), + ("reject", "Reject"), + ("done", "Done"), + ], + default="draft", + ) + server_state = fields.Selection( + selection=[ + ("invalid", "Invalid"), + ("processing", "Processing"), + ("unsigned", "Unsigned"), + ("open", "Open"), + ("paid", "Paid"), + # Not encountered states + ("rejected", "Rejected"), + ("incomplete", "Incomplete"), + ("deleted", "Deleted"), + ], + ) + server_reason_code = fields.Integer(string="Error code") + server_reason_text = fields.Char(string="Error text") + + # Set with invoice_id.number but also with returned data from server ? + ref = fields.Char("Reference No.", size=35) + ebill_account_number = fields.Char("Paynet Id", size=20) + payload = fields.Text("Payload sent") + payload_size = fields.Float( + "Payload Size (MB)", digits=(6, 3), compute="_compute_payload_size" + ) + response = fields.Text("Response") + payment_type = fields.Selection( + selection=[ + ("iban", "IBAN"), + ("credit", "CREDIT"), + ("other", "OTHER"), + ("dd", "DD"), + ("esr", "ESR"), + ], + default="iban", + readonly=True, + ) + + @api.depends("payload") + def _compute_payload_size(self): + for message in self: + size_in_bytes = len(message.payload) + if size_in_bytes > 0: + size_in_bytes = size_in_bytes / 1000000 + message.payload_size = size_in_bytes + + def set_transaction_id(self): + self.ensure_one() + self.transaction_id = "-".join( + [ + fields.Datetime.now().strftime("%y%m%d%H%M%S"), + self.invoice_id.name.replace("/", "").replace("_", ""), + ] + ) + + def update_message_from_server_data(self, data): + """Update the invoice message with data received from the server. + + Keyword arguments: + data -- Structure from the api + Example: + { + 'BillerId': '41101000001021209', + 'TransactionId': 'INV_2022_03_0001_2022_03_26_08_31_xml', + 'eBillAccountId': '123412341234', + 'Amount': Decimal('0'), + 'State': 'Invalid', + 'PaymentType': None, + 'ESRReferenceNbr': None, + 'DeliveryDate': datetime.datetime(2022, 3, 26, 0, 0), + 'PaymentDueDate': None, + 'ReasonCode': '16', + 'ReasonText': 'some good reason' + } + """ + self.ensure_one() + self.server_state = data.State.lower() + self.server_reason_code = data.ReasonCode + self.server_reason_text = data.ReasonText + if self.server_state in ["invalid"]: + self.state = "error" + elif self.server_state == "processing": + self.state = "processing" + elif self.server_state == "paid": + self.set_as_paid(data) + + def set_as_paid(self, data): + for record in self: + if record.state != "done": + record.state = "done" + record.invoice_id.message_post(body=_("Invoice paid through eBilling")) + + def send_to_postfinance(self): + # TODO: Could sent multiple with one call + for message in self: + message.file_type_used = message.service_id.file_type_to_use + message.set_transaction_id() + message.payload = message._generate_payload() + try: + # TODO: Handle file type from service configuation + data = message.payload.encode("utf-8") + res = message.service_id.upload_file( + message.transaction_id, message.file_type_used, data + ) + response = res[0] + if response.ProcessingState == "OK": + message.state = "sent" + submit_date_utc = response.SubmitDate.astimezone(pytz.utc) + message.submitted_on = submit_date_utc.replace(tzinfo=None) + message.response = response + else: + message.state = "error" + message.server_reason_code = "NOK" + message.server_reason_text = "Could not be sent to sftp" + except Exception as ex: + message.response = "Exception sending to Postfinance" + message.state = "error" + raise ex + + @staticmethod + def format_date(date_string=None): + """Format a date in the Jinja template.""" + if not date_string: + date_string = datetime.now() + return date_string.strftime("%Y%m%d") + + @staticmethod + def format_date_yb(date_string=None): + """Format a date in the Jinja template.""" + if not date_string: + date_string = datetime.now() + return date_string.strftime("%Y-%m-%d") + + def _get_payload_params(self): + bank_account = "" + if self.payment_type == "iban": + bank_account = sanitize_account_number( + self.invoice_id.partner_bank_id.l10n_ch_qr_iban + or self.invoice_id.partner_bank_id.acc_number + ) + else: + bank_account = self.invoice_id.partner_bank_id.l10n_ch_isr_subscription_chf + if bank_account: + account_parts = bank_account.split("-") + bank_account = ( + account_parts[0] + account_parts[1].rjust(6, "0") + account_parts[2] + ) + else: + bank_account = "" + + params = { + "client_pid": self.service_id.biller_id, + "invoice": self.invoice_id, + "invoice_lines": self.invoice_id.postfinance_invoice_line_ids(), + "biller": self.invoice_id.company_id, + "customer": self.invoice_id.partner_id, + "delivery": self.invoice_id.partner_shipping_id, + "pdf_data": self.attachment_id.datas.decode("ascii"), + "bank": self.invoice_id.partner_bank_id, + "bank_account": bank_account, + "transaction_id": self.transaction_id, + "payment_type": self.payment_type, + "document_type": DOCUMENT_TYPE[self.invoice_id.move_type], + "format_date": self.format_date, + "ebill_account_number": self.ebill_account_number, + "discount_template": "", + "discount": {}, + } + amount_by_group = [] + # Get the percentage of the tax from the name of the group + # Could be improve by searching in the account_tax linked to the group + for taxgroup in self.invoice_id.amount_by_group: + rate = taxgroup[0].split()[-1:][0][:-1] + amount_by_group.append( + ( + rate or "0", + taxgroup[1], + taxgroup[2], + ) + ) + params["amount_by_group"] = amount_by_group + # Get the invoice due date + date_due = None + if self.invoice_id.invoice_payment_term_id: + terms = self.invoice_id.invoice_payment_term_id.compute( + self.invoice_id.amount_total + ) + if terms: + # Returns all payment and their date like [('2020-12-07', 430.37), ...] + # Get the last payment date in the format "202021207" + date_due = terms[-1][0].replace("-", "") + if not date_due: + date_due = self.format_date( + self.invoice_id.invoice_date_due or self.invoice_id.invoice_date + ) + params["date_due"] = date_due + return params + + def _get_payload_params_yb(self): + bank_account = "" + if self.payment_type == "iban": + bank_account = sanitize_account_number( + self.invoice_id.partner_bank_id.l10n_ch_qr_iban + or self.invoice_id.partner_bank_id.acc_number + ) + else: + bank_account = self.invoice_id.partner_bank_id.l10n_ch_isr_subscription_chf + if bank_account: + account_parts = bank_account.split("-") + bank_account = ( + account_parts[0] + account_parts[1].rjust(6, "0") + account_parts[2] + ) + else: + bank_account = "" + + delivery = ( + self.invoice_id.partner_shipping_id + if self.invoice_id.partner_shipping_id != self.invoice_id.partner_id + else False + ) + orders = self.invoice_id.line_ids.sale_line_ids.mapped("order_id") + params = { + "invoice": self.invoice_id, + "saleorder": orders, + "message": self, + "client_pid": self.service_id.biller_id, + "invoice_lines": self.invoice_id.postfinance_invoice_line_ids(), + "biller": self.invoice_id.company_id, + "customer": self.invoice_id.partner_id, + "delivery": delivery, + "pdf_data": self.attachment_id.datas.decode("ascii"), + "bank": self.invoice_id.partner_bank_id, + "bank_account": bank_account, + "transaction_id": self.transaction_id, + "payment_type": self.payment_type, + "amount_sign": -1 if self.payment_type == "credit" else 1, + "document_type": DOCUMENT_TYPE[self.invoice_id.move_type], + "format_date": self.format_date_yb, + "ebill_account_number": self.ebill_account_number, + "discount_template": "", + "discount": {}, + } + amount_by_group = [] + # Get the percentage of the tax from the name of the group + # Could be improve by searching in the account_tax linked to the group + for taxgroup in self.invoice_id.amount_by_group: + rate = taxgroup[0].split()[-1:][0][:-1] + amount_by_group.append( + ( + rate or "0", + taxgroup[1], + taxgroup[2], + ) + ) + params["amount_by_group"] = amount_by_group + # Get the invoice due date + date_due = None + if self.invoice_id.invoice_payment_term_id: + terms = self.invoice_id.invoice_payment_term_id.compute( + self.invoice_id.amount_total + ) + if terms: + # Get the last payment date + date_due = terms[-1][0] + if not date_due: + date_due = self.format_date_yb( + self.invoice_id.invoice_date_due or self.invoice_id.invoice_date + ) + params["date_due"] = date_due + return params + + def _get_jinja_env(self, template_dir): + jinja_env = Environment( + loader=FileSystemLoader(template_dir), + autoescape=True, + ) + # Force the truncate filter to be exact + jinja_env.policies["truncate.leeway"] = 0 + return jinja_env + + def _get_template(self, jinja_env): + return jinja_env.get_template(INVOICE_TEMPLATE_2003) + + def _get_template_yb(self, jinja_env): + return jinja_env.get_template(INVOICE_TEMPLATE_YB) + + def _generate_payload(self): + self.ensure_one() + assert self.state in ("draft", "error") + if self.service_id.file_type_to_use == "XML": + if self.service_id.use_file_type_xml_paynet: + return self._generate_payload_paynet() + else: + return self._generate_payload_yb() + return + + def _generate_payload_paynet(self): + """Generates the xml in the paynet format.""" + params = self._get_payload_params() + jinja_env = self._get_jinja_env(TEMPLATE_DIR) + jinja_template = self._get_template(jinja_env) + return jinja_template.render(params) + + def _generate_payload_yb(self): + """Generates the xml in the yellowbill format.""" + params = self._get_payload_params_yb() + jinja_env = self._get_jinja_env(TEMPLATE_DIR) + jinja_template = self._get_template_yb(jinja_env) + return jinja_template.render(params) + + def validate_xml_payload(self): + """Check the validity of yellowbill xml.""" + schema = etree.XMLSchema(file=XML_SCHEMA_YB) + parser = etree.XMLParser(schema=schema) + try: + etree.fromstring(self.payload.encode("utf-8"), parser) + except etree.XMLSyntaxError as ex: + raise UserError(ex.error_log) + return { + "type": "ir.actions.client", + "tag": "display_notification", + "params": { + "title": _("The payload is valid."), + "sticky": False, + }, + } + + def update_invoice_status(self): + """Update the export status in the chatter.""" + for message in self: + if message.state == "done": + message.invoice_id.log_invoice_accepted_by_system() + elif message.state in ["reject", "error"]: + message.invoice_id.log_invoice_refused_by_system() diff --git a/ebill_postfinance/models/ebill_postfinance_service.py b/ebill_postfinance/models/ebill_postfinance_service.py new file mode 100644 index 000000000..de048f72b --- /dev/null +++ b/ebill_postfinance/models/ebill_postfinance_service.py @@ -0,0 +1,154 @@ +# Copyright 2022 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +import logging +import logging.config + +from ebilling_postfinance import ebilling_postfinance + +from odoo import api, fields, models +from odoo.exceptions import UserError + +_logger = logging.getLogger(__name__) + + +class EbillPostfinanceService(models.Model): + _name = "ebill.postfinance.service" + _description = "Postfinance eBill service configuration" + + name = fields.Char(required=True) + username = fields.Char() + password = fields.Char() + biller_id = fields.Char(string="Biller ID", size=17, required=True) + use_test_service = fields.Boolean(string="Testing", help="Target the test service") + partner_bank_id = fields.Many2one( + comodel_name="res.partner.bank", string="Bank account", ondelete="restrict" + ) + invoice_message_ids = fields.One2many( + comodel_name="ebill.postfinance.invoice.message", + inverse_name="service_id", + string="Invoice Messages", + readonly=True, + ) + ebill_payment_contract_ids = fields.One2many( + comodel_name="ebill.payment.contract", + inverse_name="postfinance_service_id", + string="Contracts", + readonly=True, + ) + active = fields.Boolean(default=True) + file_type_to_use = fields.Selection( + string="Invoice Format", + default="XML", + required=True, + selection=[ + ("XML", "XML Yellow Bill"), + ("EAI.XML", "Custom XML (SAPiDoc)"), + # ("eai.edi", "Custom EDIFACT"), + ("struct.pdf", "Factur X"), + ], + ) + use_file_type_xml_paynet = fields.Boolean( + string="Use Paynet/SIX format", + help="Enable use of legacy SIX/Paynet invoice format.", + ) + operation_timeout = fields.Integer( + string="HTTP Timeout", + default="600", + help="Timeout for each HTTP (GET, POST) request in seconds.", + ) + + def _get_service(self): + return ebilling_postfinance.WebService( + self.use_test_service, + self.username, + self.password, + self.biller_id, + self.operation_timeout, + ) + + def test_ping(self): + """Test the service from the UI.""" + self.ensure_one() + msg = ["Test connection to service"] + res = self.ping_service() + if res: + msg.append("Success pinging service \n Receive :{}".format(res)) + else: + msg.append(" - Failed pinging service") + raise UserError("\n".join(msg)) + + def ping_service(self, test_error=False, test_exception=False): + """Ping the service, uses the authentication. + + test_error: will create an unhandled error in the repsonse + test_exception: will create a FaultException + + """ + service = self._get_service() + return service.ping() + + def search_invoice(self, transaction_id=None): + """Get invoice status from the server. + + transaction_id: + """ + service = self._get_service() + res = service.search_invoices(transaction_id) + if res.InvoiceCount == 0: + _logger.info("Search invoice returned no invoice") + return res + if res.InvoiceCount < res.TotalInvoiceCount: + # TODO handle the case where there is more to download ? + _logger.info("Search invoice has more to download") + for message in res.InvoiceList.SearchInvoice: + _logger.info(f"Found record for message {message}") + record = self.invoice_message_ids.search( + [("transaction_id", "=", message.TransactionId)], + limit=1, + order="create_date desc", + ) + if record: + record.update_message_from_server_data(message) + else: + _logger.warning(f"Could not find record for message {message}") + return res + + def upload_file(self, transaction_id, file_type, data): + service = self._get_service() + res = service.upload_files(transaction_id, file_type, data) + return res + + def get_invoice_list(self, archive_data=False): + service = self._get_service() + res = service.get_invoice_list(archive_data) + return res + + def get_process_protocol_list(self, archive_data=False): + # Is this the processing result of an invoice ? + service = self._get_service() + res = service.get_process_protocol_list(archive_data) + return res + + def get_ebill_recipient_subscription_status(self, recipient_id): + service = self._get_service() + res = service.get_ebill_recipient_subscription_status(recipient_id) + return res + + def get_registration_protocol_list(self, archive_data=False): + service = self._get_service() + res = service.get_registration_protocol_list(archive_data) + for registration_protocol in res or {}: + self.get_registration_protocol(registration_protocol.CreateDate) + return res + + def get_registration_protocol(self, create_date, archive_data=False): + service = self._get_service() + res = service.get_registration_protocol(create_date, archive_data) + return res + + @api.model + def cron_update_invoices(self): + services = self.search([]) + for service in services: + service.search_invoice() diff --git a/ebill_postfinance/models/sale_order.py b/ebill_postfinance/models/sale_order.py new file mode 100644 index 000000000..4e537d1fc --- /dev/null +++ b/ebill_postfinance/models/sale_order.py @@ -0,0 +1,19 @@ +# Copyright 2021 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class SaleOrder(models.Model): + + _inherit = "sale.order" + + postfinance_ebill_client_order_ref = fields.Char( + compute="_compute_postfinance_ebill_client_order_ref" + ) + + @api.depends("client_order_ref") + def _compute_postfinance_ebill_client_order_ref(self): + """Compute the customer reference order to allow for glue module.""" + for order in self: + order.postfinance_ebill_client_order_ref = order.client_order_ref diff --git a/ebill_postfinance/readme/CONFIGURE.rst b/ebill_postfinance/readme/CONFIGURE.rst new file mode 100644 index 000000000..69c4aff94 --- /dev/null +++ b/ebill_postfinance/readme/CONFIGURE.rst @@ -0,0 +1,13 @@ +Create a service +================ + +First you need to be registred on 'Postfinance eBill service ' +To create a service go to `Accounting - Configuration - Payments - Postfinance eBill Service` + +Configure a customer and create his contract +============================================ + +The contracts specific to Postfinance e-billing are located in `Accounting - Customers - eBill Postfinance Contract` +Create a contract for a customer with his PayerId and make sure that the contract is active by being in `Open` state with valid start/end dates. + +Set `Customer Invoice Transmission Method` on the customer to Postfinance. diff --git a/ebill_postfinance/readme/CONTRIBUTORS.rst b/ebill_postfinance/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..0dd376fae --- /dev/null +++ b/ebill_postfinance/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Thierry Ducrest diff --git a/ebill_postfinance/readme/DESCRIPTION.rst b/ebill_postfinance/readme/DESCRIPTION.rst new file mode 100644 index 000000000..23359b87f --- /dev/null +++ b/ebill_postfinance/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module implements the exchange of electronic invoices with the Postfinance web service. diff --git a/ebill_postfinance/readme/INSTALL.rst b/ebill_postfinance/readme/INSTALL.rst new file mode 100644 index 000000000..2116848ca --- /dev/null +++ b/ebill_postfinance/readme/INSTALL.rst @@ -0,0 +1,2 @@ +This module needs the Python library `ebilling_postfiance` which can be installed from Pypi. +More information can be found at ``_. diff --git a/ebill_postfinance/readme/ROADMAP.rst b/ebill_postfinance/readme/ROADMAP.rst new file mode 100644 index 000000000..869ba4dd4 --- /dev/null +++ b/ebill_postfinance/readme/ROADMAP.rst @@ -0,0 +1,10 @@ +ToDo + +* Add option to import the contract subscription (csv) +* Add the download of this csv from web service, but what is the endpoint ? + + +Nice to have + +* Add a link to the failed job in the chatter message. +* Add an action on partner to create a ebilling contract. diff --git a/ebill_postfinance/readme/USAGE.rst b/ebill_postfinance/readme/USAGE.rst new file mode 100644 index 000000000..3418a105f --- /dev/null +++ b/ebill_postfinance/readme/USAGE.rst @@ -0,0 +1,5 @@ +To use this module, you need to: + +#. Configure the service, customers and contracts as described in the CONFIGURATION section. +#. Create an invoice for a customer with an open Postfinance contract. +#. Validate the invoice, and click the Send eBill button. diff --git a/ebill_postfinance/security/ir.model.access.csv b/ebill_postfinance/security/ir.model.access.csv new file mode 100644 index 000000000..8e235cfc3 --- /dev/null +++ b/ebill_postfinance/security/ir.model.access.csv @@ -0,0 +1,5 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_ebill_postfinance_service_user,access.ebill.postfinance.service.user,model_ebill_postfinance_service,base.group_user,1,0,0,0 +access_ebill_postfinance_service_manager,access.postfinance.service.manager,model_ebill_postfinance_service,account.group_account_manager,1,1,1,1 +access_ebill_postfinance_invoice_message_user,access.ebill.postfinance.invoice.message.user,model_ebill_postfinance_invoice_message,base.group_user,1,0,0,0 +access_ebill_postfinance_invoice_message_manager,access.ebill.postfinance.invoice.message.manager,model_ebill_postfinance_invoice_message,account.group_account_manager,1,1,1,1 diff --git a/ebill_postfinance/static/description/index.html b/ebill_postfinance/static/description/index.html new file mode 100644 index 000000000..1ec31d49a --- /dev/null +++ b/ebill_postfinance/static/description/index.html @@ -0,0 +1,470 @@ + + + + + + +eBill Postfinance + + + +
+

eBill Postfinance

+ + +

Beta License: AGPL-3 OCA/l10n-switzerland Translate me on Weblate Try me on Runboat

+

This module implements the exchange of electronic invoices with the Postfinance web service.

+

Table of contents

+ +
+

Installation

+

This module needs the Python library ebilling_postfiance which can be installed from Pypi. +More information can be found at repositoryhttps://github.com/camptocamp/ebilling-postfinance.

+
+ +
+

Create a service

+

First you need to be registred on ‘Postfinance eBill service <https://www.postfinance.ch/en/business/products/accounts-receivable-solutions/e-bill-invoice-issuer.html>’ +To create a service go to Accounting - Configuration - Payments - Postfinance eBill Service

+
+
+

Configure a customer and create his contract

+

The contracts specific to Postfinance e-billing are located in Accounting - Customers - eBill Postfinance Contract +Create a contract for a customer with his PayerId and make sure that the contract is active by being in Open state with valid start/end dates.

+

Set Customer Invoice Transmission Method on the customer to Postfinance.

+
+
+

Usage

+

To use this module, you need to:

+
    +
  1. Configure the service, customers and contracts as described in the CONFIGURATION section.
  2. +
  3. Create an invoice for a customer with an open Postfinance contract.
  4. +
  5. Validate the invoice, and click the Send eBill button.
  6. +
+
+
+

Known issues / Roadmap

+

ToDo

+
    +
  • Add option to import the contract subscription (csv)
  • +
  • Add the download of this csv from web service, but what is the endpoint ?
  • +
+

Nice to have

+
    +
  • Add a link to the failed job in the chatter message.
  • +
  • Add an action on partner to create a ebilling contract.
  • +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Camptocamp
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainer:

+

TDu

+

This module is part of the OCA/l10n-switzerland project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/ebill_postfinance/tests/__init__.py b/ebill_postfinance/tests/__init__.py new file mode 100644 index 000000000..4ec537b69 --- /dev/null +++ b/ebill_postfinance/tests/__init__.py @@ -0,0 +1,2 @@ +from . import test_ebill_postfinance +from . import test_ebill_postfinance_message_yb diff --git a/ebill_postfinance/tests/common.py b/ebill_postfinance/tests/common.py new file mode 100644 index 000000000..89eee2006 --- /dev/null +++ b/ebill_postfinance/tests/common.py @@ -0,0 +1,228 @@ +# Copyright 2022 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +import os +from os.path import dirname, join + +from vcr import VCR +from xmlunittest import XmlTestMixin + +from odoo.tests.common import SavepointCase + + +class CommonCase(SavepointCase, XmlTestMixin): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) + cls.service = cls.env["ebill.postfinance.service"].create( + { + "name": "Postfinance Test Service", + "use_test_service": True, + "biller_id": os.getenv("BILLER_ID", "41101000001021209"), + "username": os.getenv("POSTFINANCE_USER", "user"), + "password": os.getenv("POSTFINANCE_PWD", "pwd"), + } + ) + cls.country = cls.env.ref("base.ch") + cls.company = cls.env.user.company_id + cls.company.vat = "CHE-012.345.678" + cls.company.name = "Camptocamp SA" + cls.company.street = "StreetOne" + cls.company.street2 = "" + cls.company.zip = "1015" + cls.company.city = "Lausanne" + cls.company.partner_id.country_id = cls.country + cls.company.email = "info@camptocamp.com" + cls.company.phone = "" + cls.bank = cls.env.ref("base.res_bank_1") + cls.bank.clearing = 777 + cls.tax7 = cls.env["account.tax"].create( + { + "name": "Test tax", + "type_tax_use": "sale", + "amount_type": "percent", + "amount": "7.7", + "tax_group_id": cls.env.ref("l10n_ch.tax_group_tva_77").id, + } + ) + cls.partner_bank = cls.env["res.partner.bank"].create( + { + "bank_id": cls.bank.id, + "acc_number": "300.300.300", + "acc_holder_name": "AccountHolderName", + "partner_id": cls.company.partner_id.id, + "l10n_ch_qr_iban": "CH21 3080 8001 2345 6782 7", + } + ) + cls.terms = cls.env.ref("account.account_payment_term_15days") + cls.state = cls.env["res.country.state"].create( + {"code": "RR", "name": "Fribourg", "country_id": cls.country.id} + ) + cls.customer = cls.env["res.partner"].create( + { + "name": "Test RAD Customer XML", + "customer_rank": 1, + "is_company": True, + "street": "Teststrasse 100", + "street2": "This is a very long street name that should be snapped", + "city": "Fribourg", + "zip": "1700", + "country_id": cls.country.id, + "state_id": cls.state.id, + } + ) + cls.customer_delivery = cls.env["res.partner"].create( + { + "name": "The Shed in the yard", + "street": "Teststrasse 102", + "city": "Fribourg", + "zip": "1700", + "parent_id": cls.customer.id, + "type": "delivery", + } + ) + cls.contract = cls.env["ebill.payment.contract"].create( + { + "partner_id": cls.customer.id, + "postfinance_billerid": "41010198248040391", + "state": "open", + "postfinance_service_id": cls.service.id, + } + ) + cls.account = cls.env["account.account"].search( + [ + ( + "user_type_id", + "=", + cls.env.ref("account.data_account_type_revenue").id, + ) + ], + limit=1, + ) + cls.at_receivable = cls.env["account.account.type"].create( + { + "name": "Test receivable account", + "type": "receivable", + "internal_group": "asset", + } + ) + cls.a_receivable = cls.env["account.account"].create( + { + "name": "Test receivable account", + "code": "TEST_RA", + "user_type_id": cls.at_receivable.id, + "reconcile": True, + } + ) + cls.product = cls.env["product.product"].create( + {"name": "Product Q & A", "list_price": 100.00, "default_code": "370003021"} + ) + cls.product_long_name = cls.env["product.product"].create( + { + "name": "Product With a Very Long Name That Need To Be Truncated", + "list_price": 0.00, + "default_code": "370003022", + } + ) + + cls.product.product_tmpl_id.invoice_policy = "order" + cls.product_long_name.product_tmpl_id.invoice_policy = "order" + + cls.sale = cls.env["sale.order"].create( + { + "name": "Order123", + "partner_id": cls.customer.id, + "partner_shipping_id": cls.customer_delivery.id, + "client_order_ref": "CustomerRef", + "order_line": [ + ( + 0, + 0, + { + "product_id": cls.product.id, + "name": cls.product.name, + "product_uom_qty": 4.0, + "price_unit": 123.0, + "tax_id": [(4, cls.tax7.id, 0)], + }, + ), + ( + 0, + 0, + { + "product_id": cls.product_long_name.id, + "name": cls.product_long_name.name, + "product_uom_qty": 1.0, + "price_unit": 0.0, + "tax_id": [(4, cls.tax7.id, 0)], + }, + ), + ], + } + ) + cls.sale.action_confirm() + cls.sale.date_order = "2019-06-01" + cls.pickings = cls.sale.order_line.move_ids.mapped("picking_id") + cls.pickings[0].name = "Picking Name" + for line in cls.pickings.move_lines.move_line_ids: + line.qty_done = line.product_qty + cls.pickings._action_done() + # Generate the invoice from the sale order + cls.invoice = cls.sale._create_invoices() + # And add some more lines on the invoice + # One UX line and one not linked to a product + cls.invoice.update( + { + "line_ids": [ + (0, 0, {"name": "A little note", "display_type": "line_note"}), + ( + 0, + 0, + { + "name": "Phone support", + "quantity": 4.0, + # Set zero, avoiding error with accounting ?! + "price_unit": 0, + "account_id": cls.at_receivable.id, + # "tax_id": [(4, cls.tax7.id, 0)], + }, + ), + ], + } + ) + cls.invoice.action_post() + cls.invoice.payment_reference = "1234567890" + cls.invoice.partner_bank_id = cls.partner_bank.id + + @staticmethod + def compare_xml_line_by_line(content, expected): + """This a quick way to check the diff line by line to ease debugging""" + generated_line = [i.strip() for i in content.split(b"\n") if len(i.strip())] + expected_line = [i.strip() for i in expected.split(b"\n") if len(i.strip())] + number_of_lines = len(expected_line) + for i in range(number_of_lines): + if generated_line[i].strip() != expected_line[i].strip(): + return "Diff at {}/{} || Expected {} || Generated {}".format( + i, + number_of_lines, + expected_line[i], + generated_line[i], + ) + + +def get_recorder(base_path=None, **kw): + base_path = base_path or dirname(__file__) + defaults = dict( + record_mode="once", + cassette_library_dir=join(base_path, "fixtures/cassettes"), + path_transformer=VCR.ensure_suffix(".yaml"), + match_on=["method", "path", "query"], + filter_headers=["Authorization"], + decode_compressed_response=True, + ) + defaults.update(kw) + return VCR(**defaults) + + +recorder = get_recorder() diff --git a/ebill_postfinance/tests/examples/credit_note_yb.xml b/ebill_postfinance/tests/examples/credit_note_yb.xml new file mode 100644 index 000000000..a7ddd9581 --- /dev/null +++ b/ebill_postfinance/tests/examples/credit_note_yb.xml @@ -0,0 +1,176 @@ + + +
+ Camptocamp SA + IPECeBILLServer + CreateybInvoice + 1 + 2.0 + 0 + Odoo + 14.0 +
+ + + 41101000001021209 + 41010198248040391 + 2019-06-21 + $TRANSACTION_ID + PDFAppendix + + + +
+ CREDITADVICE + INV_TEST_01 + 2019-06-21 + + VAT + +
+ Camptocamp SA + StreetOne + 1015 + Lausanne + CH + info@camptocamp.com +
+ CHE012345678 +
+
+ + + $CUSTOMER_ID +
+ Test RAD Customer XML + Teststrasse 100 + This is a very long street name that should be sna + 1700 + Fribourg + CH +
+ +
+
+ +
+ Test RAD Customer XML + 1700 + Fribourg + CH + +
+
+ + 2019-06-21 + 2019-06-21 + + CHF + + + 1 + OrderReference + CustomerRef + + 2019-06-01 + + en + + 2019-07-01 + CREDIT + Yes + + +
+ + + NORMAL + 1 + Product Q & A + 370003021 + 4.0 + Units + 1 + + + 7.7 + 37.88 + 492.0 + 529.88 + + 37.88 + + 529.88 + 492.0 + + 2 + OrderNumberBySupplier + Order123 + + + 3 + OrderNumberByBuyer + CustomerRef + + + + NORMAL + 2 + Product With a Very Long Name That Need To Be Truncated + 370003022 + 1.0 + Units + 1 + + + 7.7 + 0.0 + 0.0 + 0.0 + + 0.0 + + 0.0 + 0.0 + + 4 + OrderNumberBySupplier + Order123 + + + 5 + OrderNumberByBuyer + CustomerRef + + + + NORMAL + 3 + Phone support + 4.0 + PCE + 1 + 0.0 + 0.0 + + + + + + 7.7 + -37.88 + -492.0 + -529.88 + + 37.88 + + -492.0 + -529.88 + + -529.88 + +
+ + + +
diff --git a/ebill_postfinance/tests/examples/invoice_qr_yb.xml b/ebill_postfinance/tests/examples/invoice_qr_yb.xml new file mode 100644 index 000000000..5c8e1daf5 --- /dev/null +++ b/ebill_postfinance/tests/examples/invoice_qr_yb.xml @@ -0,0 +1,192 @@ + + +
+ Camptocamp SA + IPECeBILLServer + CreateybInvoice + 1 + 2.0 + 0 + Odoo + 14.0 +
+ + + 41101000001021209 + 41010198248040391 + 2019-06-21 + $TRANSACTION_ID + PDFAppendix + + + +
+ BILL + INV_TEST_01 + 2019-06-21 + + VAT + +
+ Camptocamp SA + StreetOne + 1015 + Lausanne + CH + info@camptocamp.com +
+ CHE012345678 +
+
+ + + $CUSTOMER_ID +
+ Test RAD Customer XML + Teststrasse 100 + This is a very long street name that should be sna + 1700 + Fribourg + CH +
+ +
+
+ +
+ Test RAD Customer XML + 1700 + Fribourg + CH + +
+
+ + 2019-06-21 + 2019-06-21 + + CHF + + + 1 + OrderReference + CustomerRef + + 2019-06-01 + + en + + 2019-07-01 + IBAN + Yes + + 777 + Reserve + CH2130808001234567827 + 1234567890 + + + +
+ + + NORMAL + 1 + Product Q & A + 370003021 + 4.0 + Units + 1 + + + 7.7 + 37.88 + 492.0 + 529.88 + + 37.88 + + 529.88 + 492.0 + + 2 + OrderNumberBySupplier + Order123 + + + 3 + OrderNumberByBuyer + CustomerRef + + + 4 + DeliveryNoteNumber + Picking Name + + + + NORMAL + 2 + Product With a Very Long Name That Need To Be Truncated + 370003022 + 1.0 + Units + 1 + + + 7.7 + 0.0 + 0.0 + 0.0 + + 0.0 + + 0.0 + 0.0 + + 5 + OrderNumberBySupplier + Order123 + + + 6 + OrderNumberByBuyer + CustomerRef + + + 7 + DeliveryNoteNumber + Picking Name + + + + NORMAL + 3 + Phone support + 4.0 + PCE + 1 + 0.0 + 0.0 + + + + + + 7.7 + 37.88 + 492.0 + 529.88 + + 37.88 + + 492.0 + 529.88 + + 529.88 + +
+ + + +
diff --git a/ebill_postfinance/tests/examples/yellowbill_qr_iban.xml b/ebill_postfinance/tests/examples/yellowbill_qr_iban.xml new file mode 100644 index 000000000..12a078261 --- /dev/null +++ b/ebill_postfinance/tests/examples/yellowbill_qr_iban.xml @@ -0,0 +1,173 @@ + + +
+ Camptocamp SA + IPECeBILLServer + CreateybInvoice + 1 + 2.0 + 0 + Odoo + 14.0 +
+ + + 41101000001021209 + 41010198248040391 + 2019-06-21 + $TRANSACTION_ID + PDFAppendix + + + +
+ BILL + INV_TEST_01 + 2019-06-21 + + VAT + +
+ Camptocamp SA + StreetOne + 1015 + Lausanne + CH + info@camptocamp.com +
+ CHE012345678 +
+
+ + + $CUSTOMER_ID +
+ Test RAD Customer XML + Teststrasse 100 + This is a very long street name that should be sna + 1700 + Fribourg + CH +
+ +
+
+ +
+ Test RAD Customer XML + 1700 + Fribourg + CH + +
+
+ + 2019-06-21 + 2019-06-21 + + CHF + + + + + + + + + + + + + + en + + 2019-07-01 + IBAN + Yes + + CH2130808001234567827 + + + + +
+ + + NORMAL + 1 + Product Q & A + 4.0 + Units + 370003021 + 1 + 492.0 + 529.88 + + + 7.7 + 37.88 + 492.0 + 529.88 + + 37.88 + + 492.0 + 529.88 + + + NORMAL + 2 + Product With a Very Long Name That Need To Be Truncated + 1.0 + Units + 370003022 + 1 + 0.0 + 0.0 + + + 7.7 + 0.0 + 0.0 + 0.0 + + 0.0 + + 0.0 + 0.0 + + + NORMAL + 3 + Phone support + 4.0 + PCE + 1 + 0.0 + 0.0 + 0.0 + 0.0 + + + + + + 7.7 + 37.88 + 492.0 + 529.88 + + 37.88 + + 492.0 + 529.88 + + + +
+ + JVBERi0xLjYNJeLjz9MNCjM0IDAgb2JqDTw8L0xpbmVhcml6ZWQgMS9MIDI1MjI5L08gMzYvRSAxOTQ1OS9OIDEvVCAyNDkyNS9IIFsgNDY3IDE1OV0+Pg1lbmRvYmoNICAgICAgICAgICAgICAgICAgDQo0NCAwIG9iag08PC9EZWNvZGVQYXJtczw8L0NvbHVtbnMgNC9QcmVkaWN0b3IgMTI+Pi9GaWx0ZXIvRmxhdGVEZWNvZGUvSURbPERBNTAwQzlFRTE0OUJFNDI4MEREQzg3NjYzOEY0NjEwPjw4QzUxN0ZDNDUxNDAwNTQ2OTBFRjA5REFDNEJCNjJEOT5dL0luZGV4WzM0IDE5XS9JbmZvIDMzIDAgUi9MZW5ndGggNjQvUHJldiAyNDkyNi9Sb290IDM1IDAgUi9TaXplIDUzL1R5cGUvWFJlZi9XWzEgMiAxXT4+c3RyZWFtDQpo3mJiZBBgYGJgSgISjFNAhDaIGwwkOA4CCQZzIGGxHiT2BCQrCyS2ezAwMTJsBMkyMOIm/jOu+wUQYAB5vgj8DQplbmRzdHJlYW0NZW5kb2JqDXN0YXJ0eHJlZg0KMA0KJSVFT0YNCiAgICAgICAgDQo1MiAwIG9iag08PC9DIDc3L0ZpbHRlci9GbGF0ZURlY29kZS9JIDk5L0xlbmd0aCA3NS9TIDM4Pj5zdHJlYW0NCmjeYmBg4GBgYEpnAAKPvwyogBGIWRg4GpDFOKCYgcGcgY/5guLBRw0Mdx9IXbBsWgDV4sMMoZl14JpYGBgSGCGijLEAAQYAS4cK9g0KZW5kc3RyZWFtDWVuZG9iag0zNSAwIG9iag08PC9MYW5nKP7/AEQARQAtAEMASCkvTWFya0luZm88PC9NYXJrZWQgdHJ1ZT4+L01ldGFkYXRhIDIgMCBSL1BhZ2VMYXlvdXQvT25lQ29sdW1uL1BhZ2VzIDMyIDAgUi9TdHJ1Y3RUcmVlUm9vdCA2IDAgUi9UeXBlL0NhdGFsb2c+Pg1lbmRvYmoNMzYgMCBvYmoNPDwvQ29udGVudHMgMzggMCBSL0Nyb3BCb3hbMC4wIDAuMCA1OTUuNDQgODQyLjA0XS9Hcm91cCA1MSAwIFIvTWVkaWFCb3hbMC4wIDAuMCA1OTUuNDQgODQyLjA0XS9QYXJlbnQgMzIgMCBSL1Jlc291cmNlczw8L0NvbG9yU3BhY2U8PC9DUzAgNDUgMCBSPj4vRXh0R1N0YXRlPDwvR1MwIDQ2IDAgUi9HUzEgNDcgMCBSL0dTMiA0OCAwIFI+Pi9Gb250PDwvVFQwIDUwIDAgUj4+L1hPYmplY3Q8PC9JbTAgNDMgMCBSPj4+Pi9Sb3RhdGUgMC9TdHJ1Y3RQYXJlbnRzIDAvVGFicy9TL1R5cGUvUGFnZT4+DWVuZG9iag0zNyAwIG9iag08PC9GaWx0ZXIvRmxhdGVEZWNvZGUvRmlyc3QgNDYvTGVuZ3RoIDUwMC9OIDcvVHlwZS9PYmpTdG0+PnN0cmVhbQ0KaN6kU21v2jAQ/iv3cdPEznbshEgVEjBokUpBDWunIT54wQNrwUGJmeDf13YCdNL4ssnyy/m5e+45X8IFEOAxsBR4ApQJ4F1gjAJPISIRCALCTwppwmGJE7NWR7XGL+q3ztXz/QAoRKnjeF7d3WF/ksFPWdQKB1N8KqudLHDYB/KZ4GzeIrP5FChmfbDVQWE2lfUv52oULk57haOjvc+stApzGeLKfRPX693mp//IT/+LvzHfJfgrY50rYyFlCQ7l/kHpzdZCnKbuARukwwTBcSE3NUQMx6Wxg0F5XHaoYAEDSgjx8asAjuVOF6cP4+pg9UZVwAU8es6PDaoLxYAT349w8SR3Cuejl4fvs0/nmE4ICHBmK2Xz7blUf/XaSOSE4MTKQud9sykUEMys2r1AzJt39K6+hErvbVnht7YyQUkoeyBr5V1u5B6ZvFxrs8FXbfqm1hd7rKvaDreyOj/GNYf/In1Zj7L1oIxhdvhhvZyF63XQtSi/Gu3IFHAa3C9qXa613dZLlnSB3Bwe9VOIONh+P5+vHu8j4jhpVz+Faxbn/HLvh7e7Xa8+YSx4BGZC2nNM6WX9czS4jw86nBVFUauKOa6gx+1dd3tW2qj1fpHLGbVIo8mv7VyFPg2z65+MmXtGaeq9rJTJT73emwADABUBJKsNCmVuZHN0cmVhbQ1lbmRvYmoNMzggMCBvYmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAxOTE0Pj5zdHJlYW0NCkiJlFfbbhw3En3vr+Dj9ALTw1uT7EUQwLbsXBBjHXiwWUDwg3Y0lhRoNLasSaL9+j2nihzdrEi2YFY1WdfDYpGzeHN2srtcm+++W7x99dOBseb7718evDLd584OPo0p2YhJa+b8TDYnb+xg+S8n5Zz3zqw2kC/mpPtsnMg741Jyg/c5mLmfUhhSGIPIYXXTjZgN5rwL07Tn6Om8O+0+dr/iz5kf8P93WPrZdIsf3ltz8uWZYdHNTSDejuPTgcxDmfZsDcXWgN5LQJ+76MtQRpNzHsJkXJyG4pOJfgjmct39Zi4Yp3t2nPM7+N0K2NnAgJ2ZB+vyVwKOhuNo/ujmvgh3XrkIndEUc43vDMp52HGJ3NgYZ2XJRSVwKXm70JhiogiG3JjJjFGWXGWSCY7KRSliuL173wCAj/EeAC6ViQB4AmDjPQCQostwVSpF1GSQ2dyNSlABHZloHPwZhrZCaHNvJhgIGCXwyQAjz4FprToy3qJgQJKZZFwJbF5hS0ahHpWedhEeMmOypCGhKEwohmqB+iYiuNHEwnHVjZ50pEGimHQKOhCAvlpbdVCCQ2z1SJoCZ9Mo4inTQkKEqkUCX1kYP3ERWVASETIkRxNqcNWVSGcboagOCTpndZrVzUQEExJhvAk2udmpMGHsB0cBAbaE4qR4zxG7sOpIaTZwQI6QsgypSN44OoJCkTAhi/2ZRo7QZAYerjgNW5NmWFLNMCuTMT3JyP0CZSWzijUz7LoXJxswSQyxvMc9l+sRdxarnnWL/uOEZu67s5Kj45FgqI5Hgt9JSSEe9GKNnCTOgOE6S9DVDaQ+v62gKcRXa3MtHBekhhBnZH3C0pgqLSrjom9Mq3iX3J4LtShpqHIIrZYleq+kvBFzMulSY3KucFBOAdlUjgVh9TRlPVWrKs+ZqUpon8SKbDJXqIsccxRKHaszqahE9UOdXPOenJGoJ89KcVOS2rVWawRNW7+ZCFu4CTJrNQmvG0QGfUgoPCFDaQZRFLRwvHXCuVphbgoURCS10tgJ9lxODULP8yuHxYeoNnm8WA9eLcE2a0y8s/dCIsj++pBrEnr6fZQiFyJtJrIhtZFHhnMQoCXsOv54vWAsukYEDTMcZZSjSQYnz3s52j5YPeE+jPo9sVJ9pJ6Yb8CNe2ZU4LQbVYY14jXbmj/dT9o1hIF68DhwTLLUHIsEHrhIxjFCCb4IJE7kEKGELEei2sR0qvXAbs960HsaTUww9MVVKIvWR8lSDyVpPZRWBpNvTNa0+K6Au6nu3b6R+FLzy7qLnkUrAebWJnBvNW7MrR6ClD5vD1cbq5NmD0Jt+cSXRBl80KiDdqOg5RECb3ROB1+7Xag1FbzGF7xvLd1p3QY9ESQ8WaSIJFgJLLisfSp4AYKOhYzapwIrZxQ/cjNynbFrLlhHQ/Hc2sBLRgRH2Z8wSkMLvJ1EMMotEbjJSYkV/aKbTob332SijE4WkRsndQvCGFtqUZu7wBCETBUVpsbSZQS1oqkn39K/asScBsa8JAP2iI8RBE5jY3UOKgDXcxV4+LAcJxUW5VV9rLx+ixfvr93LZbd4cXl19vFodcUX8Yurq6PV6frYHC6W20/mw+Lly+1f5jBNQygZ+U5xABiFN14aLE/uh8X73X+vrj+tzeLH9dHx+tIslvL17ujk7OLo6mx70R7YeCl6vhQXyyWfPMuPuJMGizqRJ5Cw2Q4o6zylIRV0seWmm5l++buGu3i3f7S7ZhOwhiEC7+XBI6L+lqgb2MofFQ1NdPmPRyTi3thgUTzLlTzoUBvLP43Y905COZz9u3dlmMzsrPd+yGb2pXfwbma7ox6Ks/M63Zb/1wc7RDPT1aveA4GbVWC4/VjnTI/nLieb0OladPbzZ/1YBkxc/EGbYLZtZtXPRzzcZ1XheH3HmbpuLluAQ5+pYvoPy58BITK2TPbr8IzPxzo9iXX+KtboAg+wXvajZawNiRa7ZnRdod3uJFMK3N8U0+Mdq/B4CPZB6KYC86nZu4vX+s5GNi9mR20g9sk0wa257lOin+1uuIeji0Mu/P22PH4EhvI3MMyregP7GGD8qwZ08SCy+wWzj6/hcrc0zVGFteGwbaldPADyoq488PGu2jjoA2N4U0vSfOlj4vE43VbNXXN7rJux6ecTIWsHIvEn576CTx/zJ/ASINw1xFiZP83h7H3vA+3v+kLNDRyEpB54Mc0urzXEhe7QQ7DhyOGkW4W51dz27vFpWbxQY49AlwQQyW9XA5czCo2L2ympCwXkP2woxczesmYR7y91Wx9UlB8irti/qaipVdQ8oC1kd6t8Hum29snD6vYdeb6HDoy/6Yy1GxzOXvf80Tr760gp90GQ+ARGMjrv51nblJf8/9nPa0W+6kXyR0wIRG9u9rttd93tEKUdwpp9Vudy/ukUw53uVrvPI7Lx+Z3QfUPXdOkbYshP2H2Ny//N2cnucn2js+82n/H29QOehdFl3HDIaBom/nKs9HLd/WYuIIZb3fFWdyOvcVzkfMVQNU4Tf1yovrUBv35Wm27x08aag+3NE+T/AgwAt17fsg0KZW5kc3RyZWFtDWVuZG9iag0zOSAwIG9iag08PC9MZW5ndGggNj4+c3RyZWFtDQr///8AAAANCmVuZHN0cmVhbQ1lbmRvYmoNNDAgMCBvYmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAxNDE2OS9MZW5ndGgxIDI5MDkwPj5zdHJlYW0NCkiJdFYJdFTlFf7ue5NJYEJIyEJIgLyZSQJC9mSSsAUC2SAsgUScAQMJSSBBAgECAgJGFrXTiitupa22UsVSHdHaYRFiqWFTSlFbFUiwLqc9p8fCsbUImUy/9ybD4ah9c+68+9//f3f7v/vfHwJgEDqgompOdWbOA7sqx1NykVTX0Frf9ta2LzmWiUBIXMP6di2sTskFzPM4n7W0bVlrzkNrl3K8jWuWLFuxcekzJ/aZgdDPgXlXmpvqG/8eOqcGWPAB1+c3UxA6QKXuhQM5Tm5ubd/wzbUS6l+YQR2RK1Y11J87cvRloL4IUAe21m9oU/eErQEaK7heW1nf2lTVuWs7x82ApaJt1dp2vxc5wCqPPt+2pqltRXh2J8fn6M95KLJfHkEITIpbcXJFZeAti/jNdUCxmFQ1xKQopg7g1SpoM9D/zJw+ew6mQLuhKF/5zTipPozrGvBTfU76lMPQ+NMfBWK8Y5g/ctINs5zWfcFlSv4m90oH/ggTfTAjFGEYgIGwIJwZj8BgRCIKQxDNr2MRh6GIxzAkIBHDMQIjkUQtVthgRzJSkIpRGI3bMAZjkYZ0ZCATWchmJLnIgwP5KEAhxmE8JmAiJqEIkxlBMaZiGkpQijKUowLTMQOVmIlZmI05qMJczEM1anA75uMOOOHCAizEnahlDA/jETyGJxj1c9iLl/Ai9uE3eBn78Qo8eBWv4QDewOv4Hd7E73EQXhzCERxGJ47hbfwBS3Af1mE9NmIFduLXuBf3oA3bsQn/waN4HjewDf/FNWzADvTCL5BQ+LAZD0oIfoujcKMdW9GHxfhGVGzBj1Av9+HH2IVfYBnWoBUrsRx3oRkteEsEx7EW3ejBUqzGX/BXNOB+LEIdmvAQduMneBKP42k8g2fxFH6Gn4uCPfgVXsAv8QkasYo18Cl37UM8gC9wCRdgUguZhUZmMYQ7kExfjuJPtPAvXEGvjJUCmS5b5TElUTmhnFIuqVvVJ9R96hG1U4vRErSRmk1L1bK08VqJtt8abbVZU60ZNsVmtg22DbHF2hJsI21jbRW2OltTyulr/huK32/gJoXZPoZzjOMKrsInGTJOZtJKvNJFKx/dYiVai9eGa5phZdwPWImilWE3rTQaVkS34u8hnSGdIHUFMd/3nvGfAvTu8bX5an2zfOWXFwTmLk+47OD/s5dze77smd3T0/Nu9/VuX/dVoPtr0qXu892vdO/ufvxCQZga8iEroZEfLSe9QDpKOiLxMkZYX6zIA/w/gFse8cgb4jU4L773yEsB+t5zs76IinYDaXcTSyeIt01E2mYiZqtsJ+o6iMNtOIlTxN4OIvF+7vBpPEg8ncG7eA9nifA9OiKIq+e4w88TETou9nIX/ozzeB8f4LhYZJqES4kMklKJkDIZLOUSRQRESoUMkRmyTSolRmZJrMyWOJkjQ6VKorlz8TJXhsk8SZBqSZQaGS63ywiZLyPlDkkSp1jFJRo+kS3Ekk0Wil3ulGSplVRZLCmySEZJHT7CxzJa6pnBBrlNlkgj0dckabJU0mWZXgtESbNkSYtkynLJlrskR1ZIrrTiHXRJvrSJQ1ZJoawhltbKeGmXCbJOJsp6mSR3S5FskMmyUabIJqyVYrlHpspmfIbPJU9WEuWruZsX+mvjEuvkC6PiFhm1V8cqb2B96zXnx0UZyHqN4Vk0kSeOg+fVQp5CpTyVJhujNu7aYH8Gz8g+JCuHkKF8hXBueVqlFwOqnK+J7HJ5xb/Tix0jDvKsVBcvSvdC0jSttKXEI3UcKGkUjLGSU9O0Mo+aUjbPaXdpbs09vdGtlWnN9Y0eU4rx5kST25WpeVDtbOF/jdPqmeJKvMk2uVzjqcek6zEZetwualjer2G5oYEKfFwUklapedTUKudcp6ejJNEzpcSVaLVqpZ7OKqensyTR6nJxlfmmp3xvaYnv9zmUPpvHkAkLaKmmDqpwud2Bkd3q6XS7E92Mo3/sFXxXMKVfwMB1BWpKqVc6qoypDrs1URfYrXYr3XKV0NSAtMpqZykds7rS2X+MVqWcZc2MZEdJxcnDfFl42JjGHmbbsfCnc8l8J5ErDmGfsbCXWKCsLrZyKyxsTRa2Hws308I2YmGrsBAGFpabhaVk4cFqYYOwsBFYWGoWfEz6B+lbUmQtNQaVKKu9SI70YvRFtgyUOr2wZyYeZJuLKXL1C5J1QTIiilyH2RpNbJamsfpHB3XvevkBOY1cVnaBIzc2U/LyC4rEkZdqt5lDRxVJbk5cbIw5NEJih0ZZo4TUXehQEqzakPSkpHRzTuiMfEf5sNSU8GN9jXK2D+umTVsXVZBnTbJGJ2en5YaVT62YoDns1lSHV2nxPaXs8eUwdzyGiHaw49Uwj5O4EZnE48XiQTw1FHZEhZ1P4ZmhsFIUnt4KzLXBCFU9IFUPiPC9SLdzY+1L5s6tqYH4P/X/WxxKF6cfPUQTKlTGKkwQzhVb2FHBUypwI/snqZcUUlscyvYItjKwIfMorKUJfqGc48ROWt5N2ktSa6nidTLHSe+TPiN9TQq56Rp013BL8hVdoOi+ZmVH54r9Smnf1VKly5dBYab/W/Epb/OOMkHJPsSLR5zhbR73w4ww7kxcpL5xYb3/V3uELogIZAJcPBwKP4sgl0YuK1uIlDJamq8DtrZYRZd+ydKZgiDzjn7Z0plThIbBlBFcstpYbAlI8nVGl8znbUt0+BWQKScpevIKefeqIDlJqr7+DK9i/TqH6Yy+JIFLErgkIbDkRdaOscTBq5ihey+rxJC8GWQO8l5mMOW8nhlr9HuZwZSynAymIMgc0pla0FY+QwsGbdg6EYy1KxjryWCs04OxngzGWhiINZSlGc7pcJZmuK7mB8I8HQyzKxCmnp+EYH4S6HVCIOn/Y7xKY6O6rvC7b+b5zYw947HHwxjwxMtgzOINvAwmTohJbLYSG0jN0hKa0BhoI8BRyvYnKUqBEDX9VRCoAtISVKiipooAM/5VdQ35gX9Q0hKQUimBpjQCqRC2euh3znlnMBBose7wvXPvu++cc8/y3cNqa0ZBWox2QOQmsb28bjqYKEvfheFHMWxR0TN+1r2mmlEJ/Lklbh7/ja/hv/T4dGu6NSGyvHhJglc1TSVpurWlWVaZUV11daPrbTdQmqivnzenrr40EQwZu2F0fd0zreWV0aiDf9FoZXlruqIiGs3z+fKi0YoK+7emvKJ57db0E0+2tlaljElVtbY++UR669rmivLHTVmyvn5qc21t09T6+rLy8jI8NdXWNuMpWYZknHrnhjmLeG+zv8yAbtcg2mFNI/4MUq4RKRccwmiAsJsctJxna3i2BrPFmC1GmQgivkuRFhmcUY3VWFTcNmC1NWQQ/W1WKZ7gwel4mEvpwBufAPW/m0UllDQlI7KomgTVlEW0Y4lV7e1IuUb5VIINCoEyOG+dLcJsseWDLIlVbZBl0JN1dgJmYR7erR6RixRcjsadB87iJsPgFq4xDFahSHPO9KEebMDYRnWBZnYD8JKVuN5wmL0K8AYGB8pBkfrAzROaSQmNSy9AL0iA+qyLqDqG6lkvukAfxgaMbRi7MBxa8V00Ne9lD2xU8Dn6C4MzAhxcd1JQPCWK/EnzdoCBxTXF0ch39NX7De/734b3iUH5UCUB4pnATAKlJIErU0K0XqqW/kNT8QtYehPDlg3KRaqmsnSxSMlCDyxRUzcrWKI2r1GbvwC4qTaf1enfifEjkzh2b/ql0FZb01ORl5SjcaRnnJO1Jq2Z6mXpZLOruHrixHHViVGRSGJK+8K5ed3LlnV02KZmQses6mp71qyXly4K1NZOGj9zWtqOxZLJiqrkU2aH4w9HysoaHxsVj4wx4zrKTc3E5TMm1xbZ/ob62SuaW4xJzoy5gVTVs3Vjx4Qjfp9QmgR+omCSISti1oFgUSJetgJi12sEqPrsF4mDKhgAbwiI/RU8fQKHSnlp8ORyJviQsy5y1zmHDfF/6BwWr8MneNNuArRpg0p+oiDJUwNWeAgPoylG+mWHyJAmsqG8NSMS2SWBK4mMSq8qNNAuGaYcYZFwh6XUpoJD7KCA1Brm7kaZOpYqLAqIsZZhfA9jC8ZOjL0YRzDIxpMYZzH+iXGLNie9P5NwDuL8wzj/MBpsGFw/bPlp9hrPWhwwBWLovxikTVMRaEw81VKJW0tlwkxfsmpVZ/YDM9/OXjWRz81fsqn2d94xp7Or+ayYO4H5+2Bv3//FnoTU5MFgG/+7OS/mkdPyrOKcF++lV1iA5X6PZsVSLU2gWguIbZkjz0nchPHzNuLGtkL2jEG01gBe91Ntv6IN9wo3XFqCGSrRPtzDbK7sPo2KXj5xuqpQCNHGQVnZS0fXz1XTAyEBDgLDAo+2iFj7QMks+drfGUBrDjwOL0defE3Lz2UFS3XqlywR6kWnC5/J5xfjgVdcIkDvnFdwU4CDlwzVKNGji1/I4GRkjwwliRpzSs99hgJDoP8+cns3qIMkCHocb8SBcZSTp4Mc04Fcu/K4qwMaZuOuyczPsb4EGFYamFFGNIdAvzSna+q+DQp2KTimYJqCNQr2qi+W6Z7TtLKntXYs06RexzZbXE691YuVin2T/Z+u9NWAJtdUuqmjpmF31bMmPnte9sC8p6+bH84c7hocxOfa7ly128DxK83b1JJHC49ooMqPGjEayR1g+lwER1QOMYlIyQmu1yptsUR9niSPJkf4PE6CuLjYwkycXWwhyZLY3c9ujgMVMCuIYmmSV0SpZL4OAQVSES+zmH0oAeiiSCEFvlKwXcFVddIxBbMUbBfgwGsJa7X2+83a3T8EG/J61FjPvTt01xsKTiiYq+CIgnf1O10PqJD7Mn11k355qX75z/rlXv6yke4mtJMaGXW4FIQt1P6o49ktVRMnj98xZ+6c2TvH1dWW+8vrG8Yd+vbz5vnlB6umNCbtl4tdx1606EfbFj5n3Lyi9qjr2i++cPDnK1+0nbxCqTc9+PkW96mY+SCD+09IIuAUIGvzawZyEXIQCizyLDrFACUHc/kyt56Jx0MvWSEShCgY6A0901juTM9oKO9W4F04HNANyiafeG2XFsPcNeSCgo8FOOBQLkiIKy/skFbiIEvD8HlYbxNhLT7edAbgpE4v5eiz+Hu5a4+nzscAF7UG9D1cnY0Kdj+g4Boot1kVPKoadAH0qgbbVMFDCr5SIMrFmujigtCYbNJN/hjiw031vJdZtMDY69b+Zktnm5kRsHsWbHrJztgrVvxscOGCdtfU7et40ljcxNEPzADOP9/6MRWyfDn99XyDG7Dyc/nv93qdg/+dBsG5G8Z3pBM/7NDzSZDvVd0oVWQ6eNmbct6FJMA57zZIRWicEquM818RRq/pzV42vuywSWb32Zn2m+3Zf7dD9/nQfQ90D1prqckEobtcaO6qbHIqczHJf5SaARIE7lXzEcqhgxel5ptvZG/evt0pWh0Xny5BTj3NPj1N73s+3c9fB1hBoJ+7lgcqGIhLQqy7PcSMztX25srCdSwRFihsUHoskz0vLtY/+jD8JPB/bUp+DfML4t0QWx+E9bZY31RUWdRUlMJvakmneaGzM7sfDsh+ZFqGu8wc8oKhumLegw8Qzxl8zuGzcaK0B6v7OlvyUPbpkMCROnH3q/HKnk5Tmv2FnRne2p6LX18K34n4a5hsi6+7qWj1MzWJKBf2wPtavHqULw8pOKAgyoBiKsLWc2Hy2MkhgGPCThy4x1CnFKoySbiNg3uvQZnxpBuU8fxUmzupbV6Rqhm03P8w2fOYR4ho5TkOkjxVPI+ZnMNUCgzFckgjB7WLGpFPvrJXi0s+gVeYE3tVptWiZsTrXDoHFGifVY3h65eqHpYTeYrrCQdqVAPVA4UCHLgzat3BsOUW40npzR6Siu+iI9jAA+H3ACWLkCAyIvweiMeRHM324pHdaJOljvUqwBsUJfT500zCIKWKfUjr83iREjHwwEEFv9fKfkXBEAPhgxHx9R48HKZqRTtfAritd7VP9Cp3XgnabZE41iDAR7pup67r1StfM8AzPJ0B97GUIe9kBsv7FOg+BdinQPYZ1OnzQnlJnQJey9NvKRH+RNdN13V7AA7TOo+iXtF4PKjgMwV/UHBGwYA6528aaCcV/ErBJQV3FBylBFneUYjTC4LSB3EOQcRjEPEYhCOC6JtIgH7ur0FR95iCNyVPC/EcQo6FcDUJIbNCyKwQel8I3TMk7+7RtD0hgJp4CPqFxCXv55r4p2xErClmqHqlfCmD397v3zHWyk47+3j2lo0yNrzX7hvusn8w/BYNjrIWcOR94MiFVrmvmw4rqlUmqoU8ymU5yoSWs6lb/Z+7o/QwGLAKsKhUFn0KNstz3QoOKKggkEujEkqBkhFZU0aCMkmSkqjeVsq8lioHfF0Pr1cPL5cGx1XSq2XmuIJr2nQuKLghp0iUOKTAK6YTtc7egHM4yjZZxeBaxeL6NQAeq/bAanA9L45iSo/jGmseeIluf7TXHwHOYPCdayPAdnmgcPFI8y4qv/LSGGVgY1T/MbLNRoDtGLaQL2+6hoD4YqzGeFLAX63HLO9i5oE3FXyoYIuCPVa5gKicGDvDc/wE9fcJ9ffxu3cWz7sXFVxXNx9VNy9+wN8T7vM3mcuedcF2i2Hpfwmv9timzit+v2tf27ET4tixTR52Em7iNEmDEzuO86AErRAaHk07UUZGC0VIjCAxYGM8Wmmdhjah9Y92olunok1Ig3Ybk1ZtPEIyCTYVxGMq0QYdpEwFdaU8pK0aVQZdF/Y737nHMa2qJfqUX86993v8zuP7nRBOGjJcrEnDsmZYhGfeEpGvo/J1NM+wi/1YCT86pN0Q0oYFXBZwVsAxofEY00hTJDBFgqf4PKdMpZIWB11NtqMxqZLobhxJ64WaVcPP9eDnued7urt7pr6sliz+6c+WLDbV0sdf/fHSx80fuFau3Lp1aJVprhraunXlyql39gxvcLk2DO/5+Zq1prl2DeUvadwJkxI3phaRpomJIovpjIwhbaJadhnj2lykzaQkgzBLEpZQzpUUJGGUDFG+mCJ4EtVXeCQl6VjidLWcjqdx+Spm0xISLckKJyp2ChiWqFgvMbBTwB1x/fcEdBLYokMo5JS6v8vUFwWcEvAtWeNrAtbxYpZebIfUzY+/eJ27ep1whtpS8luy0W7MpGO6Cymz97Y9VF8fjweD5u7NC379F0v1zV3z7AK1wXKXzKiunr3bnHNqTToz9WcthHruf6yOo7Z2u7Kj2E+IPdMmW0vRStApHlCZ0S6qhOytRAMSgqVBW0LQTN2wdrPG7xWd11sgMB1XTfsuR4Yc+84AYN8ZmDgXZMk5arTgixzfyp34h2KiRbvUhYdVzsMRowoOr9QOjwYp+KWr7cZ77PoVuBU0wZcAblATQTtcJqq+X0CXaIjd4uwdcnsMiBa7Nw3KGLzGwIugCSNMwqhWYS4Br3HCe+HYckxVjnnL+ckK1D+95ICAfmM2T3cApGvQL+CIgEkBh+Eh57Zok5fb+IjrALZh6CO+Lo8XGO0STB0SdA7YZmQlHrNSCbP5MHbL5eCWmuiWm+uzpDmKwQIPxeDBUUSPCV93BfxEiHMYLMLKYVS/MKpf2HgVw803SjlPtw3g+xjm/yEuz9frAo4yeIAUS5NyRBiaFIYWToN2CYIOKQYdcrAsDpblL+9plnJRnYWolPlfysk0Kqo3ac/SZZQLbP43AoudbHy0d/WjrQ8r1R6NxxOJ6nisXal5c1dVNTTUBzJLqiorY5EZ+InG4tWJvlRsRom5sH/5uq6hJtseyNihYDBYFg5FW770VHtKuT0lfZWWp7QkNnNWRSQSLCsNliVmRxOJxvWp2WY18tyPZL+NGuw1LoxRywrgZg3luPEjqXhtBT2uuqJf8cgrHnnFo1/x4BU3vfKs3J1XBbwg4LiAGlGWhoC2BwC9s08DKRom1QizoGh4yeBl1WXmVZc1ju7UztZFoCYvva2uvb3A/PacOf/9rq5vHrzzjEmlbXIMBoQqzo2DYecm7fyEKIPvaEC9EfV5CHLD4JKkO0Lu//DaZon2lwSUSmcxTyz7BFzV4AuPY5HBKjAoMiguim7aDxe/H0nOdRMggb0I4Kv0Cq17Uh5fkDL3PsAdXeba2utslalSGbVs0dSnA9duzofChrLW3HjBzdPgJmD+gQgyqPZbcJgB0Uy08eHVFWx9HA9ewY72S0fXzdLKi9QykVomMtTk0vY7ZrRIU0u9HMl+au7czI2HS+I4wFUMCioXWjDXdAtGjR9fOuAIq7vHMdt5nOc9jH9i3Mdw0yR7AQ5ijGG4uAS7kaFu1CIy8BRe8vMiifNuifMnnDj3keb4PbuMlvFhGR+W8WEZHy1jYRkfltGdJC3hwxI+LOHTGy9yNs5sBa7okAjwYqsJYA3/uGbKD6b8YMrPTPm4X/KCWT+Y9RuH+AlR5wdBfhDkB0F+pu4jSBy9880CBgUcF/CegH0CaglweJYUdDSfC0Y3GdwFBj8Z/Jxs2uAjg4+j04Vv/eytSek2Pdpt+rJwsY/XGXS9uHBiF5/4g+nOlMCobi5NmqcISrbImMC4hfEJhmb+lwDHMEy+e4r0RwhUowgfjeolCeGad1GUu8J2QNkqcOvJt04tvT217OLfBtUmtXjquqqcOjz1QzV36o/YeBKa57dmMTRjl7mWpqtj1VNLWcG5bQjTBh/pzelHdVLOHLBaQJ8GI0ZdkHbsc1RI1vCinkTxfTYfJM3j9NaIkcLfVEoXwJTM2iNuc8A8Anm3pckHaSOUd0oVGaoKvNRFhi72UjNerdKrNqdA5gkYxjHMZ6h0KipnfjlghQaYL0gaW+ktNxtd5BrLuA2h/h8MKglpvNCqX0g5s8PRL+KfvRgHMSjtUnipLa+8L4j0XU6AS1aALV3S800I6Jb+ZEIauw3GLAZ7GViw2GgAbY6KFwEcawOsDWJtMJyWLcVr7sJ2dVS+ArAf4xCG7rV2QdruwdDqYD/AIf0PCaAh2fFfRYS/I+olv/Uu2fF22eiYuLNFL64KdUBetMdsp8VqTOY62Narsp120psF9EY8MVt9PdTU1GLbkVht4uFcbc2MUtP0mNHW1nS2blao1qxJpFK5znSxa/vgwoWDh03lmauU6S4prqhobo9Eo5F4TaKm/OXWmTOVCpbG0o3zGhqCZZarcpdqeaTONE9c64HWMZru31H7TL8RN3OjOFSY74E+gEEMTecmI6xjOwzHevgmfFPO/7KAzRqMGHGEdsk4NWww/kbceF5An4DVGkhoxyhwYwWhXUqGUmkRYkZpvkWI6RZBIcNKg1SjKBqL828UpyiEpQuI58PwgBSfIwLypetDAf1yl+YEHBXQL7d6joFlvAFwlK8FqmiOhvlAwKSAFaJ8L0nsnGFgodiFUOxCPMUtVrwu5Fp5AVVbhKotFJEjstWbAn4l4BMGFiLSDd3ttDkjcoADcoDPnsSlT/Hgnj8UMCSbPy2bvyybv4GN39WbV8lGkbnpXMxDMZ0VGRyNqb2duafbM+n25b1dnrkLnp/ziFow/xupmmBxwKNGK5Tq6V09NKdPxXrDyhxcunHnYwPK63K56ZJpQ2y+b/4Dbuww/zWKvGzkWr1Jy/8Ro1HLQB2QQTx1brqMjsMM4nDGOP+t0X+PQcl7P9WfdxaEXoYiLWNE86HXQoaWglhMkCFRUGZtMthkoDuRQpFa06gOxTp8auv7Ke0gCkALDnAjTBy3LJeiuJCBhaDwg1u/tE0BCZUAK5ODCPExjHMY72K42fch/vgswIQE0phYzyCQLkvrtBxFXk+536iUW9gBXxFwXUrYvwWcMeoFOBX1HgML6zUgZhu4bt40mvCkiZeqANBC9SzABFstYz1ulB36/tFR1MzTnWVgYe023Y5x5X1DwvYpIapfiDoJki4KUaeEqIUMLFiKUaV1+1lk/AJUjGCcxriE4eY8LJczlUuKVgiolFM6BNwS8Cdh4q4QcBngptw458R6Eue9KGe+DjAptESZFpfxlhz+ohx+HcA25sZC8rXBAcREzukc+dZo7OAWU+4TZWdtTrZkPtkyZZltXl8wFK9ubU5Uh2Ypry8Uqk40t1bHQ0GfV23sM9MbhzuyKp3elKyOhxs9Zt/9+oZkbSIciYRr5w/UJ+tra8vD4VBtIpmcevfJVcpcvPib2wcWqUCgzJ6p+qk3MB6ChjqHO8Nn1FH3YKBQ67w8L0LpvoAnBLwgV+igBly8K7RQ8o1zsY7p/+pIHqV0+bOlkbIL0jVMuRcuyM4AGQKcnXRDuXUaVuCdgL4R/kd2tcVGdV3Re+68GDy2Z+54PH7OjD3YZvx2hpkxY8yQtgEcAkY15SGLJk1SEI0QsSi4QakaVSpppSpFqgjtX6sUaD+q/hQDw0fzUSAgVeEDDKG0+SnGQmrSj/BsOnTtfc62LyToxGv2fZyz911777UbB3SSUmqKrW2AdSW2q+Iuob7USboW/W0rFn+wH4BGfIA9Ai4LuCEC+5KARwLuCni23lPRNuAtnaKkbhwtSy6Ai7NYc1gsS3YDTEvyPhCmXoVsZbBLwAUNiGsxcC2mH5iWy8chD03+NEv/a5b63yxqMy2lM819xmeNIQY7dBx87P5bOqVcITCeU+5Xs/e21m3Vci7TJ64D3MHiy6+L4wcFvC6uHRBwQcCcgOsCFuJwTfy7J+5TQA6K+xfk8pxcpjicwrKfioUOgaLEog6mWJGxGkMytao23dLyBXW4Nbn2heUZVVj/0g/zeaVGVr76xtBA5YOe7omOTKZBpdeuyNl2Pv/1yr+bkTFjB6ZfHFP22PrvpSbyK1V1VY1FeQD6WWqV/RhEvHYOYQ8AeHv0NKBu6b8e0D+Fv834G7mlcYLGyk8lHcYF1AoYfCpBQpQPIVc/ayFDiytjPGTwuAwpMqR0CrUgIZLc0ywcIYTtw/gbRsJE2BoKU/rphAkwIf+F9QWWZ2c0ncvmjJzNUkUKmGoV87eqbCwdSR/avdtrV1e3NA+GI5GgFxo1HPH71f79JfVRviPT1ZlIOo7y+AtVNeF4vKm5sTdfGebYjeN//4QWaFJryiBZk644f+GKfcZq4moSwPnUFa4dZu4NM4AaDVNMuPsfQSyMYm1xhc2iGFiusAXIEHBFqZEMjS4ZUE2Gaq1RPbi1mmtLAFvVmQB5rKMirg4LmBFwUoMgLgWt97FOYM1geYmxF9EwrmPphvgTkZ2k406J7Dwmr1rQn4cFnBBwTAOSA/XoWfTCKNqEIXkgko7ovoKvFI+kx0t2LJMZ3tWxTJW83uqGl76ZTquS/Vml3NPSBN6v+k7lYzXYnmitH1T26Oi6yufUD/BtrPfsmxyEPedQNwL4R8z2hzWNAmH+MD4MBEF8syAdP4APELTewTqC5Vn4EF6KqtcVdz8Z/DruXpMq9q3BIWJbIBtJv1ei/+zDW25VbEu4gvN8hvNsPIfjBQC8Pby7D7v7ZHcfdvdhd59r96/QwCaDTbtjxyxFCOH4n8P7bIDz99EHV9sflpGOCXCSGhuevKUbXA1TMsE9hlD6ColHrjzL8VXKVo5mHNAGh1sP43Yse6duh6s1Xd9BWTat1IBPBdQSmGK6r5GRwVj+I5YPBfyGgbjZRl61uYLcS4Zel2ElGVa6DK1kaHXRf3FEezp2bFgZpg5LBaPhShnaqdeyyE0PXimeGxN13QK6Lnmuc2ZWVN1Nq1OD91HjzIgyqBvmSYDTWBexPHpmGdQ8PwoxfxyLM+Q8TwOcdVlpwnnLzFl5aWAFNLCCpFRRpiIDjloj0phG9AMnAU5j2fryKoori9oq6U6d+pDHcaZTWOflkAt+zD7j0ML56Z6s7JeVo2T1xrdx5HtYtn6yIE8WpAoU5RVFaf/m7OcFzAg4tgjIgbaIW14uVAXXz2wsnneVdpabporEIvZpr786FIslc5luVA43HrUDoaWO09y83InV1dXV1vrtaHdmdFN3Rk20NMQjztJgb/8rlblnfh0eGd2qaiKR2tqqpV5vqCpW396fTCg10L+x8lude+ofyL2UmimjIaWkH6S0V68QmNL90+aeSm2NctADPnpREZKajyXqZrpVRPkJ0pCOtIp2aRXtruT5Sv80jWDRkCRD0pUaRrVyq/Dh1iS3CupKDQvicx6F6iEWf913UTvMx68RXtfie9bqy4dFTs8I2E2A/CjSIEpgUsAumm+meDhqAvOa9Cu2kPihyzkGFo8eAWgsc4IZOcHCUY7KXicE7JJN3xXLaQHDsvsNGaoKsuF2BlGiVFYoxSzSrOPpBj/GQZ1gKOREW1q6vp3pKjW3Pr+l3QksKRE3Jh3HqQ0Hg6qQ31opq/xYT0bZxeZUW3tlTmYU2wt+1FpJ+8dlNMqwZsiPAEytNOBlBtA4YapeS+jDfy6NtURAa2NjCbMFUwt/O777F6ikfG0fA6FJHX3zOhcrjBBjEti40gISyLziN7/LGG01wgtYtNDVGmPT9XEbnjbzql9zI4Cn4lg2HXUHAF/+vRSksoA/izw/LmCb0IuGk0ei03Mkz6dYKjuaOh8B3MDiieACvu0sSwmuOnHR4nGhR1zkd1yGk0bUq0Z52sXCHLqm2Smhd7oE8AmWrU+VxKmSrIJI/NjYztaXjsP5UzKrbdORWPDZB1CND2HGku1C4Tsygs3KAHJRAx8I66AHOzqGPF9NPSXDYD0jji1w+pKAPZrczxx/Hkd/yMcv0CwBoueE4StM6awL8NSxt7d7YqK3u7t3YqK794Vi8dDbxeHh4tuHisUnkyOrlVo9Mjk5ukqpVaOTezeO2/b4xr1vbNps25s3IR5jT/rVf8H1Vitv/7EMEuc11/eRStnJfDbgYwFrBIQJTPGlPKdBHqzLcaUk4Z9D/Uxe0YqkT9N9H0K1yPIEkTrhYnmGDBmXYYgMQ65imCNDzgqTIYP3LmGdMARUz2xvw+NDnAsrDNK830G5ohlUxSKBP8oHeiL1gQwh9Dkzp87KnPo7+dCn5ENfAJjVVKYmG5Uh04C1esj08SA6i8X37ZAPfd7q1pd3A0xj2fppYz1v9aD/9+jPPwdwX//wwLceqcIDeO+AvuUOwAP9w6UKHknrv8vAcjt/GY7f1M4T20JgW0gr2tNwiuh8HcujhUhUpIQBV7Vz5IYB3xLHrmoXXB7uAjgoHl6l4xOIaT/opT36vjsAD8TneTjzUBz6BIAfuizgkrj4dwYdbpnBgyIJi+xzuiso6Ht3g6Bcae/CGKlmfAEnnEj0dbe0Ok4gqNJOa0t3XyIRdgK+yi9LXtsfqoqicSx/87nBFbk93++xS086OzsTKScarUullnUuG/tGKhqLRROpzg6V3lkVjUQi1VXqxbHp/Rs22K9Vrht9r0aQVw3W38oIcoNojAbtwhEGULhgbtxoC54yQrjH8PBPEt7NDKynp4rFJAmSIegyxMkQF8UQtOLcEoI8VNhmuPyrUPo4wCmh9DVh/BwDi6uiMc0zWGy99fFYZ9qvY9+q0HJLttOWGmyMxho7Ghpqa/yBkvr5up5X+1IppXxf86uIk0ykO9Jf8vzT/uQL9RriM2yfpg7m6Pi8KbX4rFTdfbwrjYNnwYMlCFQTSkrTwBnLgSXNoXNQaAqwFgY4akXt2DjAy1js2BW2SgjrKUD1roiZsoKIUWipkCzF9ZyWefosZVRpbTpjNQ+cpU+Cret5PiO0NEyly8ajwwv3DQ9QsAPWH5CA1K0vkXrU04lXpI7x86cCfi1d9S7q62MsWydzVEaPqDxpsvDxYl4mpR4lpZt26XetA9iGxe9ah3Py5WnJwtuoz/ewbJ26fUjdPmm4fSgt5sdtqx+39csMMSR9cchQ5ap4dV4KzgmAGSz7KV9/JeBnAuZFUM2Jew8E5MW9+wIuiXs3NaApsAtToHHvpHaaqnFGX/4u/DwgtZRcM4WtT17cJzq4TwLYJ7qkX5zs1++ah7cPsdCW6+NUazq7Fv7lZMBBV+aiFKsz0w79owrkT7d3FZYXNwy0ISeWLRuKo4xEqqpUduj5+vT/2a/WoDivMnzO9+19F9gFlmWBhG9ZCNdACgUkxkCjSSAJgcYmk7SJkbBLWCUsgU0AM2P7I810nNHGqXactmM60RknOjZ1ojWXToyOzVRHLaMdLzMUmzFW4mRMJ5fWasv6vOcCG0j++bN883Cec/bc38t532iZo3X1A8tyXG6vNzc3FCporKjg/kDRJ9o3rXdsKuXhUO3KonC+1+fL8Qfzi7dYpUiWWkM81+33F/mzs7wer8cXjEbXVhWXBCKFa4Wd5cPO2oyn2TK+5gKqTuimrVb4FK6dC5c++WXRcpZxWBObRpQKi3I1iB4qHBdkj+haILoWoGtoWpbhKTm0ZAodckgyctJSaXfFDcrUwmRq4aWh7ZKUSDz6JbAqLuyLEh6HYLRKwZSOZ21yoU6ZPNhB/IjZ/FJjEyCT2oZ2igCO3WOUU4wYBCYo1qfOXVoj5SgeDeSLxyUkhSjlHYg2NzW3Bpt4bcqfU1FWaPPmB8PVhSGfxzRjsfYUf33ulWhh2PegzW7Pzg4VLl8e5TUtRwq+zoRstkI2V/gcK+O3KHJRPrCdMgGZVUZEuhDBycuEo6NsNOIXbwW9JdIzkh/Mk0nnCCvXz0t5hrvLpQvNzbjhCDVE7nPlmXmqeEJs6GouSTrJVh36WXfK8OQdkPd0ErgBL889XZvJfqDJKS21r4A8pzPU8zoRPKQVrnkhH1UtKxZyxGLtFkq0WyhRcp7VSc41bOoDvbGw3C7J2K0jf+VzySHRLoXyPIVtfEvv6Zze0/f1lmkrh3V4P7+dVk1e0/v6oyaX9Qb/JEiFIxRt1g9oFOrUGmhSSibCluZAE3+L2z9lOH0+EY/sqa7m7ctKOmpFrOJsn1i99rFAINef4/ZSKss3zP26q7ouN1BcYuHJLZI65sa/M9AxJ7cuUIqKJmX/TBs1F1pGVmVMC5M1tGcgQmrg+pACCc6Y0AKGns5pskYonZ09gTWOA+Ie9uorPa3JDU06NJm6q+Wg1lIHqZwjQymVDi40cGrgOq4xGZfvs5v2RkfZTETKSJGrmtwSROqtk4ZS/ypNKklPDkaiZlMePs42/XD9V41vrONzcxv5OXmPLvz7Me7Ra7RdQG9UcY/yLjjd2l+1P/28IBRGiIznUbrEg/AwiA1YGyVcgHnwPJZmzCHu04E57NMi1lG7bRcnoogBczihXDY8gzZYFMIH2u924b/kSOe0cBVOMcClB7gwwIUBLj0Agsei7vlFaePeaSExr1y0lAjm8OiNe/TGPdi4Bxv3yMk64CnEteVocoMI2cQJkNOA0oUsOfNe3W9Kt3Ro8oQg7G4BL0jcRg22jAYPNXgyHJWLGlxSJyBN5iGdsLNjqDwLqATMlKt1anJVk1uC0MV4tDqdk+pJ2ZIbvkQpdqtudYAUUCuuk2G0W2Sb1GqqbNOOl4ThJWHSjezHj+OAsSevsinU2uTMi1Y6oxdObp080vnt01uPPd3Fs9+9ePHduZvT08pm01XCZguNxvPQlpB8F05ou7yhSZfQLZiteBCxVBt21qVd0nntKr+oyaOanNJkVpPLgtCJMFreQ6HwEDQ7WaF4X9qEwUAsU2ISFe2d1+SAJrsWwlubnl9FhDdwnDRgyAchJJ6wEA7gw9vmayBOb4xQwU302NC74gYJA4Z8Fou01hVpJSrStlekXUxmxqTyoQUtWpJCKbXyzzeoDAFqJR4M5StrNLlJhBa6pMk/1QVyzFsgL/Dn2iV8U5NjktjZd0DOUF9qvaJ/nlIRGKUSAfXMkv44oT/q7To7n5dNkMlTU0KTn4rfWuHBTPmqINZE4EnJWjs3m97iz6z7TWB5TjBYHI04EGP6K/Pzs7J+sn47P/XRK63VCCy5q8U0TF66rHGlYZO6aOHfC9BFN/szOV0mdbFHH/tnmiQ1GdFObJV2y0yTt+VPdjwXdvYiYOCwdhHhUWJHLokiHINCRRHtUaudfBxanQ3aWdFUb2ivJd0Xu9+T4aYGt0zsZPTIMJeJ2e0ylkQc2cojzZEgjwQRlDfN/YWPzP0W5dFm/kxLy9xwi7wH4PH0tpnrv9qbs+YOC5uz1PyLX762RpaXv5YeTDvMWfMEqnAOTI0y/pV2sNfNWfyawBjO7vrjR6kjv61qBbjdWZYwnmeN4ENADRAy6thuYyerB2/h3awa5T5ekL6C9gbgCNCoQH13AC3AaqAeeED2RxvmUGjAmjtMi1VhrSz06UXZBvRSO3+VdRu/Zx2o72QzrBtrZhv9bC/ae81JzP+8+L2Z+lKJ8TvBVwMe/PYw+jrMl5kbpRPwoT2I9dfTnlE2YP1GceaZ9IcoV2B8F+auRrkK9Sqsl0cc6MH6QPoq2gU3H2Kb0U6oonFiTDfbzJ9EFN3N8lHfirncpgcRz6vMRRywsO4KcZYCZsf62AvrRN8w3R/u/HGUGwlY6xrqdO+VOGsz9VN96Z6PYB9baO9C/jPpv5szrAO/V6FvuTjrk+w59OsHPg0UA3SWXeh7G/ddydcLGT1GcqA62u/w46yG6tgf3WUP+CrMuRt1J0/I/rSukNU9gLUZyU/ILgN0vzQnnYnW13K7B5YJuWUC+yDZ3AuQQT3JS8gqA0vWW5DT3dgp9JLuZWsmSFYotwtdgjyFvBJsJVAGdJvr2Ebgk0Az9ujFPBuVfpHOV6nxXRiXo+bPIx1APUvp0TV1zz3se+lB/J4Nvon2SnITegpdQf1t4L/qLP8gQB5elH+jvsAtkhtwU86dnkHZCawE2oyHWS1gqbIW827HunXG+9CrNIsYNbDHf6ffN/ZD/95gn0GfXeQHjJOQJ+E6bISwGn5E7rOH9GGR3NsWoXex/JV9dtwF2LS06/Q7wHvq/B9l2ngmhM5oZOoMbF5D2X4mPJlYolsKykdI/yCxoGekXxkwdsMfPKj8wyIoX5GJHsChZIczpj8QPqR73o+s4dmiLOc7RN/N8xhM38nUVeFbulkFsEH4mEx8luWTz9FYrM8ayhdJPwQYudDrH4l1zwBl5PdJn8m3Qw2+e9/vd7zceIE+25B9Xcb3VObnuOS45LzkuuRe7v4Cvuvy81i+bb5t2Y05jD7/7cAIvrnAXN6XFn9BI2gU9BaWhM8W7SjaUVxePCS+F5d9bvlw6dXI8cjxMiv6ZvnJijdXTKyYqHyp6nb1xMffx9//+6NYiR9lLyG6FemECJE8sBTmTFDeg5oPKZ6KqIxTKkqjlCyImuQ28IuKO8D/oLiTPWvMUjJjcyM63WZ+WXHOalxTihss2/UfxRH6u12K28AbFXeA71bcyevcx3r7RlNWcsBKDcatWGJ/ItU3NDRpxYf7k7F4zDrQ1z+YGI5bo/G+WN++obiVPJQaooZYX6rPGkiOWiOjydih/sTwfjHDI5Mj8YG+/vgYtR9O0BSJMas/OTI5mtg/mEL1lNW4alWTtZKKFmtLYjiZwhhr44F9nXXW+Ph4/ZBqqu9PHqi3HhoassTQMexhLD56OB6rtx4ZxKRjyYHUeN9onBagpbHgSHw0NUmHWTRt3zCdZNJCo7WPDiM3HY/VWQeSscRAglgsMdY/lBzDFnGq1Gjf8NhAfHQU1fFEahDHFovEJ0awjTFr/H/sV0tv00AQnvIsb4QQAgHCJxAkLS0g1BwARbRQJKRW4SGEkNBib5OliR3WawoHxJ0/wZkTXJBQDsA/4SfwE+Cb2bWTtjzKAYkDtezZ9c7OfN83Y9exxjmdRqrPPFV3XdLJ6GpJGpSnGzMzdVwbU3K9EDWTDEBuPc+d7uXRDaht+5lVjtkx5Zan3KooX7OFM21tma1ieInuKbvMeec1dO4+0paXZ20RL/dULmVLo+b1OjDH3SI3TzXq2jWxTpmj69isaHd+ppSo1DaAxwqYNIohrYJ9XFiTJyZ2JkvzUAkXis7YMlA2KQRBW61kHmAzsUalFQXehQbSuWmnZTKo6HTsfpVrce7u/P2FWhll4iZLtPGb/6aAtEiKLDl8w2W0hKujDmnYhAy1cTqsd3E8xz1NKcXwSzBKMO9hLYa/wX3eY3FVWFH0CDu0xCwQoVt58BpHjJArg39EfVw5YoFI7NUewXAbWfsYLUkeTXnl/xS+JQoj9xlXH/5WcHcQw6++wXmOpnCcx2iiml3E6KZkzODr80T4NdMD9nmqY7wix2RAP/SalFw92Iiaok00kjUPOuQ4LXAyiknh0glIc1HaIbYSz5JBydoz7Mt+J7r7yvwarcJaWRPe4z0jrJeVGVWaUdXFO5NKL+Es7yWCJwavTFgkgsAKQit5cvgzOhtWV6RPOqHaQyaanklWViMXPyueTjqJMfereirR8XdMWcmr6yrtqzxNDZrBUQ/jBqo8HF+QaiXY6xW5hQi5IOkJthuhty1iZ8LTVbUrq9xaVeXWD6p8DTPWgP20aOZrqyr1EsnIlV+u+M7jnu/nrqCz1e5ZiRfDl/fkI09bKriuC0PWmetVwMMIGv+8cufG4lvWkStjpU7M4097athLbeHlBGX5FKbyFPquVWH+GJms+CaChZXJBM/qZ8KtedJL3bJQZY7mO8S/rVZkZaggV5Y9lWRdW4Uyl38DaVGpLZ6rmfleZFZx9f74c16LNEd3oeB9/F6qrcMyIZr7LmqJkgV4MauN7/sbnv87d+MV3uy/oL+9x/+SH/x9IGg9wJfxNtpUGxvg03k7Dz7C3MN7pkFn6AiN1z7SOOozOt+B7KPznfBfoMtgdFTmu8D8Dt5/U3Rc5rvpFT2BzxU6KfM9wHMa2A/TXsyJP+OX0PjNKuAmerAqweY1ALYgwWjCrWsSbKNLSHGKjtEhTjBAnq20vQbC0dwLc3h2gFLsp7F8QO+C/RzsFTpAY25AD4N9GezrYD8F+yXYb8GeYFuE/UXYX4T9cv+gxM+C/RLsPrbYvxDsy2DfBvs12BNsi+An8b19G+Kclfl3AQYARiCGyA0KZW5kc3RyZWFtDWVuZG9iag00MSAwIG9iag08PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDQxND4+c3RyZWFtDQpIiVyTy2rDMBBF9/4KLdtFcWJLoxZMICQtZNEHTfsBjq2khkY2irPI33eub2ihhkTHaObqYI/z1Wa9id1o8rfUN9swmn0X2xRO/Tk1wezCoYvZvDBt14zXu+m/OdZDlmvz9nIaw3ET931WVSZ/183TmC7mZtn2u3Cb5a+pDamLB3Pzudremnx7HobvcAxxNDOzWJg27DXouR5e6mMw+dR2t2l1vxsvd9rzV/FxGYIppvs5ZZq+DaehbkKq4yFk1Uyvhame9FpkIbb/9u21bbdvvuqUVQWKZzNdlB/Jj+AnsoZUJWtK1JQluQRbsgUvyUtlO59YF2XWW9Rb1lvUW0d2YCEL+J58D16RV+A1eQ2mm4Wbo5uDm+NZDmc5nuVwlmO+Q75jvkO+0FPgKewV9Ap7Bb1CT4GnMEeQI8yRKeeB/ACms8BZ6CxwFj5bwbMV+gv8Pf09/H1BLsD08fDx9PHw8fTx8PH08fDx9PHw8fTx8PF8L7pgGK5vHWOh02t+Z645p6TjNo34NGeYsC6G369g6AejXfhlPwIMAPOrzWgNCmVuZHN0cmVhbQ1lbmRvYmoNNDIgMCBvYmoNPDwvQml0c1BlckNvbXBvbmVudCA4L0NvbG9yU3BhY2UvRGV2aWNlR3JheS9EZWNvZGVQYXJtczw8L0JpdHNQZXJDb21wb25lbnQgOC9Db2xvcnMgMS9Db2x1bW5zIDIwMD4+L0ZpbHRlci9GbGF0ZURlY29kZS9IZWlnaHQgMjAwL0xlbmd0aCA2NC9OYW1lL1gvU3VidHlwZS9JbWFnZS9UeXBlL1hPYmplY3QvV2lkdGggMjAwPj5zdHJlYW0NCkiJ7MExAQAAAMKg/qnnZQugAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAmwADAAqwrNYNCmVuZHN0cmVhbQ1lbmRvYmoNNDMgMCBvYmoNPDwvQml0c1BlckNvbXBvbmVudCA4L0NvbG9yU3BhY2UgNDUgMCBSL0ZpbHRlci9GbGF0ZURlY29kZS9IZWlnaHQgMjAwL0xlbmd0aCA1NTIvTmFtZS9YL1NNYXNrIDQyIDAgUi9TdWJ0eXBlL0ltYWdlL1R5cGUvWE9iamVjdC9XaWR0aCAyMDA+PnN0cmVhbQ0KSIns1UFy4zAQQ1H7/pfOngXAaFKKXMnHKi62mnhczLxehBBCCCGEEEKO8v6cZVgtyPuWueIL2wAHDhy7juJUtVI/7eX5YLMfDhw4Zg5VY9ly0jQvbRvgwIHjRkc+yEvzQ+DAgeNbHEXJUXEcOHA84SiU+QtFUKJ2Hw4cOK505BSi47+KBjhw4Nh1nGS5I99r3+X54MBxR77Jof55WG4rTtWwrZvnNqk4cOBoHHnLMrcc5J92JC+1pzhw4Jg57GabPDd/HIseEXDgwPGBULRSw/Y1ckm1IP/EgQPHjY4sKpZaqsXMCThw4Kgd7aq2S/Euy75cDQcOHOcOdVGxxfbLI4WoJeDAgWPmyFs2u+THUQcjAg4cOGrMHFhUU3PWVrwkDhw4Nhxqn738eH2xL9tw4MCx68gN1L25n/2ioJ48GA4cOBqR+tZ2Vj9te7s578OBA8c9jrw+ezeVF2Jw4MAh26vNtlUrf4sUdTMVBw4c5462ZJ5rRxS1eD8cOHBc5FAjtl8ebusWT4IDB44jx+hy1cAuLToXd+DAgWPX0cZ2znOqmt2ivsBR9WvncPxTx/tzljn1067Kd1j5iIADB47G0Z6qGvmgUOYtLQYHDhyNI29RxYsa7W32chw4cDzmyF/kfpssHDhw/J5j2WyvVJvzAvtgOHDguMhRKHM/e2qp6rZiDgcOHBuOnLZzcVDUzd/iwIHj6H92QgghhBBCCCF/OD8CDADjTjb8DQplbmRzdHJlYW0NZW5kb2JqDTEgMCBvYmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0ZpcnN0IDE5My9MZW5ndGggNzE2L04gMjYvVHlwZS9PYmpTdG0+PnN0cmVhbQ0KaN7MVdtO20AUPJ9yHssDWe/a60uFIuVeBAQrCSoSoMoEk1gktmUclfx821lvgFaqqB/7kJ2dc+bM3mOfHQ44dDlk5YYcsdIBS4e90Gcp2VcOS8WR8li6HPkIouc4IUsN1Mgi5ESKJcqkiyRSMkAwQiFIY+A7rCQcHMUKUtfTGA0YIo8Sz5UYFxh4rFCqYabgp00d/HzHZQU/3/PZNUNGklEiA+3xyYk4wwocnok4qdK8XlRpitX8GZimL/VZumcpZsUmvUhKrNQoFvsyFfO62i0b2awo6m7XWN5g8RCYxTfgWvAsaAu+hcBCaKExNstuwLoo66Ksi7Iuyroo66Ksi7IuqnG5EzE3WTEX83RppzbdbZ9vHHNGRtGEenle1EmdFbmYl0kuelWdPSbLWsSin91vsmJVJeV6b8gor6u9GKyTqhbjbLWrUjHMEuS3b7QqykFSvtJR/gDzVExNM8b+vLPTfJPl6XydYA8P6stdbWJ2GtjX7CktdvWB7u6fl1VWvtEyrX4PLHBG/eLFzF5c5Q9p9ebU7f4fx2G22lw8cyK9Tf3px0+a0Ge6vaUzuqIpDWmEFnRIMV2aTp96NKdTGqAFPUd0gt9H5Bs90o5SqtBbAJe0phz9Htrv4Dk9IJ/TqumjNG7KFnRMF834V2gR/orwDDNh0BgCgxc0Bs4x3R5GPEVkhkKIX1PP9EQJbShrJlCb1JiuoZqQhPU1aeg7SG7p8QgPz8ENPTy+Fbuvd9VeBvuQ8OTOk3z1aTg6Hnw5+qs8PihVa6XbWulZ5Wh6POl/rNStlX5rZdBaGbZWRq2V0mkvbX9Ksv0xyfbnJL32Ut1e6reXBi2lPfMJMgHUhP+6/n38od0opTq+Zk8GHcdjN2iY9g27E5cYdm/+I+NNsky3+F6J/qZYPr2Xe56DgpCDMOiE+GJqX3c8rTh0oo7vRh9Z/BJgANUR3gINCmVuZHN0cmVhbQ1lbmRvYmoNMiAwIG9iag08PC9MZW5ndGggNDA4Ny9TdWJ0eXBlL1hNTC9UeXBlL01ldGFkYXRhPj5zdHJlYW0NCjw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+Cjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDE2IDkxLjE2MzYxNiwgMjAxOC8xMC8yOS0xNjo1ODo0OSAgICAgICAgIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczpwZGY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGRmLzEuMy8iCiAgICAgICAgICAgIHhtbG5zOnBkZng9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGRmeC8xLjMvIj4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMjAtMDYtMjRUMDk6MjI6MjArMDI6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAyMC0wNi0yNFQwOToyMjoxOSswMjowMDwveG1wOkNyZWF0ZURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMjAtMDYtMjRUMDk6MjI6MjArMDI6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+QWNyb2JhdCBQREZNYWtlciAyMCBmw7xyIFdvcmQ8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcE1NOkRvY3VtZW50SUQ+dXVpZDpjNGUwYThiZi05NTI1LTQ3ZjAtYjE3Ni1mMDQxNTVjY2RlNzI8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnV1aWQ6MWRmYjc1M2YtYTUwYi00OTA2LTgzZTgtYTJiMjhkZGI3OWM3PC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGk+MzwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpTZXE+CiAgICAgICAgIDwveG1wTU06c3ViamVjdD4KICAgICAgICAgPGRjOmZvcm1hdD5hcHBsaWNhdGlvbi9wZGY8L2RjOmZvcm1hdD4KICAgICAgICAgPGRjOnRpdGxlPgogICAgICAgICAgICA8cmRmOkFsdD4KICAgICAgICAgICAgICAgPHJkZjpsaSB4bWw6bGFuZz0ieC1kZWZhdWx0Ii8+CiAgICAgICAgICAgIDwvcmRmOkFsdD4KICAgICAgICAgPC9kYzp0aXRsZT4KICAgICAgICAgPGRjOmRlc2NyaXB0aW9uPgogICAgICAgICAgICA8cmRmOkFsdD4KICAgICAgICAgICAgICAgPHJkZjpsaSB4bWw6bGFuZz0ieC1kZWZhdWx0Ii8+CiAgICAgICAgICAgIDwvcmRmOkFsdD4KICAgICAgICAgPC9kYzpkZXNjcmlwdGlvbj4KICAgICAgICAgPGRjOmNyZWF0b3I+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpPlJlaWNobXV0aCBNaWNoYWVsLCBJMzY0PC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC9kYzpjcmVhdG9yPgogICAgICAgICA8cGRmOlByb2R1Y2VyPkFkb2JlIFBERiBMaWJyYXJ5IDIwLjYuNjY8L3BkZjpQcm9kdWNlcj4KICAgICAgICAgPHBkZjpLZXl3b3Jkcy8+CiAgICAgICAgIDxwZGZ4OlNvdXJjZU1vZGlmaWVkPkQ6MjAyMDA2MjMwNzEyMzQ8L3BkZng6U291cmNlTW9kaWZpZWQ+CiAgICAgICAgIDxwZGZ4OkNvbXBhbnk+UE9TVCBDSCBBRzwvcGRmeDpDb21wYW55PgogICAgICAgICA8cGRmeDpDb21tZW50cy8+CiAgICAgICAgIDxwZGZ4OkxvZ29NYXJrZT5GPC9wZGZ4OkxvZ29NYXJrZT4KICAgICAgICAgPHBkZng6TG9nb1NwcmFjaGUvPgogICAgICAgICA8cGRmeDpMb2dvQWN0dWFsPkZYUkcxTlg1VF8yMDE3PC9wZGZ4OkxvZ29BY3R1YWw+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg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wNDcvU3VidHlwZS9YTUwvVHlwZS9NZXRhZGF0YT4+c3RyZWFtDQo8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzAxNiA5MS4xNjM2MTYsIDIwMTgvMTAvMjktMTY6NTg6NDkgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGRmPSJodHRwOi8vbnMuYWRvYmUuY29tL3BkZi8xLjMvIgogICAgICAgICAgICB4bWxuczpwZGZ4PSJodHRwOi8vbnMuYWRvYmUuY29tL3BkZngvMS4zLyI+CiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDIwLTA2LTI0VDA5OjMzOjA0KzAyOjAwPC94bXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMjAtMDYtMjRUMDk6MzM6MDMrMDI6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1ldGFkYXRhRGF0ZT4yMDIwLTA2LTI0VDA5OjMzOjA0KzAyOjAwPC94bXA6TWV0YWRhdGFEYXRlPgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPkFjcm9iYXQgUERGTWFrZXIgMjAgZsO8ciBXb3JkPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPnV1aWQ6MjhkNTUyNmYtY2RlOS00ODdkLWEyM2QtNTRhZDgyY2UyYzc1PC94bXBNTTpEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD51dWlkOmZmYmI0ZGZhLWEyYWMtNDgyYy1iZmY3LThjODFhMjg2NzdlMDwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOnN1YmplY3Q+CiAgICAgICAgICAgIDxyZGY6U2VxPgogICAgICAgICAgICAgICA8cmRmOmxpPjI8L3JkZjpsaT4KICAgICAgICAgICAgPC9yZGY6U2VxPgogICAgICAgICA8L3htcE1NOnN1YmplY3Q+CiAgICAgICAgIDxkYzpmb3JtYXQ+YXBwbGljYXRpb24vcGRmPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxkYzp0aXRsZT4KICAgICAgICAgICAgPHJkZjpBbHQ+CiAgICAgICAgICAgICAgIDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCIvPgogICAgICAgICAgICA8L3JkZjpBbHQ+CiAgICAgICAgIDwvZGM6dGl0bGU+CiAgICAgICAgIDxkYzpkZXNjcmlwdGlvbj4KICAgICAgICAgICAgPHJkZjpBbHQ+CiAgICAgICAgICAgICAgIDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCIvPgogICAgICAgICAgICA8L3JkZjpBbHQ+CiAgICAgICAgIDwvZGM6ZGVzY3JpcHRpb24+CiAgICAgICAgIDxkYzpjcmVhdG9yPgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaT5SZWljaG11dGggTWljaGFlbCwgSTM2NDwvcmRmOmxpPgogICAgICAgICAgICA8L3JkZjpTZXE+CiAgICAgICAgIDwvZGM6Y3JlYXRvcj4KICAgICAgICAgPHBkZjpQcm9kdWNlcj5BZG9iZSBQREYgTGlicmFyeSAyMC42LjY2PC9wZGY6UHJvZHVjZXI+CiAgICAgICAgIDxwZGY6S2V5d29yZHMvPgogICAgICAgICA8cGRmeDpTb3VyY2VNb2RpZmllZD5EOjIwMjAwNjI0MDczMjQyPC9wZGZ4OlNvdXJjZU1vZGlmaWVkPgogICAgICAgICA8cGRmeDpDb21wYW55PlBPU1QgQ0ggQUc8L3BkZng6Q29tcGFueT4KICAgICAgICAgPHBkZng6Q29tbWVudHMvPgogICAgICAgICA8cGRmeDpMb2dvTWFya2U+UDwvcGRmeDpMb2dvTWFya2U+CiAgICAgICAgIDxwZGZ4OkxvZ29TcHJhY2hlPkQ8L3BkZng6TG9nb1NwcmFjaGU+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz4NCmVuZHN0cmVhbQ1lbmRvYmoNMyAwIG9iag08PC9GaWx0ZXIvRmxhdGVEZWNvZGUvRmlyc3QgNS9MZW5ndGggNTAvTiAxL1R5cGUvT2JqU3RtPj5zdHJlYW0NCmjeMjRSMFCwsdF3zi/NK1Ew1PfOTCmONjQDCgbF6odUFqTqBySmpxbb2QEEGADnMAvcDQplbmRzdHJlYW0NZW5kb2JqDTQgMCBvYmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0ZpcnN0IDUvTGVuZ3RoIDIzMy9OIDEvVHlwZS9PYmpTdG0+PnN0cmVhbQ0KaN5szk1Lw0AQBuC/MrduUJp1N0SUUggNfmCDwRY8bzZTs7bJlHGD5L97cKoiHry9M7zMMxcWNCwWaTHGjlg9YfBdLxkqCQ4P53Bv8yxJV9T3OMQ39RWPbphU/bjZwuoOilvZMboYaChdRFVeG220zk2mr6zV9kybmdazn5YohWdqXIS6vKncHhmMht0HwzNxm6QPOL1LOFFreqHK8R5V/T1sjux8J0SSVtT+p2W/Ws3Ujh6Fa6nBEwbr0LDjSbx5Ps/zJN3QyB7lVNgFbP/eurQmM1IYm1f0UX7ZhnhAlSyXnwIMAC3ZXAYNCmVuZHN0cmVhbQ1lbmRvYmoNNSAwIG9iag08PC9EZWNvZGVQYXJtczw8L0NvbHVtbnMgNC9QcmVkaWN0b3IgMTI+Pi9GaWx0ZXIvRmxhdGVEZWNvZGUvSURbPDYzNTE5RkQzM0ZEMDZDNDk4MUI5MUEzRjk5QjNGRENCPjw4QzQ2OTA2MjlGODVGNzQwQTA2ODg5RkRFQkYzNUJGNj5dL0luZm8gMTMgMCBSL0xlbmd0aCA0OS9Sb290IDE1IDAgUi9TaXplIDE0L1R5cGUvWFJlZi9XWzEgMiAxXT4+c3RyZWFtDQpo3mJiAAImxoRHDEwMTFVAQkAGSDD2gQg3oETPViCLgYERB8H0G0gwMgAEGADS9gUjDQplbmRzdHJlYW0NZW5kb2JqDXN0YXJ0eHJlZg0KMTE2DQolJUVPRg0K + + +
diff --git a/ebill_postfinance/tests/fixtures/cassettes/test_ping_service.yaml b/ebill_postfinance/tests/fixtures/cassettes/test_ping_service.yaml new file mode 100644 index 000000000..6beed7590 --- /dev/null +++ b/ebill_postfinance/tests/fixtures/cassettes/test_ping_service.yaml @@ -0,0 +1,1057 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: GET + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc?xsd=xsd0 + response: + body: + string: + headers: + Connection: + - close + Content-Type: + - text/xml; charset=UTF-8 + Date: + - Thu, 28 Apr 2022 08:07:23 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Set-Cookie: + - ittrksessid=f987ef88.5ddb26a77620d;HttpOnly;Secure; path=/; domain=.postfinance.ch; + SameSite=None; Secure; HttpOnly + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - YmpLOwk0afa9fSTFW995MwAACAM + X-Xss-Protection: + - 1; mode=block + content-length: + - '9632' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - ittrksessid=f987ef88.5ddb26a77620d + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: GET + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc?xsd=xsd2 + response: + body: + string: + headers: + Connection: + - close + Content-Type: + - text/xml; charset=UTF-8 + Date: + - Thu, 28 Apr 2022 08:07:23 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - YmpLPDXqfedFMKlAc9KKIwAABRA + X-Xss-Protection: + - 1; mode=block + content-length: + - '10710' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - ittrksessid=f987ef88.5ddb26a77620d + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: GET + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc?xsd=xsd3 + response: + body: + string: 12356795012 + headers: + Connection: + - close + Content-Type: + - text/xml; charset=UTF-8 + Date: + - Thu, 28 Apr 2022 08:07:24 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - YmpLPLh5lqesNG__KmPS1QAABwc + X-Xss-Protection: + - 1; mode=block + content-length: + - '3068' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - ittrksessid=f987ef88.5ddb26a77620d + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: GET + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc?xsd=xsd1 + response: + body: + string: + headers: + Connection: + - close + Content-Type: + - text/xml; charset=UTF-8 + Date: + - Thu, 28 Apr 2022 08:07:24 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - YmpLPQk0afa9fSTFW995NAAACAQ + X-Xss-Protection: + - 1; mode=block + content-length: + - '2273' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - ittrksessid=f987ef88.5ddb26a77620d + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: GET + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc?xsd=xsd4 + response: + body: + string: + headers: + Connection: + - close + Content-Type: + - text/xml; charset=UTF-8 + Date: + - Thu, 28 Apr 2022 08:07:25 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - YmpLPUjLVddjjTR3jj3aywAABhg + X-Xss-Protection: + - 1; mode=block + content-length: + - '534' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: GET + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc?xsd=xsd0 + response: + body: + string: + headers: + Connection: + - close + Content-Type: + - text/xml; charset=UTF-8 + Date: + - Fri, 29 Apr 2022 08:02:35 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Set-Cookie: + - ittrksessid=c3834b28.5ddc6772b3d0a;HttpOnly;Secure; path=/; domain=.postfinance.ch; + SameSite=None; Secure; HttpOnly + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - YmubnH-W-KPXfyRJfGf9QgAABgs + X-Xss-Protection: + - 1; mode=block + content-length: + - '9632' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - ittrksessid=c3834b28.5ddc6772b3d0a + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: GET + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc?xsd=xsd2 + response: + body: + string: + headers: + Connection: + - close + Content-Type: + - text/xml; charset=UTF-8 + Date: + - Fri, 29 Apr 2022 08:02:36 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - YmubnEfRF6duesQ9A1fmKgAABwg + X-Xss-Protection: + - 1; mode=block + content-length: + - '10710' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - ittrksessid=c3834b28.5ddc6772b3d0a + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: GET + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc?xsd=xsd3 + response: + body: + string: 12356795012 + headers: + Connection: + - close + Content-Type: + - text/xml; charset=UTF-8 + Date: + - Fri, 29 Apr 2022 08:02:36 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - YmubnXpSAfll-abirzswkwAACAs + X-Xss-Protection: + - 1; mode=block + content-length: + - '3068' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - ittrksessid=c3834b28.5ddc6772b3d0a + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: GET + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc?xsd=xsd1 + response: + body: + string: + headers: + Connection: + - close + Content-Type: + - text/xml; charset=UTF-8 + Date: + - Fri, 29 Apr 2022 08:02:37 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - YmubnUfRF6duesQ9A1fmKwAABwk + X-Xss-Protection: + - 1; mode=block + content-length: + - '2273' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - ittrksessid=c3834b28.5ddc6772b3d0a + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: GET + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc?xsd=xsd4 + response: + body: + string: + headers: + Connection: + - close + Content-Type: + - text/xml; charset=UTF-8 + Date: + - Fri, 29 Apr 2022 08:02:37 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - YmubnnpSAfll-abirzswlAAACA8 + X-Xss-Protection: + - 1; mode=block + content-length: + - '534' + status: + code: 200 + message: OK +- request: + body: "\nhttp://ch.swisspost.ebill.b2bservice/B2BService/ExecutePingurn:uuid:e1116f5e-22a4-443c-9c56-3475d3fb0d1chttps://ebill-ki.postfinance.ch/B2BService/B2BService.svcyb1021209\xA3cAmp\xA333995541101000001021209falsefalse" + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '1139' + Content-Type: + - application/soap+xml; charset=utf-8; action="http://ch.swisspost.ebill.b2bservice/B2BService/ExecutePing" + Cookie: + - ittrksessid=c3834b28.5ddc6772b3d0a + SOAPAction: + - '"http://ch.swisspost.ebill.b2bservice/B2BService/ExecutePing"' + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: POST + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc + response: + body: + string: http://ch.swisspost.ebill.b2bservice/B2BService/ExecutePingResponse00000000-0000-0000-0000-000000000000urn:uuid:e1116f5e-22a4-443c-9c56-3475d3fb0d1c2022-04-29T08:02:38.998Z2022-04-29T08:07:38.998Z41101000001021209 + headers: + Connection: + - close + Content-Length: + - '1031' + Content-Type: + - application/soap+xml; charset=utf-8 + Date: + - Fri, 29 Apr 2022 08:02:38 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Strict-Transport-Security: + - max-age=31536000 + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - YmubnkfRF6duesQ9A1fmLAAABwI + X-Xss-Protection: + - 1; mode=block + status: + code: 200 + message: OK +version: 1 diff --git a/ebill_postfinance/tests/fixtures/cassettes/test_search_invoices.yaml b/ebill_postfinance/tests/fixtures/cassettes/test_search_invoices.yaml new file mode 100644 index 000000000..a5c987a0f --- /dev/null +++ b/ebill_postfinance/tests/fixtures/cassettes/test_search_invoices.yaml @@ -0,0 +1,564 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: GET + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc?xsd=xsd0 + response: + body: + string: + headers: + Connection: + - close + Content-Type: + - text/xml; charset=UTF-8 + Date: + - Fri, 13 May 2022 05:57:53 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Set-Cookie: + - ittrksessid=b8278c09.5dede5af62f48;HttpOnly;Secure; path=/; domain=.postfinance.ch; + SameSite=None; Secure; HttpOnly + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - Yn3zYS25lnOenWMr5onEaAAABwg + X-Xss-Protection: + - 1; mode=block + content-length: + - '9632' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - ittrksessid=b8278c09.5dede5af62f48 + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: GET + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc?xsd=xsd2 + response: + body: + string: + headers: + Connection: + - close + Content-Type: + - text/xml; charset=UTF-8 + Date: + - Fri, 13 May 2022 05:57:53 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - Yn3zYusdGrL3swMNpDRV7AAACBg + X-Xss-Protection: + - 1; mode=block + content-length: + - '10710' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - ittrksessid=b8278c09.5dede5af62f48 + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: GET + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc?xsd=xsd3 + response: + body: + string: 12356795012 + headers: + Connection: + - close + Content-Type: + - text/xml; charset=UTF-8 + Date: + - Fri, 13 May 2022 05:57:54 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - Yn3zYhFe1qhLp6voSVLKEwAACRU + X-Xss-Protection: + - 1; mode=block + content-length: + - '3068' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - ittrksessid=b8278c09.5dede5af62f48 + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: GET + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc?xsd=xsd1 + response: + body: + string: + headers: + Connection: + - close + Content-Type: + - text/xml; charset=UTF-8 + Date: + - Fri, 13 May 2022 05:57:54 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - Yn3zY-sdGrL3swMNpDRV7QAACAw + X-Xss-Protection: + - 1; mode=block + content-length: + - '2273' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - ittrksessid=b8278c09.5dede5af62f48 + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: GET + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc?xsd=xsd4 + response: + body: + string: + headers: + Connection: + - close + Content-Type: + - text/xml; charset=UTF-8 + Date: + - Fri, 13 May 2022 05:57:55 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - Yn3zYy25lnOenWMr5onEaQAABxY + X-Xss-Protection: + - 1; mode=block + content-length: + - '534' + status: + code: 200 + message: OK +- request: + body: "\nhttp://ch.swisspost.ebill.b2bservice/B2BService/SearchInvoicesurn:uuid:702a1145-d198-4922-bce3-fd1101657330https://ebill-ki.postfinance.ch/B2BService/B2BService.svcyb1021209\xA3cAmp\xA333995541101000001021209test-transaction-123" + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '1174' + Content-Type: + - application/soap+xml; charset=utf-8; action="http://ch.swisspost.ebill.b2bservice/B2BService/SearchInvoices" + Cookie: + - ittrksessid=b8278c09.5dede5af62f48 + SOAPAction: + - '"http://ch.swisspost.ebill.b2bservice/B2BService/SearchInvoices"' + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: POST + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc + response: + body: + string: http://ch.swisspost.ebill.b2bservice/B2BService/SearchInvoicesResponse00000000-0000-0000-0000-000000000000urn:uuid:702a1145-d198-4922-bce3-fd11016573302022-05-13T05:57:56.570Z2022-05-13T06:02:56.570Z1141101000001021209test-transaction-12341100000259278521340Invalid2022-05-13T07:32:04.3809TransactionID in + file name (test-transaction-123) and XML (QR-IBAN) not equal + headers: + Connection: + - close + Content-Length: + - '1737' + Content-Type: + - application/soap+xml; charset=utf-8 + Date: + - Fri, 13 May 2022 05:57:55 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Strict-Transport-Security: + - max-age=31536000 + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - Yn3zZBFe1qhLp6voSVLKFAAACRM + X-Xss-Protection: + - 1; mode=block + status: + code: 200 + message: OK +version: 1 diff --git a/ebill_postfinance/tests/fixtures/cassettes/test_upload_file.yaml b/ebill_postfinance/tests/fixtures/cassettes/test_upload_file.yaml new file mode 100644 index 000000000..c6bf47038 --- /dev/null +++ b/ebill_postfinance/tests/fixtures/cassettes/test_upload_file.yaml @@ -0,0 +1,561 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: GET + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc?xsd=xsd0 + response: + body: + string: + headers: + Connection: + - close + Content-Type: + - text/xml; charset=UTF-8 + Date: + - Fri, 13 May 2022 04:51:22 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Set-Cookie: + - ittrksessid=c996ea6f.5dedd6d0eee49;HttpOnly;Secure; path=/; domain=.postfinance.ch; + SameSite=None; Secure; HttpOnly + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - Yn3jyusdGrL3swMNpDRS2gAACAc + X-Xss-Protection: + - 1; mode=block + content-length: + - '9632' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - ittrksessid=c996ea6f.5dedd6d0eee49 + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: GET + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc?xsd=xsd2 + response: + body: + string: + headers: + Connection: + - close + Content-Type: + - text/xml; charset=UTF-8 + Date: + - Fri, 13 May 2022 04:51:22 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - Yn3jyusdGrL3swMNpDRS2wAACBc + X-Xss-Protection: + - 1; mode=block + content-length: + - '10710' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - ittrksessid=c996ea6f.5dedd6d0eee49 + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: GET + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc?xsd=xsd3 + response: + body: + string: 12356795012 + headers: + Connection: + - close + Content-Type: + - text/xml; charset=UTF-8 + Date: + - Fri, 13 May 2022 04:51:23 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - Yn3jy-sdGrL3swMNpDRS3AAACBY + X-Xss-Protection: + - 1; mode=block + content-length: + - '3068' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - ittrksessid=c996ea6f.5dedd6d0eee49 + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: GET + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc?xsd=xsd1 + response: + body: + string: + headers: + Connection: + - close + Content-Type: + - text/xml; charset=UTF-8 + Date: + - Fri, 13 May 2022 04:51:23 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - Yn3jzC25lnOenWMr5onCkgAABxY + X-Xss-Protection: + - 1; mode=block + content-length: + - '2273' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Cookie: + - ittrksessid=c996ea6f.5dedd6d0eee49 + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: GET + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc?xsd=xsd4 + response: + body: + string: + headers: + Connection: + - close + Content-Type: + - text/xml; charset=UTF-8 + Date: + - Fri, 13 May 2022 04:51:24 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Strict-Transport-Security: + - max-age=31536000 + Vary: + - Accept-Encoding + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - Yn3jzC25lnOenWMr5onCkwAABww + X-Xss-Protection: + - 1; mode=block + content-length: + - '534' + status: + code: 200 + message: OK +- request: + body: "\nhttp://ch.swisspost.ebill.b2bservice/B2BService/UploadFilesReporturn:uuid:52e2cd23-f8a2-46ae-9545-283b1bb87a97https://ebill-ki.postfinance.ch/B2BService/B2BService.svcyb1021209\xA3cAmp\xA3339955XMLtest-transaction-123PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPEVudmVsb3BlIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHR5cGU9InN0cmluZyIgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249ImZpbGU6Ly9mczA4L2JpbGxpbmckLzA0JTIwRG9rdW1lbnRhdGlvbmVuLzEwJTIwVGVjaG5pc2NoZSUyMFNjaGVtYXMvMDYlMjB5ZWxsb3diaWxsJTIwSW52b2ljZSUyMDIuMC4xLzAxJTIwQmlsbGVyJTIwSW5wdXQvMDElMjBYU0QtU2NoZW1lL3liSW52b2ljZV9WMi4wLjEueHNkIj4KCTxIZWFkZXI+CgkJPEZyb20+VGVzdCBCaWxsZXIgUEZ2PC9Gcm9tPgoJCTxUbz5JUEVDZUJJTExTZXJ2ZXI8L1RvPgoJCTxVc2VDYXNlPkNyZWF0ZXliSW52b2ljZTwvVXNlQ2FzZT4KCQk8U2Vzc2lvbklEPjE8L1Nlc3Npb25JRD4KCQk8VmVyc2lvbj4yLjA8L1ZlcnNpb24+CgkJPFN0YXR1cz4wPC9TdGF0dXM+CgkJPFNvZnR3YXJlTmFtZT5UZXN0PC9Tb2Z0d2FyZU5hbWU+CgkJPFNvZnR3YXJlVmVyc2lvbj4xLjA8L1NvZnR3YXJlVmVyc2lvbj4KCTwvSGVhZGVyPgoJPEJvZHk+CgkJPERlbGl2ZXJ5SW5mbz4KCQkJPEJpbGxlcklEPjQxMTAxMDAwMDAwMjE1MTM5PC9CaWxsZXJJRD4KCQkJPGVCaWxsQWNjb3VudElEPjQxMTAwMDAwMjU5Mjc4NTIxPC9lQmlsbEFjY291bnRJRD4KCQkJPERlbGl2ZXJ5RGF0ZT4yMDIwLTA3LTAxPC9EZWxpdmVyeURhdGU+CgkJCTxUcmFuc2FjdGlvbklEPlFSLUlCQU48L1RyYW5zYWN0aW9uSUQ+CgkJCTxCaWxsRGV0YWlsc1R5cGU+UERGQXBwZW5kaXg8L0JpbGxEZXRhaWxzVHlwZT4KCQkJPFVSTEJpbGxEZXRhaWxzLz4KCQk8L0RlbGl2ZXJ5SW5mbz4KCQk8QmlsbD4KCQkJPEhlYWRlcj4KCQkJCTxEb2N1bWVudFR5cGU+QklMTDwvRG9jdW1lbnRUeXBlPgoJCQkJPERvY3VtZW50SUQ+NTE1MjwvRG9jdW1lbnRJRD4KCQkJCTxEb2N1bWVudERhdGU+MjAyMC0wNy0wMTwvRG9jdW1lbnREYXRlPgoJCQkJPFNlbmRlclBhcnR5PgoJCQkJCTxUYXhMaWFiaWxpdHk+VkFUPC9UYXhMaWFiaWxpdHk+CgkJCQkJPFBhcnR5VHlwZT4KCQkJCQkJPEN1c3RvbWVySUQ+MTAwMjwvQ3VzdG9tZXJJRD4KCQkJCQkJPEFkZHJlc3M+CgkJCQkJCQk8Q29tcGFueU5hbWU+VGVzdCBCaWxsZXI8L0NvbXBhbnlOYW1lPgoJCQkJCQkJPENvbXBhbnlEaXZpc2lvbj5WZXJrYXVmPC9Db21wYW55RGl2aXNpb24+CgkJCQkJCQk8QWRkcmVzczE+VGVzdHN0cmFzc2UgOTk8L0FkZHJlc3MxPgoJCQkJCQkJPEFkZHJlc3MyPkdlYsOkdWRlIEM8L0FkZHJlc3MyPgoJCQkJCQkJPFpJUD45OTk5PC9aSVA+CgkJCQkJCQk8Q2l0eT5PcnRzY2hhZnQ8L0NpdHk+CgkJCQkJCQk8Q291bnRyeT5DSDwvQ291bnRyeT4KCQkJCQkJCTxFbWFpbD5lLWJpbGwuaGVscEBwb3N0ZmluYW5jZS5jaDwvRW1haWw+CgkJCQkJCQk8Q29udGFjdDE+MDgwMDExMTEwMTwvQ29udGFjdDE+CgkJCQkJCTwvQWRkcmVzcz4KCQkJCQkJPFRheElEPkNIRTExMTIyMjMzMzwvVGF4SUQ+CgkJCQkJCTxBZGRpdGlvbmFsUmVmZXJlbmNlPgoJCQkJCQkJPFJlZmVyZW5jZVBvc2l0aW9uPjE8L1JlZmVyZW5jZVBvc2l0aW9uPgoJCQkJCQkJPFJlZmVyZW5jZVR5cGU+R0xOPC9SZWZlcmVuY2VUeXBlPgoJCQkJCQkJPFJlZmVyZW5jZVZhbHVlPjc2MDA4MDgwMDAwMDA8L1JlZmVyZW5jZVZhbHVlPgoJCQkJCQk8L0FkZGl0aW9uYWxSZWZlcmVuY2U+CgkJCQkJPC9QYXJ0eVR5cGU+CgkJCQk8L1NlbmRlclBhcnR5PgoJCQkJPFJlY2VpdmVyUGFydHk+CgkJCQkJPFBhcnR5VHlwZT4KCQkJCQkJPEN1c3RvbWVySUQ+QUJDMjwvQ3VzdG9tZXJJRD4KCQkJCQkJPEFkZHJlc3M+CgkJCQkJCQk8Q29tcGFueU5hbWU+VGVzdCBGaXJtYTwvQ29tcGFueU5hbWU+CgkJCQkJCQk8Q29tcGFueURpdmlzaW9uPkVpbmthdWY8L0NvbXBhbnlEaXZpc2lvbj4KCQkJCQkJCTxQT0JveD4xMDAwPC9QT0JveD4KCQkJCQkJCTxaSVA+MzAwMDwvWklQPgoJCQkJCQkJPENpdHk+QmVybjwvQ2l0eT4KCQkJCQkJCTxDb3VudHJ5PkNIPC9Db3VudHJ5PgoJCQkJCQkJPENvbnRhY3QxPjAwMDAwMDAwMDA8L0NvbnRhY3QxPgoJCQkJCQk8L0FkZHJlc3M+CgkJCQkJCTxUYXhJRD5DSEUzMzMyMjIxMTE8L1RheElEPgoJCQkJCTwvUGFydHlUeXBlPgoJCQkJPC9SZWNlaXZlclBhcnR5PgoJCQkJPEludm9pY2VSZWNlaXZpbmdQYXJ0eT4KCQkJCQk8QWRkcmVzcz4KCQkJCQkJCTxDb21wYW55TmFtZT5UZXN0IEZpcm1hPC9Db21wYW55TmFtZT4KCQkJCQkJCTxDb21wYW55RGl2aXNpb24+QnVjaGhhbHR1bmc8L0NvbXBhbnlEaXZpc2lvbj4KCQkJCQkJCTxQT0JveD4xMDAwPC9QT0JveD4KCQkJCQkJCTxaSVA+MzAwMDwvWklQPgoJCQkJCQkJPENpdHk+QmVybjwvQ2l0eT4KCQkJCQkJCTxDb3VudHJ5PkNIPC9Db3VudHJ5PgoJCQkJCQkJPENvbnRhY3QxPjAwMDAwMDAwMDE8L0NvbnRhY3QxPgoJCQkJCTwvQWRkcmVzcz4KCQkJCTwvSW52b2ljZVJlY2VpdmluZ1BhcnR5PgoJCQkJPERlbGl2ZXJ5UGxhY2U+CgkJCQkJPEFkZHJlc3M+CgkJCQkJCTxaSVA+ODAwMDwvWklQPgoJCQkJCQk8Q2l0eT5aw7xyaWNoPC9DaXR5PgoJCQkJCQk8Q291bnRyeT5DSDwvQ291bnRyeT4KCQkJCQk8L0FkZHJlc3M+CgkJCQk8L0RlbGl2ZXJ5UGxhY2U+CgkJCQk8QWNoaWV2ZW1lbnREYXRlPgoJCQkJCTxTdGFydERhdGVBY2hpZXZlbWVudD4yMDIwLTA3LTAxPC9TdGFydERhdGVBY2hpZXZlbWVudD4KCQkJCQk8RW5kRGF0ZUFjaGlldmVtZW50PjIwMjAtMDctMDE8L0VuZERhdGVBY2hpZXZlbWVudD4KCQkJCTwvQWNoaWV2ZW1lbnREYXRlPgoJCQkJPEN1cnJlbmN5PkNIRjwvQ3VycmVuY3k+CgkJCQk8QWNjb3VudEFzc2lnbm1lbnQ+CgkJCQkJPE9yZGVyUmVmZXJlbmNlPgoJCQkJCQk8UmVmZXJlbmNlUG9zaXRpb24+MDAyMDwvUmVmZXJlbmNlUG9zaXRpb24+CgkJCQkJCTxSZWZlcmVuY2VUeXBlPk9yZGVyUmVmZXJlbmNlPC9SZWZlcmVuY2VUeXBlPgoJCQkJCQk8UmVmZXJlbmNlVmFsdWU+MTAwMDwvUmVmZXJlbmNlVmFsdWU+CgkJCQkJPC9PcmRlclJlZmVyZW5jZT4KCQkJCQk8UHJvamVjdE51bWJlcj5QUkNERTY8L1Byb2plY3ROdW1iZXI+CgkJCQk8L0FjY291bnRBc3NpZ25tZW50PgoJCQkJPEZpeGVkUmVmZXJlbmNlPgoJCQkJCTxSZWZlcmVuY2VQb3NpdGlvbj4wMDMwPC9SZWZlcmVuY2VQb3NpdGlvbj4KCQkJCQk8UmVmZXJlbmNlVHlwZT5Db250cmFjdE51bWJlcjwvUmVmZXJlbmNlVHlwZT4KCQkJCQk8UmVmZXJlbmNlVmFsdWU+Q05UMjAwPC9SZWZlcmVuY2VWYWx1ZT4KCQkJCTwvRml4ZWRSZWZlcmVuY2U+CgkJCQk8TGFuZ3VhZ2U+ZGU8L0xhbmd1YWdlPgoJCQkJPFBheW1lbnRJbmZvcm1hdGlvbj4KCQkJCQk8UGF5bWVudER1ZURhdGU+MjAyMC0wNy0zMDwvUGF5bWVudER1ZURhdGU+CgkJCQkJPFBheW1lbnRUeXBlPklCQU48L1BheW1lbnRUeXBlPgoJCQkJCTxmaXhBbW91bnQ+WWVzPC9maXhBbW91bnQ+CgkJCQkJPElCQU4+CgkJCQkJCTxJQkFOPkNINTEzMDAwMDAwMTI1MDA5MDM0MjwvSUJBTj4KCQkJCQkJPENyZWRpdG9yUmVmZXJlbmNlPjEyMzQ1Njc4OTExMTMxNTE3MTkyMTIzMjUyNzwvQ3JlZGl0b3JSZWZlcmVuY2U+CgkJCQkJPC9JQkFOPgoJCQkJPC9QYXltZW50SW5mb3JtYXRpb24+CgkJCQk8RnJlZVRleHQ+RGllcyBpc3QgZWluZSBNdXN0ZXJyZWNobnVuZyBtaXQgUVItSUJBTiBBbmdhYmVuPC9GcmVlVGV4dD4KCQkJPC9IZWFkZXI+CgkJCTxMaW5lSXRlbXM+CgkJCQk8TGluZUl0ZW0+CgkJCQkJPExpbmVJdGVtVHlwZT5OT1JNQUw8L0xpbmVJdGVtVHlwZT4KCQkJCQk8TGluZUl0ZW1JRD4xPC9MaW5lSXRlbUlEPgoJCQkJCTxQcm9kdWN0R3JvdXA+RWlzZW53YXJlbjwvUHJvZHVjdEdyb3VwPgoJCQkJCTxQcm9kdWN0U3ViR3JvdXA+U2NocmF1YmVuPC9Qcm9kdWN0U3ViR3JvdXA+CgkJCQkJPFByb2R1Y3REZXNjcmlwdGlvbj5LcmV1enNjaHJhdWJlbjwvUHJvZHVjdERlc2NyaXB0aW9uPgoJCQkJCTxRdWFudGl0eT41MDwvUXVhbnRpdHk+CgkJCQkJPFF1YW50aXR5RGVzY3JpcHRpb24+SDg3PC9RdWFudGl0eURlc2NyaXB0aW9uPgoJCQkJCTxQcmljZVVuaXQ+MTwvUHJpY2VVbml0PgoJCQkJCTxQcmljZUluY2x1c2l2ZVRheD4xMC44MDwvUHJpY2VJbmNsdXNpdmVUYXg+CgkJCQkJPFByaWNlRXhjbHVzaXZlVGF4PjEwLjAwPC9QcmljZUV4Y2x1c2l2ZVRheD4KCQkJCQk8VGF4PgoJCQkJCQk8VGF4RGV0YWlsPgoJCQkJCQkJPFJhdGU+ODwvUmF0ZT4KCQkJCQkJCTxBbW91bnQ+NDAuMDA8L0Ftb3VudD4KCQkJCQkJCTxCYXNlQW1vdW50RXhjbHVzaXZlVGF4PjUwMC4wMDwvQmFzZUFtb3VudEV4Y2x1c2l2ZVRheD4KCQkJCQkJCTxCYXNlQW1vdW50SW5jbHVzaXZlVGF4PjU0MC4wMDwvQmFzZUFtb3VudEluY2x1c2l2ZVRheD4KCQkJCQkJPC9UYXhEZXRhaWw+CgkJCQkJCTxUb3RhbFRheD40MC4wMDwvVG90YWxUYXg+CgkJCQkJPC9UYXg+CgkJCQkJPEFtb3VudEluY2x1c2l2ZVRheD41MDAuMDA8L0Ftb3VudEluY2x1c2l2ZVRheD4KCQkJCQk8QW1vdW50RXhjbHVzaXZlVGF4PjU0MC4wMDwvQW1vdW50RXhjbHVzaXZlVGF4PgoJCQkJPC9MaW5lSXRlbT4KCQkJPC9MaW5lSXRlbXM+CgkJCTxTdW1tYXJ5PgoJCQkJPFRheD4KCQkJCQk8VGF4RGV0YWlsPgoJCQkJCQk8UmF0ZT44PC9SYXRlPgoJCQkJCQk8QW1vdW50PjQwLjAwPC9BbW91bnQ+CgkJCQkJCTxCYXNlQW1vdW50RXhjbHVzaXZlVGF4PjUwMC4wMDwvQmFzZUFtb3VudEV4Y2x1c2l2ZVRheD4KCQkJCQkJPEJhc2VBbW91bnRJbmNsdXNpdmVUYXg+NTQwLjAwPC9CYXNlQW1vdW50SW5jbHVzaXZlVGF4PgoJCQkJCTwvVGF4RGV0YWlsPgoJCQkJCTxUb3RhbFRheD40MC4wMDwvVG90YWxUYXg+CgkJCQkJPC9UYXg+CgkJCQkJPERpc2NvdW50PgoJCQkJCQk8RGF5cz4xMDwvRGF5cz4KCQkJCQkJPFJhdGU+MjwvUmF0ZT4KCQkJCQk8L0Rpc2NvdW50PgoJCQkJPFRvdGFsQW1vdW50RXhjbHVzaXZlVGF4PjUwMC4wMDwvVG90YWxBbW91bnRFeGNsdXNpdmVUYXg+CgkJCQk8VG90YWxBbW91bnRJbmNsdXNpdmVUYXg+NTQwLjAwPC9Ub3RhbEFtb3VudEluY2x1c2l2ZVRheD4KCQkJCTxUb3RhbEFtb3VudFBhaWQ+MjAwLjAwPC9Ub3RhbEFtb3VudFBhaWQ+CgkJCQk8VG90YWxBbW91bnREdWU+MzQwLjAwPC9Ub3RhbEFtb3VudER1ZT4KCQkJPC9TdW1tYXJ5PgoJCTwvQmlsbD48QXBwZW5kaXg+CgkJCTxEb2N1bWVudCBNaW1lVHlwZT0ieC1hcHBsaWNhdGlvbi9wZGZhcHBlbmRpeCI+SlZCRVJpMHhMallOSmVMano5TU5Dak0wSURBZ2IySnFEVHc4TDB4cGJtVmhjbWw2WldRZ01TOU1JREkxTWpJNUwwOGdNell2UlNBeE9UUTFPUzlPSURFdlZDQXlORGt5TlM5SUlGc2dORFkzSURFMU9WMCtQZzFsYm1Sdlltb05JQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdEUW8wTkNBd0lHOWlhZzA4UEM5RVpXTnZaR1ZRWVhKdGN6dzhMME52YkhWdGJuTWdOQzlRY21Wa2FXTjBiM0lnTVRJK1BpOUdhV3gwWlhJdlJteGhkR1ZFWldOdlpHVXZTVVJiUEVSQk5UQXdRemxGUlRFME9VSkZOREk0TUVSRVF6ZzNOall6T0VZME5qRXdQanc0UXpVeE4wWkRORFV4TkRBd05UUTJPVEJGUmpBNVJFRkRORUpDTmpKRU9UNWRMMGx1WkdWNFd6TTBJREU1WFM5SmJtWnZJRE16SURBZ1VpOU1aVzVuZEdnZ05qUXZVSEpsZGlBeU5Ea3lOaTlTYjI5MElETTFJREFnVWk5VGFYcGxJRFV6TDFSNWNHVXZXRkpsWmk5WFd6RWdNaUF4WFQ0K2MzUnlaV0Z0RFFwbzNtSmlaQkJnWUdKZ1NnSVNqRk5BaERhSUd3d2tPQTRDQ1FaeklHR3hIaVQyQkNRckN5UzJlekF3TVRKc0JNa3lNT0ltL2pPdSt3VVFZQUI1dmdqOERRcGxibVJ6ZEhKbFlXME5aVzVrYjJKcURYTjBZWEowZUhKbFpnMEtNQTBLSlNWRlQwWU5DaUFnSUNBZ0lDQWdEUW8xTWlBd0lHOWlhZzA4UEM5RElEYzNMMFpwYkhSbGNpOUdiR0YwWlVSbFkyOWtaUzlKSURrNUwweGxibWQwYUNBM05TOVRJRE00UGo1emRISmxZVzBOQ21qZVltQmc0R0JnWUVwbkFBS1B2d3lvZ0JHSVdSZzRHcERGT0tDWWdjR2NnWS81Z3VMQlJ3ME1keDlJWGJCc1dnRFY0c01Nb1psMTRKcFlHQmdTR0NHaWpMRUFBUVlBUzRjSzlnMEtaVzVrYzNSeVpXRnREV1Z1Wkc5aWFnMHpOU0F3SUc5aWFnMDhQQzlNWVc1bktQNy9BRVFBUlFBdEFFTUFTQ2t2VFdGeWEwbHVabTg4UEM5TllYSnJaV1FnZEhKMVpUNCtMMDFsZEdGa1lYUmhJRElnTUNCU0wxQmhaMlZNWVhsdmRYUXZUMjVsUTI5c2RXMXVMMUJoWjJWeklETXlJREFnVWk5VGRISjFZM1JVY21WbFVtOXZkQ0EySURBZ1VpOVVlWEJsTDBOaGRHRnNiMmMrUGcxbGJtUnZZbW9OTXpZZ01DQnZZbW9OUER3dlEyOXVkR1Z1ZEhNZ016Z2dNQ0JTTDBOeWIzQkNiM2hiTUM0d0lEQXVNQ0ExT1RVdU5EUWdPRFF5TGpBMFhTOUhjbTkxY0NBMU1TQXdJRkl2VFdWa2FXRkNiM2hiTUM0d0lEQXVNQ0ExT1RVdU5EUWdPRFF5TGpBMFhTOVFZWEpsYm5RZ016SWdNQ0JTTDFKbGMyOTFjbU5sY3p3OEwwTnZiRzl5VTNCaFkyVThQQzlEVXpBZ05EVWdNQ0JTUGo0dlJYaDBSMU4wWVhSbFBEd3ZSMU13SURRMklEQWdVaTlIVXpFZ05EY2dNQ0JTTDBkVE1pQTBPQ0F3SUZJK1BpOUdiMjUwUER3dlZGUXdJRFV3SURBZ1VqNCtMMWhQWW1wbFkzUThQQzlKYlRBZ05ETWdNQ0JTUGo0K1BpOVNiM1JoZEdVZ01DOVRkSEoxWTNSUVlYSmxiblJ6SURBdlZHRmljeTlUTDFSNWNHVXZVR0ZuWlQ0K0RXVnVaRzlpYWcwek55QXdJRzlpYWcwOFBDOUdhV3gwWlhJdlJteGhkR1ZFWldOdlpHVXZSbWx5YzNRZ05EWXZUR1Z1WjNSb0lEVXdNQzlPSURjdlZIbHdaUzlQWW1wVGRHMCtQbk4wY21WaGJRMEthTjZrVTIxdjJqQVEvaXYzY2RQRXpuYnNoRWdWRWpCb2tVcEJEV3VuSVQ1NHdRTnJ3VUdKbWVEZjEzWUNkTkw0c3NueXkvbTVlKzQ1WDhJRkVPQXhzQlI0QXBRSjRGMWdqQUpQSVNJUkNBTENUd3Bwd21HSkU3TldSN1hHTCtxM3p0WHovUUFvUktuamVGN2QzV0Yva3NGUFdkUUtCMU44S3F1ZExIRFlCL0taNEd6ZUlyUDVGQ2htZmJEVlFXRTJsZlV2NTJvVUxrNTdoYU9qdmMrc3RBcHpHZUxLZlJQWDY5M21wLy9JVC8rTHZ6SGZKZmdyWTUwcll5RmxDUTdsL2tIcHpkWkNuS2J1QVJ1a3d3VEJjU0UzTlVRTXg2V3hnMEY1WEhhb1lBRURTZ2p4OGFzQWp1Vk9GNmNQNCtwZzlVWlZ3QVU4ZXM2UERhb0x4WUFUMzQ5dzhTUjNDdWVqbDRmdnMwL25tRTRJQ0hCbUsyWHo3YmxVZi9YYVNPU0U0TVRLUXVkOXN5a1VFTXlzMnIxQXpKdDM5SzYraEVydmJWbmh0N1l5UVVrb2V5QnI1VjF1NUI2WnZGeHJzOEZYYmZxbTFoZDdyS3ZhRHJleU9qL0dOWWYvSW4xWmo3TDFvSXhoZHZoaHZaeUY2M1hRdFNpL0d1M0lGSEFhM0M5cVhhNjEzZFpMbG5TQjNCd2U5Vk9JT05oK1A1K3ZIdThqNGpocFZ6K0ZheGJuL0hMdmg3ZTdYYTgrWVN4NEJHWkMybk5NNldYOWN6UzRqdzg2bkJWRlVhdUtPYTZneCsxZGQzdFcycWoxZnBITEdiVklvOG12N1Z5RlBnMno2NStNbVh0R2FlcTlySlRKVDczZW13QURBQlVCSktzTkNtVnVaSE4wY21WaGJRMWxibVJ2WW1vTk16Z2dNQ0J2WW1vTlBEd3ZSbWxzZEdWeUwwWnNZWFJsUkdWamIyUmxMMHhsYm1kMGFDQXhPVEUwUGo1emRISmxZVzBOQ2tpSmxGZmJiaHczRW4zdnIrRGo5QUxUdzF1VDdFVVF3TGJzWEJCakhYaXdXVUR3ZzNZMGxoUm9OTGFzU2FMOStqMm5paHpkckVpMllGWTFXZGZEWXBHemVITjJzcnRjbSsrK1c3eDk5ZE9Cc2ViNzcxOGV2RExkNTg0T1BvMHAyWWhKYStiOFREWW5iK3hnK1M4bjVaejN6cXcya0MvbXBQdHNuTWc3NDFKeWcvYzVtTG1mVWhoU0dJUElZWFhUalpnTjVyd0wwN1RuNk9tOE8rMCtkci9pejVrZjhQOTNXUHJaZElzZjNsdHo4dVdaWWRITlRTRGVqdVBUZ2N4RG1mWnNEY1hXZ041TFFKKzc2TXRRUnBOekhzSmtYSnlHNHBPSmZnam1jdDM5Wmk0WXAzdDJuUE03K04wSzJObkFnSjJaQit2eVZ3S09odU5vL3VqbXZnaDNYcmtJbmRFVWM0M3ZETXA1MkhHSjNOZ1laMlhKUlNWd0tYbTcwSmhpb2dpRzNKakpqRkdXWEdXU0NZN0tSU2xpdUwxNzN3Q0FqL0VlQUM2VmlRQjRBbURqUFFDUW9zdHdWU3BGMUdTUTJkeU5TbEFCSFpsb0hQd1poclpDYUhOdkpoZ0lHQ1h3eVFBano0RnByVG95M3FKZ1FKS1paRndKYkY1aFMwYWhIcFdlZGhFZU1tT3lwQ0doS0V3b2htcUIraVlpdU5IRXduSFZqWjUwcEVHaW1IUUtPaENBdmxwYmRWQ0NRMnoxU0pvQ1o5TW80aW5UUWtLRXFrVUNYMWtZUDNFUldWQVNFVElrUnhOcWNOV1ZTR2Nib2FnT0NUcG5kWnJWelVRRUV4Smh2QWsydWRtcE1HSHNCMGNCQWJhRTRxUjR6eEc3c09wSWFUWndRSTZRc2d5cFNONDRPb0pDa1RBaGkvMlpSbzdRWkFZZXJqZ05XNU5tV0ZMTk1DdVRNVDNKeVAwQ1pTV3ppalV6N0xvWEp4c3dTUXl4dk1jOWwrc1JkeGFybm5XTC91T0VadTY3czVLajQ1RmdxSTVIZ3Q5SlNTRWU5R0tObkNUT2dPRTZTOURWRGFRK3Y2MmdLY1JYYTNNdEhCZWtoaEJuWkgzQzBwZ3FMU3Jqb205TXEzaVgzSjRMdFNocHFISUlyWllsZXEra3ZCRnpNdWxTWTNLdWNGQk9BZGxVamdWaDlUUmxQVldyS3MrWnFVcG9uOFNLYkRKWHFJc2NjeFJLSGFzenFhaEU5VU9kWFBPZW5KR29KODlLY1ZPUzJyVldhd1JOVzcrWkNGdTRDVEpyTlFtdkcwUUdmVWdvUENGRGFRWlJGTFJ3dkhYQ3VWcGhiZ29VUkNTMTB0Z0o5bHhPRFVMUDh5dUh4WWVvTm5tOFdBOWVMY0UyYTB5OHMvZENJc2orK3BCckVucjZmWlFpRnlKdEpySWh0WkZIaG5NUW9DWHNPdjU0dldBc3VrWUVEVE1jWlpTalNRWW56M3M1Mmo1WVBlRStqUG85c1ZKOXBKNlliOENOZTJaVTRMUWJWWVkxNGpYYm1qL2RUOW8xaElGNjhEaHdUTExVSElzRUhyaEl4akZDQ2I0SUpFN2tFS0dFTEVlaTJzUjBxdlhBYnM5NjBIc2FUVXd3OU1WVktJdldSOGxTRHlWcFBaUldCcE52VE5hMCtLNkF1Nm51M2I2UitGTHp5N3FMbmtVckFlYldKbkJ2Tlc3TXJSNkNsRDV2RDFjYnE1Tm1EMEp0K2NTWFJCbDgwS2lEZHFPZzVSRUNiM1JPQjErN1hhZzFGYnpHRjd4dkxkMXAzUVk5RVNROFdhU0lKRmdKTExpc2ZTcDRBWUtPaFl6YXB3SXJaeFEvY2pOeW5iRnJMbGhIUS9IYzJzQkxSZ1JIMlo4d1NrTUx2SjFFTU1vdEViakpTWWtWL2FLYlRvYjMzMlNpakU0V2tSc25kUXZDR0Z0cVVadTd3QkNFVEJVVnBzYlNaUVMxb3FrbjM5Sy9hc1NjQnNhOEpBUDJpSThSQkU1alkzVU9LZ0RYY3hWNCtMQWNKeFVXNVZWOXJMeCtpeGZ2cjkzTFpiZDRjWGwxOXZGb2RjVVg4WXVycTZQVjZmcllIQzZXMjAvbXcrTGx5KzFmNWpCTlF5Z1orVTV4QUJpRk4xNGFMRS91aDhYNzNYK3Zyait0emVMSDlkSHgrdElzbHZMMTd1ams3T0xvNm14NzBSN1llQ2w2dmhRWHl5V2ZQTXVQdUpNR2l6cVJKNUN3MlE0bzZ6eWxJUlYwc2VXbW01bCsrYnVHdTNpM2Y3UzdaaE93aGlFQzcrWEJJNkwrbHFnYjJNb2ZGUTFOZFBtUFJ5VGkzdGhnVVR6TGxUem9VQnZMUDQzWTkwNUNPWno5dTNkbG1NenNyUGQreUdiMnBYZndibWE3b3g2S3MvTTYzWmIvMXdjN1JEUFQxYXZlQTRHYlZXQzQvVmpuVEkvbkxpZWIwT2xhZFBielovMVlCa3hjL0VHYllMWnRadFhQUnp6Y1oxWGhlSDNIbWJwdUxsdUFRNStwWXZvUHk1OEJJVEsyVFBicjhJelB4em85aVhYK0t0Ym9BZyt3WHZhalphd05pUmE3Wm5SZG9kM3VKRk1LM044VTArTWRxL0I0Q1BaQjZLWUM4Nm5adTR2WCtzNUdOaTltUjIwZzlzazB3YTI1N2xPaW4rMXV1SWVqaTBNdS9QMjJQSDRFaHZJM01NeXJlZ1A3R0dEOHF3WjA4U0N5K3dXemo2L2hjcmMwelZHRnRlR3diYWxkUEFEeW9xNDg4UEd1Mmpqb0EyTjRVMHZTZk9sajR2RTQzVmJOWFhON3JKdXg2ZWNUSVdzSEl2RW41NzZDVHgvekovQVNJTncxeEZpWlA4M2g3SDN2QSszditrTE5EUnlFcEI1NE1jMHVyelhFaGU3UVE3RGh5T0drVzRXNTFkejI3dkZwV2J4UVk0OUFsd1FReVc5WEE1Y3pDbzJMMnltcEN3WGtQMndveGN6ZXNtWVI3eTkxV3g5VWxCOGlydGkvcWFpcFZkUThvQzFrZDZ0OEh1bTI5c25ENnZZZGViNkhEb3kvNll5MUd4ek9YdmY4MFRyNzYwZ3A5MEdRK0FSR01qcnY1MW5ibEpmOC85blBhMFcrNmtYeVIwd0lSRzl1OXJ0dGQ5M3RFS1Vkd3BwOVZ1ZHkvdWtVdzUzdVZydlBJN0x4K1ozUWZVUFhkT2tiWXNoUDJIMk55Ly9OMmNudWNuMmpzKzgybi9IMjlRT2VoZEZsM0hESWFCb20vbktzOUhMZC9XWXVJSVpiM2ZGV2R5T3ZjVnprZk1WUU5VNFRmMXlvdnJVQnYzNVdtMjd4MDhhYWcrM05FK1QvQWd3QXQxN2ZzZzBLWlc1a2MzUnlaV0Z0RFdWdVpHOWlhZzB6T1NBd0lHOWlhZzA4UEM5TVpXNW5kR2dnTmo0K2MzUnlaV0Z0RFFyLy8vOEFBQUFOQ21WdVpITjBjbVZoYlExbGJtUnZZbW9OTkRBZ01DQnZZbW9OUER3dlJtbHNkR1Z5TDBac1lYUmxSR1ZqYjJSbEwweGxibWQwYUNBeE5ERTJPUzlNWlc1bmRHZ3hJREk1TURrd1BqNXpkSEpsWVcwTkNraUpkRllKZEZUbEZmN3VlNU5KWUVKSXlFSklnTHlaU1FKQzltU1NzQVVDMlNBc2dVU2NBUU1KU1NCQkFnRUNBZ0pHRnJYVGlpdHVwYTIyVXNWU0hkSGFZUkZpcVdGVFNsRmJGVWl3THFjOXA4ZkNzYlVJbVV5Lzl5YkQ0YWg5Yys2OCs5Ly9mM2Y3di92Zkh3SmdFRHFnb21wT2RXYk9BN3NxeDFOeWtWVFgwRnJmOXRhMkx6bVdpVUJJWE1QNmRpMnNUc2tGelBNNG43VzBiVmxyemtOcmwzSzhqV3VXTEZ1eGNla3pKL2FaZ2REUGdYbFhtcHZxRy84ZU9xY0dXUEFCMStjM1V4QTZRS1h1aFFNNVRtNXViZC93emJVUzZsK1lRUjJSSzFZMTFKODdjdlJsb0w0SVVBZTIxbTlvVS9lRXJRRWFLN2hlVzFuZjJsVFZ1V3M3eDgyQXBhSnQxZHAydnhjNXdDcVBQdCsycHFsdFJYaDJKOGZuNk05NUtMSmZIa0VJVElwYmNYSkZaZUF0aS9qTmRVQ3htRlExeEtRb3BnN2cxU3BvTTlEL3pKdytldzZtUUx1aEtGLzV6VGlwUG96ckd2QlRmVTc2bE1QUStOTWZCV0s4WTVnL2N0SU5zNXpXZmNGbFN2NG05MG9IL2dnVGZUQWpGR0VZZ0lHd0lKd1pqOEJnUkNJS1F4RE5yMk1SaDZHSXh6QWtJQkhETVFJamtVUXRWdGhnUnpKU2tJcFJHSTNiTUFaamtZWjBaQ0FUV2NobUpMbklnd1A1S0VBaHhtRThKbUFpSnFFSWt4bEJNYVppR2twUWlqS1Vvd0xUTVFPVm1JbFptSTA1cU1KY3pFTTFhbkE3NXVNT09PSENBaXpFbmFobERBL2pFVHlHSnhqMWM5aUxsL0FpOXVFM2VCbjc4UW84ZUJXdjRRRGV3T3Y0SGQ3RTczRVFYaHpDRVJ4R0o0N2hiZndCUzNBZjFtRTlObUlGZHVMWHVCZjNvQTNic1FuL3dhTjRIamV3RGYvRk5XekFEdlRDTDVCUStMQVpEMG9JZm91amNLTWRXOUdIeGZoR1ZHekJqMUF2OStISDJJVmZZQm5Xb0JVcnNSeDNvUmt0ZUVzRXg3RVczZWpCVXF6R1gvQlhOT0IrTEVJZG12QVFkdU1uZUJLUDQyazhnMmZ4Rkg2R240dUNQZmdWWHNBdjhRa2FzWW8xOENsMzdVTThnQzl3Q1JkZ1VndVpoVVptTVlRN2tFeGZqdUpQdFBBdlhFR3ZqSlVDbVM1YjVURWxVVG1obkZJdXFWdlZKOVI5NmhHMVU0dlJFclNSbWsxTDFiSzA4VnFKdHQ4YWJiVlpVNjBaTnNWbXRnMjJEYkhGMmhKc0kyMWpiUlcyT2x0VHl1bHIvaHVLMzIvZ0pvWFpQb1p6ak9NS3JzSW5HVEpPWnRKS3ZOSkZLeC9kWWlWYWk5ZUdhNXBoWmR3UFdJbWlsV0UzclRRYVZrUzM0dThoblNHZElIVUZNZC8zbnZHZkF2VHU4Ylg1YW4yemZPV1hGd1RtTGsrNDdPRC9zNWR6ZTc3c21kM1QwL051OS9WdVgvZFZvUHRyMHFYdTg5MnZkTy91ZnZ4Q1FaZ2E4aUVyb1pFZkxTZTlRRHBLT2lMeE1rWllYNnpJQS93L2dGc2U4Y2diNGpVNEw3NzN5RXNCK3Q1enM3NklpbllEYVhjVFN5ZUl0MDFFMm1ZaVpxdHNKK282aU1OdE9JbFR4TjRPSXZGKzd2QnBQRWc4bmNHN2VBOW5pZkE5T2lLSXErZTR3ODhURVRvdTluSVgvb3p6ZUI4ZjRMaFlaSnFFUzRrTWtsS0prRElaTE9VU1JRUkVTb1VNa1JteVRTb2xSbVpKck15V09Ka2pRNlZLb3JsejhUSlhoc2s4U1pCcVNaUWFHUzYzeXdpWkx5UGxEa2tTcDFqRkpSbytrUzNFa2swV2lsM3VsR1NwbFZSWkxDbXlTRVpKSFQ3Q3h6SmE2cG5CQnJsTmxrZ2owZGNrYWJKVTBtV1pYZ3RFU2JOa1NZdGt5bkxKbHJza1IxWklyclRpSFhSSnZyU0pRMVpKb2F3aGx0YktlR21YQ2JKT0pzcDZtU1IzUzVGc2tNbXlVYWJJSnF5VllybEhwc3BtZkliUEpVOVdFdVdydVpzWCttdmpFdXZrQzZQaUZobTFWOGNxYjJCOTZ6WG54MFVaeUhxTjRWazBrU2VPZytmVlFwNUNwVHlWSmh1ak51N2FZSDhHejhnK0pDdUhrS0Y4aFhCdWVWcWxGd09xbksrSjdISjV4Yi9UaXgwakR2S3NWQmN2U3ZkQzBqU3R0S1hFSTNVY0tHa1VqTEdTVTlPME1vK2FVamJQYVhkcGJzMDl2ZEd0bFduTjlZMGVVNHJ4NWtTVDI1V3BlVkR0Yk9GL2pkUHFtZUpLdk1rMnVWempxY2VrNnpFWmV0d3VhbGplcjJHNW9ZRUtmRndVa2xhcGVkVFVLdWRjcDZlakpORXpwY1NWYUxWcXBaN09LcWVuc3lUUjZuSnhsZm1tcDN4dmFZbnY5em1VUHB2SGtBa0xhS21tRHFwd3VkMkJrZDNxNlhTN0U5Mk1vMy9zRlh4WE1LVmZ3TUIxQldwS3FWYzZxb3lwRHJzMVVSZllyWFlyM1hLVjBOU0F0TXBxWnlrZHM3clMyWCtNVnFXY1pjMk1aRWRKeGNuRGZGbDQySmpHSG1iYnNmQ25jOGw4SjVFckRtR2ZzYkNYV0tDc0xyWnlLeXhzVFJhMkh3czMwOEkyWW1HcnNCQUdGcGFiaGFWazRjRnFZWU93c0JGWVdHb1dmRXo2QitsYlVtUXROUWFWS0t1OVNJNzBZdlJGdGd5VU9yMndaeVllWkp1TEtYTDFDNUoxUVRJaWlseUgyUnBOYkphbXNmcEhCM1h2ZXZrQk9ZMWNWbmFCSXpjMlUvTHlDNHJFa1pkcXQ1bERSeFZKYms1Y2JJdzVORUppaDBaWm80VFVYZWhRRXF6YWtQU2twSFJ6VHVpTWZFZjVzTlNVOEdOOWpYSzJEK3VtVFZzWFZaQm5UYkpHSjJlbjVZYVZUNjJZb0RuczFsU0hWMm54UGFYczhlVXdkenlHaUhhdzQ5VXdqNU80RVpuRTQ4WGlRVHcxRkhaRWhaMVA0Wm1oc0ZJVW50NEt6TFhCQ0ZVOUlGVVBpUEM5U0xkelkrMUw1czZ0cVlINFAvWC9XeHhLRjZjZlBVUVRLbFRHS2t3UXpoVmIyRkhCVXlwd0kvc25xWmNVVWxzY3l2WUl0akt3SWZNb3JLVUpmcUdjNDhST1d0NU4ya3RTYTZuaWRUTEhTZStUUGlOOVRRcTU2UnAwMTNCTDhoVmRvT2krWm1WSDU0cjlTbW5mMVZLbHk1ZEJZYWIvVy9FcGIvT09Na0hKUHNTTFI1emhiUjczdzR3dzdreGNwTDV4WWIzL1YzdUVMb2dJWkFKY1BCd0tQNHNnbDBZdUsxdUlsREphbXE4RHRyWllSWmQreWRLWmdpRHpqbjdaMHBsVGhJYkJsQkZjc3RwWWJBbEk4blZHbDh6bmJVdDArQldRS1NjcGV2SUtlZmVxSURsSnFyNytESzlpL1RxSDZZeStKSUZMRXJna0liRGtSZGFPc2NUQnE1aWhleStyeEpDOEdXUU84bDVtTU9XOG5obHI5SHVad1pTeW5BeW1JTWdjMHBsYTBGWStRd3NHYmRnNkVZeTFLeGpyeVdDczA0T3huZ3pHV2hpSU5aU2xHYzdwY0pabXVLN21COEk4SFF5ekt4Q21ucCtFWUg0UzZIVkNJT24vWTd4S1k2TzZydkM3YitiNXpZdzk0N0hId3hqd3hNdGd6T0lOdkF3bVRvaEpiTFlTRzBqTjBoS2EwQmhvSThCUnl2WW5LVXFCRURYOVZSQ29BdElTVktpaXBvb0FNLzVWZFEzNWdYOVEwaEtRVWltQnBqUUNxUkMyZXVoM3pubG5NQkJvc2U3d3ZYUHZ1KytjYzgveTNjTnFhMFpCV294MlFPUW1zYjI4YmpxWUtFdmZoZUZITVd4UjBUTisxcjJtbWxFSi9Ma2xiaDcvamEvaHYvVDRkR3U2TlNHeXZIaEpnbGMxVFNWcHVyV2xXVmFaVVYxMWRhUHJiVGRRbXFpdm56ZW5ycjQwRVF3WnUyRjBmZDB6cmVXVjBhaURmOUZvWlhscnVxSWlHczN6K2ZLaTBZb0srN2VtdktKNTdkYjBFMCsydGxhbGpFbFZ0YlkrK1VSNjY5cm1pdkxIVFZteXZuNXFjMjF0MDlUNityTHk4akk4TmRYV051TXBXWVprbkhybmhqbUxlRyt6djh5QWJ0Y2cybUZOSS80TVVxNFJLUmNjd21pQXNKc2N0SnhuYTNpMkJyUEZtQzFHbVFnaXZrdVJGaG1jVVkzVldGVGNObUMxTldRUS9XMVdLWjdnd2VsNG1FdnB3QnVmQVBXL20wVWxsRFFsSTdLb21nVFZsRVcwWTRsVjdlMUl1VWI1VklJTkNvRXlPRytkTGNKc3NlV0RMSWxWYlpCbDBKTjFkZ0ptWVI3ZXJSNlJpeFJjanNhZEI4N2lKc1BnRnE0eERGYWhTSFBPOUtFZWJNRFlSbldCWm5ZRDhKS1Z1TjV3bUwwSzhBWUdCOHBCa2ZyQXpST2FTUW1OU3k5QUwwaUErcXlMcURxRzZsa3Z1a0FmeGdhTWJSaTdNQnhhOFYwME5lOWxEMnhVOERuNkM0TXpBaHhjZDFKUVBDV0svRW56ZG9DQnhUWEYwY2gzOU5YN0RlLzczNGIzaVVINVVDVUI0cG5BVEFLbEpJRXJVMEswWHFxVy9rTlQ4UXRZZWhQRGxnM0tSYXFtc25TeFNNbENEeXhSVXpjcldLSTJyMUdidndDNHFUYWYxZW5maWZFamt6aDJiL3FsMEZaYjAxT1JsNVNqY2FSbm5KTzFKcTJaNm1YcFpMT3J1SHJpeEhIVmlWR1JTR0pLKzhLNWVkM0xsblYwMktabVFzZXM2bXA3MXF5WGx5NEsxTlpPR2o5eld0cU94WkxKaXFya1UyYUg0dzlIeXNvYUh4c1ZqNHd4NHpyS1RjM0U1VE1tMXhiWi9vYjYyU3VhVzR4SnpveTVnVlRWczNWang0UWpmcDlRbWdSK29tQ1NJU3RpMW9GZ1VTSmV0Z0ppMTJzRXFQcnNGNG1ES2hnQWJ3aUkvUlU4ZlFLSFNubHA4T1J5SnZpUXN5NXkxem1IRGZGLzZCd1dyOE1uZU5OdUFyUnBnMHArb2lESlV3TldlQWdQb3lsRyttV0h5SkFtc3FHOE5TTVMyU1dCSzRtTVNxOHFOTkF1R2FZY1laRndoNlhVcG9KRDdLQ0ExQnJtN2thWk9wWXFMQXFJc1paaGZBOWpDOFpPakwwWVJ6REl4cE1ZWnpIK2lYR0xOaWU5UDVOd0R1TDh3emovTUJwc0dGdy9iUGxwOWhyUFdod3dCV0xvdnhpa1RWTVJhRXc4MVZLSlcwdGx3a3hmc21wVlovWURNOS9PWGpXUno4MWZzcW4yZDk0eHA3T3IrYXlZTzRINSsyQnYzLy9Gbm9UVTVNRmdHLys3T1MvbWtkUHlyT0tjRisrbFYxaUE1WDZQWnNWU0xVMmdXZ3VJYlpranowbmNoUEh6TnVMR3RrTDJqRUcwMWdCZTkxTnR2NklOOXdvM1hGcUNHU3JSUHR6RGJLN3NQbzJLWGo1eHVxcFFDTkhHUVZuWlMwZlh6MVhUQXlFQkRnTERBbysyaUZqN1FNa3MrZHJmR1VCckRqd09MMGRlZkUzTHoyVUZTM1hxbHl3UjZrV25DNS9KNXhmamdWZGNJa0R2bkZkd1U0Q0Rsd3pWS05HamkxL0k0R1Jrand3bGlScHpTczk5aGdKRG9QOCtjbnMzcUlNa0NIb2NiOFNCY1pTVHA0TWMwNEZjdS9LNHF3TWFadU91eWN6UHNiNEVHRllhbUZGR05JZEF2elNuYStxK0RRcDJLVGltWUpxQ05RcjJxaStXNlo3VHRMS250WFlzMDZSZXh6WmJYRTY5MVl1VmluMlQvWit1OU5XQUp0ZFV1cW1qcG1GMzFiTW1QbnRlOXNDOHA2K2JIODRjN2hvY3hPZmE3bHkxMjhEeEs4M2IxSkpIQzQ5b29NcVBHakVheVIxZytsd0VSMVFPTVlsSXlRbXUxeXB0c1VSOW5pU1BKa2Y0UEU2Q3VMall3a3ljWFd3aHlaTFkzYzl1amdNVk1DdUlZbW1TVjBTcFpMNE9BUVZTRVMrem1IMG9BZWlpU0NFRnZsS3dYY0ZWZGRJeEJiTVViQmZnd0dzSmE3WDIrODNhM1Q4RUcvSjYxRmpQdlR0MDF4c0tUaWlZcStDSWduZjFPMTBQcUpEN01uMTFrMzU1cVg3NXovcmxYdjZ5a2U0bXRKTWFHWFc0RklRdDFQNm80OWt0VlJNbmo5OHhaKzZjMlR2SDFkV1crOHZyRzhZZCt2Yno1dm5sQjZ1bU5DYnRsNHRkeDE2MDZFZmJGajVuM0x5aTlxanIyaSsrY1BEbksxKzBuYnhDcVRjOStQa1c5Nm1ZK1NDRCswOUlJdUFVSUd2emF3WnlFWElRQ2l6eUxEckZBQ1VIYy9reXQ1Nkp4ME12V1NFU2hDZ1k2QTA5MDFqdVRNOW9LTzlXNEYwNEhOQU55aWFmZUcyWEZzUGNOZVNDZ284Rk9PQlFMa2lJS3kvc2tGYmlJRXZEOEhsWWJ4TmhMVDdlZEFiZ3BFNHY1ZWl6K0h1NWE0K256c2NBRjdVRzlEMWNuWTBLZGorZzRCb290MWtWUEtvYWRBSDBxZ2JiVk1GRENyNVNJTXJGbXVqaWd0Q1liTkpOL2hqaXcwMzF2SmRadE1EWTY5Yitaa3RubTVrUnNIc1diSHJKenRnclZ2eHNjT0dDZHRmVTdldDQwbGpjeE5FUHpBRE9QOS82TVJXeWZEbjk5WHlERzdEeWMvbnY5M3FkZy8rZEJzRzVHOFozcEJNLzdORHpTWkR2VmQwb1ZXUTZlTm1iY3Q2RkpNQTU3elpJUldpY0VxdU04MThSUnEvcHpWNDJ2dXl3U1diMzJabjJtKzNaZjdkRDkvblFmUTkwRDFwcnFja0VvYnRjYU82cWJISXFjekhKZjVTYUFSSUU3bFh6RWNxaGd4ZWw1cHR2WkcvZXZ0MHBXaDBYbnk1QlRqM05QajFONzNzKzNjOWZCMWhCb0orN2xnY3FHSWhMUXF5N1BjU016dFgyNXNyQ2RTd1JGaWhzVUhvc2t6MHZMdFkvK2pEOEpQQi9iVXArRGZNTDR0MFFXeCtFOWJaWTMxUlVXZFJVbE1KdmFrbW5lYUd6TTdzZkRzaCtaRnFHdTh3YzhvS2h1bUxlZ3c4UXp4bDh6dUd6Y2FLMEI2djdPbHZ5VVBicGtNQ1JPbkgzcS9IS25rNVRtdjJGblJuZTJwNkxYMThLMzRuNGE1aHNpNis3cVdqMU16V0pLQmYyd1B0YXZIcVVMdzhwT0tBZ3lvQmlLc0xXYzJIeTJNa2hnR1BDVGh5NHgxQ25GS295U2JpTmczdXZRWm54cEJ1VThmeFVtenVwYlY2UnFobTAzUDh3MmZPWVI0aG81VGtPa2p4VlBJK1puTU5VQ2d6RmNrZ2pCN1dMR3BGUHZySlhpMHMrZ1ZlWUUzdFZwdFdpWnNUclhEb0hGR2lmVlkzaDY1ZXFIcFlUZVlyckNRZHFWQVBWQTRVQ0hMZ3phdDNCc09VVzQwbnB6UjZTaXUraUk5akFBK0gzQUNXTGtDQXlJdndlaU1lUkhNMzI0cEhkYUpPbGp2VXF3QnNVSmZUNTAwekNJS1dLZlVqcjgzaVJFakh3d0VFRnY5Zktma1hCRUFQaGd4SHg5UjQ4SEtacVJUdGZBcml0ZDdWUDlDcDNYZ25hYlpFNDFpREFSN3B1cDY3cjFTdGZNOEF6UEowQjk3R1VJZTlrQnN2N0ZPZytCZGluUVBZWjFPbnpRbmxKblFKZXk5TnZLUkgrUk5kTjEzVjdBQTdUT28raVh0RjRQS2pnTXdWL1VIQkd3WUE2NTI4YWFDY1YvRXJCSlFWM0ZCeWxCRm5lVVlqVEM0TFNCM0VPUWNSakVQRVloQ09DNkp0SWdIN3VyMEZSOTVpQ055VlBDL0VjUW82RmNEVUpJYk5DeUt3UWVsOEkzVE1rNys3UnREMGhnSnA0Q1BxRnhDWHY1NXI0cDJ4RXJDbG1xSHFsZkNtRDM5N3YzekhXeWs0NyszajJsbzB5TnJ6WDdodnVzbjh3L0JZTmpySVdjT1I5NE1pRlZybXZtdzRycWxVbXFvVTh5bVU1eW9TV3M2bGIvWis3by9Rd0dMQUtzS2hVRm4wS05zdHozUW9PS0tnZ2tFdWpFa3FCa2hGWlUwYUNNa21Ta3FqZVZzcThsaW9IZkYwUHIxY1BMNWNHeDFYU3EyWG11SUpyMm5RdUtMZ2hwMGlVT0tUQUs2WVR0YzdlZ0hNNHlqWlp4ZUJheGVMNk5RQWVxL2JBYW5BOUw0NWlTby9qR21zZWVJbHVmN1RYSHdIT1lQQ2RheVBBZG5tZ2NQRkk4eTRxdi9MU0dHVmdZMVQvTWJMTlJvRHRHTGFRTDIrNmhvRDRZcXpHZUZMQVg2M0hMTzlpNW9FM0ZYeW9ZSXVDUFZhNWdLaWNHRHZEYy93RTlmY0o5ZmZ4dTNjV3o3c1hGVnhYTng5Vk55OSt3TjhUN3ZNM21jdWVkY0YyaTJIcGZ3bXY5dGlteml0K3YydGYyN0VUNHRpeFRSNTJFbTdpTkVtREV6dU84NkFFclJBYUhrMDdVVVpHQzBWSWpDQXhZR004V21tZGhqYWg5WTkyb2x1bm9rMUlnM1liazFadFBFSXlDVFlWeEdNcTBRWWRwRXdGZGFVOHBLMGFWUVpkRi9ZNzM3bkhNYTJxSmZxVVg4Njk5M3Y4enVQN25SQk9HakpjckVuRHNtWlloR2ZlRXBHdm8vSjFOTSt3aS8xWUNUODZwTjBRMG9ZRlhCWndWc0F4b2ZFWTAwaFRKREJGZ3FmNFBLZE1wWklXQjExTnRxTXhxWkxvYmh4SjY0V2FWY1BQOWVEbnVlZDd1cnQ3cHI2c2xpeis2YytXTERiVjBzZGYvZkhTeDgwZnVGYXUzTHAxYUpWcHJocmF1blhseXFsMzlneHZjTGsyRE8vNStacTFwcmwyRGVVdmFkd0preEkzcGhhUnBvbUpJb3Zwakl3aGJhSmFkaG5qMmx5a3phUWtnekJMRXBaUXpwVVVKR0dVREZHK21DSjRFdFZYZUNRbDZWamlkTFdjanFkeCtTcG0weElTTGNrS0p5cDJDaGlXcUZndk1iQlR3QjF4L2ZjRWRCTFlva01vNUpTNnY4dlVGd1djRXZBdFdlTnJBdGJ4WXBaZWJJZlV6WSsvZUoyN2VwMXdodHBTOGx1eTBXN01wR082Q3ltejk3WTlWRjhmandlRDV1N05DMzc5RjB2MXpWM3o3QUsxd1hLWHpLaXVucjNibkhOcVRUb3o5V2N0aEhydWY2eU9vN1oydTdLajJFK0lQZE1tVzB2UlN0QXBIbENaMFM2cWhPeXRSQU1TZ3FWQlcwTFFUTjJ3ZHJQRzd4V2QxMXNnTUIxWFRmc3VSNFljKzg0QVlOOFptRGdYWk1rNWFyVGdpeHpmeXAzNGgyS2lSYnZVaFlkVnpzTVJvd29PcjlRT2p3WXArS1dyN2NaNzdQb1Z1QlUwd1pjQWJsQVRRVHRjSnFxK1gwQ1hhSWpkNHV3ZGNuc01pQmE3TnczS0dMekd3SXVnQ1NOTXdxaFdZUzRCcjNIQ2UrSFlja3hWam5uTCtja0sxRCs5NUlDQWZtTTJUM2NBcEd2UUwrQ0lnRWtCaCtFaDU3Wm9rNWZiK0lqckFMWmg2Q08rTG84WEdPMFNUQjBTZEE3WVptUWxIck5TQ2JQNU1IYkw1ZUNXbXVpV20rdXpwRG1Ld1FJUHhlREJVVVNQQ1Y5M0JmeEVpSE1ZTE1MS1lWUy9NS3BmMkhnVnc4MDNTamxQdHczZyt4am0veUV1ejlmckFvNHllSUFVUzVOeVJCaWFGSVlXVG9OMkNZSU9LUVlkY3JBc0RwYmxMKzlwbG5KUm5ZV29sUGxmeXNrMEtxbzNhYy9TWlpRTGJQNDNBb3VkYkh5MGQvV2pyUThyMVI2Tnh4T0o2bmlzWGFsNWMxZFZOVFRVQnpKTHFpb3JZNUVaK0luRzR0V0p2bFJzUm9tNXNILzV1cTZoSnRzZXlOaWhZREJZRmc1Rlc3NzBWSHRLdVQwbGZaV1dwN1FrTm5OV1JTUVNMQ3NObGlWbVJ4T0p4dldwMldZMTh0eVBaTCtOR3V3MUxveFJ5d3JnWmczbHVQRWpxWGh0QlQydXVxSmY4Y2dySG5uRm8xL3g0QlUzdmZLczNKMVhCYndnNExpQUdsR1dob0MyQndDOXMwOERLUm9tMVFpem9HaDR5ZUJsMVdYbVZaYzFqdTdVenRaRm9DWXZ2YTJ1dmIzQS9QYWNPZi85cnE1dkhyenpqRW1sYlhJTUJvUXF6bzJEWWVjbTdmeUVLSVB2YUVDOUVmVjVDSExENEpLa08wTHUvL0RhWm9uMmx3U1VTbWN4VHl6N0JGelY0QXVQWTVIQktqQW9NaWd1aW03YUR4ZS9IMG5PZFJNZ2diMEk0S3YwQ3ExN1VoNWZrREwzUHNBZFhlYmEydXRzbGFsU0diVnMwZFNuQTlkdXpvZkNockxXM0hqQnpkUGdKbUQrZ1FneXFQWmJjSmdCMFV5MDhlSFZGV3g5SEE5ZXdZNzJTMGZYemRMS2k5UXlrVm9tTXRUazB2WTdaclJJVTB1OUhNbCthdTdjekkySFMrSTR3RlVNQ2lvWFdqRFhkQXRHalI5Zk91QUlxN3ZITWR0NW5PYzlqSDlpM01kdzB5UjdBUTVpakdHNHVBUzdrYUZ1MUNJeThCUmU4dk1paWZOdWlmTW5uRGoza2ViNFBidU1sdkZoR1IrVzhXRVpIeTFqWVJrZmx0R2RKQzNod3hJK0xPSFRHeTl5TnM1c0JhN29rQWp3WXFzSllBMy91R2JLRDZiOFlNclBUUG00WC9LQ1dUK1k5UnVIK0FsUjV3ZEJmaERrQjBGK3B1NGpTQnk5ODgwQ0JnVWNGL0NlZ0gwQ2FnbHdlSllVZERTZkMwWTNHZHdGQmo4Wi9KeHMydUFqZzQrajA0VnYvZXl0U2VrMlBkcHQrckp3c1kvWEdYUzl1SEJpRjUvNGcrbk9sTUNvYmk1Tm1xY0lTcmJJbU1DNGhmRUpobWIrbHdESE1FeStlNHIwUndoVW93Z2ZqZW9sQ2VHYWQxR1V1OEoyUU5rcWNPdkp0MDR0dlQyMTdPTGZCdFVtdFhqcXVxcWNPanoxUXpWMzZvL1llQkthNTdkbU1UUmpsN21XcHF0ajFWTkxXY0c1YlFqVEJoL3B6ZWxIZFZMT0hMQmFRSjhHSTBaZGtIYnNjMVJJMXZDaW5rVHhmVFlmSk0zajlOYUlrY0xmVkVvWHdKVE0yaU51YzhBOEFubTNwY2tIYVNPVWQwb1ZHYW9Ldk5SRmhpNzJVak5lcmRLck5xZEE1Z2tZeGpITVo2aDBLaXBuZmpsZ2hRYVlMMGdhVytrdE54dGQ1QnJMdUEyaC9oOE1LZ2xwdk5DcVgwZzVzOFBSTCtLZnZSZ0hNU2p0VW5pcExhKzhMNGowWFU2QVMxYUFMVjNTODAwSTZKYitaRUlhdXczR0xBWjdHVml3MkdnQWJZNktGd0VjYXdPc0RXSnRNSnlXTGNWcjdzSjJkVlMrQXJBZjR4Q0c3clYyUWRydXdkRHFZRC9BSWYwUENhQWgyZkZmUllTL0krb2x2L1V1MmZGMjJlaVl1TE5GTDY0S2RVQmV0TWRzcDhWcVRPWTYyTmFyc3AxMjBwc0Y5RVk4TVZ0OVBkVFUxR0xia1ZodDR1RmNiYzJNVXRQMG1OSFcxblMyYmxhbzFxeEpwRks1em5TeGEvdmd3b1dEaDAzbG1hdVU2UzRwcnFob2JvOUVvNUY0VGFLbS9PWFdtVE9WQ3BiRzBvM3pHaHFDWlphcmNwZHFlYVRPTkU5YzY0SFdNWnJ1MzFIN1RMOFJOM09qT0ZTWTc0RStnRUVNVGVjbUk2eGpPd3pIZXZnbWZGUE8vN0tBelJxTUdIR0Vkc2s0Tld3dy9rYmNlRjVBbjREVkdraG94eWh3WXdXaFhVcUdVbWtSWWtacHZrV0k2UlpCSWNOS2cxU2pLQnFMODI4VXB5aUVwUXVJNThQd2dCU2ZJd0x5cGV0REFmMXlsK1lFSEJYUUw3ZDZqb0ZsdkFGd2xLOEZxbWlPaHZsQXdLU0FGYUo4TDBuc25HRmdvZGlGVU94Q1BNVXRWcnd1NUZwNUFWVmJoS290RkpFanN0V2JBbjRsNEJNR0ZpTFNEZDN0dERramNvQURjb0RQbnNTbFQvSGduajhVTUNTYlB5MmJ2eXlidjRHTjM5V2JWOGxHa2JucFhNeERNWjBWR1J5TnFiMmR1YWZiTStuMjViMWRucmtMbnAvemlGb3cveHVwbW1CeHdLTkdLNVRxNlYwOU5LZFB4WHJEeWh4Y3VuSG5Zd1BLNjNLNTZaSnBRMnkrYi80RGJ1d3cveldLdkd6a1dyMUp5LzhSbzFITFFCMlFRVHgxYnJxTWpzTU00bkRHT1ArdDBYK1BRY2w3UDlXZmR4YUVYb1lpTFdORTg2SFhRb2FXZ2xoTWtDRlJVR1p0TXRoa29EdVJRcEZhMDZnT3hUcDhhdXY3S2UwZ0NrQUxEbkFqVEJ5M0xKZWl1SkNCaGFEd2cxdS90RTBCQ1pVQUs1T0RDUEV4akhNWTcySzQyZmNoL3Znc3dJUUUwcGhZenlDUUxrdnJ0QnhGWGsrNTM2aVVXOWdCWHhGd1hVcll2d1djTWVvRk9CWDFIZ01MNnpVZ1podTRidDQwbXZDa2laZXFBTkJDOVN6QUJGc3RZejF1bEIzNi90RlIxTXpUbldWZ1llMDIzWTV4NVgxRHd2WXBJYXBmaURvSmtpNEtVYWVFcUlVTUxGaUtVYVYxKzFsay9BSlVqR0NjeHJpRTRlWThMSmN6bFV1S1ZnaW9sRk02Qk53UzhDZGg0cTRRY0JuZ3B0dzQ1OFI2RXVlOUtHZStEakFwdEVTWkZwZnhsaHorb2h4K0hjQTI1c1pDOHJYQkFjUkV6dWtjK2RabzdPQVdVKzRUWldkdFRyWmtQdGt5WlpsdFhsOHdGSzl1YlU1VWgyWXByeThVcWs0MHQxYkhRMEdmVjIzc005TWJoenV5S3AzZWxLeU9oeHM5WnQvOStvWmtiU0ljaVlScjV3L1VKK3RyYTh2RDRWQnRJcG1jZXZmSlZjcGN2UGliMndjV3FVQ2d6SjZwK3FrM01CNkNoanFITzhObjFGSDNZS0JRNjd3OEwwTHB2b0FuQkx3Z1YraWdCbHk4SzdSUThvMXpzWTdwLytwSUhxVjArYk9sa2JJTDBqVk11UmN1eU00QUdRS2NuWFJEdVhVYVZ1Q2RnTDRSL2tkMnRjVkdkVjNSZSs2OEdEeTJaKzU0UEg3T2pEM1ladngyaHBreFk4eVF0Z0VjQWtZMTVTR0xKazFTRUkwUXNTaTRRYWthVlNwcHBTcEZxZ2p0WDZzVWFEK3EvaFFEdzBmelVTQWdWZUVEREtHMCtTbkdRbXJTai9Cc09uVHRmYzYyTHlUb3hHdjJmWnl6OTExNzc3VWJCM1NTVW1xS3JXMkFkU1cycStJdW9iN1VTYm9XL1cwckZuK3dINEJHZklBOUFpNEx1Q0VDKzVLQVJ3THVDbmkyM2xQUk51QXRuYUtrYmh3dFN5NkFpN05ZYzFnc1MzWURURXZ5UGhDbVhvVnNaYkJMd0FVTmlHc3hjQzJtSDVpV3k4Y2hEMDMrTkV2L2E1YjYzeXhxTXkybE04MTl4bWVOSVFZN2RCeDg3UDViT3FWY0lUQ2VVKzVYcy9lMjFtM1ZjaTdUSjY0RDNNSGl5NitMNHdjRnZDNnVIUkJ3UWNDY2dPc0NGdUp3VGZ5N0orNVRRQTZLK3hmazhweGNwamljd3JLZmlvVU9nYUxFb2c2bVdKR3hHa015dGFvMjNkTHlCWFc0TmJuMmhlVVpWVmovMGcvemVhVkdWcjc2eHRCQTVZT2U3b21PVEtaQnBkZXV5TmwyUHYvMXlyK2JrVEZqQjZaZkhGUDIyUHJ2cFNieUsxVjFWWTFGZVFENldXcVYvUmhFdkhZT1lROEFlSHYwTktCdTZiOGUwRCtGdjgzNEc3bWxjWUxHeWs4bEhjWUYxQW9ZZkNwQlFwUVBJVmMvYXlGRGl5dGpQR1R3dUF3cE1xUjBDclVnSVpMYzB5d2NJWVR0dy9nYlJzSkUyQm9LVS9ycGhBa3dJZitGOVFXV1oyYzBuY3Ztakp6TlVrVUttR29WODdlcWJDd2RTUi9hdmR0clYxZTNOQStHSTVHZ0Z4bzFIUEg3MWY3OUpmVlJ2aVBUMVpsSU9vN3krQXRWTmVGNHZLbTVzVGRmR2ViWWplTi8vNFFXYUZKcnlpQlprNjQ0ZitHS2ZjWnE0bW9Td1BuVUZhNGRadTROTTRBYURWTk11UHNmUVN5TVltMXhoYzJpR0ZpdXNBWElFSEJGcVpFTWpTNFpVRTJHYXExUlBiaTFtbXRMQUZ2Vm1RQjVyS01pcmc0TG1CRndVb01nTGdXdDk3Rk9ZTTFnZVlteEY5RXdybVBwaHZnVGtaMms0MDZKN0R3bXIxclFuNGNGbkJCd1RBT1NBL1hvV2ZUQ0tOcUVJWGtna283b3ZvS3ZGSStreDB0MkxKTVozdFd4VEpXODN1cUdsNzZaVHF1Uy9WbWwzTlBTQk42ditrN2xZelhZbm1pdEgxVDI2T2k2eXVmVUQvQnRyUGZzbXh5RVBlZFFOd0w0Ujh6Mmh6V05BbUgrTUQ0TUJFRjhzeUFkUDRBUEVMVGV3VHFDNVZuNEVGNktxdGNWZHo4Wi9EcnVYcE1xOXEzQklXSmJJQnRKdjFlaS8rekRXMjVWYkV1NGd2Tjhodk5zUElmakJRQzhQYnk3RDd2N1pIY2ZkdmRoZDU5cjk2L1F3Q2FEVGJ0anh5eEZDT0g0bjhQN2JJRHo5OUVIVjlzZmxwR09DWENTR2h1ZXZLVWJYQTFUTXNFOWhsRDZDb2xIcmp6TDhWWEtWbzVtSE5BR2gxc1A0M1lzZTZkdWg2czFYZDlCV1RhdDFJQlBCZFFTbUdLNnI1R1J3VmorSTVZUEJmeUdnYmpaUmw2MXVZTGNTNFplbDJFbEdWYTZESzFrYUhYUmYzRkVlenAyYkZnWnBnNUxCYVBoU2huYXFkZXl5RTBQWGltZUd4TjEzUUs2TG5tdWMyWldWTjFOcTFPRDkxSGp6SWd5cUJ2bVNZRFRXQmV4UEhwbUdkUThQd294Znh5TE0rUThUd09jZFZscHdubkx6Rmw1YVdBRk5MQ0NwRlJScGlJRGpsb2owcGhHOUFNbkFVNWoyZnJ5S29vcmk5b3E2VTZkK3BESGNhWlRXT2Zsa0F0K3pEN2owTUw1Nlo2czdKZVZvMlQxeHJkeDVIdFl0bjZ5SUU4V3BBb1U1UlZGYWYvbTdPY0Z6QWc0dGdqSWdiYUlXMTR1VkFYWHoyd3NubmVWZHBhYnBvckVJdlpwcjc4NkZJc2xjNWx1VkE0M0hyVURvYVdPMDl5ODNJblYxZFhWMXZydGFIZG1kRk4zUmsyME5NUWp6dEpnYi84cmxibG5maDBlR2QycWFpS1IydHFxcFY1dnFDcFczOTZmVENnMTBMK3g4bHVkZStvZnlMMlVtaW1qSWFXa0g2UzBWNjhRbU5MOTArYWVTbTJOY3RBRFBucFJFWkthanlYcVpycFZSUGtKMHBDT3RJcDJhUlh0cnVUNVN2ODBqV0RSa0NSRDBwVWFSclZ5cS9EaDFpUzNDdXBLRFF2aWN4NkY2aUVXZjkxM1VUdk14NjhSWHRmaWU5YnF5NGRGVHM4STJFMkEvQ2pTSUVwZ1VzQXVtbSttZURocUF2T2E5Q3Uya1BpaHl6a0dGbzhlQVdnc2M0SVpPY0hDVVk3S1hpY0U3SkpOM3hYTGFRSERzdnNOR2FvS3N1RjJCbEdpVkZZb3hTelNyT1BwQmovR1FaMWdLT1JFVzFxNnZwM3BLalczUHIrbDNRa3NLUkUzSmgzSHFRMEhnNnFRMzFvcHEveFlUMGJaeGVaVVczdGxUbVlVMnd0KzFGcEorOGRsTk1xd1pzaVBBRXl0Tk9CbEJ0QTRZYXBlUytqRGZ5Nk50VVJBYTJOakNiTUZVd3QvTzc3N0Y2aWtmRzBmQTZGSkhYM3pPaGNyakJCakV0aTQwZ0lTeUx6aU43L0xHRzAxd2d0WXRORFZHbVBUOVhFYm5qYnpxbDl6STRDbjRsZzJIWFVIQUYvK3ZSU2tzb0EvaXp3L0xtQ2IwSXVHazBlaTAzTWt6NmRZS2p1YU9oOEIzTURpaWVBQ3Z1MHNTd211T25IUjRuR2hSMXprZDF5R2swYlVxMFo1MnNYQ0hMcW0yU21oZDdvRThBbVdyVStWeEttU3JJSkkvTmpZenRhWGpzUDVVektyYmRPUldQRFpCMUNORDJIR2t1MUM0VHN5Z3MzS0FISlJBeDhJNjZBSE96cUdQRjlOUFNYRFlEMGpqaTF3K3BLQVBacmN6eHgvSGtkL3lNY3YwQ3dCb3VlRTRTdE02YXdMOE5TeHQ3ZDdZcUszdTd0M1lxSzc5NFZpOGREYnhlSGg0dHVIaXNVbmt5T3JsVm85TWprNXVrcXBWYU9UZXplTzIvYjR4cjF2Yk5wczI1czNJUjVqVC9yVmY4SDFWaXR2LzdFTUV1YzExL2VSU3RuSmZEYmdZd0ZyQklRSlRQR2xQS2RCSHF6TGNhVWs0WjlEL1V4ZTBZcWtUOU45SDBLMXlQSUVrVHJoWW5tR0RCbVhZWWdNUTY1aW1DTkR6Z3FUSVlQM0xtR2RNQVJVejJ4dncrTkRuQXNyRE5LODMwRzVvaGxVeFNLQlA4b0hlaUwxZ1F3aDlEa3pwODdLblBvNytkQ241RU5mQUpqVlZLWW1HNVVoMDRDMWVzajA4U0E2aThYMzdaQVBmZDdxMXBkM0EweGoyZnBwWXoxdjlhRC85K2pQUHdkd1gvL3d3TGNlcWNJRGVPK0F2dVVPd0FQOXc2VUtIa25ydjh2QWNqdC9HWTdmMU00VDIwSmdXMGdyMnROd2l1aDhIY3VqaFVoVXBJUUJWN1Z6NUlZQjN4TEhybW9YWEI3dUFqZ29IbDZsNHhPSWFUL29wVDM2dmpzQUQ4VG5lVGp6VUJ6NkJJQWZ1aXpna3JqNGR3WWRicG5CZ3lJSmkreHp1aXNvNkh0M2c2QmNhZS9DR0tsbWZBRW5uRWowZGJlME9rNGdxTkpPYTB0M1h5SVJkZ0sreWk5TFh0c2Zxb3FpY1N4Lzg3bkJGYms5MysreFMwODZPenNUS1NjYXJVdWxsblV1Ry90R0tocUxSUk9wemc2VjNsa1ZqVVFpMVZYcXhiSHAvUnMyMks5VnJodDlyMGFRVnczVzM4b0ljb05vakFidHdoRUdVTGhnYnR4b0M1NHlRcmpIOFBCUEV0N05ES3lucDRyRkpBbVNJZWd5eE1rUUY4VVF0T0xjRW9JOFZOaG11UHlyVVBvNHdDbWg5RFZoL0J3RGk2dWlNYzB6V0d5OTlmRllaOXF2WTkrcTBISkx0dE9XR215TXhobzdHaHBxYS95Qmt2cjV1cDVYKzFJcHBYeGY4NnVJazB5a085SmY4dnpUL3VRTDlScmlNMnlmcGc3bTZQaThLYlg0ckZUZGZid3JqWU5ud1lNbENGUVRTa3JUd0JuTGdTWE5vWE5RYUFxd0ZnWTRha1h0MkRqQXkxanMyQlcyU2dqcktVRDFyb2lac29LSVVXaXBrQ3pGOVp5V2Vmb3NaVlJwYlRwak5RK2NwVStDcmV0NVBpTzBORXlseThhand3djNEUTlRc0FQV0g1Q0ExSzB2a1hyVTA0bFhwSTd4ODZjQ2ZpMWQ5UzdxNjJNc1d5ZHpWRWFQcUR4cHN2RHhZbDRtcFI0bHBadDI2WGV0QTlpR3hlOWFoM1B5NVduSnd0dW96L2V3YkoyNmZVamRQbW00ZlNndDVzZHRxeCszOWNzTU1TUjljY2hRNWFwNGRWNEt6Z21BR1N6N0tWOS9KZUJuQXVaRlVNMkpldzhFNU1XOSt3SXVpWHMzTmFBcHNBdFRvSEh2cEhhYXFuRkdYLzR1L0R3Z3RaUmNNNFd0VDE3Y0p6cTRUd0xZSjdxa1g1enMxKythaDdjUHNkQ1c2K05VYXpxN0Z2N2xaTUJCVithaUZLc3owdzc5b3dya1Q3ZDNGWllYTnd5MElTZVdMUnVLbzR4RXFxcFVkdWo1K3ZULzJhL1dvRGl2TW56TzkrMTlGOWdGbG1XQmhHOVpDTmRBQ2dVa3hrQ2pTU0FKZ2NZbWs3U0prYkJMV0NVc2dVMEFNMlA3STgxMG5OSEdxWGFjdG1NNjBSa25Paloxb2pXWFRveU96VlJITGFNZEx6TVVtekZXNG1STUo1Zldhc3Y2dk9jQ0cwaisrYk44ODNDZWMvYmMzOHQ1MzJpWm8zWDFBOHR5WEc2dk56YzNGQ3BvcktqZy9rRFJKOW8zclhkc0t1WGhVTzNLb25DKzErZkw4UWZ6aTdkWXBVaVdXa004MSszM0YvbXpzN3dlcjhjWGpFYlhWaFdYQkNLRmE0V2Q1Y1BPMm95bjJUSys1Z0txVHVpbXJWYjRGSzZkQzVjKytXWFJjcFp4V0JPYlJwUUtpM0kxaUI0cUhCZGtqK2hhSUxvV29HdG9XcGJoS1RtMFpBb2Rja2d5Y3RKU2FYZkZEY3JVd21ScTRhV2g3WktVU0R6NkpiQXFMdXlMRWg2SFlMUkt3WlNPWjIxeW9VNlpQTmhCL0lqWi9GSmpFeUNUMm9aMmlnQ08zV09VVTR3WUJDWW8xcWZPWFZvajVTZ2VEZVNMeHlVa2hTamxIWWcyTnpXM0JwdDRiY3FmVTFGV2FQUG1COFBWaFNHZnh6UmpzZllVZjMzdWxXaGgyUGVnelc3UHpnNFZMbDhlNVRVdFJ3cSt6b1JzdGtJMlYvZ2NLK08zS0hKUlByQ2RNZ0daVlVaRXVoREJ5Y3VFbzZOc05PSVhid1c5SmRJemtoL01rMG5uQ0N2WHowdDVocnZMcFF2TnpiamhDRFZFN25QbG1YbXFlRUpzNkdvdVNUckpWaDM2V1hmSzhPUWRrUGQwRXJnQkw4ODlYWnZKZnFESktTMjFyNEE4cHpQVTh6b1JQS1FWcm5raEgxVXRLeFp5eEdMdEZrcTBXeWhSY3A3VlNjNDFiT29EdmJHdzNDN0oySzBqZitWenlTSFJMb1h5UElWdGZFdnY2WnplMC9mMWxta3JoM1Y0UDcrZFZrMWUwL3Y2b3lhWDlRYi9KRWlGSXhSdDFnOW9GT3JVR21oU1NpYkNsdVpBRTMrTDJ6OWxPSDArRVkvc3FhN203Y3RLT21wRnJPSnNuMWk5OXJGQUlOZWY0L1pTS3NzM3pQMjZxN291TjFCY1l1SEpMWkk2NXNhL005QXhKN2N1VUlxS0ptWC9UQnMxRjFwR1ZtVk1DNU0xdEdjZ1FtcmcrcEFDQ2M2WTBBS0duczVwc2tZb25aMDlnVFdPQStJZTl1b3JQYTNKRFUwNk5KbTZxK1dnMWxJSHFad2pReW1WRGk0MGNHcmdPcTR4R1pmdnM1djJSa2ZaVEVUS1NKR3JtdHdTUk9xdGs0WlMveXBOS2tsUERrYWlabE1lUHM0Mi9YRDlWNDF2ck9OemN4djVPWG1QTHZ6N01lN1JhN1JkUUc5VWNZL3lMampkMmwrMVAvMjhJQlJHaUl6blVickVnL0F3aUExWUd5VmNnSG53UEpabXpDSHUwNEU1N05NaTFsRzdiUmNub29nQmN6aWhYRFk4Z3paWUZNSUgydTkyNGIva1NPZTBjQlZPTWNDbEI3Z3d3SVVCTGowQWdzZWk3dmxGYWVQZWFTRXhyMXkwbEFqbThPaU5lL1RHUGRpNEJ4djN5TWs2NENuRXRlVm9jb01JMmNRSmtOT0Ewb1VzT2ZOZTNXOUt0M1JvOG9RZzdHNEJMMGpjUmcyMmpBWVBOWGd5SEpXTEdseFNKeUJONWlHZHNMTmpxRHdMcUFUTWxLdDFhbkpWazF1QzBNVjR0RHFkaytwSjJaSWJ2a1FwZHF0dWRZQVVVQ3V1azJHMFcyU2IxR3FxYk5PT2w0VGhKV0hTamV6SGorT0FzU2V2c2luVTJ1VE1pMVk2b3hkT2JwMDgwdm50MDF1UFBkM0ZzOSs5ZVBIZHVadlQwOHBtMDFYQ1pndU54dlBRbHBCOEYwNW91N3loU1pmUUxaaXRlQkN4VkJ0MjFxVmQwbm50S3Irb3lhT2FuTkprVnBQTGd0Q0pNRnJlUTZId0VEUTdXYUY0WDlxRXdVQXNVMklTRmUyZDErU0FKcnNXd2x1Ym5sOUZoRGR3bkRSZ3lBY2hKSjZ3RUE3Z3c5dm1heUJPYjR4UXdVMzAyTkM3NGdZSkE0WjhGb3UwMWhWcEpTclN0bGVrWFV4bXhxVHlvUVV0V3BKQ0tiWHl6emVvREFGcUpSNE01U3RyTkxsSmhCYTZwTWsvMVFWeXpGc2dML0RuMmlWOFU1TmprdGpaZDBET1VGOXF2YUovbmxJUkdLVVNBZlhNa3Y0NG9UL3E3VG83bjVkTmtNbFRVMEtUbjRyZld1SEJUUG1xSU5aRTRFbkpXanMzbTk3aXo2ejdUV0I1VGpCWUhJMDRFR1A2Sy9QenM3SitzbjQ3UC9YUks2M1ZDQ3k1cThVMFRGNjZySEdsWVpPNmFPSGZDOUJGTi9zek9WMG1kYkZISC90bm1pUTFHZEZPYkpWMnkweVR0K1ZQZGp3WGR2WWlZT0N3ZGhIaFVXSkhMb2tpSElOQ1JSSHRVYXVkZkJ4YW5RM2FXZEZVYjJpdkpkMFh1OStUNGFZR3QwenNaUFRJTUplSjJlMHlsa1FjMmNvanpaRWdqd1FSbERmTi9ZV1B6UDBXNWRGbS9reEx5OXh3aTd3SDRQSDB0cG5ydjlxYnMrWU9DNXV6MVB5TFg3NjJScGFYdjVZZVREdk1XZk1FcW5BT1RJMHkvcFYyc05mTldmeWF3QmpPN3ZyalI2a2p2NjFxQmJqZFdaWXdubWVONEVOQURSQXk2dGh1WXllckIyL2gzYXdhNVQ1ZWtMNkM5Z2JnQ05Db1FIMTNBQzNBYXFBZWVFRDJSeHZtVUdqQW1qdE1pMVZoclN6MDZVWFpCdlJTTzMrVmRSdS9aeDJvNzJRenJCdHJaaHY5YkMvYWU4MUp6UCs4K0wyWitsS0o4VHZCVndNZS9QWXcranJNbDVrYnBSUHdvVDJJOWRmVG5sRTJZUDFHY2VhWjlJY29WMkI4RithdVJya0s5U3FzbDBjYzZNSDZRUG9xMmdVM0gyS2IwVTZvb25GaVREZmJ6SjlFRk4zTjhsSGZpcm5jcGdjUno2dk1SUnl3c080S2NaWUNac2Y2MkF2clJOOHczUi91L0hHVUd3bFk2eHJxZE8rVk9Hc3o5Vk45Nlo2UFlCOWJhTzlDL2pQcHY1c3pyQU8vVjZGdnVUanJrK3c1OU9zSFBnMFVBM1NXWGVoN0cvZGR5ZGNMR1QxR2NxQTYydS93NDZ5RzZ0Z2YzV1VQK0NyTXVSdDFKMC9JL3JTdWtOVTlnTFVaeVUvSUxnTjB2elFublluVzEzSzdCNVlKdVdVQyt5RFozQXVRUVQzSlM4Z3FBMHZXVzVEVDNkZ3A5Skx1WldzbVNGWW90d3RkZ2p5RnZCSnNKVkFHZEp2cjJFYmdrMEF6OXVqRlBCdVZmcEhPVjZueFhSaVhvK2JQSXgxQVBVdnAwVFYxenozc2UrbEIvSjROdm9uMlNuSVRlZ3BkUWYxdDRML3FMUDhnUUI1ZWxIK2p2c0F0a2h0d1U4NmRua0haQ2F3RTJveUhXUzFncWJJVzgyN0h1blhHKzlDck5Jc1lOYkRIZjZmZk4vWkQvOTVnbjBHZlhlUUhqSk9RSitFNmJJU3dHbjVFN3JPSDlHR1IzTnNXb1hleC9KVjlkdHdGMkxTMDYvUTd3SHZxL0I5bDJuZ21oTTVvWk9vTWJGNUQyWDRtUEpsWW9sc0t5a2RJL3lDeG9HZWtYeGt3ZHNNZlBLajh3eUlvWDVHSkhzQ2haSWN6cGo4UVBxUjczbytzNGRtaUxPYzdSTi9OOHhoTTM4blVWZUZidWxrRnNFSDRtRXg4bHVXVHo5RllyTThheWhkSlB3UVl1ZERySDRsMXp3Qmw1UGRKbjhtM1F3MitlOS92ZDd6Y2VJRSsyNUI5WGNiM1ZPYm51T1M0NUx6a3V1UmU3djRDdnV2eTgxaStiYjV0MlkwNWpENy83Y0FJdnJuQVhONlhGbjlCSTJnVTlCYVdoTThXN1NqYVVWeGVQQ1MrRjVkOWJ2bHc2ZFhJOGNqeE1pdjZadm5KaWpkWFRLeVlxSHlwNm5iMXhNZmZ4OS8vKzZOWWlSOWxMeUc2RmVtRUNKRThzQlRtVEZEZWc1b1BLWjZLcUl4VEtrcWpsQ3lJbXVRMjhJdUtPOEQvb0xpVFBXdk1VakpqY3lNNjNXWitXWEhPYWx4VGloc3MyL1VmeFJINnUxMksyOEFiRlhlQTcxYmN5ZXZjeDNyN1JsTldjc0JLRGNhdFdHSi9JdFUzTkRScHhZZjdrN0Y0ekRyUTF6K1lHSTViby9HK1dOKytvYmlWUEpRYW9vWllYNnJQR2tpT1dpT2p5ZGloL3NUd2ZqSERJNU1qOFlHKy92Z1l0UjlPMEJTSk1hcy9PVEk1bXRnL21FTDFsTlc0YWxXVHRaS0tGbXRMWWppWndoaHI0NEY5blhYVytQaDQvWkJxcXU5UEhxaTNIaG9hc3NUUU1leGhMRDU2T0I2cnR4NFp4S1JqeVlIVWVOOW9uQmFncGJIZ1NIdzBOVW1IV1RSdDN6Q2RaTkpDbzdXUERpTTNIWS9WV1FlU3NjUkFnbGdzTWRZL2xCekRGbkdxMUdqZjhOaEFmSFFVMWZGRWFoREhGb3ZFSjBhd2pURnIvSC9zVjB0djAwQVFudklzYjRRUUFnSENKeEFrTFMwZzFCd0FSYlJRSktSVzRTR0VrTkJpYjVPbGlSM1dhd29IeEowL3daa1RYSkJRRHNBLzRTZndFK0NiMmJXVHRqektBWWtEdGV6WjljN09mTjgzWTlleHhqbWRScXJQUEZWM1hkTEo2R3BKR3BTbkd6TXpkVndiVTNLOUVEV1RERUJ1UGMrZDd1WFJEYWh0KzVsVmp0a3g1WmFuM0tvb1g3T0ZNMjF0bWExaWVJbnVLYnZNZWVjMWRPNCswcGFYWjIwUkwvZFVMbVZMbytiMU9qREgzU0kzVHpYcTJqV3hUcG1qNjlpc2FIZCtwcFNvMURhQXh3cVlOSW9ocllKOVhGaVRKeVoySmt2elVBa1hpczdZTWxBMktRUkJXNjFrSG1BenNVYWxGUVhlaFFiU3VXbW5aVEtvNkhUc2ZwVnJjZTd1L1AyRldobGw0aVpMdFBHYi82YUF0RWlLTERsOHcyVzBoS3VqRG1uWWhBeTFjVHFzZDNFOHh6MU5LY1h3U3pCS01POWhMWWEvd1gzZVkzRlZXRkgwQ0R1MHhDd1FvVnQ1OEJwSGpKQXJnMzlFZlZ3NVlvRkk3TlVld1hBYldmc1lMVWtlVFhubC94UytKUW9qOXhsWEgvNVdjSGNRdzYrK3dYbU9wbkNjeDJpaW1sM0U2S1prek9EcjgwVDROZE1EOW5tcVk3d2l4MlJBUC9TYWxGdzkySWlhb2swMGtqVVBPdVE0TFhBeWlrbmgwZ2xJYzFIYUliWVN6NUpCeWRvejdNdCtKN3I3eXZ3YXJjSmFXUlBlNHowanJKZVZHVldhVWRYRk81TktMK0VzN3lXQ0p3YXZURmdrZ3NBS1FpdDVjdmd6T2h0V1Y2UlBPcUhhUXlhYW5rbFdWaU1YUHl1ZVRqcUpNZmVyZWlyUjhYZE1XY21yNnlydHF6eE5EWnJCVVEvakJxbzhIRitRYWlYWTZ4VzVoUWk1SU9rSnRodWh0eTFpWjhMVFZiVXJxOXhhVmVYV0Q2cDhEVFBXZ1AyMGFPWnJxeXIxRXNuSWxWK3UrTTdqbnUvbnJxQ3oxZTVaaVJmRGwvZmtJMDliS3JpdUMwUFdtZXRWd01NSUd2KzhjdWZHNGx2V2tTdGpwVTdNNDA5N2F0aExiZUhsQkdYNUZLYnlGUHF1VldIK0dKbXMrQ2FDaFpYSkJNL3FaOEt0ZWRKTDNiSlFaWTdtTzhTL3JWWmtaYWdnVjVZOWxXUmRXNFV5bDM4RGFWR3BMWjZybWZsZVpGWng5Zjc0YzE2TE5FZDNvZUI5L0Y2cXJjTXlJWnI3TG1xSmtnVjRNYXVONy9zYm52ODdkK01WM3V5L29MKzl4LytTSC94OUlHZzl3SmZ4TnRwVUd4dmcwM2s3RHo3QzNNTjdwa0ZuNkFpTjF6N1NPT296T3QrQjdLUHpuZkJmb010Z2RGVG11OEQ4RHQ1L1UzUmM1cnZwRlQyQnp4VTZLZk05d0hNYTJBL1RYc3lKUCtPWDBQak5LdUFtZXJBcXdlWTFBTFlnd1dqQ3JXc1NiS05MU0hHS2p0RWhUakJBbnEyMHZRYkMwZHdMYzNoMmdGTHNwN0Y4UU8rQy9SenNGVHBBWTI1QUQ0TjlHZXpyWUQ4Rit5WFliOEdlWUZ1RS9VWFlYNFQ5Y3YrZ3hNK0MvUkxzUHJiWXZ4RHN5MkRmQnZzMTJCTnNpK0FuOGIxOUcrS2NsZmwzQVFZQVJpQ0d5QTBLWlc1a2MzUnlaV0Z0RFdWdVpHOWlhZzAwTVNBd0lHOWlhZzA4UEM5R2FXeDBaWEl2Um14aGRHVkVaV052WkdVdlRHVnVaM1JvSURReE5ENCtjM1J5WldGdERRcElpVnlUeTJyRE1CQkY5LzRLTGR0RmNXSkxveFpNSUNRdFpORUhUZnNCanEya2hrWTJpclBJMzNldWIyaWhoa1RIYU9icVlJL3oxV2E5aWQxbzhyZlVOOXN3bW4wWDJ4Uk8vVGsxd2V6Q29Zdlp2REJ0MTR6WHUrbS9PZFpEbG12ejluSWF3M0VUOTMxV1ZTWi8xODNUbUM3bVp0bjJ1M0NiNWErcERhbUxCM1B6dWRyZW1ueDdIb2J2Y0F4eE5ET3pXSmcyN0RYb3VSNWU2bU13K2RSMnQybDF2eHN2ZDlyelYvRnhHWUlwcHZzNVpacStEYWVoYmtLcTR5RmsxVXl2aGFtZTlGcGtJYmIvOXUyMWJiZHZ2dXFVVlFXS1p6TmRsQi9KaitBbnNvWlVKV3RLMUpRbHVRUmJzZ1V2eVV0bE81OVlGMlhXVzlSYjFsdlVXMGQyWUNFTCtKNThEMTZSVitBMWVRMm1tNFdibzV1RG0rTlpEbWM1bnVWd2xtTytRNzVqdmtPKzBGUGdLZXdWOUFwN0JiMUNUNEduTUVlUUk4eVJLZWVCL0FDbXM4Qlo2Q3h3Rmo1YndiTVYrZ3Y4UGYwOS9IMUJMc0QwOGZEeDlQSHc4ZlR4OFBIMDhmRHg5UEh3OGZUeDhQRjhMN3BnR0s1dkhXT2gwMnQrWjY0NXA2VGpObzM0TkdlWXNDNkczNjlnNkFlalhmaGxQd0lNQVBPcnpXZ05DbVZ1WkhOMGNtVmhiUTFsYm1Sdlltb05ORElnTUNCdlltb05QRHd2UW1sMGMxQmxja052YlhCdmJtVnVkQ0E0TDBOdmJHOXlVM0JoWTJVdlJHVjJhV05sUjNKaGVTOUVaV052WkdWUVlYSnRjenc4TDBKcGRITlFaWEpEYjIxd2IyNWxiblFnT0M5RGIyeHZjbk1nTVM5RGIyeDFiVzV6SURJd01ENCtMMFpwYkhSbGNpOUdiR0YwWlVSbFkyOWtaUzlJWldsbmFIUWdNakF3TDB4bGJtZDBhQ0EyTkM5T1lXMWxMMWd2VTNWaWRIbHdaUzlKYldGblpTOVVlWEJsTDFoUFltcGxZM1F2VjJsa2RHZ2dNakF3UGo1emRISmxZVzBOQ2tpSjdNRXhBUUFBQU1LZy9xbm5aUXVnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDQW13QURBQXF3ck5ZTkNtVnVaSE4wY21WaGJRMWxibVJ2WW1vTk5ETWdNQ0J2WW1vTlBEd3ZRbWwwYzFCbGNrTnZiWEJ2Ym1WdWRDQTRMME52Ykc5eVUzQmhZMlVnTkRVZ01DQlNMMFpwYkhSbGNpOUdiR0YwWlVSbFkyOWtaUzlJWldsbmFIUWdNakF3TDB4bGJtZDBhQ0ExTlRJdlRtRnRaUzlZTDFOTllYTnJJRFF5SURBZ1VpOVRkV0owZVhCbEwwbHRZV2RsTDFSNWNHVXZXRTlpYW1WamRDOVhhV1IwYUNBeU1EQStQbk4wY21WaGJRMEtTSW5zMVVGeTR6QVFRMUg3L3BmT25nWEFhRktLWE1uSEtpNjJtbmhjekx4ZWhCQkNDQ0dFRUVLTzh2NmNaVmd0eVB1V3VlSUwyd0FIRGh5N2p1SlV0VkkvN2VYNVlMTWZEaHc0Wmc1Vlk5bHkwalF2YlJ2Z3dJSGpSa2MreUV2elErREFnZU5iSEVYSlVYRWNPSEE4NFNpVStRdEZVS0oySHc0Y09LNTA1QlNpNDcrS0JqaHc0TmgxbkdTNUk5OXIzK1g1NE1CeFI3N0pvZjU1V0c0clR0V3dyWnZuTnFrNGNPQm9ISG5MTXJjYzVKOTJKQysxcHpodzRKZzU3R2FiUERkL0hJc2VFWERnd1BHQlVMUlN3L1kxY2ttMUlQL0VnUVBIalk0c0twWmFxc1hNQ1RodzRLZ2Q3YXEyUy9FdXk3NWNEUWNPSE9jT2RWR3h4ZmJMSTRXb0plREFnV1BteUZzMnUrVEhVUWNqQWc0Y09Hck1IRmhVVTNQV1Zyd2tEaHc0Tmh4cW43MzhlSDJ4TDl0dzRNQ3g2OGdOMUwyNW4vMmlvSjQ4R0E0Y09CcVIrdFoyVmo5dGU3czU3OE9CQThjOWpydytlemVWRjJKdzRNQWgyNnZOdGxVcmY0c1VkVE1WQnc0YzU0NjJaSjVyUnhTMWVEOGNPSEJjNUZBanRsOGVidXNXVDRJREI0NGp4K2h5MWNBdUxUb1hkK0RBZ1dQWDBjWjJ6bk9xbXQyaXZzQlI5V3ZuY1B4VHgvdHpsam4xMDY3S2QxajVpSUFEQjQ3RzBaNnFHdm1nVU9ZdExRWUhEaHlOSTI5UnhZc2E3VzMyY2h3NGNEem15Ri9rZnBzc0hEaHcvSjVqMld5dlZKdnpBdnRnT0hEZ3VNaFJLSE0vZTJxcDZyWmlEZ2NPSEJ1T25MWnpjVkRVemQvaXdJSGo2SDkyUWdnaGhCQkNDQ0YvT0Q4Q0RBRGpUamI4RFFwbGJtUnpkSEpsWVcwTlpXNWtiMkpxRFRFZ01DQnZZbW9OUER3dlJtbHNkR1Z5TDBac1lYUmxSR1ZqYjJSbEwwWnBjbk4wSURFNU15OU1aVzVuZEdnZ056RTJMMDRnTWpZdlZIbHdaUzlQWW1wVGRHMCtQbk4wY21WaGJRMEthTjdNVmR0TzIwQVVQSjl5SHNzRFdlL2E2MHVGSXVWZUJBUXJDU29Tb01vRWsxZ2t0bVVjbGZ4ODIxbHZnRmFxcUIvN2tKMmRjK2JNM21PZkhRNDRkRGxrNVlZY3NkSUJTNGU5MEdjcDJWY09TOFdSOGxpNkhQa0lvdWM0SVVzTjFNZ2k1RVNLSmNxa2l5UlNNa0F3UWlGSVkrQTdyQ1FjSE1VS1V0ZlRHQTBZSW84U3o1VVlGeGg0ckZDcVlhYmdwMDBkL0h6SFpRVS8zL1BaTlVOR2tsRWlBKzN4eVlrNHd3b2Nub2s0cWRLOFhsUnBpdFg4R1ppbUwvVlp1bWNwWnNVbXZVaEtyTlFvRnZzeUZmTzYyaTBiMmF3bzZtN1hXTjVnOFJDWXhUZmdXdkFzYUF1K2hjQkNhS0V4TnN0dXdMb282NktzaTdJdXlyb282NktzaTdJdXFuRzVFekUzV1RFWDgzUnBwemJkYlo5dkhITkdSdEdFZW5sZTFFbWRGYm1ZbDBrdWVsV2RQU2JMV3NTaW45MXZzbUpWSmVWNmI4Z29yNnU5R0t5VHFoYmpiTFdyVWpITUV1UzNiN1FxeWtGU3Z0SlIvZ0R6VkV4Tk04Yit2TFBUZkpQbDZYeWRZQThQNnN0ZGJXSjJHdGpYN0NrdGR2V0I3dTZmbDFWV3Z0RXlyWDRQTEhCRy9lTEZ6RjVjNVE5cDllYlU3ZjRmeDJHMjJsdzhjeUs5VGYzcHgwK2EwR2U2dmFVenVxSXBEV21FRm5SSU1WMmFUcDk2TktkVEdxQUZQVWQwZ3Q5SDVCczkwbzVTcXRCYkFKZTBwaHo5SHRydjREazlJSi9UcXVtak5HN0tGblJNRjgzNFYyZ1Ivb3J3REROaDBCZ0NneGMwQnM0eDNSNUdQRVZraGtLSVgxUFA5RVFKYlNockpsQ2IxSml1b1pxUWhQVTFhZWc3U0c3cDhRZ1B6OEVOUFR5K0ZidXZkOVZlQnZ1UThPVE9rM3oxYVRnNkhudzUrcXM4UGloVmE2WGJXdWxaNVdoNlBPbC9yTlN0bFg1clpkQmFHYlpXUnEyVjBta3ZiWDlLc3YweHlmYm5KTDMyVXQxZTZyZVhCaTJsUGZNSk1nSFVoUCs2L24zOG9kMG9wVHErWms4R0hjZGpOMmlZOWcyN0U1Y1lkbS8rSStOTnNreTMrRjZKL3FaWVByMlhlNTZEZ3BDRE1PaUUrR0pxWDNjOHJUaDBvbzd2Umg5Wi9CSmdBTlVSM2dJTkNtVnVaSE4wY21WaGJRMWxibVJ2WW1vTk1pQXdJRzlpYWcwOFBDOU1aVzVuZEdnZ05EQTROeTlUZFdKMGVYQmxMMWhOVEM5VWVYQmxMMDFsZEdGa1lYUmhQajV6ZEhKbFlXME5DancvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtDang0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURFMklEa3hMakUyTXpZeE5pd2dNakF4T0M4eE1DOHlPUzB4TmpvMU9EbzBPU0FnSUNBZ0lDQWdJajRLSUNBZ1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNEtJQ0FnSUNBZ1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSUtJQ0FnSUNBZ0lDQWdJQ0FnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklnb2dJQ0FnSUNBZ0lDQWdJQ0I0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlLSUNBZ0lDQWdJQ0FnSUNBZ2VHMXNibk02WkdNOUltaDBkSEE2THk5d2RYSnNMbTl5Wnk5a1l5OWxiR1Z0Wlc1MGN5OHhMakV2SWdvZ0lDQWdJQ0FnSUNBZ0lDQjRiV3h1Y3pwd1pHWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2Y0dSbUx6RXVNeThpQ2lBZ0lDQWdJQ0FnSUNBZ0lIaHRiRzV6T25Ca1puZzlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2Y0dSbWVDOHhMak12SWo0S0lDQWdJQ0FnSUNBZ1BIaHRjRHBOYjJScFpubEVZWFJsUGpJd01qQXRNRFl0TWpSVU1EazZNakk2TWpBck1ESTZNREE4TDNodGNEcE5iMlJwWm5sRVlYUmxQZ29nSUNBZ0lDQWdJQ0E4ZUcxd09rTnlaV0YwWlVSaGRHVStNakF5TUMwd05pMHlORlF3T1RveU1qb3hPU3N3TWpvd01Ed3ZlRzF3T2tOeVpXRjBaVVJoZEdVK0NpQWdJQ0FnSUNBZ0lEeDRiWEE2VFdWMFlXUmhkR0ZFWVhSbFBqSXdNakF0TURZdE1qUlVNRGs2TWpJNk1qQXJNREk2TURBOEwzaHRjRHBOWlhSaFpHRjBZVVJoZEdVK0NpQWdJQ0FnSUNBZ0lEeDRiWEE2UTNKbFlYUnZjbFJ2YjJ3K1FXTnliMkpoZENCUVJFWk5ZV3RsY2lBeU1DQm13N3h5SUZkdmNtUThMM2h0Y0RwRGNtVmhkRzl5Vkc5dmJENEtJQ0FnSUNBZ0lDQWdQSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUStkWFZwWkRwak5HVXdZVGhpWmkwNU5USTFMVFEzWmpBdFlqRTNOaTFtTURReE5UVmpZMlJsTnpJOEwzaHRjRTFOT2tSdlkzVnRaVzUwU1VRK0NpQWdJQ0FnSUNBZ0lEeDRiWEJOVFRwSmJuTjBZVzVqWlVsRVBuVjFhV1E2TVdSbVlqYzFNMll0WVRVd1lpMDBPVEEyTFRnelpUZ3RZVEppTWpoa1pHSTNPV00zUEM5NGJYQk5UVHBKYm5OMFlXNWpaVWxFUGdvZ0lDQWdJQ0FnSUNBOGVHMXdUVTA2YzNWaWFtVmpkRDRLSUNBZ0lDQWdJQ0FnSUNBZ1BISmtaanBUWlhFK0NpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUR4eVpHWTZiR2srTXp3dmNtUm1PbXhwUGdvZ0lDQWdJQ0FnSUNBZ0lDQThMM0prWmpwVFpYRStDaUFnSUNBZ0lDQWdJRHd2ZUcxd1RVMDZjM1ZpYW1WamRENEtJQ0FnSUNBZ0lDQWdQR1JqT21admNtMWhkRDVoY0hCc2FXTmhkR2x2Ymk5d1pHWThMMlJqT21admNtMWhkRDRLSUNBZ0lDQWdJQ0FnUEdSak9uUnBkR3hsUGdvZ0lDQWdJQ0FnSUNBZ0lDQThjbVJtT2tGc2RENEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1BISmtaanBzYVNCNGJXdzZiR0Z1WnowaWVDMWtaV1poZFd4MElpOCtDaUFnSUNBZ0lDQWdJQ0FnSUR3dmNtUm1Pa0ZzZEQ0S0lDQWdJQ0FnSUNBZ1BDOWtZenAwYVhSc1pUNEtJQ0FnSUNBZ0lDQWdQR1JqT21SbGMyTnlhWEIwYVc5dVBnb2dJQ0FnSUNBZ0lDQWdJQ0E4Y21SbU9rRnNkRDRLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdQSEprWmpwc2FTQjRiV3c2YkdGdVp6MGllQzFrWldaaGRXeDBJaTgrQ2lBZ0lDQWdJQ0FnSUNBZ0lEd3ZjbVJtT2tGc2RENEtJQ0FnSUNBZ0lDQWdQQzlrWXpwa1pYTmpjbWx3ZEdsdmJqNEtJQ0FnSUNBZ0lDQWdQR1JqT21OeVpXRjBiM0krQ2lBZ0lDQWdJQ0FnSUNBZ0lEeHlaR1k2VTJWeFBnb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBOGNtUm1PbXhwUGxKbGFXTm9iWFYwYUNCTmFXTm9ZV1ZzTENCSk16WTBQQzl5WkdZNmJHaytDaUFnSUNBZ0lDQWdJQ0FnSUR3dmNtUm1PbE5sY1Q0S0lDQWdJQ0FnSUNBZ1BDOWtZenBqY21WaGRHOXlQZ29nSUNBZ0lDQWdJQ0E4Y0dSbU9sQnliMlIxWTJWeVBrRmtiMkpsSUZCRVJpQk1hV0p5WVhKNUlESXdMall1TmpZOEwzQmtaanBRY205a2RXTmxjajRLSUNBZ0lDQWdJQ0FnUEhCa1pqcExaWGwzYjNKa2N5OCtDaUFnSUNBZ0lDQWdJRHh3WkdaNE9sTnZkWEpqWlUxdlpHbG1hV1ZrUGtRNk1qQXlNREEyTWpNd056RXlNelE4TDNCa1puZzZVMjkxY21ObFRXOWthV1pwWldRK0NpQWdJQ0FnSUNBZ0lEeHdaR1o0T2tOdmJYQmhibmsrVUU5VFZDQkRTQ0JCUnp3dmNHUm1lRHBEYjIxd1lXNTVQZ29nSUNBZ0lDQWdJQ0E4Y0dSbWVEcERiMjF0Wlc1MGN5OCtDaUFnSUNBZ0lDQWdJRHh3WkdaNE9reHZaMjlOWVhKclpUNUdQQzl3WkdaNE9reHZaMjlOWVhKclpUNEtJQ0FnSUNBZ0lDQWdQSEJrWm5nNlRHOW5iMU53Y21GamFHVXZQZ29nSUNBZ0lDQWdJQ0E4Y0dSbWVEcE1iMmR2UVdOMGRXRnNQa1pZVWtjeFRsZzFWRjh5TURFM1BDOXdaR1o0T2t4dloyOUJZM1IxWVd3K0NpQWdJQ0FnSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGdvZ0lDQThMM0prWmpwU1JFWStDand2ZURwNGJYQnRaWFJoUGdvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0NpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQUtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQW9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lBb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdDaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUFvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0NpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQUtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQW9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lBb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdDaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUFvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0NpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQUtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdDancvZUhCaFkydGxkQ0JsYm1ROUluY2lQejROQ21WdVpITjBjbVZoYlExbGJtUnZZbW9OTXlBd0lHOWlhZzA4UEM5R2FXeDBaWEl2Um14aGRHVkVaV052WkdVdlJtbHljM1FnTlM5TVpXNW5kR2dnTlRBdlRpQXhMMVI1Y0dVdlQySnFVM1J0UGo1emRISmxZVzBOQ21qZU1qWlNNRkN3c2RGM3ppL05LMUV3MVBmT1RDbU9OallEQ2diRjZvZFVGcVRxQnlTbXB4YmIyUUVFR0FEbnFndmdEUXBsYm1SemRISmxZVzBOWlc1a2IySnFEVFFnTUNCdlltb05QRHd2Um1sc2RHVnlMMFpzWVhSbFJHVmpiMlJsTDBacGNuTjBJRFV2VEdWdVozUm9JREkxTmk5T0lERXZWSGx3WlM5UFltcFRkRzArUG5OMGNtVmhiUTBLYU41c2tFOVBnMEFReGIvSzNycEVVNGFsMHRRMFRVZ0oxVmlVRkJKN004c3lsYlhBTnVNU3czZjM0TllhdlhoNzgrKzlYeVlNR2JEbDBvOEgyeGppTzlTcTZaeG1tUk1TMjJ0MkgwWXp6MSticnNQZXZ2TnZlWkw5eVBPbm9tVHJPeFp2WEk5UVdtMzZSRnJreWEwQUFSQ0pHU3lFQ0JaWElDWUFrNTh0bHhJck1wVzBMRS9TVEI2Um1BQjIrQ1QyYktqMi9BY2NQNXc0UjIzTnE0bVZIV1RMMC8xdUV6enViOG9YQWNIOE1zb2tIWkdubDZJNGtWUU51cXZNMVA5d0NQamx5TW5VZzBJSFVwc0t6eGhzcXl1U05EcVNhVFNOSXM4dnpFQUtuWlUrYUt6L3ZFS1lCeUowSHltRzZnMlZkWG1sdHEzTFhhMitCQmdBS3F0ajVBMEtaVzVrYzNSeVpXRnREV1Z1Wkc5aWFnMDFJREFnYjJKcURUdzhMMFJsWTI5a1pWQmhjbTF6UER3dlEyOXNkVzF1Y3lBMEwxQnlaV1JwWTNSdmNpQXhNajQrTDBacGJIUmxjaTlHYkdGMFpVUmxZMjlrWlM5SlJGczhSRUUxTURCRE9VVkZNVFE1UWtVME1qZ3dSRVJET0RjMk5qTTRSalEyTVRBK1BEaEROVEUzUmtNME5URTBNREExTkRZNU1FVkdNRGxFUVVNMFFrSTJNa1E1UGwwdlNXNW1ieUF6TXlBd0lGSXZUR1Z1WjNSb0lEUTVMMUp2YjNRZ016VWdNQ0JTTDFOcGVtVWdNelF2Vkhsd1pTOVlVbVZtTDFkYk1TQXlJREZkUGo1emRISmxZVzBOQ21qZVltSUFBaVpHSDJZR0pnWm1IU0FoNEFJa0dQdEFSQ3hRWXY1aUlJdUJnWEVBQ2FiblFJS1JBU0RBQU5uVEJFc05DbVZ1WkhOMGNtVmhiUTFsYm1Sdlltb05jM1JoY25SNGNtVm1EUW94TVRZTkNpVWxSVTlHRFFvPTwvRG9jdW1lbnQ+CjxEb2N1bWVudCBNaW1lVHlwZT0iYXBwbGljYXRpb24vcGRmIj5KVkJFUmkweExqWU5KZUxqejlNTkNqRTBJREFnYjJKcURUdzhMMHhwYm1WaGNtbDZaV1FnTVM5TUlETXdNRGMxTDA4Z01UWXZSU0F5TkRnd01pOU9JREV2VkNBeU9UYzNNUzlJSUZzZ05EVTNJREUxTTEwK1BnMWxibVJ2WW1vTklDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0RRb3lNU0F3SUc5aWFnMDhQQzlFWldOdlpHVlFZWEp0Y3p3OEwwTnZiSFZ0Ym5NZ05DOVFjbVZrYVdOMGIzSWdNVEkrUGk5R2FXeDBaWEl2Um14aGRHVkVaV052WkdVdlNVUmJQRFl6TlRFNVJrUXpNMFpFTURaRE5EazRNVUk1TVVFelJqazVRak5HUkVOQ1BqdzRRelEyT1RBMk1qbEdPRFZHTnpRd1FUQTJPRGc1UmtSRlFrWXpOVUpHTmo1ZEwwbHVaR1Y0V3pFMElERXhYUzlKYm1adklERXpJREFnVWk5TVpXNW5kR2dnTlRRdlVISmxkaUF5T1RjM01pOVNiMjkwSURFMUlEQWdVaTlUYVhwbElESTFMMVI1Y0dVdldGSmxaaTlYV3pFZ01pQXhYVDQrYzNSeVpXRnREUXBvM21KaVpCQmdZR0pnQ2dJU0RGT0FCT00rRU1FQ0V1c0JFcEZXUUdMaE53WW1Sb1o1SUNVTWpFei9HYmYvQndnd0FJKzdCK0lOQ21WdVpITjBjbVZoYlExbGJtUnZZbW9OYzNSaGNuUjRjbVZtRFFvd0RRb2xKVVZQUmcwS0lDQWdJQ0FnSUNBTkNqSTBJREFnYjJKcURUdzhMME1nTnpNdlJtbHNkR1Z5TDBac1lYUmxSR1ZqYjJSbEwwa2dPVFV2VEdWdVozUm9JRFk1TDFNZ016ZytQbk4wY21WaGJRMEthTjVpWUdCZ1pXQmdpbVVBZ3RnM0RLaUFFWWhaR0RnYUJKREVXS0dZZ1dFZkF6OVFpUVJiYWZzQmtRTlE1UW1QSURSakZWd0RDd05ETVJ0VTFBMGd3QUNxVkFoVkRRcGxibVJ6ZEhKbFlXME5aVzVrYjJKcURURTFJREFnYjJKcURUdzhMMHhoYm1jby92OEFSQUJGQUMwQVF3QklLUzlOWVhKclNXNW1ienc4TDAxaGNtdGxaQ0IwY25WbFBqNHZUV1YwWVdSaGRHRWdNaUF3SUZJdlVHRm5aVXhoZVc5MWRDOVBibVZEYjJ4MWJXNHZVR0ZuWlhNZ01USWdNQ0JTTDFOMGNuVmpkRlJ5WldWU2IyOTBJRFlnTUNCU0wxUjVjR1V2UTJGMFlXeHZaejQrRFdWdVpHOWlhZzB4TmlBd0lHOWlhZzA4UEM5RGIyNTBaVzUwY3lBeE55QXdJRkl2UTNKdmNFSnZlRnN3TGpBZ01DNHdJRFU1TlM0ME5DQTROREl1TURSZEwwMWxaR2xoUW05NFd6QXVNQ0F3TGpBZ05UazFMalEwSURnME1pNHdORjB2VUdGeVpXNTBJREV5SURBZ1VpOVNaWE52ZFhKalpYTThQQzlHYjI1MFBEd3ZWRlF3SURJeklEQWdVajQrUGo0dlVtOTBZWFJsSURBdlUzUnlkV04wVUdGeVpXNTBjeUF3TDFSaFluTXZVeTlVZVhCbEwxQmhaMlUrUGcxbGJtUnZZbW9OTVRjZ01DQnZZbW9OUER3dlJtbHNkR1Z5TDBac1lYUmxSR1ZqYjJSbEwweGxibWQwYUNBeE9UQStQbk4wY21WaGJRMEtTSWxVajd0cXcxQU1obmM5eFQ4ZUZ5eExwNDZQaHhCSWJBOE5CRHBvS3gxQ0xxVWhGeE1DNmVOWGJpN1FTWi9nbHo2cGVNZDRYQ3lhdHhhQ3lXVFdOaURGRnlYaGlEU0tuQ3JvcTdLVTBNU3h4bmxEMnhlYUdZbW5Dak9Cd3JhVUM0dlVzQlVjdElKZG9TUFdpRng4OFEzdk95dFBpZzhkNkNOTXN6eHhRbGl2djdNOGxxd0lsNndleXJNL0haZjdCMlBaOTV1alp6OXQ3Z2NNdHNFVWZqTGJrU3E3K09iN3d5aktzZnhuREJpU25WRzM4RWQvQlJnQVhJZzEzZzBLWlc1a2MzUnlaV0Z0RFdWdVpHOWlhZzB4T0NBd0lHOWlhZzA4UEM5R2FXeDBaWEl2Um14aGRHVkVaV052WkdVdlJtbHljM1FnTVRJdlRHVnVaM1JvSURNd01TOU9JREl2Vkhsd1pTOVBZbXBUZEcwK1BuTjBjbVZoYlEwS2FONmtVdEZxZ3pBVS9aVThib3lTYTZ6YVFoRzBuZHRnNjhOcXAxRDZrTm1nZ1JnbHByRCsvV0tzZHV5MUpIQ1RldzdubmhOQ0NBSkVYTE1CclZZNDZnb21OWEpnRG5oTjIxZkd5MHFqd1BIeGhnM1F6Q1VlVGdRdE8rUVNuRFJTeDNIemM1ajV2bWN4UkFEQUNod3RtdENhaTh0RHBEZ1ZqME9IQzBhUXN6U0RQMjFqUzJ1R3MzeWZiMTZlTE84anRmMmRWa3dYRmQ0MnFxYkN0ckxCMEJ3QXYya3FlQkhKVWpBRWVLZFovWVVXQzV4ZVdtYXB2V0hGVzkwb25GOXplTTR5REUzS21IYXNwL3dmK2l5TDVzUmxpVE11STlueDZaNXcxZWwxUmRXWStTYU9DTEZCM3VtVjRSRGo1dnl0ZXgrcE9qTnJLRzMya2hzeFpwN0gwaWViWnRaSlY5MkJCQXNFZHk3ZkQrNVU4RHgvcXVQWi9BK2JjYXdqOWdlZnZIc0F4ekQ4RldBQWgrMmYwdzBLWlc1a2MzUnlaV0Z0RFdWdVpHOWlhZzB4T1NBd0lHOWlhZzA4UEM5R2FXeDBaWEl2Um14aGRHVkVaV052WkdVdlRHVnVaM1JvSURJeU56VTJMMHhsYm1kMGFERWdOVGd5TWprK1BuTjBjbVZoYlEwS1NJbDhsbmxjRkVjV3gzOXZlcnBtR0Via0ZFU2dld1o2akdqVXFNdXFTNHozdWtsVXNyb21hbFFJb29pZ3FFVFJSQ0VyUmtWRXZQQldRQVV2QkM5UXZPTjlJSmYzVElDTmllczZmdFFZUDVwMVlHWnJrSS9aL0dIcTgzbFY3NzE2VmRYMTdhNVhEUUxRQXFrUUVERjBXS2N1M2grT1NlTWVDNWZJNklTb3hCbmxBVmNBQ2dlOEk2Tm5Kc21GSitzeUFaK05BSnN5SVhGaVF2ZnRyZG9EQVRyQXRYaGkvT3dKb1ptRjE0RzJaWUIvZm14TTFIanJSeVBLZ2I2UmZMNndXTzd3N09vL2p0dlozQTZKVFVoS0hoRjdoS3Q5ZWZ6QVVmRlRvNk9vdkpzZnNOaWIyNUVKVWNtSnZrdGRpb0NLSkI0a1Q0bEtpTW5NckY3RmJTNmFGWWxUWnlRNVFzSG51bVZ5OWlkT2owbk0zZi9nSWJjSEF2cE9FSVJGbEFVUlduRzkySlh2b3MzclZxakNCSlduVmxTNU1yWEtXZFQxNk9nNGhlVFJmQllYTGhnK3VKK00zcEFkRFdLTi9SUHFxdWxGKzN1REhBNEhvRGFKUjUycndZZlhLamo1Y1RpY0g5Zklud3REczVPM0twVXo1dmVGZHdwcWtXbTBManBYZlF1M2x1NGVubDdlUHExOC9Wcjd0d2tJREpKa2d6RTRSREcxZmFkZGFQc083M2JzMVBtOUxsMjcvU25zejkxNzlQeEwrUHU5UHVqZHAyKy8vZ01HL25YUTN6Nzg2T1BCUTRaR2ZQTDNZY1AvTWVMVHowYU9HdjM1bUxIaklxUHdSZlQ0bUFrVFl5ZkZUWTVQbURJMWNkcjBHVWxmenB5VlBIdk9WMS9QblplUytzMC81NmN0K0hiaG9zWHBTektXWmk3TFdyNWk1YXJWMld2V3JsdVBqWnMyYjhuSnpkdTZiWHQrd1k2ZHUzWUxld3IzRmhYdjIzL2c0S0dTMHNOSHlvNGVPMzdpNUtuVE9IUDIzUGtMRnk5ZHZuSzEvRnBGSmFxcWE2N2Z1SGtMZCs2YUxkL1gxa0h0eGQ4QTllZGIxYUEvNXBGREphdEdxZ3FGWUdHb01FdElFZEtGRENGWHFCQmVxRnVvaDRxZHhCSGlPSEdobUM0dUV5K0lEOFhuTElBNU5DbmFnOXJqV2tkZ1hPRGt3RE9CbHdNZFFTbEJXNEorbG55a1FHbUFORmo2VkJvcGpaYkdTSE9sZzlKWnFVWXlTMCtrNTVKZGJpa2JaWlBjV2U0bTk1Ujd5ZjNsc1hLaVBGdE9rVmZKSitXbkJ0SGdaZkExR0EwbVEwZkRFTU53dzFoRG1tRzFZWWRSWldUR2xrWlBvNC9SM3lnWjJ4bmJHd2NabzR3eHdhcGc5MkNEQWtXbDZCVjN4VnZ4VXdLVUVLV0QwazBKVitLVlZDVk5XYVJrS0N1VlhHV1BzbDhwVTQ0cFo1V3JTb1Z5UjdsdkNqZjFOdlUxUlpxaVRSTk1rMDFUTzZSMDlDMHdGQ3dzMkZ0UVd1RFlIZk1MMlpqTjF4Wm1DN2Yxc3ZXeDliZWR0amthb2h1ZU4zN1ErS3p4ZVdPalBkaWVaRSt4TnpnYW5OOGQvK0p5VkZBWlZLTlVlNFVRSVVLWUk2UnhpcG5DVnFGU2VLbDJVMGVJNzRranhTaHhzYmhVWEM1V2lrOFpXSkFtUXB1akxkRmVEd1NuR0I5NE50QWVoS0RVb0p5Z1o1S2ZKRXVEcElobWl1T2tWS2xFT2kvZGxMNlhua2t2Wk1pZW5HS28zRVh1SVljM1VZeVRrempGTERtbm1XS3Jab3FERGNNTW96bkZyRGNVUFRqRjFzYWdab3FSeHZGTkZPVzNVSXg0UXpGTHlWRjJ2YUY0bVZPOHpTbjJmRU14eGhUSEtVWnlpcjRGeG9KRkJjVUZMM2QzNWhSaDg3SUYycnB6aXIxdC9Xd0RiVFVOWXh1ZU5ZWTNVWHhsbCsySjlwbjJWQ2RGeHoxK2ZwOXdxUWJFOTE4ZlIvc2taNjJ1NUZvb29MdWhxOUZWNjZwMEZVQkRaY09WL3orNGo4T0FKK29uZ3dGckNuQmZ6VnN2cTRlMXBiV0ZWVzkxdGVxc0xsYU5sVmxGcTJCVldmSFErYzVRdjZDcDVqbTFmdGFqdUNhOTlGRVA0TkZuOWVuMWM0RzZ1THJaOVdYVzhuc2Q2ak90YSt0MjFHWFhadGZtMVM0QmF2T2QwWFcrdGROcWVjYXM3VnpidTdacmJZaGxvR1dBSmR6U3d4Sm02V3JwYkdsbk1WcmFXTHd0Wkg1c3Rwb2ZtSDh5LytBY1pUNXZQbWsrWVM3bDJqbnpkbk9SZVlDNXI3bVBPY1JzTkJ2TVFUK3U0L1B4SERhSlo5Vko4WlBlaldrTWVNUnorc2Y4c0c3VWJOQ3MxNng3dlYvUCtmeHF1T3ZSanVmU2h4NDh3NHNRb3B1eVhGK2V3ZXljV1R6M0RSZnp4RDI4TFJINW5jRzZjUG44TjJKYTk2WTZXVnVzbTY2cjFQM3F5bk9qNnlpbnozVkVzNnpBSHhiWE10ZmJ2SDZoNTFsVXIzWjY5R3A5MDZ6NlZxOGo5RVBlTmxiZjNTbjZuczFXMkIrdjlMdVJicS9YYU5MMWIzbXlWNi9uMUE5NkU1bkJKZnVOZGFwRmlac2I0TmIwbkc1K1RiVi9jNmVBclVqREFtRXN2NzN1NDF0a1lnazJZU2Uyd1IzcEhQRjhyTVJUL0l5bFdJTkZSUHcrZm9MTjJJVmY4QXpQa1ljOXVJanpLTVFYaUVZV3h1TXlZbkFCbDNBTlYzQVY1ZmczSnFBS0ZhakVYa3pFWXl6SGRWU2pCckg0RDZ4WWpEaE13bVFrSUI1VGtJT3BtSVpFVE1jTWZJa2t6TVFzUEVBeTVtQTJ2c0pjZkkxUzVDSUY4L2hmd2pkNGlFYzRRdG0waGxRa2tKcEUyTkJBYTJrZHJhY05hSVNkR0dsSUN3ZHRwRTIwbWJaUUR1V1NDK25JbGZTVVIxdnhBaTlwRzIybmZDcWdIYlNUZHRGdTJrT0Z0SmVLcUpqMjBYNDZnRjl4ZzlKcENSMmtRMVJDcFhTWVdwQWJIYUV5YWtudTVFR2VxTWUveUl1ODZTZ2RJeDlxUlJsMG5FN1FTVHBGcCtrNzhpVS9GS0dZV3BNL25hR3oxSVlDS0pDQzZCeWR4My94Q2ovZ0hra2trNEdNZElFdTBpVzZURmZvS3BYVE5RcW1FRkxJUkJWVVNWVlVUVFYwSFdYVWx0NmhkaFNLSC9FVDNXRHBiQW5MWUV0WkpsdkdzdGh5dG9LdFpLdllhcGJOMXJDMVlnaGJ4OVlqbjIxZ0c5a210cGx0WVRrc2wrV3hyV3diMjg3eVdZRTZUajJaN1dBNzJTNjJtKzFoaFd3dksyTEZiQi9ienc2d2crcDRkUUk3eEVwWUtUdk1qckF5ZHBRZFk4ZlpDWGFTbldLbjJYZnNERHZMenJIejdBSzd5QzZ4eSt3S3U4cksyVFZXd1NyVkRlcEd0VjN0RUNHU3FCSUZVUzJLSWhNMW9sWjBFWFdpSzZ0aTFheUczV0EzMlMxMm05MWhkNW41ZnpUWDUzTlY1eEhIOFh2MnVjL3o3SjQ5NSs0NUVnS0pJb0ZBQlNRNkdBd0VZeEM5OTE3c0FBRUNkbXdjTXdHYlhtMUVGNzI0QUtaamJKT1pPSk5rRXNkMjNJMHhIU0ZBOU42RkVDVjNKcE0vWU4vOFh1eDh2dWFrS1RTblRKRTViYzZZczZiWW5EUG56UVZ6MFZ3eWw4MFZjOVZjTTlmTkRlZXdjOFE1Nmh4empqc25PTUVHTnJRSk50R1dzMG0ydksxZ2syMktyV1FyMnlvMjFhYlpxcmFhVGVkRUxzZEpMRnpFcC9rTW4rVmlQc2ZuK1FKZjVFdmVmZStCVitJOTlFcTlSMTZaOTloNzRqMzFudmtSMy9IQlZyYzFiSWJOdEZrMjI5YTB0V3lPenVEeVhNRk90elBzVER2THpyWno3Rnc3ejg2M0Mrdzc5bDI3ME9iYlJYYXhYV0tYMm1WMnVWMWhDeUtISTBWMlplU29YV1ZYMnpYeG43WXUvdHMyMkkxMmszM1B2bTgvc0IvYXpaRmprZU9SRTVGVGtTT1JRcnZGYnJVZjJXMTJ1OTFoZDlwZGRyZmRZL2ZhaiswKys0bjkxSDVtOTNNeXAzQkZyc1NWdVFxbmNocFg1V3FjenRXNUJtZHdKbWR4ZG5SWmREbTJqazdHTnBpSGJiRWR0bysrZ1Iyd0kzYkN6dGdGdTJJMzdJNDlzQ2Yyd3Q3WUIvdGlQK3lQQTNBZ0RzTEJPQVNINGpBY2ppT2lCVnlUYTNFTzUzSnRyc04xdVI1ZjVpdDhsYS94ZGE3UERiZ2g1dU1pWEl4TGNDa3V3K1c0QWd0d0phN0MxYmdHMStJNlhDK3Q1RVZwTFcxd0EyNlVQR21MbTN6bFIzMGRTUTNlY200NnQ1emJ6a25uam5QWHVlYzhjRXFjaDA2cDg4akpjY3FjeDg0VDU2bVRHOWRhQk9KMEJRVlIwR0RBQWdLQjY5UUdCZzk4aUlGQUFDRWtRQ0tVYytwQUVwUjM2anIxb0FJa1F3cFVoRXBRR2FwQUtxVEYxYmN3THBaMHA3N1RBS283RGFFR1pFQW1aRUUyMUlSYWtDUHR1QkUzNWhOOGtndjVCdC9rVzN3YnY0WmNxQTExb0M3VWcvclFBQnBDSTJnTXowRVQvQTkrQTVOaENyd0ZiOE5VbUFiVFlRYk1oRmt3RytiZ3R6QVg1dUYzK0QzK2dEL2lUL2d6SHNCZjhDRCtpb2Z3TUI3Qm8zZ01qK01KUEltRmVBcUw4RFNld2JOWWpPZndQRjdBaTNnSnIrQlZ2SWJYOFFiZXhGdDRHKy80cmZFdTNzUDcrQUJMOENHVzRpT1lEd3Qwb0VNc3c4YzZRU2ZpRTN5cXkra2tYVjVYd0djVUlZZEFKK3NVVWhRbFRZWXNJUkc1eE9UcGlycVNycXlyNkZTZFJqN0ZTQ2pRVlhVMW5hNnJVMGdKbEVqbEtJbktVd1ZLcGhTcVNKV29NbFdoVkVxanFsU04wcW02YnlpRE1pbUxzcWttMWFJY3l0VTFkQWJWcGpwVWwrcFJmV3BBRGFrUk5hYm5xQWsxcGVlcG1jN1VXZFNjV3RCdnFDVzlRSzNvUldwTmJTaVAybEk3dnNOM3FUMTE4SzJQUHZtdXo3NUhIYWtUZGFZdTFKVzZVWGZxUVQycEYvV21QdFNYK2xGL0d1RDdmc3dYUDVETzBrVzZTamZwTGozOE5uNmUzOVp2SnoybGwvU1dQdEpYK2tsL0dTQURaVkR3ZGpBMW1CWk1EMllFTTROWndXd2FTSU5vTUEyaG9UU01odE1JZW9sZXB0L1NTQnBGbytsM05JYkc4ajBhUjcrbjhUU0JYcUZYNlEvMEdyMU9FK2tOK2lPOUNmbXdDQmJERWxnS3kyQTVySUFDV01uM1lSV3Noald3RnRiQmV0Z0FHMkVUVGVJSFhNSVArWDMrZ0Qva3pkSWhHQjM3SXZidjJKZXhyMkpmY3lsYzQ2MjhoVC9pYmJ5ZGQvQk8zcVViU3JwVWx4cVNJWmx3UFJqRmorQ0daTUZOTlVQTlVuUFVQTFZBNWF2RmFya3FVR3ZVaG5pNWJGSGIxVTYxVysxVis5Uis5UmYxTi9WUDlhWDZSdjBnT1ZKWEdrb1RhUTYzMUFGMVNCMVRoZXFNT3E4dXErdnFwcm9OdCtFTzNJVjdjQjhlUUFrODFFMzE4N29aNytZOXZKZkwrREUvNGFmOHpJdklDMUFLajZBTUhzTVRlQXJQVkVRNUNwUlMwU0NpdE03V3VicTVicUZiNmxieCs5WTZUN2ZUSFhRbjNVMzNpcmZVSUpXbWgrbVg5V2c5VHIraVg5ZHZxaXc5V1UvVjAvVk1QVnZQMWZQanBiVlFMOUpMOURLOVFxL1VxL1ZhdlY3bDZJMzZQYjFaYjlPNzlNZjZzN2pvUHRkLzFmL1FYOFNiN0R2OWt6NmdhdXVEK29nK29ZdDBzYXF2TCtxcitxYStxMHQwbVg1bWxMR0dqWmpRSkpvSzZxcEpNVlZNbXFscXFwbDBVOE5rbW14VHkrU2FPcWFlYW13YW1FYW1xV2xtV3BwV3ByWEpVMmphbW5hbXZlbGdPcHBPcHJQcFlycWFicWE3NldGNm1sNm10K2xqK3BwK3ByOFpZQWFhUVVIVURPWjkvT24vOTFHdVl1WDlieDh6eEl3d0k4MFlNNWIzZStBWno0MUxMc0VyNzFYMFVyMTBMOVBMOW1wNXVWNDlyMUhjaFMyOFZsNmUxOEhyNHZYdytuZ0R2Q0hlQ0cra044WWI1NDJQRmNXS1l4ZGpWMlBYWTdkamQyUDNZNld4SitLSUVpMVdTSHdKSlVtMkJtTmtoK3lSVCtUUDhybjhYZjRsWDhtMzhyMzhHSXdQSmdTdkJoT0RTY0dmZ3Z4Z2FUZ3FIQnRPQ0Y4TEo0YVR3aW5odEhCdU9DK2NIeTRJM3duZkRSZUcrZUdpY0hHNEpGd2FMZ3VYaHl1Q0F2bFpEc2d2Y2xCK2xVTnlXSTdJVVRrbXgrV0VuSlJDT1NWRmNsck95RmtwbG5OeVhpN0lSYmtrbCtWS01JVlArY2wraWxQb25IS0tuTlBPR2Vjc1BYTWpydU9DcTl5b3ExM2pXaGRkY2wyWFhjLzEzWmdyYnVDR2JvS2I2SmFUd1RMRWJ5OURuV0xuWFBSQnRDVDZNRm9hZlJRdGsyRXlYRWJJUy9KZnFzczh2S2N6aStQbnZNdjljVzl1M3Q5VlN4SzF4QjRSSktyR1E3V1lVaVFpaVcwNkZKV1UyRk1NUnV4TDdDb2xSUzF0VWR1TVVSTUd0WVRhT21TeHRKYVp4MXFDV2pMUFZFMkwzNTF2T3ZQSFRNN3pQdmZKL2QzN3Z1Yzk3em1mZTc3dm1zRjJGYnVxWGMyT3NDUHRLTHU2L2JKZHc2NXAxN0pyMjlGMkhidXVYYyt1Ynpld0c5cU43Qmk3c1ZQa0ZEc2x6bG5ubkhQZXVlQjg0M3pyWEhRdU9aZkZYWEZQM0JmZk84ZnBDOW9sRmxqSCtSWGFUWHZvSzc1TmY2WjhPdWFjb0psMGhISmtkNWtzVTZGMFU1eUxkSndYOHhMbkpMYzBuZm1PN0NWN3l6NnlyMHlUUGNQZkN6OFVmamc4UGJ3Zy9FaDRoaDJ5Zllmb0NaYzY3QWh1NVVoSGlRSTFsUTQ0YUg2Y2dCTjB2TENpc09Ld2tyQ3pwb3ZwNmc1d0I1b1BnM09DYzRQcHdVWGVZTEhRdVVLcjZDRWRwVTJVeTYvVFVtN1B2K05sbk1zZjhnVGF5OWxPUmJlR1c5T3Q1ZFoybzkwNmJsMjNubHZmYmVBMmRCdTVNVzRYazI0eXpIdHVWN2VibStnMmRtUGRKbTZjR1dLR21rd3p6QXczSTh4SU04cHQ2alp6bTd2eGJvcWI2cWE1UGQxZWJvTGJ3dTN0SnJuZDNXUzNSL0I1OEFWek1CVDBQZkxZRTU3MGxLYzl5d3Q0RmJ5S251MWhDNTdyaFh2R0MzcWVWOGw3eWF2c1ZmR3FldFc4Q0MvU2kvS3FlK25CSERwTUJjRjV3Zm5CQmNHRjFqaHJ2RFZCbkhEMlFVOTk2Unh3RGpxSG5NTk9nWE5FbkJTbnhOZmlyK0swT0NNS1JaRW9GaVhpckRnbnpvdXI0cHE0TG02SW0rS1crRTdjRm5kRUtZanpHZ2lUQnRYWFM5YVN0V1cwckFQT0ROYnBPZ1BzU2RZOWRBcklNMEFQMUlOQW8yNDZVU2VCSDhmMGNYMENERG1qQzNVUmVEUldqOVBqUWFiUmVvek9rZzFsSXhrakc0TlFrM1cybmdJNnpRZWpjc0NvaFdEV05Ca3JtNEJVeTJTY2JDcWJ5ZVl5WGliSUZ2SVZrT2NIL1VUL0NBbzkwQS8xSTdBbkNQcFVLbDhUN0tscERRTi9obHNqNVBmeVBzWURzS1k5YU5QUnpOZHhab0Z1YWhicVptYVJibTRXNndTenhDelY4ZVlEczh6a2dtN1g5UTE5RThTS0FiY2FnbHV4dXBQVjNJb0h4K3FEWVhFZ1Z4dXJyZldhanRFeFpybFpZZkxNUjJhbFdXVldtNC9OR3JQV3JEUHJ6U2ZtVS9PWjJXQTJtazJ5cFh4Vi9sUCtJRHZMdDJRWDJWVjJjL3VZaVdhU3pKWlRURTFUMnlrMDBXYWFtVzVtbUpsbWxwbHQ1cGk1SnNmTTAvc3BFaU5LYjZaSTFZQ2dJUDFTakx2bDExQ21mN2Y4OS9LcnVBOUZ1ZmUvZzJnTC9aRXpvUTBQMDFFdW8zSWR0QTlWZFlxcTBhOXBEZFRjY3NvaGk5N0duZm1VQ3RPNHY1d2ovWHhxQnAwbk1RcnhiQi9vdmYxVWxTUDhlOUIrYytSNXZEV0hYS3BEN2FrSEZPTmlUdlRIVXorNnBtWlJLMHFFamh6RDAvMisvaEkvMTkrSTJ0a25UL2t2eUtFb0tOVEJWT2cvMHBmOHYxTWMzbGlCK3JyR3VSVjMweHRZWlRxZVhBdnR1VnIyVit3UDhYK0dCOUZRb0lXa0tJa0t1VURFWXZZTUt1VUl6cFlkTWNzR2Y2ZC9ERSs5VFAyaFoxZERtN1hremlKYTkvT1QvRUtxaWpVbVl0WlZ0QXRNMllPWUhLUXJIS2JML0kxK0dVVlNFK3FDL2VSVEVSZkkwSXNab2RjUk1ZMG94VkJyL0RLYUR0RkpLb0VHUENKRzZ6Q2RnTy9yNy8wTFZKbmlxUmU4M1l3MzcvQlRkSi9vUCtVSjFjbnZRT0dJeTdMeWFOTnhhTklvZE1MSjNCdjk3V2l4VHI1UEZiQmlQQ3lkTWhIdmxaajlLbnJ0UGVpamkrVUd0VjA5czJxRXJ2dmhPSkVHOURHdHBTTlF1aEZRcG1ONUpoVFhMZEZSREVCbmMxTXVWMXZWdWNBZzdQb2RHa21MYVRzOTVVcjhLMDdoMy9KUXp1WWNNR29WOUdzSjN4WHRSVTh4SE4zTFVKa2xENm9Pc0RRMVZzMUNWUzIwN29iNmhvNkZ6b2FlK2duK1hFcEJQc3lBOXl0b0hYYTJqNHFoaVM3VE5ickptaDBPaDlYbWFPN0ZrMkZUUWVEUGVBdHY1WHlzVXNJMytSNVV4Qk4rQnJWQVVBblZ5enQ5V0YzeHZwaUE3bXdOV0ZKT2t3ZmlKMWxOMWtFZHQ1UnQ1Vy9rYUhpVkl6K0E3WlkzVkpRcWhscE5nT1hwOWVnOXR1dWp1c3dLQzh5c1FCWE9QTi93b3ZHTHF5RUt6UXZsaFhhRjh2MGJWQVZuR0lVbzFLSzI4SDRRYkJqT093OFo5eWM2ejJHSVhSUTM1bmFjaU1nTTRHR2N4Uk1SeWRtOG1qZjk0dnNPUG9Bb1hlVEg4Tm1GVGluM3VTbjBSUWVSREh0SFpJZ3NkSmk1SWw5OEszNldBZlFXUmxhUmpWRzcvV1dHSENjbnlUeTVVNTVCVjNkVC9paWZ3M3hscTFxcWptcWdZbFZuTlVDTlYrdFVxU3JWL1VDODI1WnRqYlRtV251dGZ3UmVEYlFMOUFpa0JQcERxZTRKWEtnd3NQeWJoeS9mWCtoLy92ZzZlczQzNVc1YUlscW9TUEM0Q1BrOGdOSmxra0NtaWkwOFQwemhmRkZQVDdUYWlEYmNuY3BVQThUNmhGaVBmcktOVE9KdW5FYkRSUHgvWnJNcXEyMjR0RlZmMFVOMUFIc3J3c3dUclRDZUtoNWJZYlNMU2JUR21zZGxjeFVyVDlNVmVZMEQ2bFA2bTdLNUdqOFVtMlVQWk1GQjFVNzNwV2k1aG5iSUxKNUN1OFdiUlBhekNvdVF4OTE1RzdqUWt4UDRYOUluS2JvamkxckpXelNMaG90TCtJcE9vSG4wRWFlckliU0VXbkEybGRMbnFJb1lQUXBVcmNKZmkweTFRTHpFK1NUVVZ1eXVOZGRqcVN2VGJPNHZWMXVQeFdVYVQ4WEtwcXZ5RC9DK1dPeVFTYXBNcC9KUVZNQVVta3RaL2d5YXBQdXFjendFN1Y5dnFxK3VnMjdaTWtGRjR6b05WT2tIcHUxQmRlOEhCOXJMSk55SlFPWWtJaTk2Z1JDcllTdkJDWVVNeWtTTjl3SEZpaWpmNmluMjBoQWR6cUFPa1RvZFNxVzMvYzlwbFQrRVJ2bTVGQWNlNVBqWm1IRUwzYWFsdElYbmhDYlRHS3FKeXJuS2licVRLTmFkL0RpeFFGd1dhU0x2Lzg4WDBhN1BFWFFmdGdQL3ROTmYwZ0oxa2RMb2RYK1IvdzJ5dXhFSXU0cmVwYTcwSFhiNUNDdThKUXVvUmFpNytNTHZKTWRndjljb3hkL3MxMktiaHZvaktKa08wS2FBcGtHQldKenhUajZIL1U2bURKSHFqNU1ab1V6RVlTbWk4QWFpTlI3OG1hK3kxQ3oxRXkxQ3plZUJONStnYnJiOW0vRmlpWTBqcVZaMTkwelBwMjIzblk4LzdZVHExSTQzcE1mNUVFTDh3KzcxZUNaeHJNMzZ2OTFPTEhvOHR1T0U3SzRUMEVKQWlMbEVqdHBaS1JJU0l1SUNaeTdWaVNYRzFtcGxyU0lrRG1qRkJjUUJMUWNmUU1KU0lGa1VMUW5EcStxWnNRZkJpblpOMWZ2V2UvWHExYXN5bkJ3NCsvYVZ1OS8rMXUxYnErKzkrODdOYjk2NHZuSnRlV2xoM25sN2RtYjZyY3R2MkVPRFh4L283K3Z0T1gvdXEyZS9jdWIwcVpQZGFldkVsNCsvM3BWNmpSNHp5WmVPSHVrME90cmJXZzhmT25pZ3BWbHZhbXpRa29sNFRJMUdGRm5DS0oybE9ZK3dMbzhwWGZUaXhXNk8wendROHZzSUhpTkF5dFhMTU9JSk1WSXZhWVBrOG45STJxR2tYWlBFT2hsQUE5MXBrcVdFL1dhRWtoS2VtM0FBL21DRXVvVHRDdmhOQVQ4UWNBUEFwZ2tLSk51Mk1rSVk5a2lXNWQ1ZjhiUGVDRXdYSkJNWm1sbEtkS2RSa0VnQ21BU0l0ZExWQUxjT1lnRklyZG0rUUVLeEJuQ0tkZENSTEd1bkk5d0RKcWV5K1VVMlB1RmtSd3pUZEx2VERHY0tkSUVoT3N5YUxDR0NNc0lNaTJhWUtzeVE2M3cxYUowRTZXMy9ma2xIQzU2bExkTEYvRldIeVhtWDIyaTJ3TzRJYS8zZVR0c2VDcE8zWkp5MS9WeEQ5ck50MXdsSGZYK05zSjlOT1B1NUp1OWRGK1lBWFNtVjgvd2NtTDRQUVJ5YkltQk51dXM2RE44Rms0U3ZoSzhxWE44U3pYS0tkNE93T0IybUsvNE5EN2FtdzJkbzhvNzVxS1BEM2l6L0NYVmtpVC90VUpNTkdkVE5qM1FHQjVFL2VlZHh1MDNhNnpuZDZVQnZEZ01iTkRaVkFLMWhQN0JVNHdsSWlITm9iTElXV2N3OW9xT1FFSXdVQ0hqaVVGaFREKytXZXBCZjZBRXgrRndNV213UmR1UTZpMmM4WCsvamRLN1BJaW1kRXY4ekJCbEFkLzlhVDhsWEtOR1UvaG5pSU0rVFdxb0J2d296eTJJblR2QVVVVE93cCtEam9NRFBkYWZmTDBtVXJ1b0VCZ2dmR29mWTV0MitVeEIrMCtRYnZGNnkwUUlnckRqaGhEaEJDOFlqWkoreVhDWjVuTE5kNVJ5YTRaeGlsVk5UOXloazhnYkNVR1lPc1ZoWHJUWHBodzlrVi9vWVB2d0Y3S1dRUHpaRnh5Ym1ISkwxdlVwc3g2YnJzSkRmVStOVklIWWc0OGlHVklFa1F4WmNTTXFyTldHT09CcFRVdENpSXFrWFMyb01zbEpRTU1reDNic1k5bTdDTlA5UHBWTDVLZGNTdzU1YXhVM1daOVhqL1hWNG5YdWFMNFBEY0xtT1RjLzVmcUtPQjZrV0doeXRESkR4YU5veFNZYWhHVGlaS1dpbDhuWVAvN2tHc3lGa0dTNEErUmVTS21pZG9GR0JYZmg0ZG5hbmMxRG9mRDlIU2M3My9IeXBYRnlnUktmK3B2U3g5TEcvbXZXcWlWTXFiNjBiTEhmZmhWaXQ0TDd1Tk9VYzMxOE1rSndDTTdZUllBR2N6Nnk3N0MzTHBXekJvaVoxbG1BdFFSL1N6R2t2QTVDRWhnT0s3MDBFTnI0M05lZHM2Z2lSZTlQT0l3bExHVy9ZRFY0RG5yTkpFTElGVmVKVVR1UUk0UWdhd3hDYVIxSk15QnViTmtKRndWVUVRZUNGRWthQ0ZxdlNNQ3FVcEpDbWg0YTZoQ0VibnBXRmtoSnk3S3EwQXJSWVNDdUcwc2NyMGpIZzZKeXpoZURHUVlJWmZnRWcwNDZkT0cvMzJmMzJvRFFrUVVRNDZSRlF0a0MySDZQSGczZ0lHd0hNT1NuSUpWd00rbTFqVTh3MFdaRXNnaVNuRldzMDhKeUw3WnNJN0lVTG45bGJ3Y3ljODNnUXdmeWlCNGxoL3ZGS0MwN3NQME9pTVBFOGY5dHlOTWtmbTRJTTVNeEVqNUhZeHlaY2tXSEt2a0cvYS9MVnNWbDZ4d1FpWlFTcU5RZ0Y2RUtuNi9zRS9paEVwVERyaEQxbjRYUW56T1N5NGtKVjF1aUVuTmhETlZBVmVmVzRrOWVRbXJYdlY2M2RCbXNjOEt2bVdPRy9XZ1B2R2I3Q2U5R0UrOEhYRUEzdHd5MGRHdld2K25PUWp5WTd3ZzFYL0FDMHNkTVZNNEFuUHhHZVlIRTVGZUJOc016UEV1RkZEc29rdlJSSWx5MHhZakg2bDJoMkVTVDREeTdkYzdCWkpsbDB1UlRsaDRZbi92OFV3dnVFK0VVaUp2ZjEvaXFHSzFoNGZIMTJyUjVkcWFFNS9vTTNTdXBrV0NaZ0xlTEltdXlHd1c2NlZrMGt6OWZzdzludTR3ZThUeWhmNEQ4UHJwMExyRmpJZzR0dzM0d1dLQkF1QVlFNEMyRUUrVVh0ODVkVElROXFQTW9WUyt4ZHEyNUtxQWtZU2hSTXhKZkRpdVBFYzRrSE5RUlBRTEFOd2lJd2ttVjRQdEU4cnh2ajRYckdvZmpEa1BlblFCZnhiVE9ZQ3ZWc09iOUVlWEZsUE4vRDZITWZGZkFPVFRrTUdiNVBJWWZBeFZRT2hHSDZMaGJ0R3VVRHRGV0w1cGY0eTI2WlAreVd3aWNIdUN1aXcyY3pzdFIwUVVSS2lWaEM0T0NnTGZDdTRQTjM0N3huUVNTYS9SYWY5UHB3NE9laFZpbGRoVmtQNmhyUlNZNklyYzRiZ0VFUVJqbm13a1NoWUR6RkJVRmZ0QzcyamhYTXE2azlpbWp2V2FGd1RNd3FIaEZzdkNxaWlnYkFMWXRKclQzQTVJdkhrM1BpWG9DTjRzR0xwRVlodkRaa2xjRzE0UlJOVjY2TlVIK1VxeHJWRFF2VmdPSldMd0RJOXlDRjc0M3ZyNFJYV2N2WTVCVURBdHN0aWh5S3dCK1NrWXFHTnlTOEUxVkwwa1A3QUlvb096SktxTW9PUnUyeGFHUkhraitFZnduaitDRStpZG9zL1I4RHJ3WXU2ODhIM253MWdJWUExbDlDZCthMDJXdzJwNkREVUdSZkVubjdwUjFCLzBSRTJZWVNXSDRGdHR6SUZsaHFsSHgyMTNMZU9JSncrUVhTa0ladE5Jc1M1WmMxT0w2UEh0a0hLMVY0WXpZVzA3UVNCNkpLQlZDQjhsRkY1WE9VUkVraEZrMG1QNnJvUHE4U0phMUt4SHZFYUNLWkRPYzVYQUdRVmdHUzBZcUpSS0lDUktwQXZMSHFScFdpaHBSZnp1TEdKbDJha1VybHYyOVVnQmNiRFExUkRqeTNYVTJMenNRMTNrZEVmMG8vclYrTHJjUTkvWjc4UVA5MTVGZlJiZjJwbm94RlhEd3JqZXNyU2FZLzA1NDFQR3VNSzVyU29EVEs4TjlSUkZHMGhzWllWRlUxZ0dOUlRZVWRCVE4yazZaSk00aW8ya0ZnU2JMTWFZYzRUU2FLZGhDMDRrY2prZGpScUJ3dFNhdDJITVcwdjlod1NVdGJPSWt3VHRvdEdrRkxxanc1cm55aWZLcklEeFNzbERDMmsrUGF0dnFwSmovUXNNWnh2VW45UkpWK3FCWlZTZjFSMCs5K0Q1bnhmUDVXTy95Z3RlM3F1eDN0K3U0dWFoc2E2TmdkMmhuUWQ2R3RSVTVhMWcvMEoyc24yOFNJbTF0NmU1dDdlOWYwSjA4YW56eFppNFRqbWRONGpDV254dGhSZUZiQmhXRkRIZGxRbXVTWXVsVitpbEQ1UlE5OExyNTlhOTc2Z3M4SVl0R1NmTWJXYnNaaUNDc3hXQ2lXd0orelEwTmc5cFIxK294TDhWbE1aVk0rWU1wZHIwZFZXVHI3VzhuNTR5OWUvZlRuZjhCL2U1Zzcxbmsyc3ZWNURuLzRyeEZwRHY5NDh6c2ZyTU5adWxUK3M5S3BES0xqNkx4OGpPZXluWTQzeFA5TmQvbkhObkdlY2Z4OTcyZDg1enZmT2ZiZHhibmdFQnduc1NrSnNaTmdadWJMV2lnTThYT0xxNnAxRzlZeWZwUVd3dFlPdEdvRklTanRLbzEvbUtaTld0aXFWUzJiUkZZeWtwSkt6U1EwYVZNbjBGUW1EWlVSYWRDeWRaUm9pcUx4STNqUDg4YVhtTElxeWQzeitpNnYzM3UvbitmN1BKZXEwMktwTmkyVnltbmQwWjc2NWFrMXFaSldTdTNVZHFUNk8xN1hqclQ5MVBwWjdCMHQyanBhdmo2c3FsSmZDd1JlSFVadjFaMXNQVk0zMW5xdTduenJYNktYVzJzZXNlZ0M1TVJFTnNMaGVVNjZSc3NUM2dhTTRuYmNTUzlPWlhOQ2J2RWFZZlhpWXMzajZXL1g3RWkvRkh3MStNZmdMZTFXMnV6SjZsUXcyaE5adTNOaHhIbTZiWGNiMSthMjZ3WDlSL3FnWHRiRlFmMlVmbFBuOVRFL1lVYUtlakFVNHZyMDBmSy9oZzJEQlZOZXhEQ2tQajJJOE9wU0tBVEhwS1l4MkhXSHdmNjdvcTY3dkQzS25UenRMR1pKNCtsRlo3R2lmSzNQT1I1eFhabk1QUXRaMmFKMHVyemF0c1hZUW5xTjh2VHNGME11a3FwRUoyQUdHdEZnSHJWSUpFMERtcHNYSmtiTC8yYUx3c0JUOGRPRWdGVEQrQ3BzS0F1bTJNNUM4TEduNHJJVGJNRXd2anVNWDU4WTVaN3c5QmFQSkkxa1k3SWplU29wNXFCcEh0WjFyaTg1V3Y3cmJEQUd0c0MrL25ReHVSU3ZlOXFDUmRtTzNIaU9PNUdqT1J1K1pnUW50MmROeUFzVTdXYW5xYjJtc2l2dHdZb1h0T3V6bTJFVzJ4TWZTT2NsTGk0VkpFNktWSHhGaWxUK1Fhck1zNlFvNmJqOVVoQWZUbkx3NGFRZ1Boa2VwVDVKUncwa0E1OUVXcnJNbUo1SHZUUndBNDVUY0RCS0EybThVTG94NVYvTXorRHgyalZTZ0R4TUYyN0E4Q3BMZ1BsL0hvQXhwaUxrbzUxYjJrRllYbEZNTHpKUVAwTDRkRG9ZMU50RytZZEdkb0hXTFFyZnlXSmVkV3piall6eTdlL3VBcG1kUXJxelBWTklGMHlZUEdkbVlFYklzV1pKV3RTVTdNcDJkL2V3bjY1c1MzSlJreVMzZkpYTGRGcVdiVVdqRWN0ZWxPUWxXZWNnekhUaVRYeisyZmQybm5yLzBlK3M3bnJ1MGphYVdYbjBsZjBOUTg0TEYxNDdlbktqRWJDYjNuZnRiNTNiL1dUbjh6dTIvekxaY0todjFhOFByeis0UHFKcnNVU3o4c0pES3g0ZmNBWit1TmJiOHZVbCt5YnZIRjZ4akY1dWRZM1dkZTJyKzUvWXNPSjdVSlBJcXZKMS9nclVKSk0wY0xVc2oxOVdPRUZyMXJMYUk1cllGZWx5SCtPK3FXeU9mTVBkeGowcmJnMDhFK2wzeCtNZmlSZHJMOWRkcTcwV3VXbC9WbmV0WVNKZWpsdnhlRHFXdC9LeHRiRTk4V054ZVFtWDBKWll5N2t1YlMyM1Vsc1ZXZU0rcGhTMWJkbzE2VlByTnAzU0RScmxkZFVJUWVlc3lpWlJvcEFTVHE4Q0tjQzRneFJ3NW11ZGs2RmtyUHdmdjFLUlpqTUVtVE4vYXdodzlUTW41Ti9uSllxaFpzTzRZRkxEOU14Kzg0QXB4RDFFS2U0aFhHWVlNOGxrZVluSW1SS1NienJzR3RRc3VCV0FNM1hFSE1hZnMrd3gvUnBtanZtck8xTTB2eHYyd1EvNzRJZG53VDlURENka3d5K01CcnZMKzByeEF5Z2JWK1N5TE1UbGdyeEI1dVVGdUM2WjRTNHZ3QlhJREhlWldZNGN3NitXNnhaa056cHA2RHA4Wk5QcGRZajhUTG82Q2FEQ3dObVlTZWV2QXJtQWV4Ny9URVFib1FhZ0FlZmY4bEVBMWxPQVhxcnJSRkhyWVRpOFM1VkRCQWdHZWpQaFhBR0x3OEl1QkJmSURYY0RxRGJ3VEJtZFhWbmtsMSsyOWR3ckYxL2MrZEdoL2grM241NXAvTTJMTC8zcTdlL3YrOFdSbjc5eDU4MUJ5cisrcVpmVGI2L2l3aC8rNmZkL3VQVGhPU1J1TFZTT0JWQTVva0NjeFlpejQ4U05RbVV1aWFWQW43cVZmMDdjSGRpcTFrVFIwOWhXUStCdHhxakJ4V05MK0cvaTdjaDBURmdhWGw2MzFPME5yNHYxdXB2Q1Q5WnRkcmVFbjQ5dGNmZEorNkxUM0xSakVJdUdOTnZlYVBWYmV5emVja1BIakJNR1p4aEN2YXZJNUN4M0V0cWZjV2FvRkMyT1NXMVFTby9YdW9KcUEyR1RjMVRaUGxVcy9xOXZqcmFuZ2RFT28ySWFNb0xyMDdCMG9HSWFUaHBvU1dXSE5LckY0akE2M1p6TTRua0V6VFJPNDlhWWIvTm5pbGJHOERzNlE2LzRvekhMbFZkYk5CS3lsMGhsZlY1OHpCQVF2Q0ZkbEJ1ckVISVpRanBEeUdYd1dBd2tRS2luQ2lIZ0piME84YmtLbndGTzB3UDRHWU1LeUprQjY3dGF1QUV1V2NyUERPUlpuNElRMFJMelJqcXd0OTVySUdRajJVTU9rR05FN0tnRTQrUUNrZUJsd3JDUU1XMlhRYUN6NDJwNVF4RnFHV2FDcXRRenYxU1lYeGJTNGR6VFQ1WGEwMmFtdlRRQTBGRWI3WktZQnNsMEVqTWlMN1FRT2Jvd3lVeVRmK3JzNHMvZisrZTltelR5OFVXcTA3dlhsWGNQUC9QR3pDVnVVM0JaOGJXWDM2RkYrODFoR3FjOERkTFdlMysvZDh0b1BIVjJPejErNU9IdGJ5R0JSd21oZWZBODZQazVCUWs4emZtZEwrOEg4NzB3QkwxMWxWYjVibFdwbm8vRnFsandZK2l4MVlwR3ZCOUlmaUJETURmcFRGWE5uNmxxK21lcW12NFozd2pCbTJlTmh2Y0R5UTlrQ0twVzZsc2pxWXJGcWxpWWF6QjZpb0Z1WkdkRDRGamdSR0FvTUI2NEVwZ015Q1FRRCt3SkhBZ01WajZhQ0pRRFNqeEFDWlVGamc5SS9GaDV2REpEcXNqL2dCSkpsQVJGa3B0Rklnd0tKNFFoWVZ5WUVLUnhZVkxnaU5Bb1hJQ1JJS0IvWXNKQmNOdXowWEVGMXNFSUNpNUJpQ0N5d216dnhZSjdMS1VndU9zcENMS3d2dWJSamZnQ051OTRlL1A0RW9ZK2w1N3RwZUVQS2QwNzhPVnQ4WWlnaUJMeEtOcGQ3TStGQWxCWDI1V0o4bUJ3UjRlSGg0WFB6cCsvRXhXU2R5NFJTZzRCTHozSUN6MzRJQzI5MnBlejhRVUc1bTc5UDRwL1FkbXFXUi9RY2FRb01ybEU5Sk9lWlZsMnpuYk5uanVXenA2Ym10blphNDdhMlpBWUZ3ZkZLNkt3QVE2VEloOFg5NGdIeExJb3dOTXJITjlNU1dVbVBIdlJURmQya05CeE1nbXBRaG9obHlmZ1pkYVhqYUJzRFNnYlliSVJKaHRoc3BFYTFJejRta0ZRWmpaSTVzUWo2NFg3eFVQMXNEbEQvVkF5SEQyZzFXbWlNSjFRcEF3SWRHZ1lYMGhBRlBJcUlmd25VRXNzK2dtckpMVWlMOVZ5Ynh1anhqLzRUMnNuK2VsYUNjaVo5SnBVTGJ2Zm9EOHhMamdUVHRrUkdtc2llc1FLdTZKTUpVdFRORDJvMzlkTzZGVm1yL3V0aGVjVzlZVGo0UzQ0ckkxUVd6RldJN2diS2pia0pycXV5dlpGYldKM1lIUEIyZ2lWdlVIQStCYTI3UkFwMkpURGVOcGpyemFxbCtuT2xsVUt2K3A2QjNXSVpidXpRODZrdysxeFRqaER6cmdqT1BCcUZyWDhUc1B5YTRUbDF3S0xLVGs5Ykpxek9zMExaajhnbU1BRXcyc21Mb1J3VEI2aG90dTRGNGJsVE1JT3p3R3czamFtUzFVSnhScnEvRlNlOWRxbCt6TU42MGZlQUUzemhjSU5NMGV4YUR5ODM3TWtNNkRVS0xMQ1MwWVN1cTE2R2xMQzlaU2thVHFkT2dqaUU4Q2gzZ3RvaXFWUWlmOGYyOVVDMjlSMWh2OXpuNzdYMTc3SFRoemJjUUxPaXdDQkFBbVBPVW9iOHlydjhseEtJTjRvQlFvazZkaEMyNmt0SFF5SzJZQ09kbElLVmNjZ1JldEVrU0NRbGxEUkxaTjRiRHdtcWlwRGFrVXBLa0diS0J1cnNrcUQyZDcvSDl2QnNDWDYvUC9uM0hQUDYvL09mNytqZW52a3NjZGIxYlNtYnNpRzN6Y3hvNWc5Wlo3eHcraUQ0UFBFTzUrL3R1TGdBbTUyajJ5WjJmNmVNdXl0bzlNM3pLdlpsR2lYdGovWE52bk5TNG5UU09acHFEd3FrUzB1Q0xJVThlVkRYNEFXbkVlM1VYSnN1bzJ1Smk4b0huaDFNMmpOMEdZNkdyVW14N1BhT29kalBLL3oxaFZNQ0V6bmM3eHpDcVlIbXRWbVl4R1BlV01GaXdKdGFwdXhpcmQ1MndwV0JWNWtQa05UWGN2bEplb1NjN25WS3E5V1Y1dXRsdWt2VW5SUGtkT1pqM1I3UUxIOEhQV2FuNlZobERmbWw0ZUVVZzBKdXVtWUZkTktWUmNhVmVlWjJydml3aWNjOFpFbmg0SXFIUEh4RitLbXZHTDhXSjJCenZVd0NvakJDOTZIamZxNDZ5RVdvalpPa2lYb3U3TWtjMmU1NWM3YzR5YmpHUURMalpNQXI3aVVXb0pVUllKVVFtK0F1S0dCSlhKQmdhQlZGSWNlQ2cwWUFpdlRMMlQ3QlNzamsyRmNJVWtUa1JwaUR6RUpoVW5zMjZwWTdHRitrYks5Z3ltRDVPelU1cVZSWTdHNjJGaXByalFVRm1zQ2tUZTZuSjYwcW5VcWZpRTNsSXpjb0dUUEp5R1B3SmN2bEVaZWpxYWRkdWhuWno5bkJTL2Yzbms5ZWVmVThmajI0eWRlaXgrWDhsamw2eThrYnlRdTMvNHBHOEpjbHk1ZSt1VHN4UXU0cEhoeW5WS0NyUExDRU5ZbnN0QkdpNC9tai9FNVhHa0lId3RMUThNanJMTGlHbDlOOFpUaURlRTlZVWVkdnk0MDJ6ODcxT1JZYmpYN20wUHJIUzNXT3Q3bWJ3bjFoai9OdnhhNFZ2anBrSnY1TjRkOEdVNkZDOHFVS2w3bG02RFU4U2VVMlh3WjczZmVMazV5cDhlTmNyWklvL3hWNUhhQ08vZ1FvWUk1aEFvT0VxcW9NVmgreFdUY2pKb3J6TTJtRWhhMENndUttVDJwVzFFbmtjc01aTXIzdWltMEpxbGFpaXM2QTRKV0pwMFNtd0pyYm1SNXRWTHRnOHRQTmlWbGJrSFJZS08zQXFDWHNUM3NBRHZHN2pKbEtHdGc4MUdaMFNkQmZFWVlwK0VZcDdHWVlEUVROeDlHbVl3NEpKb1cwTURNb2tHWmwvakZna05uVEFxd1hDa3JsTUE4VG5scDRDWlBQS2hOMHdYNVFza29jd3ZDdG5nTjZnYTN4MDBxOVdTcjI0a3BSeXZxa1VjZmI5V3lLYWNxSW9RQkpSMlJkWHo1RWwySEtqMXlEbUhpaCtyZVhMdmp5dnJucjcrODdCZlZudCs4OE9QMzM5dlkzcFZjcDM3ODg0VUxkNlgydnB1OHYzTnVYZUsrZk9qeW1ZdDlGeTljeGJ4YW52cEdHcW51QXo5N2pqZ3pPUXhXS2prWU0yZU83OGp4OVJ4ZnkvRk4vSDZYRFJ0djBCa3VSMmR6RUZXYTVUS1pEQVhjcUxKTlpJbnN0SGtwbERMWC93bVhtUTVYS1liTFlpbmRNZDJZdmtMZm9HL1c5K2dLWUxvNG9CL1RlL1VydXFZVEcraXpvcWZaSUp4dnVpbVFPa2tFa1pmSUViZVE5RGNvbllpSVhPaHBtWHlVVHJqNlI5SjZDTENKWFdzZUVRVVl3RHZwTHd5L09WQXZickdKZWdxZXA3YVcvNG1VUWxZY2RNa1l2NXB1dXNnQ09sR2psWmt1bDhkdEdpS1Vwa2FocksycEdaTTUrQlgrOUlYV1V6YWgxak1KSTF2bXlhZnJoY1FMNTlhdmJCMjFiZHVKRHo3SXF4bys1T0N2K2VPck82Vm5kakc5TmJsN1YrS1g4MFlWa3Vhd1VYUDhVeGtHWEtxaXlKMEdWL2JncGU5dHZ4TVJNUjVVeWxoNWlpcTdKR25xa3FWUm44MmNtaUlabXFTNVRERHRBRzJqUFlZbzJ0RGc4U00vUXlkdEw3TkxneEd0Si9WRmRFRXdzc3p1VURvYys5eHYyNzFxcjlhclg3UU5PMW9RS1pUekRKK3JrRTlnZGM0dDdIV25ZNHozS2FWSmIzSXVkYi9GOXBwN25TZWxIdXVQemd2dVMvd3p1Yy80eFBVNTd6ZTkzaTVOek1OcGdkZGpCMXdZSUkyT3RKczhXd1BKQmFZcGFmVDFyaWNwWFpWVzFhSG9HazJUZFlkaE1FMHpWRVZHUXRrY2t6MnpiUmZIM1Rja2wxTzJ1S25aa20zeWMzRE9rSGdGR1BrQWhpeTV6cm1ZcThLUzh5MUxOZzFEbGlVTkQ3NWxnVG5meTd5elhLOWFwYWI5dEdhOEdqVjdXT2hrVkZ1Z2JjYnoyQ05OamJyRDhxdFM2WHpjK2xtZVY4NFFVV0lEZHdxRGlWaWlNSENIOS9PQk83ZGlPRm1PLytuZnVGcGRGWXR2T2hPdkRsVEZOdkV6UU5PMzdiampUTnpOejZSLzBlaHVYbC92cUc5Q051RUhwTnNkS0k0NGFiK2R4UkdyMUIrUkVWUStYaExoZEs1TVg0U1Zsa1NNYUZFa3k5TW1JVmx3ZjJKTmdvdFJTMndmQnBXQ1M0b1ZBNHBqazNCaHJOWmY0Sjg0YVJKNlpYSWxzOW0yNUw0YjcxWVhqYW80Y1RYNUJ0dDU3Yk82NU4razRTejU3eGxqcDlUZVQxcUpQN1BaVGNrWWNRNUFCM0NjdFc1OTM2Ny9seVBrQVByci9LcHlKTm0vYkx2NTliMmppV2M1T0JaaTBjRDI5QVpDZnp6NUpFemxjTy9vdlpkNHVwK2NQMCtIbHFtU0lvTTRKbDJGN3ludDRFUE0wb3ZoUmJVUmxySTRMSk1Pd3lzRXVSaWl5aEg0RWJZOWpPWEphRCtpZDdIOWR4SFhFZldJUmtSaHBtNGU0bW5FWWlwajIxUDBMdmF4Z2ZvUnRoMldPWWJDRDlUR1ZBTEg2MURQd3hyRWZ2UTdsYS9ndDFvRTJyQjhDTi83dlFJd2lkcmdPeDNhWWRpTDllL2c4MmV3YmovYXBWZytpSDR6dmpjMjR4djZiZ2lTUldoWVB3TDcyWmxaYjZYOEI1aW90S2R1NEZxYXNNL1ppTzA0eGdLMFR5RG1ZSnM4dEZNUWNYWWVkckR6cVU1OGpoYTI0dmh4cWtkTXk5aVoyTTlyK0x3QjN5dkg4bGIwQzNFZUdsb2JVWUlZTGgyQmlKUVBwOUdPd2ZVL2xWNDM0anlzcFRVUHJnbm5uNW5UL3lJOXh6bTV3REUvUnBSSmtWUS9XaU5uYm85aTZ5T1lKZGZDWnJRdGlCQmlvWFFaMnBTNXdIQy85cW45SUJPUWQ3UlBYeUFlVTFiQmsxaG1PTS9GYWplOFRXWEVQSUgyVkVKNUJ3N0lBL0FkZlBhUzFvSHJXSVg3UFE3eExZeVJ2b2JSV2dYOEJQazFEZnZmZ3RpUGZmNVY4R0VWTE1IeHE5SFdLdjJDUTlzUnUzQ3NmMlQzaWZZR3kxc3dyb3R3clAvUWVjRDNGeU5tWUZ3MkkxcHBQamorR05wemlqdHJURWF3N1UxczAwekFlcjhBcnAwNFNlL1ErOWhYUllhSG5ROHNkR0tiM2Jpdlg2SlZFRDZhUXhhQ1p4bmdzM1BZVHhDaElZb1IxWWgrUkNlaUJWR0htSU1Zam1NRGppc0x2aUpuaUp1Q0g4Z045VHp1SWM1TmNEYTlodjBpbnVremN6RFRGNDFUb2gyQmxneEtxRTg2TDhSWm5FdFh0bTg2VThTWnJCWDhiaEc4L3p1dGt6ZzFhUEhzS2JkaEJzMUJuRUhrVnRiU3VjTTUwM25vUU1tL1E5Z2pzSlU0Uy9QTFd0b1g0cHJZRXp3VEdWdWZzOWF4NG95Z2xRSEtNbHpmbXJYWnZSaTBhK0VROXJsQ1c0azU1UURNVkRiQ1RQa05XS25jaFdueUNLaFd4MklkcmdmYkhwTnV3eUpITDlSaUxPZGplZDhqZGk5QjcyUHIxVjVjNS91NG4zM3dLOXpUSHlwOVVxblN4MVQxdjl5WGZYQlZ4UlhBejd2M3ZnOUFKZ2trRGdRUldpS2ZBaElIL0N5SkVTSUVpeUltb1pFUkxDbHRDYWpWeW1qSFFpeENJaCtPRmFFVUxRVUdnU1k0WUFHRmxLbTA0eGRZWU9vVTFFbzdMZERPSUoxMlNzRU9qWG0zdjdQdjN1U3hJWVNnL2FkdjVqZm43bm03ZDgvZFBYdk8yWHIvWkZRaSs2TDF6anp6M0VyYVJQYW0vbE9wcFAvWFVmM2w0QnlKMWhNejYvMVBvb2Q5bis5NVhzOUUvRlRrT3VnYlN2US9oMm9ZbkJnU1daV29pdXlLbDBwbVRPUU1QT1FWeXMzUlFybkIyOHYrNUJEbk9Rdm9TNk4vbGpmY1plejFZZitqU0xWVU83d2puaU1QT0N1SmFjemxISkVGaXI0ZitYQ2FINTNuYzdZdmhUTDBWMXRxekE5OHFnOHl4dms3R0hBaTRGTTRpeDlOd0NkN2FtN1ErR3p5QXpFYUZnWCtPcXZaUC9mSnk4Z2xvWDlhZmpyTDhzOHJiTCswcGNrdHhQZnduRExYTStIM2EzelVHS2N4VXVPY3hwbXd2eTNUeGk5MjZ2QmpqY01IcENJNDExOE9LTUhHWThIWkp3NnozK1crSHl2Mk44VjIrSnZkYnY3bVdEN1BIMExVMzhSYVBONmNVNmY0eVNDZkRncHphVW92WGNJOEdyMWU1Z1R4YklPSk42ZmxCWk5IeTR4OW5XSmJaWDYwa1gwbkJocDcxd1pua1BYRTdpcHZPbXUrV3BieUhUM2RHczRqZXBpcWEyTDJRcVNINWdYTmllNEsxbGx6MFRKWjRINU12YUJqcjVjc2t5OEtwQnpiOXhrZE9WV2w2cUxsc2o1MlN2SzlVbUx0WHFuVXZkTHZVSHQwN3hPUFNkZEVEbkhpc0l6d2ZrYWZIT2xNdjdWbURRcGxrL0VMSFZzbG9tc1JueUZ4ZkhZaWZmUjk2OHlZUXVrV3JNY0dzeFptUExXSStyQ3VCZStNNWNnOXBwNDRKVCtObGtvNVoyaGR2RnJXeFVvNWN6bXltWGU4ekxnU3RZVnh1U1pmcjVEN09GKzF4S1phWW80WS82L3dHOTE2dnVkeDRqcTQxYXhSdmZTSVZyT0dWZWJieDNpcEdGdWo1OGV0ay83cUk3RVZ4R0d0SjFiSVltK0lqSTFWeVRKMHk2TEVTZVpkZ3U1cHp1OFF6dTR6ak84VHhHMWg3bWZRNjlnQ3JXVzBSdER6RWkrVTdyRnFVd2VJc1VIckZPWjNUOG82dDBScThlUGJFaXRZaDRVeVZDN3A1MjlKeVFnRnBuL1F6WlR2STI5d3JwZjNtYUVMejVwRGQzdFB5YmU5TXNsM1IzQjJzMlNvOTF2TzZqbDUwYzJRYWQ1K2VkSGJKVXUxN1hXWGdlNDJ2bjhIdGFYcUQ4bmRxbmZlcDcxS0tyeGJHVjhyRDNyVDVGSDNWWHp2ZDlMWm04bGVNeTc2TEg2U3gvalR2RGNnY2x3cTNETE8xaUtlejVFSDZXZm0yT0dQVjd4eE10U01TOFBZR21MWjdFemdxMHJZVSt6VjUvUHN4ZFptTzBNYkwyQ2YrVTU5TCtPMGovZWkzTW82SFlWclVqSTV5VmttOWJEVytiM2M3bjVWbm9oczlodFk1R0tMY2VsdGIyVGtTUmptalpUWDRTbWVyMFgrRXJhbTJ0UnVJK1ZqV01pNzl5SzM2NzFBY1lwa2xFcDBhMkFWdkJmK2w0N09jeUY5T3RGZWZzTjU3WjNrR29pYzhSc1V1ei9yUElyNVJubGY4UnNVZkxGRWljMlg3UGhjeVhZSG9MK2FjVlk3Mm92enRGUHlYUEgvM1o1TkY0UGZpTFIxTEV6L3huQS9rRmRlQWtmVFpGK1ZRVzY0Yk5zdUYvWTNDNjR6Ni90M3lVbjVrSFNQSFBFL1FKWkZqa2lXK3hnK0NMU0gwZTRlcm1lNFQraVhHNzIxZjA2Um45UTF0L1YyMjk3WDl0ck9kcG1XVHVnSHpmN3d2SXhXdkFMNmc5MU83SlBSU3V3dC9udXJkZHZiMUE0Vk10aGRyVGJoZ3dOYXQyTjN5UURGeWNQV1hCM0RtWVBtOWlGaUJHaGZNNzZyM0tIbzJWV2NIZHpYb1BuL2tUSldhVmxYR2FYcjZxNU8vUi91VDdndjl2NWczd2p2b055R0hJQzhHVGtaV1JMSzlETnJuMXRiRjhhU0MvV3h6c2FJdHQ3NS93Um5aeis4QTIvL3IrZUtDTDRLbVJBN1NoMVNRQjE1bVBya1Bsa2cwa1FzK1d3NGJDUU8zWXY4QUIzWk96a0l1dktjaGU2YnlKK0lOSjdsK1JIMGgxUDRqdGRMMWdaMVpVOTByd1ZqRThIN0pxZkdONzRyOHA4enNEVTF2ckVPWnZIOFR5Q2ZOLzRCK1N2a0t2cC93cmlua2I5Ty9kODBqZlpjMkVQN0ZPM1pNSVhuNTVBNXlHdWhPM1JqL0VwRjY1Rlc5OUF2WEY3NC9uR3BrcHBsQm5iMlFUWWduN1R2RUpjc3cvMXNSOXAzalhELzI1UFI0QzdSV3FiV2dUdlRNZXErYmVsM240dmRjVUxKZmliVDhVcjlKbXJLSzdTTzFscFc2MmRUUHdiUzNOOU1IY3U4SXRtaHhKNU9XcjlxN2F6MUsxTGZYeE9MR250S3NXdTZzU3ZJRytteE5YSkcxa0FtOUFwa0ZYM09PUVA4ZzhTZURQejdMSGVqRFFwdGZFektVdmlIeUYwWjVMbzNpTHRua1FkbzkwYWVEWE5hR0Z0YnhkaDJjdG9YM2U1b2pyeU1uSm9mTU0yaUxYM0lqUUhqRlRzWGQ1VDJjdmRsNS9JMmNuUjZudjY4N1REUGgzUWFMZmxLdk5CdlVPeTZ0RlVkMEU2N3ZUcTNvMjI3N3VodzI2cEx3clpOcS85dDN3dnJtVnpKYmNZNmR4MUY3eGJlenBiYVA3VEJQc2ZONXkxb3MwWmoweUVPREF4eTZIcjRGekdqTjVDai9PZHB6MHQ4SnZtSlZ5U2ZkaTJRRi8wQ3FOVC9rS01peTBTY1QvMG0yaitnbmVrZE1IMm5CRlMyNTgrMjMycDlidXBEMXN6RXdlZlVmaGtPdDBBM2VCWG1oSHV0ZDBqbS9wTkQxdFY3cmxmaG4vVU9nbFVEdGl0SHluZmdGZG9adERPSXhkbXhMT0oyb1d6aWVSR3lNN0l6OFgwU3pDU1czeDE5eDIrS2ZjLzBLZUcvWXUrN01vNDQvNkIzbUhjZTk5OGtwcy94a3BJUnYwSnF5SjBMeUtGOStIOGxZMnRwNXlCN3hQdktCdDZ6aS9GTE5BZkVUcE1IeThtSG5UUjNNRytacklFcSt0N2xuWllYM0M0eWh2ZmtlY2NsTzVEWFJSdmxBYzFYc1dHU3FUa1AzU0RrUUNPUFV4dFBsVEZRd1B0dTFWemoxdU1qZjJFcytjZkpsajN1Uk5uamJaRkhlTisyem5XeXB0TTdzaVpSS2NXSitiSXlWaWNyM1pka0FicVg0cy9LUzdFaFVxUHZDUE9xNXNUd21XSXFFdTl0Y3Y0YzJybUJMQXEvMmE0SmpIMVQ1VTd5OHZyMGVjTnhpV0p5NldtK243blYxdlpxRzNMOFlxamtPenprcC9aOHVrWk9uZitibEpSdkJUbCtiblBPTDVPcDJGbWdhMnJXZHFwTWN1ZHg3OU9jcnZOdlJCNlIrNzFGRUt5eGJVczRGK3ZTMUZZdEZOWW1QSmZET04xbkE3bGIvY3I0VW9yUzZFbXpYK04xejZKZE9jTVp1di8rYmwwZncrUDBkNlNuOXcvQWg5Uk9CZi9xQ2VYT1IvUmZ3eGw5a0xPQ0QzckxxWm5xNU9rQSt2b2J6YmpaWnR5WTJHUW93SzZaakt2elQ3UWdDMXZ3VDNpbHN0akFldW4rT2RuK2J1UWp6bnZNZFpOa21QVjdGSnVXeXIzZWRPb2hrVnpXVWIrN2h6Y1F2ZnJudmNEK3d4TzA4OHkzQjlLc1ZTSGpNbVM4K1VacUtuZVlDUDhsM0Z1MHZtTGRncjd4MTZVNFhvaS9kcEhpNkhiSmN4K2lmdGxMckx1S3ZTdGhYek5rZ1h0TXJ2WnVsQmx1bGxRcWtXTC9ZT1FVa2twZGNUNUIveEh5aDdScnBNTDVRTzVudmFwaE5pem11eHNOKzZrVmdQUHljTUEzRktjdThpWCsveU44TFhqdW5YcEdkNU84WmdqZlVTY2IwNkNmZnd3YW5SZVl1MGdxblYzTXNSWmJtTWZONVB4Wk1PYnJBUU9EZWU3d3lqbGo1M083RFdOVkRyZEJyL0lhbTBDZmE0TmVaWkVOK3FJTDJORld2N2JzYUV2ZjN3WjkveS9BanJiZTI4OEdmYitMMkRmQkJ2MkVEdGpSMWpybjJhRFB1NGdkRTIzUVQ3VHRJRDV4ajAyK3pkMTBDL0xESU4rZlJONkp4UHVTYi9MTS9jS2ZHYlEvRFByOUNGYkJqK0VNRkFVUTgveHA5S2xCL2cwMndxUVdrdnVRVjRuNWhmUDR5MkV3bEtYbTBySEpYNlRtTmdSekpyZW54amU5Z256WGFsOEpmMDNOWitiVzJOdUE3QWVyZysrckRlYmRsckk5dWJ5bGYvS3ExRGVhY2R0YThGMjRoL0Y5a0pOYlNPNU04Vi9XeXdhNGl1cUs0LyszbjNtaENSSUlUWmlhVUtHQXBJQUoxVllCbFVCRFNDT0VobENJVkxRRUJBU3BQT3UwVUJFVkRCUzBJc3BFQkFzVktDUlVPbE1HQzlMSnRBeFFiSXZZa25hcStERmpJU08weWhSMGtLL3QvOXg3OTdGNUNUeG45TTM4NXJ6ZHZmZnUyZnR4enY4RWUybGZKa2ZKQWVPWC9DOHc4eUhmL0lxTWRUa3U0Snl6aGpIamJvQzV1cHZmcUsyekFKVXE1cjdlSmxmOVVNWEQ5N0ZGeGJ1QXNXOG9TcndzNnBCMUtCWGRJREhjbmFiYUwzZnJtSnRBZlVLdG9QVENlM0NkZmNoM2oyR0tjejlHMmp1cGkwY3gzdklkem5PNFU4YVd1QzJhdzE2R08waVY1RERHVGNtRjMySE1yYy9jb2ZUTE5XelR6V21sdjgram1UWGJVbmNpWXV6ditRTjUvVFR6K2diODJGMkErUmx6ME95ZG9xOHRtTTU4VmVoTndjM3VZeWdQYTF0dkR1THVsNmdMak0xb3dGVC82N3pmaUo3T2NYd2xYazlkZHhoVm5MTnZodThPdFpiam94dnZ5NXJ0TWZ1UFhDZ2lsY3BuK2tzZDVqaEYxR1BVVENwZmY1OXpVcWY4R1NQNTA5a0t4MTRFdUI4eGQ0OUdQejlPN1RVSVMrTjVXTzk5d3Uvd3FGT0wwQ3Y1VHVvQXV4RjkvSHRSN05hamoxdkROU3FpYnY0MzUzazhNa1BMMk43c1Q0WHYxZ2JucWQwMk9ET1VYc3h4bXBDbnRBTnpWOUtHWXpTaXdWMkVGZHdUQTFOMVRhaWprcHJDVld0Y0U3NGorVDIwa2orVDMyOXNSRytvZWVmOUNpY1hSVzR1OXc1MVJ6dHJmUEp6c1lWdGw0ZDYxbTlHaFcvVGJzWjA3d2xVdTNkd1hycWkydCtMSEg4VThrU2YrYjdTZFhNa1I3dWZVb3RXb3cvWFpnUmhUUkhNSWp4L3dTUnp4aE5jdjMrU3lUeU1kNWw3Uk5ZODZNVDdOYVl2bndjLzBuV0dhc05ud2MvTS94R0dPdDFHK2w1ODI3U1hlSERKOEs1RzFTRTlvenBWNlZHdHJkdmFwSzVYKzZjc3JVM1JuMWV5Y29hNVI3b205WENvSjl2YlZiUXp3bXZxdkhkNVJwOWgzNTdFQzNWMHFtWGIxZFFvQzdWVjJsRHNKbU5ma3IwbVdpL1ZKblgxRmV5VjlHdEV4K3B6RmxxdHE1ZWsyTHVNN1JQcTYzUTJxYi9iMkNBdzE5bEp2WjdPVGtCYzZVNWovU2NaRDZsQlEydnVkNDVZcjEzOUZMVnFUV0FiSFN2NnZZTHp2c3haVHkxNkZXVGZDZDVqM0FOdG1TRFlLL0dEanZDWVNRUi9kbHVNenI4aTNzL1pqMlFVcGhLY0Z1anpvNXJnQmNOSnd5OEZPd1lJenNwVWd0TUtxZDA2d0Z2SDk1S01BUnIvb0VicC82dkFPWURQVEpxUm82d251ZkNxVUdVSS9rZUc1U0ZCSUlUekhzNWpPQy84dHVQODdobEpuOFAzbTNFLzd6cCszblg1b3I3N2FyNUg0Wms4UmtMckNSMzZ6ZlZSbk5aSWZHTGJyZ2FQOC9vcWFTS3ZHVllKUENzOWVHNC90cWR4UDVGb24zYjc0RW5XcG9LNWxyTW9lRlIyZnA0K0I2eVJUbWd3cWFQNThhZnAvZWYzMWZQa25zYzlSbnNkNDNka1NYd1hUT3pySGEvQ0JoVUxKcUJRWWd2enJwenpHNXcvWUhwYnpSZFVjOS9reTlsZ25uVFp2b3Y3SU1xc1B3Y3Z1Zk1aRTA0RmYzSWZvUllnZk5kaXcwSERlcTM5Z3UyMHQ2aDV2aG03YUxkR1lXMWJJRWdiblNlRFRVWnZpNDZkcDduVXF1OWY5aXVNdmZaWmZzZDU1SXR1Y0c1SHZ0SXZNMUZQOHUyVGZFNjl3RzlZYXQrRDRaSXo3SnVvcmFnL1JDK29zd0IwZGQ2aDFXUnhYcXJzTFpIelhZVEZUZzNuaVlnbVV1dTBuemxBMnU5WC9YdVl1TmhQM21YZnh6aitGZ3F0azJ6SForeTNWTVp3ZDJDKzZDS2JGWVU3bHZ0aUhOdU9DOTZ3RzJqTERXZkovZlIzQW1aYWl6SEFubzRTNnpEMVRpN3ZQMERtOG44ZWJXY3lpYXdsRDZGWTNUL1BmWEtPN1ludDhQb3Z0QzdxU0luMXFXR0ZScDdIU2xGbjdVUWROWEVkeDlQdFdsUWZqWWU2MkIvVnUrcnNVbzdIZGhZckpadUt3czQxL3owK1g4Sit6UlJ1SEM5MlVvK2xub1Z0NHBmYitBK2pMSE02eXV6SGFRZFJSd3dQZHNjK3dGQ25GbDI0cGxua1JxNzFJVk0vU04zME91RnNCUy95K2pYcnQ1Z2kyQitnUXJFbTJHMzNKY2E2djhaTWR4Z0d1QmVwRDQ1eUg3eUhvZTRuZU1HOURmMjhLdWF4YlppSHlNOUpCQmU0NzZxdGx1QlFiQXQ5aWVCTlJHNThIMFp4RFpFaGJZMjFtZ2h0ckVibEkzQlBJOFpxQzAxNlROWWR0amxyU3VmNkkvRTR6M0VaMGJGSWE2MXU3SnNwWjQvL3g2b2N1d25YY2lSTDExQ1hPRnVCbklkcXhvWk05aGxuenZBNDdxY05zcmVNRmhTTnVjMzZtOVMxOUtWSHNOdXFRb0hwZTZldVM0T0Y1RmxTd1hIWHNvNjVSWWlkQ1ZZTGtldmR3aGQ5N1R5S201d2J5VEQrSDliK211dFpZbWl6dHQ0enVGVndibU03b1JiOTdUWFNWNjkxdW10dkxQb0tWbSsrbzBjSDE0K3dybnVJdGFIMExVaC9iZTFBTDBIdHQ3N3RyL2xOM3hhUzM1M3VPb3Q3aTRUN0xibW5yL1Q5aVVBMGNobnpTclBYR0xUdytoV3lrdkYxbytBZ0NQaHNsOUZyeSt4T1BOc1BzZ1lkamQ0NmhqTTJKbERBK0ZYZ3JPRGVvKzdYNDZFclkxT3B4RWJHK1F1U0kweitxK2U0NTBXWDJubU0veExMcUJYTitGSW5sVXQvMGZtTWU2TWw5cm5mUUkzRVdvbXBLbWRRaTBxZHhuaFRKN0hGT29qQjFnVWRnMkl0Q2tnc3Nyc3dkcFRTeDFKbDFYK3J2NGtwcFloYmcva3RxelIyNStDZ2lrblpPbWJaNEhpL2szakcvS3ZqMWJWMkR4Mi9yQ002QmxudnNFM0lHWElDSlR3TGV6U3FOdHVxY3RNNUhTZFZMR1NjbHY5U3U1ajZxYk9jUWNhTDRlbjBrdEdXVFNuMjFkQ20wNFdtVDVQcDA3NTlMYXFkUTl3bjY3bDJrcE1QNEhwM0lqb2w2eTVnc015L2UxelZLK1Y4TGhya3NzNlhuQ2Q1VXEwVDE2aUdtdWdrWXFsMWdkT0NhbGxiOTNia1NPN2lQTzBuUnlKMmlrYmxhWm5IVnVxeVRPYmRTdlVPeGppT244dDllc2I0S2ZWSlB2ZnA4bVR0RjlaeVlhMEJESEZleEViN1htcWhHMUJ1OHYyZVNIMjdVWkI5NWg3RUpxblp4UExlWDltdVhPY05sVVAya2NQa0RmSWgrUWM1Q2x6OEY5ZDBvc3hMc2g3NkJXVE1YZTVSenRkK3hETXFrZS90MW5yRlhvUjVzWHJVQ3ZUdGVZSDNmNU9rRWZrTXZXVmtDQ2ttRThoSVl4bHpNVnJGK1FUbk80SEpkZzcxUVJYM1NSbUc4YnFZLzRjNUQxT3I5K1g5QkxYMFR6Q2V0c2JPNXp3a21Cc1RTbCtYeUQxbklkc040dm9tdVA0TFVPUHV3eXozNzVqcW5zWG1lQVUyMDY2MUxReHhoMk1qdi9GdVp4N0twRTZqcnFpM01sbXZKVENHK1NHYjJtZUorS0w4WVh0NXBzN3RBOHhweTlEZzdPV3pWdHE1SklONWJCQ3ZUNkVoZGdJTmRvTHJ4RGIySHQ0L3dPZi9vUzNtOHpuR3ZzVjdjeGdmcm1HN3Q3SFNtWUVNYnhKanpseGtPTE5KTmdvOTFsU01NNU01eHJmWXAxaTlwNVU1Y1MrZVZqNTBoUGcwMS9oa2lKMEl6dENucDJoM2tqZERYMUpSZmtRUlAxTEhqdEpxL0VsNW55QnpFVVhteGZrZkJ2TDlxOG52eVJINmRDdXBkMGUwbmE4bzRtdVNqOXY2cmVZd1JPWXlGWm5ia0d3enp4MGc4eDVGZmZmc3krdVFoSE1nYTZMV3d1d0IrMlcrVy83TGQwdWJVOXBIMlFOcWo5VENDdGVmZTdKUytYMWMrZHZnZkEyemxHOThqMXZHV01DMTUxeEltKzhteDlUNzZTblZUOXJ4bVZwRDhVM21lVHV1Vno0Y1VIdXJRdDRyejJVK3ZUUG83TzFrbXpmNWp1NXNNeFc5MUx0bDdDZTBmNnJ2VE1Zd2p1V041L05DNXFwanZDZDAxOCtVLythN2tyN0wrb3Z2SE5QTjByNVRTemJ3akZaNi9UaFdBZHYvbExwUzlrZ04yWTh5Yjd0YXF4eTdGeG9ZRDY0ajkwbGNJRjhsWHpiM0JwTFJwRDhaYks3RlhxZk84V2RGenZ0bjVheUtDVkhXcGtQaVFRb2xxZmVjN3NHMjZMWEVEekxHbWttN1NmMzMwNDBqTVVyaVV6cVl4MzRWeHEvVWQwZ3NFNmdCc3BOeExjcDZmQzh5LzJydW5RK1pqLzZMZFlMWGlacW1CVXZjOTdIRStqLzc1UUljMVZYRzhmL3VmZXlHUUhpbXBVQ1NLekNCQUExSmFFMHJGSm8waEpCQ29ablE4T2lVMmV6ZUpHczIyWFIzQTRST2F3VkRPclZscXN6RVFteHRSUUpCYkllWFVIUWFCdnRRVkVRZGNBWTdEdHBXVVptcDA5WXF0dVg2UDJmdmhpUUlHVHRqMVptek83LzdmZWZjYzcvelB1Zjdjbm11NTlKdUxtYVJiQklrQldRaXlYTEpjOS9sdW1rL21UNjhFK1VadzhVZDRCekwrSVdVd3ZmbWpuSVl4emhkUS9uQWczMjlsQTg0dUJ6OXhCOTR6anByS2Y5STJXNU01TDF3bVA1ZHl2Y2VJcTIxY2c3NlFSOTNZWCtHYXRkVlB1blBjTE9nendjKzVKdzM0SnpYTzUwTCtsdk9CZC85OUFuUG9jaVhRVGtXdDZjZkVWSEs1VmtjazQrb05KSzRrSVBiT1pRdi91LzJtL1g5VmZvVVAwM0dYTnBlNUJySDZZdnNjLzJQT0ZZekxpMmpmSVRwTE44TEdHTm1Zcng1RDU0MVhrYUhyd2RwNWpua3VMN0tGdjhUR09FYmkvRnBHYnhuVDlFUEViN01Dc3FkOUwraVhLdjBxUVhTLzU2TVhtMDIxK1l4bmlzSitsS3JlSzkwWVppTUQwVTgrQVo5bUtkd04zM3R0MWwvbWZDZFBPWE9LZUczc3I3N2hWOUVXMkZ6SHZhbTMrZWM4RmM2WTlLSG80anJyR3hBekhvV1hzOGUrc0Y3dUdka0hpWjQ3MlVjdGdkNS9mSXFYSm5ueWxSK3M1VHY0MWt5aWt4TVN1ZVNOeDlQVW0vMGJHZXMwRXUvdUZmNklpUHBRNDhWNk5PY3Z3bkVtRjhQL1ZGTUZXaHZjdzc3NlVQR2k3c0hNamlPMDNmem5DQjk2VUZ4MWVBNGJjZzljb1I3VDVEYUo0MG9GM0FOWlNmOVN5RXYvNEZ5R2VVbHlzT2tpaXdhcEl1MTNwMlV6aFF5bGRTNGZIVVFzMW4yVjVTM2tNS1VmMDk5bjFiSXVHMDA5OW5QMFdsTXhYU1JSMlo0bjhTM3lYTjZHWDNFTzhoZ3ViQ2ZMc2FINWJWcFBBY0xNTTZ6RWZtMHNjNWNpVXpqVDF4L1B5SEhVTTYxWGk3MWZmUWZma2g1a3VzN2dXL0pkd3V4Uzc4ZHUzdzJkbkZOZDNITmR2RU1uV2QwNDNINTNRNTBtV244NW52NGlySFh1V2hzNTk0U3RwNUdoMW5EY2hmNFBzdXRpK2Vsc1lpK1RoUDFSb1IxaXpiSFk3bnhNRzR6R2ZPWk43RzloZmd1ZmRLSVo0M1Q1dG5oUE8vTlFZN25uSE5JbjRSU3N3ZWI2RmQyNkR2cFIvZFFOcEY2VkdqdlVETGZxSEhmVVdkTTJHRitoK2thcHB1UzcrbXZsRXQ5QTdZeXZjbHp3dG1wTnptdmFOMk1qL2plK3hwR3lUcW1ZSzIrV1g0ajZ0dGtkcnYxUG9oU2ptV0hUTmM3ZjlkYjJKLzMyTWREY3UrLzVIMGFrLzFlUkFUR2FaVDd6MkNUNUhSU3BtZnl1emdtK1pINk9Vc0g3d1BQQTlqbVBZaTFBditQTUY5Z3ZzcjEvK3JWNTZHM2xOOXR3K2RTOXdidG5lSTVWV3k4N2h6WEc1MmR3M1lDL3EwOFQxYnc3R21uZE9NNWsvbG1KWDJjY293MXpTVDYzWXdwMzhVQ2N3Mzd1Um96dEIxaVA3cm4rNkR6WHNSbTdHK1RaeDlXVTY2aHZDY1YxOUYyZ1dGd256Y3liaEo4aHV0UXNOL0ZuL1J0MCtZN0gvdVdVSDZSY2hVcS9YbVVPYWowSGVUWmVQNXFTZnYzc205WlBCdkhVSnFwK0xFdmZTczZ2UTh4cG8xakROZVBhZktXNFJrS24wbC82TE1vRy9abkJIM1BvRXlXajJPMCtUekdHVjBjencwOGt6ZVNWR3g0Rml1TkQ3bG11akZkcTZEdnZGdnVvM244TGsySDgxWXFkdFJEbUtlOXh6TXVhYzlNMmRYSDh0d3ZRNGYyRkpZTGRJMWpMM2lZY1J6eFBrTmJuK2M2UDRITnZ2MWNzdzl5N2V4RnV3bmVDd0dlamFka1d5YlExbUx0RHZTS2QvcFJ4b0tDYjhpWWNESDd0OW1zNDc0OHlYcmNNa1l1NmpnT3k4VThhRnN4enB5Q3IzUE9PcmdXL3NGMk8rS2RuSjhHOW5zanNnMUdyZUt1TWxienJwbkRkWHlFTWtUcHB0bUdiSmIzc0YrWi9EYVRka1diaEJSK2JLYThvOEI5bTJEZnpuRCszK0E0dDlIMmZkQmwzRnVJQmNidjZQdUxlZHFCSi93bWFzMEZxS0V2WGF4MTBnZlBvaCt5bDJ2dFRUekFNcXZFdmNqMjlLWTloQnYxNTV4M2ZMZndUdndsejRpNGM4bW94akI1cjhaUjZuMlgrbXM4eS83aWZHQ3lmL3BXd243cHRTeGJ5emw4RTlzNFIxV2tXc0k1RitnMjErS3ZwWi9lcnB0bzEzbzRCZ2F5dFI5ekRyZnovbnpkK1NidGlQVnprMmlYYkp1SUJlZHdUaTg0SCtqSHlSbkdGWEJ1ME04UVhMN0EvZ3MvUDE4YmpSRFAxMnpQaDdSWFJidXY0REhUd21Pc3Y0RnJXOWhjSWVJY09SWWNtOEY3L2xwcExaUDdMZk9LWDNpVnZ6VFVuWGdyZlR0eXhSKzZ2Sjk3bDhlUE01LzZKUEk0OVNJeWg0eEs4dkdYZ0krMmtNM1ViWllwcER5U3ZQTXUxMnUvd1cvOUNZemdQL21ML0craDNmYmZ4WWNycE1XQTlQY0hrakgxQ2lOZlRqTDZJakN1RkxoaHcwREdGdzFrUXJkQ29WQW9GQXFGUXFGUUtCUUtoVUtoVUNnVUNvVkNvVkFvRkFxRlFxRlFLQlFLaFVLaFVDZ1VDb1ZDb1ZBb0ZBcUZRcUZRS0JRS2hVS2hVSHdxZUlEUlgvTWV4anljaEE5ZWpNS2QyQUlZTnhvWFlUQU5aT0FGUGpVQzd3VHhsTG9QSWFZOE1nM1BDTzhqcnE0aFEvdXlxK3ZVdDd1NlNYMjNxL3RRcUIxbVNZK2VScHZaMnU5ZDNZTkpwdTdxWG1TWWxxdHJ6TTkzZFoxNnBhdWIxT3RjM1lkYWN4TjZZS0VJQlNoRU1iVnFOTUNtWElvb21ra0NiV2lST1hjeEZhTXVuZ0htaDJXSmZMNHBRWVIvQzFYTXErZjNDY1JseXFhMFdYb2RueUZaY2dUL0ZVelZNdGZHZXVZc2s5YWJXVytxbmlXMDNrYmJyYlJqMFc2VU5zTUlVZzlTYitHN1dGODlWbC9yQ3pDSFdtNWZxaGl6WkJzQ3RORENzaGJyRGJBZVlTT0lScmRzSlZNTnpCVnZXOW5HZUYrZnhEaUVaVDhpMTJ4UG5Sd0xDNlZNMS9LTnlBM0lrUmpZeDZTZHFOdFRTOWJTeXJkQjJWK1JxcVB0OWZ3MkpuTmFXU29rUjg1aWZtbytGck5OWW5UQzhydG1PYlp6NWZlMkxHR2ppWFdLa1E3SnArVzJLRlhXa3ZseDVvanhhK21id1N2OUVPOFRiRVdZWDhZNUNpV3laTEpIcVY0RVpKdkVDZ2pKR2tXYkcyWHY2ajdKNnVteGlnb0tpNjNxQnR0YUdtMk9KdHBhYk91dWFLd2xHZ3Nrd3RIbWZLc2tFckdxd3ZVTmliaFZaY2Z0MkRvN2xHK05HRkZoMThiczlkYXlGcnU1V255ekpOQVdiVTFZa1doOU9HZ0ZveTF0TWZHTkpjd1h6TEZ5aFNpZVpWVUZJaTBOVmtXZ09SZ05OakszTXRyUWJGVzBodUtpcHVxR2NOeUs5TGRURjQxWnBlSGFTRGdZaUZodWpTd1RaYVZXUE5vYUM5b1VkWW4xZ1podHRUYUg3SmlWRVAxWVhHMHRDUWZ0NXJnOTE0cmJ0bVUzMWRxaGtCMnlJc2xjSzJUSGc3RndpK2lnckNOa0p3TGhTRHkvWnVXS2xXV0xacGJFd29ISTB1cnJwYVFRYlFsWWlWZ2daRGNGWW8xV3RPN2E0L2dwNy9KaEVyWFQvMTkyZWcxV1lnVXB3eUxNN0xmdmw3SWxZb2JyMmRLSWJQWDFTbjdTZC8zUG1mL0lLWk84aVFGbkdqcnhMMzc3cTl0TDByVlo0dStkakN6a2FETzFHYnplYzdRWkI4eXNuS1BhOUlPNTQzTk9mMS9MdzNuaTFmSU96TXpLZVVtYnBtVWRtSnR6NTFGdHlzRXhtVVVqUzI3V0xGN0lzK1hUNGpOS1hpUzlSTWRhTFp2NW8vajhBbm1VdkVqK3lYalZ4a1p4bk9HWldlZHViY2ZjK1VyT0psN2ZySDIrcFhnQms4UGt3Q2ErdmVPdVRucXFiTUNoZDY2TERjUVNJWkZBT2h0TGxRcUxWS1NpTkRoS0pkb1NLVWI1VVVXSm9xejNJdmRzUnpLVjI3UngweEsxS1pYSWw1UDJSL01qZGNpUHB2eTZQak43aHFKU3FidjN2TTg3Ny92TXg4N096dTB1QWU4Q1Byd0hSR1JXQjA0Q004Q3F5Q2l0aXVicVBKamFyR3hDM1UzNG93OG9UV1FOcUFBS3h0bUVYcHZJQURBS1RBTXpnRS9xUk9Ra2NCWllBcjZRR1V0cGNwL2ZpYkUzdWM5SUtwMTRPaTZMUjd6aXlIZGxzZlR0Z3NmZjJ1OXg1akZQMXVQSkh1cjJ3dHZUSG0vZTZuRW9GcmNGMXpYRXI2YkNTaGdYR2NiQVQ4RlM5aXNTb0pSd2NrVjVnRGdBVTN6VmlLV0VTaDFHZkdaSnFTRlVZUXJGQ3VDVnF3cDFHeHJqcVRwV1lXc2tSRGo3Qi92Y3k3RFBTeHNhNHpPcGI3SlB5ZXZBRXFDd1QzRit3ajRoWjltcW1IUFlKREFETEFIWGdEWEF4MVp4Zm96ekkvWVJDYkFQU1JlUUJFYUJHV0FKV0FQODdFUFlJUHRBdkk1Sksvd2t3TmdIc0VIMlBpN3JmZGdBdXdIdkJydUJvZjNKVGV5Snowdkg3S282UEZaMW1scXFUaWdjTDdNL3VyZTJZRVVadU5OWVVZdEtPK2tqTzVWMk4vWVFsbCt6dS9kSlhtWi9MZWttdjVMYXdkNGpEb0FYVGRnZ29BT0R3Qmh3Q3ZEQnV3N3ZPckdCNTRBcmdBTmdsY0VHQVoydEFPOEExOGtPd0FJR0FaVzk2NktiTXJ2bUdtbWVDck0vc04rUUpzejQ3OWx2SmIvRDNwTDhPL1pyeVcrREkrQVY5cFliNFNSVmp6eEJuU0E0Q081Qy9qNzJ5MUpIaUZkU2pXd0pjOGRodTRBa01BQ01BdE9BankyeGR2Y0pIa0lqaTJSRkpWQzY1RFBKUHljdnFjUTZ3UzFqSHhhZ0xvelI4d2c4bUJsOXhtQ1djZWxuS0FwalhId2VuakRHRDM0RVR4amplK2ZnQ1dNOGZScWVNTVlUSitBSll3eVB3aFBHR0JpQ0IxTm1MLzZpWXpOUEREeEY5VlNBVFdHV3BqQkxVNWlsS1ZMRHBzUkpidFdJc2IzZ2RuWml4aTViNXBaT2JpOVErMDFxSDZEMlM5UWVwL1laYXArajlsNXFINmEyU1cyTjJoRnFXOVJlcExzeEZUYTEzcmlydU1kcXB2WUt0VitqZHBIYUJyVmoxTzZndGs0VFZwbTF1WS90bEpTVlZFcUpodzc4U0I5Mm53QnJ3NHkyWWMyM1lVOVlncjBHVkdUSmdraHY5OFNiSW9MYlM1MUpyN3k5SjM0U2o4OHlLaTdqTml5VGo0RWEzS0JsTEtObE5MS01CZ0t3U1dBVXVBcXNBUlhBQjNVN0JqNHRiUUMyQzBnQ284QlpZQTN3eWVHc0FZeWNyQTd4ZFRrd01laXU2c0FIZ0JxMmpMTWRaeHRyczFxRFd0QU1QcXBNYXpRUW9RT1JTb1FsU0RpTUxUdlVxRGFXYWNQY1Z3My8rcXFCMUtacTJVVTJMYlp1OWx5VnA5MWIyTHJwVDExamthY2VvRDhoa1Jxc1BMcUhHRFFHM2syS3NyeUxhS3JnYnFLeFY4RnhWenVFYWdIWDJNb1g2QVpSYTQ3ZjB2N0dQOVBLRE83ZnRVWCtGNzFjUTEzK1owUmVuZVB2YVJmNDIxMWxGWkUzalRJRkxlaFNPcS90NXErdFNPazVKQzY3L0l5Z09mNTlyWjgvcGNuRXVKYzRYRVRKQ3ZBRHhqQi9GTzFsdEtQY0txTE5PWjdVRHZPOW5tcVhxRFBIZDJBSXB1ZDJZckJiTk5scE5JTElHM3pYNDQ4bnl2UzR0ZFYveVovM0QvZ2Y5c2Y5Vy8xdGZ1NXY5YmY0TjZvaE5haHVVTzlYNjFSVjlhazFLbE9KdXJGY1diVk1mSk9TamI2Z0lIeFN3dFpJUDhpRUZWKzFZdXVqS3NPN2xQTTFKY2R5QjlNMDUxdzlSbkpIZGVlZkI2TmxXcmQvMkxrdm1xWk9LRWR5UTJsbnQ1a3IreXNIbklTWmMveUQzOG5QVW5xeGdLakRmbGltWkNoZnBoVVJPdC9paFBibDV3bWxqZWVmYlJIODlmUFBGZ3FrT1h3NjJad005VFh1K1VibUhtYXNhczA3Ui9OZGZtdmF1WlE3bUhkM3ZmSkthN3JneEtWZnFjRFBPVDgrcUkvazUrbVg5SXRzWnA3ZUZGVEl6eXQ5OU12c0FSRlgraktGUXE1TUQwa2QwZWxONkxCMGJrcWRpbjlwb1NPNkd2RjBsejFkRFBXaDZ4QUVYVzB0aVVsZHJMWlc2bXFvME0wV083S1oyWTRPcVduQ2k1M1VGSnYwLzlTc3hLQ0p4YVFtYkpNVnFWa0oyMExqOUVtSnBrRVMwYVNFUGtnMEtkSG9nMUp5Nkk2a3F5cTVjRnR5UWZhazBEc2F6ZE0wcks1ckdsYWhNZi9mWXp4dG1yVFVXemcya2gyUFpzZWkyWEZnekhubTlQRm14ejZxNjdQSENpS2hPNG94ZHZUWWNjRkh4cDFDZER6akhJdG05Tm5la1h1a1IwUzZONXFaSlNQWm9menNpRFdlY1h1dDNtejBTS1pRNmgvc1R0elYxNFhiZlhVUDNxT3hRZEZZdCtpclAzR1BkRUtrKzBWZkNkRlhRdlRWYi9YTHZvaGM2b1A1V1pXa0MvdEdQQzZ4K2pvczI3R1d0a0k2SER6Vko5ZHdiMXZ6bVpZRnZMcThUT3JOZ25OL05PMDBBQ0sxTGJVdEpWSjR0RVJxQThLQmFxcjVURzlieXdKOXVab0tJdHdZVFJOellySTRTWnF6VDJhOFh4RUhRaE9UWXNJOWF4Yi8xNEZjMXJHT1pJb1RoT1Njem9NNUo3bC9PRC9yOXlNNkppN0o2Vm1QMWRkbnk1V3JYbkE3Z2owaXFDaTNoU0syVjhScWE2dkMvNzcvazFYZUo1NENteTJXcUJXaCtFUXNLRTRrTjhTd0l3d040MXBIaHZNTGVMRVMveFhGQWk2d1NFMWFYRytqT216VEpGNlppR3RleDhSazFhdk94VVNWdlpxb1VseWZrdHVIbUN6ejlveE55R2JsZEpvaitkUUc1V0dsQzU4ZVhOa0IzZ2JlQm82RDQwcVhGVEs0d2hLOFZrM3crcm9NOS9zeWZMM1Zndmx2QVFZQWxPOUcyQTBLWlc1a2MzUnlaV0Z0RFdWdVpHOWlhZzB5TUNBd0lHOWlhZzA4UEM5R2FXeDBaWEl2Um14aGRHVkVaV052WkdVdlRHVnVaM1JvSURJNE5qNCtjM1J5WldGdERRcElpVnlSMzJyRElCVEc3MzJLYzlsZUZOT1FOaTFJWUdRdDVHSi9XTFlIU1BVa0V4WWp4bHprN1hmVTBzRUU0MCtPMy9ITEo2K2I1OFpvRC96ZFRiSkZENzAyeXVFOExVNGkzSERRaHUxelVGcjYreTUrNWRoWnhrbmNyclBIc1RIOXhJUUEva0hGMmJzVk5rOXF1dUdXOFRlbjBHa3p3T2FyYnJmQTI4WGFIeHpSZU1pZ3FrQmhUNDFlT3Z2YWpRZzh5bmFOb3JyMjY0NDBmeWMrVjR1UXgvMCttWkdUd3RsMkVsMW5CbVFpbzFHQnVOS29HQnIxcjA0L0VtVzNYbjUzam9rOEhNNHlXcGdvOXBGcFllS1krQmk1U0Z3RVBpUStCRDRuUGdldUU5ZUJMNGt2Z2ErSnlZd28wMTFsdUt0TVBjdlFzendsUGtYRGQyZkJPaVVNajF6azRoeEZFcDhoWmhGUzBBWWZMMlVuQzZRS2svMEtNQUJDeVlsT0RRcGxibVJ6ZEhKbFlXME5aVzVrYjJKcURURWdNQ0J2WW1vTlBEd3ZSbWxzZEdWeUwwWnNZWFJsUkdWamIyUmxMMFpwY25OMElETTFMMHhsYm1kMGFDQXlPRFF2VGlBMkwxUjVjR1V2VDJKcVUzUnRQajV6ZEhKbFlXME5DbWplVkZETGFzTXdFUHlWUGJhSHNoYW1UZ3JCa0NjdGFWMFRwNmVRZytKc2JkRkVFb29NOGQ5M0xlZlJYclNhMldHWW5RUWlHTUF3aGlFSUllQUZSQnlCaUNCKzVxK0FPQm5BYUlSTDFrU3d3bHc2MG43dGlGai9uOGpvN0pmVWdzQ1ZPZENIdE96VktkYXRKU3k4YThvZ1d4bmowelJZc24yd2dDVE1BZ3NxKzEzV0hFK2JFSU1YMjBDTnRUWmVlbVUwRmxacUhEdXZ2bVhwTWNlSjJoMlVxWnkwZGR1QnVmYXV4V2t0bmNlRnFocEhPRk9TOThjYmRNWk9wYjNDdWQ2ek9XSFdQUXNPZUVkditxQTBGYlhrSXk3cXo4WjNYQitERDFNL1pCcC9nYzN1VkRwbGI5Q1MrMHVzdWFTSk9YZnA4VXZ2eWQyYzBuVFQ5N0VOM1VUNExuWDFNSnMvVFY4ZnVhSkwvUldJYTFsNW12NEtNQUJ1STR5UURRcGxibVJ6ZEhKbFlXME5aVzVrYjJKcURUSWdNQ0J2WW1vTlBEd3ZUR1Z1WjNSb0lEUXdORGN2VTNWaWRIbHdaUzlZVFV3dlZIbHdaUzlOWlhSaFpHRjBZVDQrYzNSeVpXRnREUW84UDNod1lXTnJaWFFnWW1WbmFXNDlJdSs3dnlJZ2FXUTlJbGMxVFRCTmNFTmxhR2xJZW5KbFUzcE9WR042YTJNNVpDSS9QZ284ZURwNGJYQnRaWFJoSUhodGJHNXpPbmc5SW1Ga2IySmxPbTV6T20xbGRHRXZJaUI0T25odGNIUnJQU0pCWkc5aVpTQllUVkFnUTI5eVpTQTFMall0WXpBeE5pQTVNUzR4TmpNMk1UWXNJREl3TVRndk1UQXZNamt0TVRZNk5UZzZORGtnSUNBZ0lDQWdJQ0krQ2lBZ0lEeHlaR1k2VWtSR0lIaHRiRzV6T25Ka1pqMGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNVGs1T1M4d01pOHlNaTF5WkdZdGMzbHVkR0Y0TFc1ekl5SStDaUFnSUNBZ0lEeHlaR1k2UkdWelkzSnBjSFJwYjI0Z2NtUm1PbUZpYjNWMFBTSWlDaUFnSUNBZ0lDQWdJQ0FnSUhodGJHNXpPbmh0Y0QwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0x5SUtJQ0FnSUNBZ0lDQWdJQ0FnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpQ2lBZ0lDQWdJQ0FnSUNBZ0lIaHRiRzV6T21SalBTSm9kSFJ3T2k4dmNIVnliQzV2Y21jdlpHTXZaV3hsYldWdWRITXZNUzR4THlJS0lDQWdJQ0FnSUNBZ0lDQWdlRzFzYm5NNmNHUm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNCa1ppOHhMak12SWdvZ0lDQWdJQ0FnSUNBZ0lDQjRiV3h1Y3pwd1pHWjRQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNCa1puZ3ZNUzR6THlJK0NpQWdJQ0FnSUNBZ0lEeDRiWEE2VFc5a2FXWjVSR0YwWlQ0eU1ESXdMVEEyTFRJMFZEQTVPak16T2pBMEt6QXlPakF3UEM5NGJYQTZUVzlrYVdaNVJHRjBaVDRLSUNBZ0lDQWdJQ0FnUEhodGNEcERjbVZoZEdWRVlYUmxQakl3TWpBdE1EWXRNalJVTURrNk16TTZNRE1yTURJNk1EQThMM2h0Y0RwRGNtVmhkR1ZFWVhSbFBnb2dJQ0FnSUNBZ0lDQThlRzF3T2sxbGRHRmtZWFJoUkdGMFpUNHlNREl3TFRBMkxUSTBWREE1T2pNek9qQTBLekF5T2pBd1BDOTRiWEE2VFdWMFlXUmhkR0ZFWVhSbFBnb2dJQ0FnSUNBZ0lDQThlRzF3T2tOeVpXRjBiM0pVYjI5c1BrRmpjbTlpWVhRZ1VFUkdUV0ZyWlhJZ01qQWdac084Y2lCWGIzSmtQQzk0YlhBNlEzSmxZWFJ2Y2xSdmIydytDaUFnSUNBZ0lDQWdJRHg0YlhCTlRUcEViMk4xYldWdWRFbEVQblYxYVdRNk1qaGtOVFV5Tm1ZdFkyUmxPUzAwT0Rka0xXRXlNMlF0TlRSaFpEZ3lZMlV5WXpjMVBDOTRiWEJOVFRwRWIyTjFiV1Z1ZEVsRVBnb2dJQ0FnSUNBZ0lDQThlRzF3VFUwNlNXNXpkR0Z1WTJWSlJENTFkV2xrT21abVltSTBaR1poTFdFeVlXTXRORGd5WXkxaVptWTNMVGhqT0RGaE1qZzJOemRsTUR3dmVHMXdUVTA2U1c1emRHRnVZMlZKUkQ0S0lDQWdJQ0FnSUNBZ1BIaHRjRTFOT25OMVltcGxZM1ErQ2lBZ0lDQWdJQ0FnSUNBZ0lEeHlaR1k2VTJWeFBnb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBOGNtUm1PbXhwUGpJOEwzSmtaanBzYVQ0S0lDQWdJQ0FnSUNBZ0lDQWdQQzl5WkdZNlUyVnhQZ29nSUNBZ0lDQWdJQ0E4TDNodGNFMU5Pbk4xWW1wbFkzUStDaUFnSUNBZ0lDQWdJRHhrWXpwbWIzSnRZWFErWVhCd2JHbGpZWFJwYjI0dmNHUm1QQzlrWXpwbWIzSnRZWFErQ2lBZ0lDQWdJQ0FnSUR4a1l6cDBhWFJzWlQ0S0lDQWdJQ0FnSUNBZ0lDQWdQSEprWmpwQmJIUStDaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lEeHlaR1k2YkdrZ2VHMXNPbXhoYm1jOUluZ3RaR1ZtWVhWc2RDSXZQZ29nSUNBZ0lDQWdJQ0FnSUNBOEwzSmtaanBCYkhRK0NpQWdJQ0FnSUNBZ0lEd3ZaR002ZEdsMGJHVStDaUFnSUNBZ0lDQWdJRHhrWXpwa1pYTmpjbWx3ZEdsdmJqNEtJQ0FnSUNBZ0lDQWdJQ0FnUEhKa1pqcEJiSFErQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJRHh5WkdZNmJHa2dlRzFzT214aGJtYzlJbmd0WkdWbVlYVnNkQ0l2UGdvZ0lDQWdJQ0FnSUNBZ0lDQThMM0prWmpwQmJIUStDaUFnSUNBZ0lDQWdJRHd2WkdNNlpHVnpZM0pwY0hScGIyNCtDaUFnSUNBZ0lDQWdJRHhrWXpwamNtVmhkRzl5UGdvZ0lDQWdJQ0FnSUNBZ0lDQThjbVJtT2xObGNUNEtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ1BISmtaanBzYVQ1U1pXbGphRzExZEdnZ1RXbGphR0ZsYkN3Z1NUTTJORHd2Y21SbU9teHBQZ29nSUNBZ0lDQWdJQ0FnSUNBOEwzSmtaanBUWlhFK0NpQWdJQ0FnSUNBZ0lEd3ZaR002WTNKbFlYUnZjajRLSUNBZ0lDQWdJQ0FnUEhCa1pqcFFjbTlrZFdObGNqNUJaRzlpWlNCUVJFWWdUR2xpY21GeWVTQXlNQzQyTGpZMlBDOXdaR1k2VUhKdlpIVmpaWEkrQ2lBZ0lDQWdJQ0FnSUR4d1pHWTZTMlY1ZDI5eVpITXZQZ29nSUNBZ0lDQWdJQ0E4Y0dSbWVEcFRiM1Z5WTJWTmIyUnBabWxsWkQ1RU9qSXdNakF3TmpJME1EY3pNalF5UEM5d1pHWjRPbE52ZFhKalpVMXZaR2xtYVdWa1Bnb2dJQ0FnSUNBZ0lDQThjR1JtZURwRGIyMXdZVzU1UGxCUFUxUWdRMGdnUVVjOEwzQmtabmc2UTI5dGNHRnVlVDRLSUNBZ0lDQWdJQ0FnUEhCa1puZzZRMjl0YldWdWRITXZQZ29nSUNBZ0lDQWdJQ0E4Y0dSbWVEcE1iMmR2VFdGeWEyVStVRHd2Y0dSbWVEcE1iMmR2VFdGeWEyVStDaUFnSUNBZ0lDQWdJRHh3WkdaNE9reHZaMjlUY0hKaFkyaGxQa1E4TDNCa1puZzZURzluYjFOd2NtRmphR1UrQ2lBZ0lDQWdJRHd2Y21SbU9rUmxjMk55YVhCMGFXOXVQZ29nSUNBOEwzSmtaanBTUkVZK0Nqd3ZlRHA0YlhCdFpYUmhQZ29nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lBb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdDaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUFvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0NpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQUtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQW9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lBb2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdDaUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FLSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUFvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0NpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQUtJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQW9nSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0Nqdy9lSEJoWTJ0bGRDQmxibVE5SW5jaVB6NE5DbVZ1WkhOMGNtVmhiUTFsYm1Sdlltb05NeUF3SUc5aWFnMDhQQzlHYVd4MFpYSXZSbXhoZEdWRVpXTnZaR1V2Um1seWMzUWdOUzlNWlc1bmRHZ2dOVEF2VGlBeEwxUjVjR1V2VDJKcVUzUnRQajV6ZEhKbFlXME5DbWplTWpSU01GQ3dzZEYzemkvTksxRXcxUGZPVENtT05qUURDZ2JGNm9kVUZxVHFCeVNtcHhiYjJRRUVHQURuTUF2Y0RRcGxibVJ6ZEhKbFlXME5aVzVrYjJKcURUUWdNQ0J2WW1vTlBEd3ZSbWxzZEdWeUwwWnNZWFJsUkdWamIyUmxMMFpwY25OMElEVXZUR1Z1WjNSb0lESXpNeTlPSURFdlZIbHdaUzlQWW1wVGRHMCtQbk4wY21WaGJRMEthTjVzemsxTHcwQVFCdUMvTXJkdVVKcDFOMFNVVWdnTmZtQ0R3Ulk4YnpaVHM3YkpsSEdENUw5N2NLb2lIcnk5TTd6TU14Y1dOQ3dXYVRIR2psZzlZZkJkTHhrcUNRNFA1M0J2OHl4SlY5VDNPTVEzOVJXUGJwaFUvYmpad3VvT2lsdlpNYm9ZYUNoZFJGVmVHMjIwemsybXI2elY5a3libWRhem41WW9oV2RxWElTNnZLbmNIaG1NaHQwSHd6TnhtNlFQT0wxTE9GRnJlcUhLOFI1Vi9UMXNqdXg4SjBTU1Z0VCtwMlcvV3MzVWpoNkZhNm5CRXdicjBMRGpTYng1UHMvekpOM1F5QjdsVk5nRmJQL2V1clFtTTFJWW0xZjBVWDdaaG5oQWxTeVhud0lNQUMzWlhBWU5DbVZ1WkhOMGNtVmhiUTFsYm1Sdlltb05OU0F3SUc5aWFnMDhQQzlFWldOdlpHVlFZWEp0Y3p3OEwwTnZiSFZ0Ym5NZ05DOVFjbVZrYVdOMGIzSWdNVEkrUGk5R2FXeDBaWEl2Um14aGRHVkVaV052WkdVdlNVUmJQRFl6TlRFNVJrUXpNMFpFTURaRE5EazRNVUk1TVVFelJqazVRak5HUkVOQ1BqdzRRelEyT1RBMk1qbEdPRFZHTnpRd1FUQTJPRGc1UmtSRlFrWXpOVUpHTmo1ZEwwbHVabThnTVRNZ01DQlNMMHhsYm1kMGFDQTBPUzlTYjI5MElERTFJREFnVWk5VGFYcGxJREUwTDFSNWNHVXZXRkpsWmk5WFd6RWdNaUF4WFQ0K2MzUnlaV0Z0RFFwbzNtSmlBQUlteG9SSERFd01URlZBUWtBR1NERDJnUWczb0VUUFZpQ0xnWUVSQjhIMEcwZ3dNZ0FFR0FEUzlnVWpEUXBsYm1SemRISmxZVzBOWlc1a2IySnFEWE4wWVhKMGVISmxaZzBLTVRFMkRRb2xKVVZQUmcwSzwvRG9jdW1lbnQ+CgkJPC9BcHBlbmRpeD4KCTwvQm9keT4KPC9FbnZlbG9wZT4K41101000001021209" + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '106756' + Content-Type: + - application/soap+xml; charset=utf-8; action="http://ch.swisspost.ebill.b2bservice/B2BService/UploadFilesReport" + Cookie: + - ittrksessid=c996ea6f.5dedd6d0eee49 + SOAPAction: + - '"http://ch.swisspost.ebill.b2bservice/B2BService/UploadFilesReport"' + User-Agent: + - Zeep/3.2.0 (www.python-zeep.org) + method: POST + uri: https://ebill-ki.postfinance.ch/B2BService/B2BService.svc + response: + body: + string: http://ch.swisspost.ebill.b2bservice/B2BService/UploadFilesReportResponse00000000-0000-0000-0000-000000000000urn:uuid:52e2cd23-f8a2-46ae-9545-283b1bb87a972022-05-13T04:51:26.164Z2022-05-13T04:56:26.164ZXML2022-05-13T06:51:26.1646559+02:00test-transaction-123OK + headers: + Connection: + - close + Content-Length: + - '1374' + Content-Type: + - application/soap+xml; charset=utf-8 + Date: + - Fri, 13 May 2022 04:51:26 GMT + Referrer-Policy: + - no-referrer-when-downgrade + Server: + - Apache (proxied) + Strict-Transport-Security: + - max-age=31536000 + X-Content-Type-Options: + - nosniff + X-Frame-Options: + - SAMEORIGIN + X-RP-UNIQUE_ID: + - Yn3jzRFe1qhLp6voSVLHyAAACQw + X-Xss-Protection: + - 1; mode=block + status: + code: 200 + message: OK +version: 1 diff --git a/ebill_postfinance/tests/test_ebill_postfinance.py b/ebill_postfinance/tests/test_ebill_postfinance.py new file mode 100644 index 000000000..81552d564 --- /dev/null +++ b/ebill_postfinance/tests/test_ebill_postfinance.py @@ -0,0 +1,50 @@ +# Copyright 2022 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +import os + +from .common import CommonCase, recorder + + +class TestEbillPostfinance(CommonCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.transaction_id = "test-transaction-123" + cls.invoice_message = cls.invoice.create_postfinance_ebill() + + @recorder.use_cassette + def test_ping_service(self): + """Check the ping service testing purpose only.""" + self.service.ping_service() + + @recorder.use_cassette + def test_upload_file(self): + """Check uploading an XML invoice to the service.""" + with open( + os.path.join( + os.path.dirname(__file__), "examples", "yellowbill_qr_iban.xml" + ), + "r", + ) as f: + data = f.read() + data = data.encode("utf-8") + res = self.service.upload_file(self.transaction_id, "XML", data) + result = res[0] + self.assertEqual(result.FileType, "XML") + self.assertEqual(result.TransactionID, "test-transaction-123") + self.assertEqual(result.ProcessingState, "OK") + + @recorder.use_cassette + def test_search_invoices(self): + """Check the search invoice endpoint. + + Get the state of the invoice send in the previous test. + And update the invoice message record with the result. + + """ + res = self.service.search_invoice(transaction_id=self.transaction_id) + data = res.InvoiceList["SearchInvoice"][0] + self.invoice_message.update_message_from_server_data(data) + self.assertEqual(self.invoice_message.state, "error") + self.assertEqual(self.invoice_message.server_state, "invalid") diff --git a/ebill_postfinance/tests/test_ebill_postfinance_message_yb.py b/ebill_postfinance/tests/test_ebill_postfinance_message_yb.py new file mode 100644 index 000000000..f1fdba3ba --- /dev/null +++ b/ebill_postfinance/tests/test_ebill_postfinance_message_yb.py @@ -0,0 +1,57 @@ +# Copyright 2022 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +import os +from string import Template + +from freezegun import freeze_time +from lxml import etree as ET + +from odoo.modules.module import get_module_root +from odoo.tools import file_open + +from .common import CommonCase + + +@freeze_time("2019-06-21 09:06:00") +class TestEbillPostfinanceMessageYB(CommonCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.schema_file = ( + get_module_root(os.path.dirname(__file__)) + + "/messages/ybInvoice_V2.0.4.xsd" + ) + + def test_invoice_qr(self): + """Check XML payload genetated for an invoice.""" + self.invoice.name = "INV_TEST_01" + self.invoice.invoice_date_due = "2019-07-01" + message = self.invoice.create_postfinance_ebill() + message.set_transaction_id() + message.payload = message._generate_payload_yb() + # Validate the xml generated on top of the xsd schema + node = ET.fromstring(message.payload.encode("utf-8")) + self.assertXmlValidXSchema(node, xschema=None, filename=self.schema_file) + # Remove the PDF file data from the XML to ease diff check + lines = message.payload.splitlines() + for pos, line in enumerate(lines): + if line.find("MimeType") != -1: + lines.pop(pos) + break + payload = "\n".join(lines).encode("utf8") + # Prepare the XML file that is expected + expected_tmpl = Template( + file_open("ebill_postfinance/tests/examples/invoice_qr_yb.xml").read() + ) + expected = expected_tmpl.substitute( + TRANSACTION_ID=message.transaction_id, CUSTOMER_ID=self.customer.id + ).encode("utf8") + # Remove the comments in the expected xml + expected_nocomment = [ + line + for line in expected.split(b"\n") + if not line.lstrip().startswith(b" -

Beta License: AGPL-3 OCA/l10n-switzerland Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/l10n-switzerland Translate me on Weblate Try me on Runboat

This module implements the exchange of electronic invoices with the Postfinance web service.

Table of contents

@@ -435,7 +435,7 @@

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -461,7 +461,7 @@

Maintainers

promote its widespread use.

Current maintainer:

TDu

-

This module is part of the OCA/l10n-switzerland project on GitHub.

+

This module is part of the OCA/l10n-switzerland project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

diff --git a/ebill_postfinance/tests/__init__.py b/ebill_postfinance/tests/__init__.py index 4ec537b69..6b1397c97 100644 --- a/ebill_postfinance/tests/__init__.py +++ b/ebill_postfinance/tests/__init__.py @@ -1,2 +1,3 @@ from . import test_ebill_postfinance from . import test_ebill_postfinance_message_yb +from . import test_ebill_postfinance_message_yb_creditnote diff --git a/ebill_postfinance/tests/common.py b/ebill_postfinance/tests/common.py index a3349f1ff..6496d442e 100644 --- a/ebill_postfinance/tests/common.py +++ b/ebill_postfinance/tests/common.py @@ -1,16 +1,19 @@ # Copyright 2022 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) +import logging import os from os.path import dirname, join from vcr import VCR from xmlunittest import XmlTestMixin -from odoo.tests.common import SavepointCase +from odoo.tests.common import TransactionCase +_logger = logging.getLogger(__name__) -class CommonCase(SavepointCase, XmlTestMixin): + +class CommonCase(TransactionCase, XmlTestMixin): @classmethod def setUpClass(cls): super().setUpClass() @@ -25,7 +28,8 @@ def setUpClass(cls): } ) cls.country = cls.env.ref("base.ch") - cls.company = cls.env.user.company_id + cls.company = cls.env.ref("l10n_ch.demo_company_ch") + cls.env.user.company_id = cls.company cls.company.vat = "CHE-012.345.678" cls.company.name = "Camptocamp SA" cls.company.street = "StreetOne" @@ -36,23 +40,15 @@ def setUpClass(cls): cls.company.email = "info@camptocamp.com" cls.company.phone = "" cls.bank = cls.env.ref("base.res_bank_1") - cls.bank.clearing = 777 - cls.tax7 = cls.env["account.tax"].create( - { - "name": "Test tax", - "type_tax_use": "sale", - "amount_type": "percent", - "amount": "7.7", - "tax_group_id": cls.env.ref("l10n_ch.tax_group_tva_77").id, - } - ) + cls.bank.bic = 777 + cls.tax7 = cls.env.ref("l10n_ch.{}_vat_77".format(cls.company.id)) cls.partner_bank = cls.env["res.partner.bank"].create( { "bank_id": cls.bank.id, - "acc_number": "300.300.300", + "acc_number": "CH04 8914 4618 6435 6132 2", "acc_holder_name": "AccountHolderName", "partner_id": cls.company.partner_id.id, - "l10n_ch_qr_iban": "CH21 3080 8001 2345 6782 7", + "l10n_ch_qr_iban": "CH2130808001234567827", } ) cls.terms = cls.env.ref("account.account_payment_term_15days") @@ -91,30 +87,9 @@ def setUpClass(cls): } ) cls.account = cls.env["account.account"].search( - [ - ( - "user_type_id", - "=", - cls.env.ref("account.data_account_type_revenue").id, - ) - ], + [("account_type", "=", "asset_receivable")], limit=1, ) - cls.at_receivable = cls.env["account.account.type"].create( - { - "name": "Test receivable account", - "type": "receivable", - "internal_group": "asset", - } - ) - cls.a_receivable = cls.env["account.account"].create( - { - "name": "Test receivable account", - "code": "TEST_RA", - "user_type_id": cls.at_receivable.id, - "reconcile": True, - } - ) cls.product = cls.env["product.product"].create( {"name": "Product Q & A", "list_price": 100.00, "default_code": "370003021"} ) @@ -125,10 +100,8 @@ def setUpClass(cls): "default_code": "370003022", } ) - cls.product.product_tmpl_id.invoice_policy = "order" cls.product_long_name.product_tmpl_id.invoice_policy = "order" - cls.sale = cls.env["sale.order"].create( { "name": "Order123", @@ -166,7 +139,7 @@ def setUpClass(cls): # Generate the invoice from the sale order cls.invoice = cls.sale._create_invoices() # And add some more lines on the invoice - # One UX line and one not linked to a product + # One UX line and one not linked to a product and without VAT cls.invoice.update( { "line_ids": [ @@ -177,17 +150,15 @@ def setUpClass(cls): { "name": "Phone support", "quantity": 4.0, - # Set zero, avoiding error with accounting ?! "price_unit": 0, - "account_id": cls.at_receivable.id, - # "tax_id": [(4, cls.tax7.id, 0)], + # Force not tax on this line, for testing purpose + "tax_ids": [(5, 0, 0)], }, ), ], } ) - cls.invoice.action_post() - cls.invoice.payment_reference = "1234567890" + cls.invoice.payment_reference = "210000000003139471430009017" cls.invoice.partner_bank_id = cls.partner_bank.id @staticmethod diff --git a/ebill_postfinance/tests/examples/credit_note_yb.xml b/ebill_postfinance/tests/examples/credit_note_yb.xml index cd2b480a2..336e65450 100644 --- a/ebill_postfinance/tests/examples/credit_note_yb.xml +++ b/ebill_postfinance/tests/examples/credit_note_yb.xml @@ -1,9 +1,5 @@ - - + +
Camptocamp SA IPECeBILLServer @@ -21,7 +17,7 @@ 2019-06-21 $TRANSACTION_ID PDFAppendix - +
@@ -48,8 +44,7 @@
Test RAD Customer XML Teststrasse 100 - This is a very long street name that should be sna + This is a very long street name that should be sna 1700 Fribourg CH @@ -121,8 +116,7 @@ NORMAL 2 - Product With a Very Long Name That Need To Be Truncated + Product With a Very Long Name That Need To Be Truncated 370003022 1.0 Units diff --git a/ebill_postfinance/tests/examples/invoice_qr_yb.xml b/ebill_postfinance/tests/examples/invoice_qr_yb.xml index c8c5745ab..1cecb7257 100644 --- a/ebill_postfinance/tests/examples/invoice_qr_yb.xml +++ b/ebill_postfinance/tests/examples/invoice_qr_yb.xml @@ -1,9 +1,5 @@ - - + +
Camptocamp SA IPECeBILLServer @@ -21,7 +17,7 @@ 2019-06-21 $TRANSACTION_ID PDFAppendix - +
@@ -48,8 +44,7 @@
Test RAD Customer XML Teststrasse 100 - This is a very long street name that should be sna + This is a very long street name that should be sna 1700 Fribourg CH @@ -88,7 +83,7 @@ 777 Reserve CH2130808001234567827 - 1234567890 + 210000000003139471430009017 @@ -127,8 +122,7 @@ NORMAL 2 - Product With a Very Long Name That Need To Be Truncated + Product With a Very Long Name That Need To Be Truncated 370003022 1.0 Units diff --git a/ebill_postfinance/tests/test_ebill_postfinance_message_yb.py b/ebill_postfinance/tests/test_ebill_postfinance_message_yb.py index ea27e9038..047226635 100644 --- a/ebill_postfinance/tests/test_ebill_postfinance_message_yb.py +++ b/ebill_postfinance/tests/test_ebill_postfinance_message_yb.py @@ -1,6 +1,7 @@ # Copyright 2022 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) +import logging import os from string import Template @@ -12,6 +13,8 @@ from .common import CommonCase +_logger = logging.getLogger(__name__) + @freeze_time("2019-06-21 09:06:00") class TestEbillPostfinanceMessageYB(CommonCase): @@ -22,14 +25,14 @@ def setUpClass(cls): get_module_root(os.path.dirname(__file__)) + "/messages/ybInvoice_V2.0.4.xsd" ) - - def test_invoice_qr(self): - """Check XML payload genetated for an invoice.""" # If ebill_postfinance_stock is installed it will break the test try: - self.invoice.invoice_line_ids.sale_line_ids.write({"move_ids": False}) + cls.invoice.invoice_line_ids.sale_line_ids.write({"move_ids": False}) except Exception: - pass + _logger.info("Disabling moves on invoice lines.") + + def test_invoice_qr(self): + """Check XML payload genetated for an invoice.""" self.invoice.name = "INV_TEST_01" self.invoice.invoice_date_due = "2019-07-01" message = self.invoice.create_postfinance_ebill() diff --git a/ebill_postfinance/tests/test_ebill_postfinance_message_yb_creditnote.py b/ebill_postfinance/tests/test_ebill_postfinance_message_yb_creditnote.py index ef589f7d5..fa788e220 100644 --- a/ebill_postfinance/tests/test_ebill_postfinance_message_yb_creditnote.py +++ b/ebill_postfinance/tests/test_ebill_postfinance_message_yb_creditnote.py @@ -1,6 +1,7 @@ # Copyright 2022 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) +import logging import os from string import Template @@ -12,6 +13,8 @@ from .common import CommonCase +_logger = logging.getLogger(__name__) + @freeze_time("2019-06-21 09:06:00") class TestEbillPostfinanceMessageYBCreditNote(CommonCase): @@ -22,17 +25,18 @@ def setUpClass(cls): get_module_root(os.path.dirname(__file__)) + "/messages/ybInvoice_V2.0.4.xsd" ) - - def test_invoice_credit_note(self): - """Check XML payload genetated for a credit note.""" # If ebill_postfinance_stock is installed it will break the test try: - self.invoice.invoice_line_ids.sale_line_ids.write({"move_ids": False}) + cls.invoice.invoice_line_ids.sale_line_ids.write({"move_ids": False}) except Exception: - pass + _logger.info("Disabling moves on invoice lines.") + + def test_invoice_credit_note(self): + """Check XML payload genetated for a credit note.""" self.invoice.name = "INV_TEST_01" self.invoice.invoice_date_due = "2019-07-01" self.invoice.move_type = "out_refund" + self.invoice.action_post() message = self.invoice.create_postfinance_ebill() message.set_transaction_id() message.payload = message._generate_payload_yb() diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 000000000..c42883328 --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1,3 @@ +# For tests +vcrpy==4.4.0 +xmlunittest==0.5.0 From 93062b0cd5c859c704fe3e85f737449923aea393 Mon Sep 17 00:00:00 2001 From: Thierry Ducrest Date: Mon, 17 Oct 2022 15:47:52 +0200 Subject: [PATCH 07/17] Add ebill_postfinance_stock Remove the dependency on stock in the `ebill_postfinance` module. And add a new module `ebill_postfinance_stock` that will integrate in the xml invoice informations related to the deliveries. This is for Odoo implementation that sell only services and have no stock to manage. And do not use the `stock` module. --- ebill_postfinance_stock/__init__.py | 1 + ebill_postfinance_stock/__manifest__.py | 17 ++ .../invoice-line-stock-yellowbill.jinja | 10 + ebill_postfinance_stock/models/__init__.py | 1 + .../ebill_postfinance_invoice_message.py | 24 +++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 1 + ebill_postfinance_stock/tests/__init__.py | 1 + .../tests/examples/invoice_qr_yb.xml | 192 ++++++++++++++++++ .../test_ebill_postfinance_message_yb.py | 60 ++++++ 10 files changed, 308 insertions(+) create mode 100644 ebill_postfinance_stock/__init__.py create mode 100644 ebill_postfinance_stock/__manifest__.py create mode 100644 ebill_postfinance_stock/messages/invoice-line-stock-yellowbill.jinja create mode 100644 ebill_postfinance_stock/models/__init__.py create mode 100644 ebill_postfinance_stock/models/ebill_postfinance_invoice_message.py create mode 100644 ebill_postfinance_stock/readme/CONTRIBUTORS.rst create mode 100644 ebill_postfinance_stock/readme/DESCRIPTION.rst create mode 100644 ebill_postfinance_stock/tests/__init__.py create mode 100644 ebill_postfinance_stock/tests/examples/invoice_qr_yb.xml create mode 100644 ebill_postfinance_stock/tests/test_ebill_postfinance_message_yb.py diff --git a/ebill_postfinance_stock/__init__.py b/ebill_postfinance_stock/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/ebill_postfinance_stock/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/ebill_postfinance_stock/__manifest__.py b/ebill_postfinance_stock/__manifest__.py new file mode 100644 index 000000000..fdea40247 --- /dev/null +++ b/ebill_postfinance_stock/__manifest__.py @@ -0,0 +1,17 @@ +# Copyright 2022 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "eBill Postfinance Stock", + "summary": """Add stock integration to Postfinance eBill""", + "version": "14.0.1.0.0", + "license": "AGPL-3", + "author": "Camptocamp,Odoo Community Association (OCA)", + "maintainers": ["TDu"], + "website": "https://github.com/OCA/l10n-switzerland", + "depends": [ + "ebill_postfinance", + "sale_stock", + ], + "auto_install": True, +} diff --git a/ebill_postfinance_stock/messages/invoice-line-stock-yellowbill.jinja b/ebill_postfinance_stock/messages/invoice-line-stock-yellowbill.jinja new file mode 100644 index 000000000..521b51ec7 --- /dev/null +++ b/ebill_postfinance_stock/messages/invoice-line-stock-yellowbill.jinja @@ -0,0 +1,10 @@ +{% for picking in line.sale_line_ids.move_ids.mapped('picking_id') %} +{%- if picking.state != 'cancel' %} +{% set ref.position = ref.position + 1 %} + + {{ ref.position }} + DeliveryNoteNumber + {{ picking.name }} + +{%- endif %} +{% endfor %} diff --git a/ebill_postfinance_stock/models/__init__.py b/ebill_postfinance_stock/models/__init__.py new file mode 100644 index 000000000..6c45f0783 --- /dev/null +++ b/ebill_postfinance_stock/models/__init__.py @@ -0,0 +1 @@ +from . import ebill_postfinance_invoice_message diff --git a/ebill_postfinance_stock/models/ebill_postfinance_invoice_message.py b/ebill_postfinance_stock/models/ebill_postfinance_invoice_message.py new file mode 100644 index 000000000..89bda52eb --- /dev/null +++ b/ebill_postfinance_stock/models/ebill_postfinance_invoice_message.py @@ -0,0 +1,24 @@ +# Copyright 2022 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +import os + +from odoo import models +from odoo.modules.module import get_module_root + +MODULE_PATH = get_module_root(os.path.dirname(__file__)) +INVOICE_LINE_STOCK_TEMPLATE = "invoice-line-stock-yellowbill.jinja" +TEMPLATE_DIR = [MODULE_PATH + "/messages"] + + +class EbillPostfinanceInvoiceMessage(models.Model): + _inherit = "ebill.postfinance.invoice.message" + + def _get_jinja_env(self, template_dir): + template_dir += TEMPLATE_DIR + return super()._get_jinja_env(template_dir) + + def _get_payload_params_yb(self): + params = super()._get_payload_params_yb() + params["invoice_line_stock_template"] = INVOICE_LINE_STOCK_TEMPLATE + return params diff --git a/ebill_postfinance_stock/readme/CONTRIBUTORS.rst b/ebill_postfinance_stock/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..0dd376fae --- /dev/null +++ b/ebill_postfinance_stock/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Thierry Ducrest diff --git a/ebill_postfinance_stock/readme/DESCRIPTION.rst b/ebill_postfinance_stock/readme/DESCRIPTION.rst new file mode 100644 index 000000000..4789bf4f1 --- /dev/null +++ b/ebill_postfinance_stock/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module adds some information related to delivery in the eBill Postfinance integration. diff --git a/ebill_postfinance_stock/tests/__init__.py b/ebill_postfinance_stock/tests/__init__.py new file mode 100644 index 000000000..d5235b1f0 --- /dev/null +++ b/ebill_postfinance_stock/tests/__init__.py @@ -0,0 +1 @@ +from . import test_ebill_postfinance_message_yb diff --git a/ebill_postfinance_stock/tests/examples/invoice_qr_yb.xml b/ebill_postfinance_stock/tests/examples/invoice_qr_yb.xml new file mode 100644 index 000000000..cb9bb2e45 --- /dev/null +++ b/ebill_postfinance_stock/tests/examples/invoice_qr_yb.xml @@ -0,0 +1,192 @@ + + +
+ Camptocamp SA + IPECeBILLServer + CreateybInvoice + 1 + 2.0 + 0 + Odoo + 14.0 +
+ + + 41101000001021209 + 41010198248040391 + 2019-06-21 + $TRANSACTION_ID + PDFAppendix + + + +
+ BILL + INV_TEST_01 + 2019-06-21 + + VAT + +
+ Camptocamp SA + StreetOne + 1015 + Lausanne + CH + info@camptocamp.com +
+ CHE012345678 +
+
+ + + $CUSTOMER_ID +
+ Test RAD Customer XML + Teststrasse 100 + This is a very long street name that should be sna + 1700 + Fribourg + CH +
+ +
+
+ +
+ Test RAD Customer XML + 1700 + Fribourg + CH + +
+
+ + 2019-06-21 + 2019-06-21 + + CHF + + + 1 + OrderReference + CustomerRef + + 2019-06-01 + + en + + 2019-07-01 + IBAN + Yes + + 777 + Reserve + CH2130808001234567827 + 210000000003139471430009017 + + + +
+ + + NORMAL + 1 + Product Q & A + 370003021 + 4.0 + Units + 1 + + + 7.7 + 37.88 + 492.0 + 529.88 + + 37.88 + + 529.88 + 492.0 + + 2 + OrderNumberBySupplier + Order123 + + + 3 + OrderNumberByBuyer + CustomerRef + + + 4 + DeliveryNoteNumber + Picking Name + + + + NORMAL + 2 + Product With a Very Long Name That Need To Be Truncated + 370003022 + 1.0 + Units + 1 + + + 7.7 + 0.0 + 0.0 + 0.0 + + 0.0 + + 0.0 + 0.0 + + 5 + OrderNumberBySupplier + Order123 + + + 6 + OrderNumberByBuyer + CustomerRef + + + 7 + DeliveryNoteNumber + Picking Name + + + + NORMAL + 3 + Phone support + 4.0 + PCE + 1 + 0.0 + 0.0 + + + + + + 7.7 + 37.88 + 492.0 + 529.88 + + 37.88 + + 492.0 + 529.88 + + 529.88 + +
+ + + +
diff --git a/ebill_postfinance_stock/tests/test_ebill_postfinance_message_yb.py b/ebill_postfinance_stock/tests/test_ebill_postfinance_message_yb.py new file mode 100644 index 000000000..30d9b5fdf --- /dev/null +++ b/ebill_postfinance_stock/tests/test_ebill_postfinance_message_yb.py @@ -0,0 +1,60 @@ +# Copyright 2022 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from string import Template + +from freezegun import freeze_time +from lxml import etree as ET + +from odoo.modules.module import get_module_path +from odoo.tools import file_open + +from odoo.addons.ebill_postfinance.tests.common import CommonCase + + +@freeze_time("2019-06-21 09:06:00") +class TestEbillPostfinanceMessageYB(CommonCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.schema_file = ( + get_module_path("ebill_postfinance") + "/messages/ybInvoice_V2.0.4.xsd" + ) + cls.pickings = cls.sale.order_line.move_ids.mapped("picking_id") + cls.pickings[0].name = "Picking Name" + for line in cls.pickings.move_lines.move_line_ids: + line.qty_done = line.product_qty + cls.pickings._action_done() + + def test_invoice_qr(self): + """Check XML payload genetated for an invoice.""" + self.invoice.name = "INV_TEST_01" + self.invoice.invoice_date_due = "2019-07-01" + message = self.invoice.create_postfinance_ebill() + message.set_transaction_id() + message.payload = message._generate_payload_yb() + # Validate the xml generated on top of the xsd schema + node = ET.fromstring(message.payload.encode("utf-8")) + self.assertXmlValidXSchema(node, xschema=None, filename=self.schema_file) + # Remove the PDF file data from the XML to ease diff check + lines = message.payload.splitlines() + for pos, line in enumerate(lines): + if line.find("MimeType") != -1: + lines.pop(pos) + break + payload = "\n".join(lines).encode("utf8") + # Prepare the XML file that is expected + expected_tmpl = Template( + file_open("ebill_postfinance_stock/tests/examples/invoice_qr_yb.xml").read() + ) + expected = expected_tmpl.substitute( + TRANSACTION_ID=message.transaction_id, CUSTOMER_ID=self.customer.id + ).encode("utf8") + # Remove the comments in the expected xml + expected_nocomment = [ + line + for line in expected.split(b"\n") + if not line.lstrip().startswith(b" +

Beta License: AGPL-3 OCA/l10n-switzerland Translate me on Weblate Try me on Runboat

+

This module adds some information related to delivery in the eBill Postfinance integration.

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Camptocamp
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainer:

+

TDu

+

This module is part of the OCA/l10n-switzerland project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+ + + diff --git a/setup/ebill_postfinance_stock/odoo/addons/ebill_postfinance_stock b/setup/ebill_postfinance_stock/odoo/addons/ebill_postfinance_stock new file mode 120000 index 000000000..fff1ded63 --- /dev/null +++ b/setup/ebill_postfinance_stock/odoo/addons/ebill_postfinance_stock @@ -0,0 +1 @@ +../../../../ebill_postfinance_stock \ No newline at end of file diff --git a/setup/ebill_postfinance_stock/setup.py b/setup/ebill_postfinance_stock/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/ebill_postfinance_stock/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) From 9f85d29d0db80664b3317d798c40d68f3d212b85 Mon Sep 17 00:00:00 2001 From: Thierry Ducrest Date: Wed, 13 Dec 2023 16:55:10 +0100 Subject: [PATCH 11/17] ebill_postfinance_stock: migrate to v16 --- ebill_postfinance_stock/README.rst | 2 +- ebill_postfinance_stock/__manifest__.py | 2 +- ebill_postfinance_stock/static/description/index.html | 2 +- .../tests/test_ebill_postfinance_message_yb.py | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ebill_postfinance_stock/README.rst b/ebill_postfinance_stock/README.rst index bc9fb22d3..c28c170aa 100644 --- a/ebill_postfinance_stock/README.rst +++ b/ebill_postfinance_stock/README.rst @@ -7,7 +7,7 @@ eBill Postfinance Stock !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:9b60c00dbeaf81912bbe2a0f425b8abe5e812b6fd95bd7f01512bfc84289fae8 + !! source digest: sha256:d560906a22ebe7ea9c8860c9debf497de39154cb16cf9b93cdf7123f96203532 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/ebill_postfinance_stock/__manifest__.py b/ebill_postfinance_stock/__manifest__.py index fdea40247..5d826a902 100644 --- a/ebill_postfinance_stock/__manifest__.py +++ b/ebill_postfinance_stock/__manifest__.py @@ -4,7 +4,7 @@ { "name": "eBill Postfinance Stock", "summary": """Add stock integration to Postfinance eBill""", - "version": "14.0.1.0.0", + "version": "16.0.1.0.0", "license": "AGPL-3", "author": "Camptocamp,Odoo Community Association (OCA)", "maintainers": ["TDu"], diff --git a/ebill_postfinance_stock/static/description/index.html b/ebill_postfinance_stock/static/description/index.html index d8d8f1386..ace8fe588 100644 --- a/ebill_postfinance_stock/static/description/index.html +++ b/ebill_postfinance_stock/static/description/index.html @@ -367,7 +367,7 @@

eBill Postfinance Stock

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:9b60c00dbeaf81912bbe2a0f425b8abe5e812b6fd95bd7f01512bfc84289fae8 +!! source digest: sha256:d560906a22ebe7ea9c8860c9debf497de39154cb16cf9b93cdf7123f96203532 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/l10n-switzerland Translate me on Weblate Try me on Runboat

This module adds some information related to delivery in the eBill Postfinance integration.

diff --git a/ebill_postfinance_stock/tests/test_ebill_postfinance_message_yb.py b/ebill_postfinance_stock/tests/test_ebill_postfinance_message_yb.py index 30d9b5fdf..3162f32f6 100644 --- a/ebill_postfinance_stock/tests/test_ebill_postfinance_message_yb.py +++ b/ebill_postfinance_stock/tests/test_ebill_postfinance_message_yb.py @@ -22,8 +22,8 @@ def setUpClass(cls): ) cls.pickings = cls.sale.order_line.move_ids.mapped("picking_id") cls.pickings[0].name = "Picking Name" - for line in cls.pickings.move_lines.move_line_ids: - line.qty_done = line.product_qty + for line in cls.pickings.move_ids.move_line_ids: + line.qty_done = line.reserved_qty cls.pickings._action_done() def test_invoice_qr(self): From 9194959aa8c542f71e4fc8384b38a10fea06de75 Mon Sep 17 00:00:00 2001 From: Thierry Ducrest Date: Mon, 14 Feb 2022 10:08:43 +0100 Subject: [PATCH 12/17] Add ebill_postfinance_server_env --- ebill_postfinance_server_env/README.rst | 87 ++++ ebill_postfinance_server_env/__init__.py | 1 + ebill_postfinance_server_env/__manifest__.py | 13 + .../models/__init__.py | 1 + .../models/ebill_postfinance_service.py | 17 + .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 12 + .../static/description/index.html | 431 ++++++++++++++++++ 8 files changed, 563 insertions(+) create mode 100644 ebill_postfinance_server_env/README.rst create mode 100644 ebill_postfinance_server_env/__init__.py create mode 100644 ebill_postfinance_server_env/__manifest__.py create mode 100644 ebill_postfinance_server_env/models/__init__.py create mode 100644 ebill_postfinance_server_env/models/ebill_postfinance_service.py create mode 100644 ebill_postfinance_server_env/readme/CONTRIBUTORS.rst create mode 100644 ebill_postfinance_server_env/readme/DESCRIPTION.rst create mode 100644 ebill_postfinance_server_env/static/description/index.html diff --git a/ebill_postfinance_server_env/README.rst b/ebill_postfinance_server_env/README.rst new file mode 100644 index 000000000..9e6e2efdd --- /dev/null +++ b/ebill_postfinance_server_env/README.rst @@ -0,0 +1,87 @@ +======================================== +Server environment for eBill Postfinance +======================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:c93ce80916831830e4dbff8df6684e8b3dd53d0506f2c25d142d3d775a981907 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fl10n--switzerland-lightgray.png?logo=github + :target: https://github.com/OCA/l10n-switzerland/tree/14.0/ebill_postfinance_server_env + :alt: OCA/l10n-switzerland +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/l10n-switzerland-14-0/l10n-switzerland-14-0-ebill_postfinance_server_env + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/l10n-switzerland&target_branch=14.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module is based on the `server_environment` module to use files for +configuration. So we can have different configuration for each +environment (dev, test, integration, prod). + +This module define the config variables for the `ebill_postfinance` module. + +Exemple of the section to put in the configuration file:: + + [postfinance_service.name_of_the_service] + use_test_service": True, + username": username, + password": password, + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Camptocamp + +Contributors +~~~~~~~~~~~~ + +* Thierry Ducrest + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/l10n-switzerland `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/ebill_postfinance_server_env/__init__.py b/ebill_postfinance_server_env/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/ebill_postfinance_server_env/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/ebill_postfinance_server_env/__manifest__.py b/ebill_postfinance_server_env/__manifest__.py new file mode 100644 index 000000000..77c474c22 --- /dev/null +++ b/ebill_postfinance_server_env/__manifest__.py @@ -0,0 +1,13 @@ +# Copyright 2022 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +{ + "name": "Server environment for eBill Postfinance", + "version": "14.0.1.0.0", + "author": "Camptocamp, Odoo Community Association (OCA)", + "license": "AGPL-3", + "category": "Tools", + "depends": ["server_environment", "ebill_postfinance"], + "website": "https://github.com/OCA/l10n-switzerland", + "installable": True, +} diff --git a/ebill_postfinance_server_env/models/__init__.py b/ebill_postfinance_server_env/models/__init__.py new file mode 100644 index 000000000..0342dfa28 --- /dev/null +++ b/ebill_postfinance_server_env/models/__init__.py @@ -0,0 +1 @@ +from . import ebill_postfinance_service diff --git a/ebill_postfinance_server_env/models/ebill_postfinance_service.py b/ebill_postfinance_server_env/models/ebill_postfinance_service.py new file mode 100644 index 000000000..c636fdcf5 --- /dev/null +++ b/ebill_postfinance_server_env/models/ebill_postfinance_service.py @@ -0,0 +1,17 @@ +# Copyright 2022 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from odoo import models + + +class EbillPostfinanceService(models.Model): + _name = "ebill.postfinance.service" + _inherit = ["ebill.postfinance.service", "server.env.mixin"] + + @property + def _server_env_fields(self): + return { + "use_test_service": {}, + "username": {}, + "password": {}, + } diff --git a/ebill_postfinance_server_env/readme/CONTRIBUTORS.rst b/ebill_postfinance_server_env/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..0dd376fae --- /dev/null +++ b/ebill_postfinance_server_env/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Thierry Ducrest diff --git a/ebill_postfinance_server_env/readme/DESCRIPTION.rst b/ebill_postfinance_server_env/readme/DESCRIPTION.rst new file mode 100644 index 000000000..39b6b51e4 --- /dev/null +++ b/ebill_postfinance_server_env/readme/DESCRIPTION.rst @@ -0,0 +1,12 @@ +This module is based on the `server_environment` module to use files for +configuration. So we can have different configuration for each +environment (dev, test, integration, prod). + +This module define the config variables for the `ebill_postfinance` module. + +Exemple of the section to put in the configuration file:: + + [postfinance_service.name_of_the_service] + use_test_service": True, + username": username, + password": password, diff --git a/ebill_postfinance_server_env/static/description/index.html b/ebill_postfinance_server_env/static/description/index.html new file mode 100644 index 000000000..7f4076d0e --- /dev/null +++ b/ebill_postfinance_server_env/static/description/index.html @@ -0,0 +1,431 @@ + + + + + + +Server environment for eBill Postfinance + + + +
+

Server environment for eBill Postfinance

+ + +

Beta License: AGPL-3 OCA/l10n-switzerland Translate me on Weblate Try me on Runboat

+

This module is based on the server_environment module to use files for +configuration. So we can have different configuration for each +environment (dev, test, integration, prod).

+

This module define the config variables for the ebill_postfinance module.

+

Exemple of the section to put in the configuration file:

+
+[postfinance_service.name_of_the_service]
+use_test_service": True,
+username": username,
+password": password,
+
+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Camptocamp
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/l10n-switzerland project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + From 0b85664f041333ac0738e75a2502490516b9560a Mon Sep 17 00:00:00 2001 From: oca-travis Date: Wed, 6 Dec 2023 13:02:17 +0000 Subject: [PATCH 13/17] [UPD] Update ebill_postfinance_server_env.pot --- .../i18n/ebill_postfinance_server_env.pot | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 ebill_postfinance_server_env/i18n/ebill_postfinance_server_env.pot diff --git a/ebill_postfinance_server_env/i18n/ebill_postfinance_server_env.pot b/ebill_postfinance_server_env/i18n/ebill_postfinance_server_env.pot new file mode 100644 index 000000000..acdce5705 --- /dev/null +++ b/ebill_postfinance_server_env/i18n/ebill_postfinance_server_env.pot @@ -0,0 +1,39 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * ebill_postfinance_server_env +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: ebill_postfinance_server_env +#: model:ir.model.fields,field_description:ebill_postfinance_server_env.field_ebill_postfinance_service__display_name +msgid "Display Name" +msgstr "" + +#. module: ebill_postfinance_server_env +#: model:ir.model.fields,field_description:ebill_postfinance_server_env.field_ebill_postfinance_service__id +msgid "ID" +msgstr "" + +#. module: ebill_postfinance_server_env +#: model:ir.model.fields,field_description:ebill_postfinance_server_env.field_ebill_postfinance_service____last_update +msgid "Last Modified on" +msgstr "" + +#. module: ebill_postfinance_server_env +#: model:ir.model,name:ebill_postfinance_server_env.model_ebill_postfinance_service +msgid "Postfinance eBill service configuration" +msgstr "" + +#. module: ebill_postfinance_server_env +#: model:ir.model.fields,field_description:ebill_postfinance_server_env.field_ebill_postfinance_service__server_env_defaults +msgid "Server Env Defaults" +msgstr "" From 679139f754406921b4bd79060bf5c4005f70f6fd Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 6 Dec 2023 13:08:32 +0000 Subject: [PATCH 14/17] [BOT] post-merge updates --- .../static/description/icon.png | Bin 0 -> 9455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ebill_postfinance_server_env/static/description/icon.png diff --git a/ebill_postfinance_server_env/static/description/icon.png b/ebill_postfinance_server_env/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 zcmW++2RxMjAAjx~&dlBk9S+%}OXg)AGE&Cb*&}d0jUxM@u(PQx^-s)697TX`ehR4?GS^qbkof1cslKgkU)h65qZ9Oc=ml_0temigYLJfnz{IDzUf>bGs4N!v3=Z3jMq&A#7%rM5eQ#dc?k~! zVpnB`o+K7|Al`Q_U;eD$B zfJtP*jH`siUq~{KE)`jP2|#TUEFGRryE2`i0**z#*^6~AI|YzIWy$Cu#CSLW3q=GA z6`?GZymC;dCPk~rBS%eCb`5OLr;RUZ;D`}um=H)BfVIq%7VhiMr)_#G0N#zrNH|__ zc+blN2UAB0=617@>_u;MPHN;P;N#YoE=)R#i$k_`UAA>WWCcEVMh~L_ zj--gtp&|K1#58Yz*AHCTMziU1Jzt_jG0I@qAOHsk$2}yTmVkBp_eHuY$A9)>P6o~I z%aQ?!(GqeQ-Y+b0I(m9pwgi(IIZZzsbMv+9w{PFtd_<_(LA~0H(xz{=FhLB@(1&qHA5EJw1>>=%q2f&^X>IQ{!GJ4e9U z&KlB)z(84HmNgm2hg2C0>WM{E(DdPr+EeU_N@57;PC2&DmGFW_9kP&%?X4}+xWi)( z;)z%wI5>D4a*5XwD)P--sPkoY(a~WBw;E~AW`Yue4kFa^LM3X`8x|}ZUeMnqr}>kH zG%WWW>3ml$Yez?i%)2pbKPI7?5o?hydokgQyZsNEr{a|mLdt;X2TX(#B1j35xPnPW z*bMSSOauW>o;*=kO8ojw91VX!qoOQb)zHJ!odWB}d+*K?#sY_jqPdg{Sm2HdYzdEx zOGVPhVRTGPtv0o}RfVP;Nd(|CB)I;*t&QO8h zFfekr30S!-LHmV_Su-W+rEwYXJ^;6&3|L$mMC8*bQptyOo9;>Qb9Q9`ySe3%V$A*9 zeKEe+b0{#KWGp$F+tga)0RtI)nhMa-K@JS}2krK~n8vJ=Ngm?R!9G<~RyuU0d?nz# z-5EK$o(!F?hmX*2Yt6+coY`6jGbb7tF#6nHA zuKk=GGJ;ZwON1iAfG$E#Y7MnZVmrY|j0eVI(DN_MNFJmyZ|;w4tf@=CCDZ#5N_0K= z$;R~bbk?}TpfDjfB&aiQ$VA}s?P}xPERJG{kxk5~R`iRS(SK5d+Xs9swCozZISbnS zk!)I0>t=A<-^z(cmSFz3=jZ23u13X><0b)P)^1T_))Kr`e!-pb#q&J*Q`p+B6la%C zuVl&0duN<;uOsB3%T9Fp8t{ED108<+W(nOZd?gDnfNBC3>M8WE61$So|P zVvqH0SNtDTcsUdzaMDpT=Ty0pDHHNL@Z0w$Y`XO z2M-_r1S+GaH%pz#Uy0*w$Vdl=X=rQXEzO}d6J^R6zjM1u&c9vYLvLp?W7w(?np9x1 zE_0JSAJCPB%i7p*Wvg)pn5T`8k3-uR?*NT|J`eS#_#54p>!p(mLDvmc-3o0mX*mp_ zN*AeS<>#^-{S%W<*mz^!X$w_2dHWpcJ6^j64qFBft-o}o_Vx80o0>}Du;>kLts;$8 zC`7q$QI(dKYG`Wa8#wl@V4jVWBRGQ@1dr-hstpQL)Tl+aqVpGpbSfN>5i&QMXfiZ> zaA?T1VGe?rpQ@;+pkrVdd{klI&jVS@I5_iz!=UMpTsa~mBga?1r}aRBm1WS;TT*s0f0lY=JBl66Upy)-k4J}lh=P^8(SXk~0xW=T9v*B|gzIhN z>qsO7dFd~mgxAy4V?&)=5ieYq?zi?ZEoj)&2o)RLy=@hbCRcfT5jigwtQGE{L*8<@Yd{zg;CsL5mvzfDY}P-wos_6PfprFVaeqNE%h zKZhLtcQld;ZD+>=nqN~>GvROfueSzJD&BE*}XfU|H&(FssBqY=hPCt`d zH?@s2>I(|;fcW&YM6#V#!kUIP8$Nkdh0A(bEVj``-AAyYgwY~jB zT|I7Bf@%;7aL7Wf4dZ%VqF$eiaC38OV6oy3Z#TER2G+fOCd9Iaoy6aLYbPTN{XRPz z;U!V|vBf%H!}52L2gH_+j;`bTcQRXB+y9onc^wLm5wi3-Be}U>k_u>2Eg$=k!(l@I zcCg+flakT2Nej3i0yn+g+}%NYb?ta;R?(g5SnwsQ49U8Wng8d|{B+lyRcEDvR3+`O{zfmrmvFrL6acVP%yG98X zo&+VBg@px@i)%o?dG(`T;n*$S5*rnyiR#=wW}}GsAcfyQpE|>a{=$Hjg=-*_K;UtD z#z-)AXwSRY?OPefw^iI+ z)AXz#PfEjlwTes|_{sB?4(O@fg0AJ^g8gP}ex9Ucf*@_^J(s_5jJV}c)s$`Myn|Kd z$6>}#q^n{4vN@+Os$m7KV+`}c%4)4pv@06af4-x5#wj!KKb%caK{A&Y#Rfs z-po?Dcb1({W=6FKIUirH&(yg=*6aLCekcKwyfK^JN5{wcA3nhO(o}SK#!CINhI`-I z1)6&n7O&ZmyFMuNwvEic#IiOAwNkR=u5it{B9n2sAJV5pNhar=j5`*N!Na;c7g!l$ z3aYBqUkqqTJ=Re-;)s!EOeij=7SQZ3Hq}ZRds%IM*PtM$wV z@;rlc*NRK7i3y5BETSKuumEN`Xu_8GP1Ri=OKQ$@I^ko8>H6)4rjiG5{VBM>B|%`&&s^)jS|-_95&yc=GqjNo{zFkw%%HHhS~e=s zD#sfS+-?*t|J!+ozP6KvtOl!R)@@-z24}`9{QaVLD^9VCSR2b`b!KC#o;Ki<+wXB6 zx3&O0LOWcg4&rv4QG0)4yb}7BFSEg~=IR5#ZRj8kg}dS7_V&^%#Do==#`u zpy6{ox?jWuR(;pg+f@mT>#HGWHAJRRDDDv~@(IDw&R>9643kK#HN`!1vBJHnC+RM&yIh8{gG2q zA%e*U3|N0XSRa~oX-3EAneep)@{h2vvd3Xvy$7og(sayr@95+e6~Xvi1tUqnIxoIH zVWo*OwYElb#uyW{Imam6f2rGbjR!Y3`#gPqkv57dB6K^wRGxc9B(t|aYDGS=m$&S!NmCtrMMaUg(c zc2qC=2Z`EEFMW-me5B)24AqF*bV5Dr-M5ig(l-WPS%CgaPzs6p_gnCIvTJ=Y<6!gT zVt@AfYCzjjsMEGi=rDQHo0yc;HqoRNnNFeWZgcm?f;cp(6CNylj36DoL(?TS7eU#+ z7&mfr#y))+CJOXQKUMZ7QIdS9@#-}7y2K1{8)cCt0~-X0O!O?Qx#E4Og+;A2SjalQ zs7r?qn0H044=sDN$SRG$arw~n=+T_DNdSrarmu)V6@|?1-ZB#hRn`uilTGPJ@fqEy zGt(f0B+^JDP&f=r{#Y_wi#AVDf-y!RIXU^0jXsFpf>=Ji*TeqSY!H~AMbJdCGLhC) zn7Rx+sXw6uYj;WRYrLd^5IZq@6JI1C^YkgnedZEYy<&4(z%Q$5yv#Boo{AH8n$a zhb4Y3PWdr269&?V%uI$xMcUrMzl=;w<_nm*qr=c3Rl@i5wWB;e-`t7D&c-mcQl7x! zZWB`UGcw=Y2=}~wzrfLx=uet<;m3~=8I~ZRuzvMQUQdr+yTV|ATf1Uuomr__nDf=X zZ3WYJtHp_ri(}SQAPjv+Y+0=fH4krOP@S&=zZ-t1jW1o@}z;xk8 z(Nz1co&El^HK^NrhVHa-_;&88vTU>_J33=%{if;BEY*J#1n59=07jrGQ#IP>@u#3A z;!q+E1Rj3ZJ+!4bq9F8PXJ@yMgZL;>&gYA0%_Kbi8?S=XGM~dnQZQ!yBSgcZhY96H zrWnU;k)qy`rX&&xlDyA%(a1Hhi5CWkmg(`Gb%m(HKi-7Z!LKGRP_B8@`7&hdDy5n= z`OIxqxiVfX@OX1p(mQu>0Ai*v_cTMiw4qRt3~NBvr9oBy0)r>w3p~V0SCm=An6@3n)>@z!|o-$HvDK z|3D2ZMJkLE5loMKl6R^ez@Zz%S$&mbeoqH5`Bb){Ei21q&VP)hWS2tjShfFtGE+$z zzCR$P#uktu+#!w)cX!lWN1XU%K-r=s{|j?)Akf@q#3b#{6cZCuJ~gCxuMXRmI$nGtnH+-h z+GEi!*X=AP<|fG`1>MBdTb?28JYc=fGvAi2I<$B(rs$;eoJCyR6_bc~p!XR@O-+sD z=eH`-ye})I5ic1eL~TDmtfJ|8`0VJ*Yr=hNCd)G1p2MMz4C3^Mj?7;!w|Ly%JqmuW zlIEW^Ft%z?*|fpXda>Jr^1noFZEwFgVV%|*XhH@acv8rdGxeEX{M$(vG{Zw+x(ei@ zmfXb22}8-?Fi`vo-YVrTH*C?a8%M=Hv9MqVH7H^J$KsD?>!SFZ;ZsvnHr_gn=7acz z#W?0eCdVhVMWN12VV^$>WlQ?f;P^{(&pYTops|btm6aj>_Uz+hqpGwB)vWp0Cf5y< zft8-je~nn?W11plq}N)4A{l8I7$!ks_x$PXW-2XaRFswX_BnF{R#6YIwMhAgd5F9X zGmwdadS6(a^fjHtXg8=l?Rc0Sm%hk6E9!5cLVloEy4eh(=FwgP`)~I^5~pBEWo+F6 zSf2ncyMurJN91#cJTy_u8Y}@%!bq1RkGC~-bV@SXRd4F{R-*V`bS+6;W5vZ(&+I<9$;-V|eNfLa5n-6% z2(}&uGRF;p92eS*sE*oR$@pexaqr*meB)VhmIg@h{uzkk$9~qh#cHhw#>O%)b@+(| z^IQgqzuj~Sk(J;swEM-3TrJAPCq9k^^^`q{IItKBRXYe}e0Tdr=Huf7da3$l4PdpwWDop%^}n;dD#K4s#DYA8SHZ z&1!riV4W4R7R#C))JH1~axJ)RYnM$$lIR%6fIVA@zV{XVyx}C+a-Dt8Y9M)^KU0+H zR4IUb2CJ{Hg>CuaXtD50jB(_Tcx=Z$^WYu2u5kubqmwp%drJ6 z?Fo40g!Qd<-l=TQxqHEOuPX0;^z7iX?Ke^a%XT<13TA^5`4Xcw6D@Ur&VT&CUe0d} z1GjOVF1^L@>O)l@?bD~$wzgf(nxX1OGD8fEV?TdJcZc2KoUe|oP1#=$$7ee|xbY)A zDZq+cuTpc(fFdj^=!;{k03C69lMQ(|>uhRfRu%+!k&YOi-3|1QKB z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 From 3ff5f5872a74f0f70a90fc4c3480aa2663d29691 Mon Sep 17 00:00:00 2001 From: Thierry Ducrest Date: Thu, 14 Dec 2023 16:19:39 +0100 Subject: [PATCH 15/17] [MIG] ebill_postfinance_server_env: Migration to 16 --- ebill_postfinance_server_env/README.rst | 12 ++++++------ ebill_postfinance_server_env/__manifest__.py | 3 ++- .../static/description/index.html | 8 ++++---- .../odoo/addons/ebill_postfinance_server_env | 1 + setup/ebill_postfinance_server_env/setup.py | 6 ++++++ 5 files changed, 19 insertions(+), 11 deletions(-) create mode 120000 setup/ebill_postfinance_server_env/odoo/addons/ebill_postfinance_server_env create mode 100644 setup/ebill_postfinance_server_env/setup.py diff --git a/ebill_postfinance_server_env/README.rst b/ebill_postfinance_server_env/README.rst index 9e6e2efdd..4f5f069ef 100644 --- a/ebill_postfinance_server_env/README.rst +++ b/ebill_postfinance_server_env/README.rst @@ -7,7 +7,7 @@ Server environment for eBill Postfinance !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:c93ce80916831830e4dbff8df6684e8b3dd53d0506f2c25d142d3d775a981907 + !! source digest: sha256:de89f67310399aa6681c254c4f41c84a30e84c8e9ab58449f0261a8554d498c9 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png @@ -17,13 +17,13 @@ Server environment for eBill Postfinance :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fl10n--switzerland-lightgray.png?logo=github - :target: https://github.com/OCA/l10n-switzerland/tree/14.0/ebill_postfinance_server_env + :target: https://github.com/OCA/l10n-switzerland/tree/16.0/ebill_postfinance_server_env :alt: OCA/l10n-switzerland .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/l10n-switzerland-14-0/l10n-switzerland-14-0-ebill_postfinance_server_env + :target: https://translation.odoo-community.org/projects/l10n-switzerland-16-0/l10n-switzerland-16-0-ebill_postfinance_server_env :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/l10n-switzerland&target_branch=14.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/l10n-switzerland&target_branch=16.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -52,7 +52,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -82,6 +82,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. -This module is part of the `OCA/l10n-switzerland `_ project on GitHub. +This module is part of the `OCA/l10n-switzerland `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/ebill_postfinance_server_env/__manifest__.py b/ebill_postfinance_server_env/__manifest__.py index 77c474c22..490aee782 100644 --- a/ebill_postfinance_server_env/__manifest__.py +++ b/ebill_postfinance_server_env/__manifest__.py @@ -3,11 +3,12 @@ { "name": "Server environment for eBill Postfinance", - "version": "14.0.1.0.0", + "version": "16.0.1.0.0", "author": "Camptocamp, Odoo Community Association (OCA)", "license": "AGPL-3", "category": "Tools", "depends": ["server_environment", "ebill_postfinance"], "website": "https://github.com/OCA/l10n-switzerland", + "auto_install": True, "installable": True, } diff --git a/ebill_postfinance_server_env/static/description/index.html b/ebill_postfinance_server_env/static/description/index.html index 7f4076d0e..5bfcbf407 100644 --- a/ebill_postfinance_server_env/static/description/index.html +++ b/ebill_postfinance_server_env/static/description/index.html @@ -367,9 +367,9 @@

Server environment for eBill Postfinance

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:c93ce80916831830e4dbff8df6684e8b3dd53d0506f2c25d142d3d775a981907 +!! source digest: sha256:de89f67310399aa6681c254c4f41c84a30e84c8e9ab58449f0261a8554d498c9 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/l10n-switzerland Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/l10n-switzerland Translate me on Weblate Try me on Runboat

This module is based on the server_environment module to use files for configuration. So we can have different configuration for each environment (dev, test, integration, prod).

@@ -398,7 +398,7 @@

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -422,7 +422,7 @@

Maintainers

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

-

This module is part of the OCA/l10n-switzerland project on GitHub.

+

This module is part of the OCA/l10n-switzerland project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

diff --git a/setup/ebill_postfinance_server_env/odoo/addons/ebill_postfinance_server_env b/setup/ebill_postfinance_server_env/odoo/addons/ebill_postfinance_server_env new file mode 120000 index 000000000..c6e0fe813 --- /dev/null +++ b/setup/ebill_postfinance_server_env/odoo/addons/ebill_postfinance_server_env @@ -0,0 +1 @@ +../../../../ebill_postfinance_server_env \ No newline at end of file diff --git a/setup/ebill_postfinance_server_env/setup.py b/setup/ebill_postfinance_server_env/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/ebill_postfinance_server_env/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) From 7f7b5b878d2f8447160fd7053ec20508687863e0 Mon Sep 17 00:00:00 2001 From: Thierry Ducrest Date: Fri, 15 Dec 2023 10:49:02 +0100 Subject: [PATCH 16/17] ebill_postfinance: remove queue job dependency Now that `account_invoice_export` does not requires it anymore. --- ebill_postfinance/README.rst | 2 +- ebill_postfinance/__manifest__.py | 1 - ebill_postfinance/static/description/index.html | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/ebill_postfinance/README.rst b/ebill_postfinance/README.rst index 651f3ecda..d644904e9 100644 --- a/ebill_postfinance/README.rst +++ b/ebill_postfinance/README.rst @@ -7,7 +7,7 @@ eBill Postfinance !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:0cd6ce9cf9fb6862a9630738b19a5f8a256ee1921806c04b8906f9771878712e + !! source digest: sha256:8fe54c201370aabd37f966becd9bc102925267307e434f56a4c558a943f058ed !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/ebill_postfinance/__manifest__.py b/ebill_postfinance/__manifest__.py index 34eac5ae1..dfc1fcbcb 100644 --- a/ebill_postfinance/__manifest__.py +++ b/ebill_postfinance/__manifest__.py @@ -14,7 +14,6 @@ "account_invoice_export", "base_ebill_payment_contract", "l10n_ch", - "queue_job", "sale", ], "external_dependencies": { diff --git a/ebill_postfinance/static/description/index.html b/ebill_postfinance/static/description/index.html index f2906c19a..b70067dd2 100644 --- a/ebill_postfinance/static/description/index.html +++ b/ebill_postfinance/static/description/index.html @@ -367,7 +367,7 @@

eBill Postfinance

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:0cd6ce9cf9fb6862a9630738b19a5f8a256ee1921806c04b8906f9771878712e +!! source digest: sha256:8fe54c201370aabd37f966becd9bc102925267307e434f56a4c558a943f058ed !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/l10n-switzerland Translate me on Weblate Try me on Runboat

This module implements the exchange of electronic invoices with the Postfinance web service.

From 33ef17dbf9e66fc21cc6f75bf9c4e34806f0d7a6 Mon Sep 17 00:00:00 2001 From: Thierry Ducrest Date: Tue, 9 Jan 2024 17:07:53 +0100 Subject: [PATCH 17/17] ebill_postfinance: reduce payload size saved in the db --- .../ebill_postfinance_invoice_message.py | 38 +++++++++++++------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/ebill_postfinance/models/ebill_postfinance_invoice_message.py b/ebill_postfinance/models/ebill_postfinance_invoice_message.py index 4f305a454..6129aae79 100644 --- a/ebill_postfinance/models/ebill_postfinance_invoice_message.py +++ b/ebill_postfinance/models/ebill_postfinance_invoice_message.py @@ -74,9 +74,7 @@ class EbillPostfinanceInvoiceMessage(models.Model): ref = fields.Char("Reference No.", size=35) ebill_account_number = fields.Char("Payer Id", size=20) payload = fields.Text("Payload sent") - payload_size = fields.Float( - "Payload Size (MB)", digits=(6, 3), compute="_compute_payload_size" - ) + payload_size = fields.Float("Payload Size (MB)", digits=(6, 3), readonly=True) response = fields.Text() payment_type = fields.Selection( selection=[ @@ -90,13 +88,12 @@ class EbillPostfinanceInvoiceMessage(models.Model): readonly=True, ) - @api.depends("payload") - def _compute_payload_size(self): - for message in self: - size_in_bytes = len(message.payload) - if size_in_bytes > 0: - size_in_bytes = size_in_bytes / 1000000 - message.payload_size = size_in_bytes + @api.model + def _get_payload_size(self, payload): + size_in_bytes = len(payload) + if size_in_bytes > 0: + size_in_bytes = size_in_bytes / 1000000 + return size_in_bytes def set_transaction_id(self): self.ensure_one() @@ -144,15 +141,32 @@ def set_as_paid(self, data): record.state = "done" record.invoice_id.message_post(body=_("Invoice paid through eBilling")) + @api.model + def _remove_pdf_data_from_payload(self, data): + """Minimize payload size to be kept. + + Remove the node containing the pdf data from the xml. + + """ + start_node = "" + end_node = "" + start = data.find(start_node) + if start < 0: + return data + end = data.find(end_node, start) + return data[0:start] + data[end + len(end_node) :] + def send_to_postfinance(self): # TODO: Could sent multiple with one call for message in self: message.file_type_used = message.service_id.file_type_to_use message.set_transaction_id() - message.payload = message._generate_payload() + payload = message._generate_payload() + data = payload.encode("utf-8") + message.payload = self._remove_pdf_data_from_payload(payload) + message.payload_size = self._get_payload_size(payload) try: # TODO: Handle file type from service configuation - data = message.payload.encode("utf-8") res = message.service_id.upload_file( message.transaction_id, message.file_type_used, data )