From 56e0c32709a722e8f4afb1df61686078e0515e4b Mon Sep 17 00:00:00 2001
From: Thierry Ducrest
Date: Mon, 14 Feb 2022 10:08:43 +0100
Subject: [PATCH 01/19] 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
+
+
+
+
This module implements the exchange of electronic invoices with the Postfinance web service.
+
Table of contents
+
+
+
+
+
+
+
+
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.
+
+
+
+
+
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.
+
+
+
+
+
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.
+
+
+
+
+
+
+
+
This module is maintained by the OCA.
+
+
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 :
+
+
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
+
+
+
+
+
+ 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MS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczpwZGY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGRmLzEuMy8iCiAgICAgICAgICAgIHhtbG5zOnBkZng9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGRmeC8xLjMvIj4KICAgICAgICAgPHhtcDpNb2RpZnlEYXRlPjIwMjAtMDYtMjRUMDk6MjI6MjArMDI6MDA8L3htcDpNb2RpZnlEYXRlPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+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: 1 2 3 5 6 7 9 50 1 2
+ 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: 1 2 3 5 6 7 9 50 1 2
+ 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/ExecutePing urn:uuid:e1116f5e-22a4-443c-9c56-3475d3fb0d1c https://ebill-ki.postfinance.ch/B2BService/B2BService.svc yb1021209 \xA3cAmp\xA3339955 41101000001021209 false false "
+ 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/ExecutePingResponse 00000000-0000-0000-0000-000000000000 urn:uuid:e1116f5e-22a4-443c-9c56-3475d3fb0d1c 2022-04-29T08:02:38.998Z 2022-04-29T08:07:38.998Z 41101000001021209
+ 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: 1 2 3 5 6 7 9 50 1 2
+ 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/SearchInvoices urn:uuid:702a1145-d198-4922-bce3-fd1101657330 https://ebill-ki.postfinance.ch/B2BService/B2BService.svc yb1021209 \xA3cAmp\xA3339955 41101000001021209 test-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/SearchInvoicesResponse 00000000-0000-0000-0000-000000000000 urn:uuid:702a1145-d198-4922-bce3-fd1101657330 2022-05-13T05:57:56.570Z 2022-05-13T06:02:56.570Z 1 1 41101000001021209 test-transaction-123 41100000259278521 340 Invalid 2022-05-13T07:32:04.38 09 TransactionID 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: 1 2 3 5 6 7 9 50 1 2
+ 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/UploadFilesReport urn:uuid:52e2cd23-f8a2-46ae-9545-283b1bb87a97 https://ebill-ki.postfinance.ch/B2BService/B2BService.svc yb1021209 \xA3cAmp\xA3339955 XML test-transaction-123 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPEVudmVsb3BlIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHR5cGU9InN0cmluZyIgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249ImZpbGU6Ly9mczA4L2JpbGxpbmckLzA0JTIwRG9rdW1lbnRhdGlvbmVuLzEwJTIwVGVjaG5pc2NoZSUyMFNjaGVtYXMvMDYlMjB5ZWxsb3diaWxsJTIwSW52b2ljZSUyMDIuMC4xLzAxJTIwQmlsbGVyJTIwSW5wdXQvMDElMjBYU0QtU2NoZW1lL3liSW52b2ljZV9WMi4wLjEueHNkIj4KCTxIZWFkZXI+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+CgkJPC9BcHBlbmRpeD4KCTwvQm9keT4KPC9FbnZlbG9wZT4K 41101000001021209 "
+ 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/UploadFilesReportResponse 00000000-0000-0000-0000-000000000000 urn:uuid:52e2cd23-f8a2-46ae-9545-283b1bb87a97 2022-05-13T04:51:26.164Z 2022-05-13T04:56:26.164Z XML 2022-05-13T06:51:26.1646559+02:00 test-transaction-123 OK
+ 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"
-
+
This module implements the exchange of electronic invoices with the Postfinance web service.
Table of contents
@@ -435,7 +435,7 @@
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.
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()
From e9f2427b78c98855a7cd9f672d101ff1a65f078f Mon Sep 17 00:00:00 2001
From: Thierry Ducrest
Date: Fri, 15 Dec 2023 10:49:02 +0100
Subject: [PATCH 07/19] 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
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
This module implements the exchange of electronic invoices with the Postfinance web service.
From a64750407798656be7653bc7281172e7ae16854f Mon Sep 17 00:00:00 2001
From: Thierry Ducrest
Date: Tue, 9 Jan 2024 17:07:53 +0100
Subject: [PATCH 08/19] 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
)
From 1053a3ceb70bf3d3d8b7ff1594bfa48d8960795f Mon Sep 17 00:00:00 2001
From: oca-ci
Date: Fri, 12 Jul 2024 10:46:21 +0000
Subject: [PATCH 09/19] [UPD] Update ebill_postfinance.pot
---
ebill_postfinance/i18n/ebill_postfinance.pot | 42 +++++++++++---------
1 file changed, 24 insertions(+), 18 deletions(-)
diff --git a/ebill_postfinance/i18n/ebill_postfinance.pot b/ebill_postfinance/i18n/ebill_postfinance.pot
index 951b66103..be5c67248 100644
--- a/ebill_postfinance/i18n/ebill_postfinance.pot
+++ b/ebill_postfinance/i18n/ebill_postfinance.pot
@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 14.0\n"
+"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -14,6 +14,7 @@ msgstr ""
"Plural-Forms: \n"
#. module: ebill_postfinance
+#. odoo-python
#: code:addons/ebill_postfinance/models/ebill_payment_contract.py:0
#, python-format
msgid "A Postfinance service is required for a Postfinance contract."
@@ -35,7 +36,6 @@ msgid "Bank account"
msgstr ""
#. module: ebill_postfinance
-#: model:ir.model.fields,field_description:ebill_postfinance.field_ebill_payment_contract__postfinance_billerid
#: model:ir.model.fields,field_description:ebill_postfinance.field_ebill_postfinance_service__biller_id
msgid "Biller ID"
msgstr ""
@@ -50,6 +50,11 @@ msgstr ""
msgid "Check payload validity"
msgstr ""
+#. module: ebill_postfinance
+#: model:ir.model.fields,field_description:ebill_postfinance.field_ebill_payment_contract__postfinance_billerid
+msgid "Contract ID"
+msgstr ""
+
#. module: ebill_postfinance
#: model:ir.model.fields,field_description:ebill_postfinance.field_ebill_postfinance_service__ebill_payment_contract_ids
#: model_terms:ir.ui.view,arch_db:ebill_postfinance.postfinance_service_form_view
@@ -84,11 +89,8 @@ msgid "Deleted"
msgstr ""
#. module: ebill_postfinance
-#: model:ir.model.fields,field_description:ebill_postfinance.field_account_move__display_name
-#: model:ir.model.fields,field_description:ebill_postfinance.field_ebill_payment_contract__display_name
#: model:ir.model.fields,field_description:ebill_postfinance.field_ebill_postfinance_invoice_message__display_name
#: model:ir.model.fields,field_description:ebill_postfinance.field_ebill_postfinance_service__display_name
-#: model:ir.model.fields,field_description:ebill_postfinance.field_sale_order__display_name
msgid "Display Name"
msgstr ""
@@ -128,6 +130,7 @@ msgid "Error code"
msgstr ""
#. module: ebill_postfinance
+#. odoo-python
#: code:addons/ebill_postfinance/models/account_move.py:0
#, python-format
msgid "Error generating postfinance eBill"
@@ -159,11 +162,8 @@ msgid "IBAN"
msgstr ""
#. module: ebill_postfinance
-#: model:ir.model.fields,field_description:ebill_postfinance.field_account_move__id
-#: model:ir.model.fields,field_description:ebill_postfinance.field_ebill_payment_contract__id
#: model:ir.model.fields,field_description:ebill_postfinance.field_ebill_postfinance_invoice_message__id
#: model:ir.model.fields,field_description:ebill_postfinance.field_ebill_postfinance_service__id
-#: model:ir.model.fields,field_description:ebill_postfinance.field_sale_order__id
msgid "ID"
msgstr ""
@@ -204,12 +204,14 @@ msgid "Invoice Messages"
msgstr ""
#. module: ebill_postfinance
+#. odoo-python
#: code:addons/ebill_postfinance/models/account_move.py:0
#, python-format
msgid "Invoice accepted by the Postfinance system"
msgstr ""
#. module: ebill_postfinance
+#. odoo-python
#: code:addons/ebill_postfinance/models/ebill_postfinance_invoice_message.py:0
#, python-format
msgid "Invoice paid through eBilling"
@@ -243,11 +245,8 @@ msgid "Journal Entry"
msgstr ""
#. module: ebill_postfinance
-#: model:ir.model.fields,field_description:ebill_postfinance.field_account_move____last_update
-#: model:ir.model.fields,field_description:ebill_postfinance.field_ebill_payment_contract____last_update
#: model:ir.model.fields,field_description:ebill_postfinance.field_ebill_postfinance_invoice_message____last_update
#: model:ir.model.fields,field_description:ebill_postfinance.field_ebill_postfinance_service____last_update
-#: model:ir.model.fields,field_description:ebill_postfinance.field_sale_order____last_update
msgid "Last Modified on"
msgstr ""
@@ -293,6 +292,11 @@ msgstr ""
msgid "Password"
msgstr ""
+#. module: ebill_postfinance
+#: model:ir.model.fields,field_description:ebill_postfinance.field_ebill_postfinance_invoice_message__ebill_account_number
+msgid "Payer Id"
+msgstr ""
+
#. module: ebill_postfinance
#: model:ir.model.fields,field_description:ebill_postfinance.field_ebill_postfinance_invoice_message__payload_size
msgid "Payload Size (MB)"
@@ -321,11 +325,7 @@ msgid ""
msgstr ""
#. module: ebill_postfinance
-#: model:ir.model.fields,field_description:ebill_postfinance.field_ebill_postfinance_invoice_message__ebill_account_number
-msgid "Paynet Id"
-msgstr ""
-
-#. module: ebill_postfinance
+#: model:transmit.method,name:ebill_postfinance.postfinance_transmit_method
#: model_terms:ir.ui.view,arch_db:ebill_postfinance.ebill_payment_contract_form_view
msgid "Postfinance"
msgstr ""
@@ -463,6 +463,12 @@ msgid "Testing"
msgstr ""
#. module: ebill_postfinance
+#: model:ir.model.fields,help:ebill_postfinance.field_ebill_payment_contract__postfinance_billerid
+msgid "The PayerID of the customer"
+msgstr ""
+
+#. module: ebill_postfinance
+#. odoo-python
#: code:addons/ebill_postfinance/models/ebill_payment_contract.py:0
#, python-format
msgid "The Postfinacnce Account ID is required for a Postfinance contract."
@@ -474,6 +480,7 @@ msgid "The Postfinance system rejected the eBill that was send."
msgstr ""
#. module: ebill_postfinance
+#. odoo-python
#: code:addons/ebill_postfinance/models/ebill_postfinance_invoice_message.py:0
#, python-format
msgid "The payload is valid."
@@ -486,7 +493,7 @@ msgstr ""
#. module: ebill_postfinance
#: model:ir.model.fields,field_description:ebill_postfinance.field_ebill_postfinance_invoice_message__transaction_id
-msgid "Transaction Id"
+msgid "Transaction"
msgstr ""
#. module: ebill_postfinance
@@ -517,7 +524,6 @@ msgstr ""
#. module: ebill_postfinance
#: model:ir.actions.server,name:ebill_postfinance.cron_search_invoices_ir_actions_server
#: model:ir.cron,cron_name:ebill_postfinance.cron_search_invoices
-#: model:ir.cron,name:ebill_postfinance.cron_search_invoices
msgid "eBill Postfinance - Check invoices state on server"
msgstr ""
From 388cd65aa1e03697fc6b1147290b0670c7019504 Mon Sep 17 00:00:00 2001
From: Thierry Ducrest
Date: Tue, 17 Sep 2024 11:44:03 +0200
Subject: [PATCH 10/19] [IMP] ebill_postfinance: black, isort, prettier
---
ebill_postfinance/README.rst | 61 +++++++++++--------
ebill_postfinance/models/account_move.py | 3 +-
.../ebill_postfinance_invoice_message.py | 2 +
.../models/ebill_postfinance_service.py | 2 +-
ebill_postfinance/models/sale_order.py | 1 -
ebill_postfinance/pyproject.toml | 3 +
ebill_postfinance/readme/CONFIGURE.md | 15 +++++
ebill_postfinance/readme/CONFIGURE.rst | 13 ----
ebill_postfinance/readme/CONTRIBUTORS.md | 1 +
ebill_postfinance/readme/CONTRIBUTORS.rst | 1 -
.../{DESCRIPTION.rst => DESCRIPTION.md} | 3 +-
ebill_postfinance/readme/INSTALL.md | 3 +
ebill_postfinance/readme/INSTALL.rst | 2 -
ebill_postfinance/readme/ROADMAP.md | 10 +++
ebill_postfinance/readme/ROADMAP.rst | 10 ---
ebill_postfinance/readme/USAGE.md | 6 ++
ebill_postfinance/readme/USAGE.rst | 5 --
.../static/description/index.html | 56 ++++++++++-------
ebill_postfinance/tests/common.py | 9 ++-
.../tests/test_ebill_postfinance.py | 1 -
.../views/ebill_payment_contract.xml | 4 +-
.../views/ebill_postfinance_service.xml | 2 +-
22 files changed, 123 insertions(+), 90 deletions(-)
create mode 100644 ebill_postfinance/pyproject.toml
create mode 100644 ebill_postfinance/readme/CONFIGURE.md
delete mode 100644 ebill_postfinance/readme/CONFIGURE.rst
create mode 100644 ebill_postfinance/readme/CONTRIBUTORS.md
delete mode 100644 ebill_postfinance/readme/CONTRIBUTORS.rst
rename ebill_postfinance/readme/{DESCRIPTION.rst => DESCRIPTION.md} (68%)
create mode 100644 ebill_postfinance/readme/INSTALL.md
delete mode 100644 ebill_postfinance/readme/INSTALL.rst
create mode 100644 ebill_postfinance/readme/ROADMAP.md
delete mode 100644 ebill_postfinance/readme/ROADMAP.rst
create mode 100644 ebill_postfinance/readme/USAGE.md
delete mode 100644 ebill_postfinance/readme/USAGE.rst
diff --git a/ebill_postfinance/README.rst b/ebill_postfinance/README.rst
index d644904e9..2d8fba193 100644
--- a/ebill_postfinance/README.rst
+++ b/ebill_postfinance/README.rst
@@ -17,18 +17,19 @@ 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/16.0/ebill_postfinance
+ :target: https://github.com/OCA/l10n-switzerland/tree/17.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-16-0/l10n-switzerland-16-0-ebill_postfinance
+ :target: https://translation.odoo-community.org/projects/l10n-switzerland-17-0/l10n-switzerland-17-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=16.0
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/l10n-switzerland&target_branch=17.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
-This module implements the exchange of electronic invoices with the Postfinance web service.
+This module implements the exchange of electronic invoices with the
+Postfinance web service.
**Table of contents**
@@ -38,48 +39,54 @@ This module implements the exchange of electronic invoices with the Postfinance
Installation
============
-This module needs the Python library `ebilling_postfiance` which can be installed from Pypi.
-More information can be found at ``_.
+This module needs the Python library ebilling_postfiance which can be
+installed from Pypi. More information can be found at [repository
+`https://github.com/camptocamp/ebilling-postfinance](repository%20https://github.com/camptocamp/ebilling-postfinance) `__.
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`
+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.
+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.
+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.
+1. Configure the service, customers and contracts as described in the
+ CONFIGURATION section.
+2. Create an invoice for a customer with an open Postfinance contract.
+3. 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 ?
-
+- 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.
+- Add a link to the failed job in the chatter message.
+- Add an action on partner to create a ebilling contract.
Bug Tracker
===========
@@ -87,7 +94,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.
@@ -95,17 +102,17 @@ Credits
=======
Authors
-~~~~~~~
+-------
* Camptocamp
Contributors
-~~~~~~~~~~~~
+------------
-* Thierry Ducrest
+- Thierry Ducrest
Maintainers
-~~~~~~~~~~~
+-----------
This module is maintained by the OCA.
@@ -125,6 +132,6 @@ Current `maintainer `__:
|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/models/account_move.py b/ebill_postfinance/models/account_move.py
index 2b96cd6f6..59cebc729 100644
--- a/ebill_postfinance/models/account_move.py
+++ b/ebill_postfinance/models/account_move.py
@@ -13,7 +13,6 @@
class AccountMove(models.Model):
-
_inherit = "account.move"
@api.onchange("transmit_method_id")
@@ -40,7 +39,7 @@ def _export_invoice(self):
raise UserError(_("Error generating postfinance eBill"))
message.send_to_postfinance()
self.invoice_exported = True
- return "Postfinance invoice generated and in state {}".format(message.state)
+ return f"Postfinance invoice generated and in state {message.state}"
def create_postfinance_ebill(self):
"""Generate the message record for an invoice."""
diff --git a/ebill_postfinance/models/ebill_postfinance_invoice_message.py b/ebill_postfinance/models/ebill_postfinance_invoice_message.py
index 6129aae79..205f23b54 100644
--- a/ebill_postfinance/models/ebill_postfinance_invoice_message.py
+++ b/ebill_postfinance/models/ebill_postfinance_invoice_message.py
@@ -201,6 +201,7 @@ def format_date_yb(date_string=None):
def _get_payload_params(self):
bank_account = ""
+ __import__("pdb").set_trace()
if self.payment_type == "iban":
bank_account = sanitize_account_number(
self.invoice_id.partner_bank_id.l10n_ch_qr_iban
@@ -266,6 +267,7 @@ def _get_payload_params(self):
def _get_payload_params_yb(self):
bank_account = ""
+ __import__("pdb").set_trace()
if self.payment_type == "iban":
bank_account = sanitize_account_number(
self.invoice_id.partner_bank_id.l10n_ch_qr_iban
diff --git a/ebill_postfinance/models/ebill_postfinance_service.py b/ebill_postfinance/models/ebill_postfinance_service.py
index de048f72b..2cbba3005 100644
--- a/ebill_postfinance/models/ebill_postfinance_service.py
+++ b/ebill_postfinance/models/ebill_postfinance_service.py
@@ -73,7 +73,7 @@ def test_ping(self):
msg = ["Test connection to service"]
res = self.ping_service()
if res:
- msg.append("Success pinging service \n Receive :{}".format(res))
+ msg.append(f"Success pinging service \n Receive :{res}")
else:
msg.append(" - Failed pinging service")
raise UserError("\n".join(msg))
diff --git a/ebill_postfinance/models/sale_order.py b/ebill_postfinance/models/sale_order.py
index 4e537d1fc..30e9601c5 100644
--- a/ebill_postfinance/models/sale_order.py
+++ b/ebill_postfinance/models/sale_order.py
@@ -5,7 +5,6 @@
class SaleOrder(models.Model):
-
_inherit = "sale.order"
postfinance_ebill_client_order_ref = fields.Char(
diff --git a/ebill_postfinance/pyproject.toml b/ebill_postfinance/pyproject.toml
new file mode 100644
index 000000000..4231d0ccc
--- /dev/null
+++ b/ebill_postfinance/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["whool"]
+build-backend = "whool.buildapi"
diff --git a/ebill_postfinance/readme/CONFIGURE.md b/ebill_postfinance/readme/CONFIGURE.md
new file mode 100644
index 000000000..37e7c371d
--- /dev/null
+++ b/ebill_postfinance/readme/CONFIGURE.md
@@ -0,0 +1,15 @@
+## 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/CONFIGURE.rst b/ebill_postfinance/readme/CONFIGURE.rst
deleted file mode 100644
index 69c4aff94..000000000
--- a/ebill_postfinance/readme/CONFIGURE.rst
+++ /dev/null
@@ -1,13 +0,0 @@
-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.md b/ebill_postfinance/readme/CONTRIBUTORS.md
new file mode 100644
index 000000000..62ceaf42f
--- /dev/null
+++ b/ebill_postfinance/readme/CONTRIBUTORS.md
@@ -0,0 +1 @@
+- Thierry Ducrest \<\>
diff --git a/ebill_postfinance/readme/CONTRIBUTORS.rst b/ebill_postfinance/readme/CONTRIBUTORS.rst
deleted file mode 100644
index 0dd376fae..000000000
--- a/ebill_postfinance/readme/CONTRIBUTORS.rst
+++ /dev/null
@@ -1 +0,0 @@
-* Thierry Ducrest
diff --git a/ebill_postfinance/readme/DESCRIPTION.rst b/ebill_postfinance/readme/DESCRIPTION.md
similarity index 68%
rename from ebill_postfinance/readme/DESCRIPTION.rst
rename to ebill_postfinance/readme/DESCRIPTION.md
index 23359b87f..2d2323487 100644
--- a/ebill_postfinance/readme/DESCRIPTION.rst
+++ b/ebill_postfinance/readme/DESCRIPTION.md
@@ -1 +1,2 @@
-This module implements the exchange of electronic invoices with the Postfinance web service.
+This module implements the exchange of electronic invoices with the
+Postfinance web service.
diff --git a/ebill_postfinance/readme/INSTALL.md b/ebill_postfinance/readme/INSTALL.md
new file mode 100644
index 000000000..0d9b0e40b
--- /dev/null
+++ b/ebill_postfinance/readme/INSTALL.md
@@ -0,0 +1,3 @@
+This module needs the Python library ebilling_postfiance which can be
+installed from Pypi. More information can be found at
+[repository https://github.com/camptocamp/ebilling-postfinance](repository%20https://github.com/camptocamp/ebilling-postfinance).
diff --git a/ebill_postfinance/readme/INSTALL.rst b/ebill_postfinance/readme/INSTALL.rst
deleted file mode 100644
index 2116848ca..000000000
--- a/ebill_postfinance/readme/INSTALL.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-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.md b/ebill_postfinance/readme/ROADMAP.md
new file mode 100644
index 000000000..801d720b3
--- /dev/null
+++ b/ebill_postfinance/readme/ROADMAP.md
@@ -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/ROADMAP.rst b/ebill_postfinance/readme/ROADMAP.rst
deleted file mode 100644
index 869ba4dd4..000000000
--- a/ebill_postfinance/readme/ROADMAP.rst
+++ /dev/null
@@ -1,10 +0,0 @@
-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.md b/ebill_postfinance/readme/USAGE.md
new file mode 100644
index 000000000..5b80165bb
--- /dev/null
+++ b/ebill_postfinance/readme/USAGE.md
@@ -0,0 +1,6 @@
+To use this module, you need to:
+
+1. Configure the service, customers and contracts as described in the
+ CONFIGURATION section.
+2. Create an invoice for a customer with an open Postfinance contract.
+3. Validate the invoice, and click the Send eBill button.
diff --git a/ebill_postfinance/readme/USAGE.rst b/ebill_postfinance/readme/USAGE.rst
deleted file mode 100644
index 3418a105f..000000000
--- a/ebill_postfinance/readme/USAGE.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-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/static/description/index.html b/ebill_postfinance/static/description/index.html
index b70067dd2..3070546ce 100644
--- a/ebill_postfinance/static/description/index.html
+++ b/ebill_postfinance/static/description/index.html
@@ -1,4 +1,3 @@
-
@@ -9,10 +8,11 @@
/*
:Author: David Goodger (goodger@python.org)
-:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
+:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
+Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
@@ -275,7 +275,7 @@
margin-left: 2em ;
margin-right: 2em }
-pre.code .ln { color: grey; } /* line numbers */
+pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
@@ -301,7 +301,7 @@
span.pre {
white-space: pre }
-span.problematic {
+span.problematic, pre.problematic {
color: red }
span.section-subtitle {
@@ -369,15 +369,18 @@ eBill Postfinance
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:8fe54c201370aabd37f966becd9bc102925267307e434f56a4c558a943f058ed
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-
-This module implements the exchange of electronic invoices with the Postfinance web service.
+
+This module implements the exchange of electronic invoices with the
+Postfinance web service.
Table of contents
To use this module, you need to:
-Configure the service, customers and contracts as described in the CONFIGURATION section.
+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.
@@ -422,7 +431,8 @@
ToDo
Add option to import the contract subscription (csv)
-Add the download of this csv from web service, but what is the endpoint ?
+Add the download of this csv from web service, but what is the
+endpoint ?
Nice to have
@@ -435,7 +445,7 @@
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.
@@ -455,13 +465,15 @@
This module is maintained by the OCA.
-
+
+
+
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 :
-
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/common.py b/ebill_postfinance/tests/common.py
index 6496d442e..45a31a2c8 100644
--- a/ebill_postfinance/tests/common.py
+++ b/ebill_postfinance/tests/common.py
@@ -5,6 +5,7 @@
import os
from os.path import dirname, join
+import requests
from vcr import VCR
from xmlunittest import XmlTestMixin
@@ -16,6 +17,7 @@
class CommonCase(TransactionCase, XmlTestMixin):
@classmethod
def setUpClass(cls):
+ cls._super_send = requests.Session.send
super().setUpClass()
cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True))
cls.service = cls.env["ebill.postfinance.service"].create(
@@ -41,7 +43,7 @@ def setUpClass(cls):
cls.company.phone = ""
cls.bank = cls.env.ref("base.res_bank_1")
cls.bank.bic = 777
- cls.tax7 = cls.env.ref("l10n_ch.{}_vat_77".format(cls.company.id))
+ cls.tax7 = cls.env.ref(f"account.{cls.company.id}_vat_77")
cls.partner_bank = cls.env["res.partner.bank"].create(
{
"bank_id": cls.bank.id,
@@ -161,6 +163,11 @@ def setUpClass(cls):
cls.invoice.payment_reference = "210000000003139471430009017"
cls.invoice.partner_bank_id = cls.partner_bank.id
+ @classmethod
+ def _request_handler(cls, s, r, /, **kw):
+ """Don't block external requests."""
+ return cls._super_send(s, r, **kw)
+
@staticmethod
def compare_xml_line_by_line(content, expected):
"""This a quick way to check the diff line by line to ease debugging"""
diff --git a/ebill_postfinance/tests/test_ebill_postfinance.py b/ebill_postfinance/tests/test_ebill_postfinance.py
index 81552d564..46de29242 100644
--- a/ebill_postfinance/tests/test_ebill_postfinance.py
+++ b/ebill_postfinance/tests/test_ebill_postfinance.py
@@ -25,7 +25,6 @@ def test_upload_file(self):
os.path.join(
os.path.dirname(__file__), "examples", "yellowbill_qr_iban.xml"
),
- "r",
) as f:
data = f.read()
data = data.encode("utf-8")
diff --git a/ebill_postfinance/views/ebill_payment_contract.xml b/ebill_postfinance/views/ebill_payment_contract.xml
index 7ddf708fd..aa8a38489 100644
--- a/ebill_postfinance/views/ebill_payment_contract.xml
+++ b/ebill_postfinance/views/ebill_payment_contract.xml
@@ -19,7 +19,7 @@
@@ -38,7 +38,7 @@
class="oe_stat_button"
icon="fa-user-o"
string="Set invoicing method"
- attrs="{'invisible': [('is_postfinance_method_on_partner', '=', True)]}"
+ invisible="[('is_postfinance_method_on_partner', '=', True)]"
>
Date: Tue, 17 Sep 2024 16:14:15 +0200
Subject: [PATCH 11/19] [MIG] ebill_postfinance: Migration to 17.0
---
ebill_postfinance/__manifest__.py | 2 +-
.../models/ebill_payment_contract.py | 5 ++-
.../ebill_postfinance_invoice_message.py | 43 +++++--------------
.../views/ebill_payment_contract.xml | 4 +-
.../views/ebill_postfinance_service.xml | 2 +-
requirements.txt | 3 ++
test-requirements.txt | 3 ++
7 files changed, 23 insertions(+), 39 deletions(-)
create mode 100644 requirements.txt
create mode 100644 test-requirements.txt
diff --git a/ebill_postfinance/__manifest__.py b/ebill_postfinance/__manifest__.py
index dfc1fcbcb..c4230feda 100644
--- a/ebill_postfinance/__manifest__.py
+++ b/ebill_postfinance/__manifest__.py
@@ -4,7 +4,7 @@
{
"name": "eBill Postfinance",
"summary": """Postfinance eBill integration""",
- "version": "16.0.1.0.0",
+ "version": "17.0.1.0.0",
"license": "AGPL-3",
"author": "Camptocamp,Odoo Community Association (OCA)",
"maintainers": ["TDu"],
diff --git a/ebill_postfinance/models/ebill_payment_contract.py b/ebill_postfinance/models/ebill_payment_contract.py
index 70b96ea59..e2af41cc3 100644
--- a/ebill_postfinance/models/ebill_payment_contract.py
+++ b/ebill_postfinance/models/ebill_payment_contract.py
@@ -23,7 +23,7 @@ class EbillPaymentContract(models.Model):
compute="_compute_is_postfinance_method_on_partner"
)
payment_type = fields.Selection(
- selection=[("qr", "QR"), ("isr", "ISR")],
+ selection=[("qr", "QR")],
string="Payment method",
default="qr",
help="Payment type to use for the invoices sent,"
@@ -60,7 +60,8 @@ def _check_postfinance_biller_id(self):
if not contract.postfinance_billerid:
raise ValidationError(
_(
- "The Postfinacnce Account ID is required for a Postfinance contract."
+ "The Postfinacnce Account ID 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
index 205f23b54..95c7bf8df 100644
--- a/ebill_postfinance/models/ebill_postfinance_invoice_message.py
+++ b/ebill_postfinance/models/ebill_postfinance_invoice_message.py
@@ -201,22 +201,11 @@ def format_date_yb(date_string=None):
def _get_payload_params(self):
bank_account = ""
- __import__("pdb").set_trace()
- 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 = ""
-
+ bank_account = sanitize_account_number(
+ self.invoice_id.partner_bank_id.l10n_ch_qr_iban
+ or self.invoice_id.partner_bank_id.acc_number
+ or ""
+ )
params = {
"client_pid": self.service_id.biller_id,
"invoice": self.invoice_id,
@@ -266,23 +255,11 @@ def _get_payload_params(self):
return params
def _get_payload_params_yb(self):
- bank_account = ""
- __import__("pdb").set_trace()
- 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 = ""
-
+ bank_account = sanitize_account_number(
+ self.invoice_id.partner_bank_id.l10n_ch_qr_iban
+ or self.invoice_id.partner_bank_id.acc_number
+ or ""
+ )
delivery = (
self.invoice_id.partner_shipping_id
if self.invoice_id.partner_shipping_id != self.invoice_id.partner_id
diff --git a/ebill_postfinance/views/ebill_payment_contract.xml b/ebill_postfinance/views/ebill_payment_contract.xml
index aa8a38489..ccbc19ec8 100644
--- a/ebill_postfinance/views/ebill_payment_contract.xml
+++ b/ebill_postfinance/views/ebill_payment_contract.xml
@@ -19,7 +19,7 @@
@@ -38,7 +38,7 @@
class="oe_stat_button"
icon="fa-user-o"
string="Set invoicing method"
- invisible="[('is_postfinance_method_on_partner', '=', True)]"
+ invisible="is_postfinance_method_on_partner"
>
Date: Tue, 17 Sep 2024 16:40:05 +0200
Subject: [PATCH 12/19] Fix precommit for ebill_postfinance
---
.pre-commit-config.yaml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 4e67bc6cf..1a165cce5 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -75,6 +75,8 @@ repos:
args:
- --plugin=@prettier/plugin-xml
files: \.(css|htm|html|js|json|jsx|less|md|scss|toml|ts|xml|yaml|yml)$
+ # For ebill_postfinance don't format the message template files
+ exclude: /messages/.*\.xml$|/components/wsdl/.*\.xml$|/tests/examples/.*\.xml$
- repo: https://github.com/pre-commit/mirrors-eslint
rev: v8.24.0
hooks:
From c8aed3871314300b9441d63d648e0142f228f1ac Mon Sep 17 00:00:00 2001
From: Thierry Ducrest
Date: Mon, 14 Feb 2022 10:08:43 +0100
Subject: [PATCH 13/19] 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
+
+
+
+
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
+
+
+
+
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.
+
+
+
+
+
+
+
+
This module is maintained by the OCA.
+
+
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 467cea5da7f27349bf14150414c1b9a9e5ec742a Mon Sep 17 00:00:00 2001
From: oca-travis
Date: Wed, 6 Dec 2023 13:02:17 +0000
Subject: [PATCH 14/19] [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 c5912cf092d608d7765cfebb0e0f3261998dd904 Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Wed, 6 Dec 2023 13:08:32 +0000
Subject: [PATCH 15/19] [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
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
z
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
Xviia!U7SGha1wx#SCgwmn*{w2TRX*I
literal 0
HcmV?d00001
From 1d91fe9939aad0ddb0cf400f6366f684de43f397 Mon Sep 17 00:00:00 2001
From: Thierry Ducrest
Date: Thu, 14 Dec 2023 16:19:39 +0100
Subject: [PATCH 16/19] [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 ++++----
3 files changed, 12 insertions(+), 11 deletions(-)
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
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-
+
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 @@
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 @@
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 .
From f9beefd276de50ded73362e7c39fb535ca10ad08 Mon Sep 17 00:00:00 2001
From: oca-ci
Date: Fri, 12 Jul 2024 10:46:22 +0000
Subject: [PATCH 17/19] [UPD] Update ebill_postfinance_server_env.pot
---
.../i18n/ebill_postfinance_server_env.pot | 17 +----------------
1 file changed, 1 insertion(+), 16 deletions(-)
diff --git a/ebill_postfinance_server_env/i18n/ebill_postfinance_server_env.pot b/ebill_postfinance_server_env/i18n/ebill_postfinance_server_env.pot
index acdce5705..403a7bb04 100644
--- a/ebill_postfinance_server_env/i18n/ebill_postfinance_server_env.pot
+++ b/ebill_postfinance_server_env/i18n/ebill_postfinance_server_env.pot
@@ -4,7 +4,7 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 14.0\n"
+"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
@@ -13,21 +13,6 @@ msgstr ""
"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"
From c42e5c16199806d2dc5107865122ef3daf48a2b9 Mon Sep 17 00:00:00 2001
From: Thierry Ducrest
Date: Fri, 20 Sep 2024 10:31:42 +0200
Subject: [PATCH 18/19] [IMP] ebill_postfinance_server_env: black, isort,
prettier
---
ebill_postfinance_server_env/README.rst | 35 ++++++++++---------
ebill_postfinance_server_env/pyproject.toml | 3 ++
.../readme/CONTRIBUTORS.md | 1 +
.../readme/CONTRIBUTORS.rst | 1 -
.../{DESCRIPTION.rst => DESCRIPTION.md} | 7 ++--
.../static/description/index.html | 23 ++++++------
6 files changed, 40 insertions(+), 30 deletions(-)
create mode 100644 ebill_postfinance_server_env/pyproject.toml
create mode 100644 ebill_postfinance_server_env/readme/CONTRIBUTORS.md
delete mode 100644 ebill_postfinance_server_env/readme/CONTRIBUTORS.rst
rename ebill_postfinance_server_env/readme/{DESCRIPTION.rst => DESCRIPTION.md} (53%)
diff --git a/ebill_postfinance_server_env/README.rst b/ebill_postfinance_server_env/README.rst
index 4f5f069ef..07399be3d 100644
--- a/ebill_postfinance_server_env/README.rst
+++ b/ebill_postfinance_server_env/README.rst
@@ -17,29 +17,32 @@ 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/16.0/ebill_postfinance_server_env
+ :target: https://github.com/OCA/l10n-switzerland/tree/17.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-16-0/l10n-switzerland-16-0-ebill_postfinance_server_env
+ :target: https://translation.odoo-community.org/projects/l10n-switzerland-17-0/l10n-switzerland-17-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=16.0
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/l10n-switzerland&target_branch=17.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
-This module is based on the `server_environment` module to use files for
+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.
+This module define the config variables for the ebill_postfinance
+module.
-Exemple of the section to put in the configuration file::
+Exemple of the section to put in the configuration file:
- [postfinance_service.name_of_the_service]
- use_test_service": True,
- username": username,
- password": password,
+::
+
+ [postfinance_service.name_of_the_service]
+ use_test_service": True,
+ username": username,
+ password": password,
**Table of contents**
@@ -52,7 +55,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.
@@ -60,17 +63,17 @@ Credits
=======
Authors
-~~~~~~~
+-------
* Camptocamp
Contributors
-~~~~~~~~~~~~
+------------
-* Thierry Ducrest
+- Thierry Ducrest
Maintainers
-~~~~~~~~~~~
+-----------
This module is maintained by the OCA.
@@ -82,6 +85,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/pyproject.toml b/ebill_postfinance_server_env/pyproject.toml
new file mode 100644
index 000000000..4231d0ccc
--- /dev/null
+++ b/ebill_postfinance_server_env/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["whool"]
+build-backend = "whool.buildapi"
diff --git a/ebill_postfinance_server_env/readme/CONTRIBUTORS.md b/ebill_postfinance_server_env/readme/CONTRIBUTORS.md
new file mode 100644
index 000000000..62ceaf42f
--- /dev/null
+++ b/ebill_postfinance_server_env/readme/CONTRIBUTORS.md
@@ -0,0 +1 @@
+- Thierry Ducrest \<\>
diff --git a/ebill_postfinance_server_env/readme/CONTRIBUTORS.rst b/ebill_postfinance_server_env/readme/CONTRIBUTORS.rst
deleted file mode 100644
index 0dd376fae..000000000
--- a/ebill_postfinance_server_env/readme/CONTRIBUTORS.rst
+++ /dev/null
@@ -1 +0,0 @@
-* Thierry Ducrest
diff --git a/ebill_postfinance_server_env/readme/DESCRIPTION.rst b/ebill_postfinance_server_env/readme/DESCRIPTION.md
similarity index 53%
rename from ebill_postfinance_server_env/readme/DESCRIPTION.rst
rename to ebill_postfinance_server_env/readme/DESCRIPTION.md
index 39b6b51e4..a1b4e5782 100644
--- a/ebill_postfinance_server_env/readme/DESCRIPTION.rst
+++ b/ebill_postfinance_server_env/readme/DESCRIPTION.md
@@ -1,10 +1,11 @@
-This module is based on the `server_environment` module to use files for
+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.
+This module define the config variables for the ebill_postfinance
+module.
-Exemple of the section to put in the configuration file::
+Exemple of the section to put in the configuration file:
[postfinance_service.name_of_the_service]
use_test_service": True,
diff --git a/ebill_postfinance_server_env/static/description/index.html b/ebill_postfinance_server_env/static/description/index.html
index 5bfcbf407..4aaed666e 100644
--- a/ebill_postfinance_server_env/static/description/index.html
+++ b/ebill_postfinance_server_env/static/description/index.html
@@ -1,4 +1,3 @@
-
@@ -9,10 +8,11 @@
/*
:Author: David Goodger (goodger@python.org)
-:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
+:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
+Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
@@ -275,7 +275,7 @@
margin-left: 2em ;
margin-right: 2em }
-pre.code .ln { color: grey; } /* line numbers */
+pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
@@ -301,7 +301,7 @@
span.pre {
white-space: pre }
-span.problematic {
+span.problematic, pre.problematic {
color: red }
span.section-subtitle {
@@ -369,11 +369,12 @@ Server environment for eBill Postfinance
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:de89f67310399aa6681c254c4f41c84a30e84c8e9ab58449f0261a8554d498c9
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-
-This module is based on the server_environment module to use files for
+
+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.
+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]
@@ -398,7 +399,7 @@
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.
@@ -418,11 +419,13 @@
This module is maintained by the OCA.
-
+
+
+
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 .
From e166d773a4df0bb72178b7062c13a5b7377d8898 Mon Sep 17 00:00:00 2001
From: Thierry Ducrest
Date: Fri, 20 Sep 2024 10:37:54 +0200
Subject: [PATCH 19/19] [MIG] ebill_postfinance_server_env: Migration to 17.0
---
.../ebill_postfinance_invoice_message.py | 31 ++++---------------
ebill_postfinance/tests/common.py | 2 +-
.../tests/examples/invoice_qr_yb.xml | 2 +-
.../test_ebill_postfinance_message_yb.py | 2 +-
ebill_postfinance_server_env/__manifest__.py | 2 +-
5 files changed, 10 insertions(+), 29 deletions(-)
diff --git a/ebill_postfinance/models/ebill_postfinance_invoice_message.py b/ebill_postfinance/models/ebill_postfinance_invoice_message.py
index 95c7bf8df..9ce325637 100644
--- a/ebill_postfinance/models/ebill_postfinance_invoice_message.py
+++ b/ebill_postfinance/models/ebill_postfinance_invoice_message.py
@@ -238,19 +238,9 @@ def _get_payload_params(self):
)
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
- )
+ date_due = self.format_date(
+ self.invoice_id.invoice_date_due or self.invoice_id.invoice_date
+ )
params["date_due"] = date_due
return params
@@ -303,18 +293,9 @@ def _get_payload_params_yb(self):
)
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
- )
+ 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
diff --git a/ebill_postfinance/tests/common.py b/ebill_postfinance/tests/common.py
index 45a31a2c8..034ff74d8 100644
--- a/ebill_postfinance/tests/common.py
+++ b/ebill_postfinance/tests/common.py
@@ -53,7 +53,7 @@ def setUpClass(cls):
"l10n_ch_qr_iban": "CH2130808001234567827",
}
)
- cls.terms = cls.env.ref("account.account_payment_term_15days")
+ cls.payment_term = cls.env.ref("account.account_payment_term_advance_60days")
cls.state = cls.env["res.country.state"].create(
{"code": "RR", "name": "Fribourg", "country_id": cls.country.id}
)
diff --git a/ebill_postfinance/tests/examples/invoice_qr_yb.xml b/ebill_postfinance/tests/examples/invoice_qr_yb.xml
index 1cecb7257..e92689658 100644
--- a/ebill_postfinance/tests/examples/invoice_qr_yb.xml
+++ b/ebill_postfinance/tests/examples/invoice_qr_yb.xml
@@ -76,7 +76,7 @@
en
- 2019-07-01
+ 2019-08-20
IBAN
Yes
diff --git a/ebill_postfinance/tests/test_ebill_postfinance_message_yb.py b/ebill_postfinance/tests/test_ebill_postfinance_message_yb.py
index 047226635..c596f3c04 100644
--- a/ebill_postfinance/tests/test_ebill_postfinance_message_yb.py
+++ b/ebill_postfinance/tests/test_ebill_postfinance_message_yb.py
@@ -34,7 +34,7 @@ def setUpClass(cls):
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"
+ self.invoice.invoice_payment_term_id = self.payment_term
message = self.invoice.create_postfinance_ebill()
message.set_transaction_id()
message.payload = message._generate_payload_yb()
diff --git a/ebill_postfinance_server_env/__manifest__.py b/ebill_postfinance_server_env/__manifest__.py
index 490aee782..434f37e8c 100644
--- a/ebill_postfinance_server_env/__manifest__.py
+++ b/ebill_postfinance_server_env/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Server environment for eBill Postfinance",
- "version": "16.0.1.0.0",
+ "version": "17.0.1.0.0",
"author": "Camptocamp, Odoo Community Association (OCA)",
"license": "AGPL-3",
"category": "Tools",