From ebe5ede3975d6bbf10903b6e0386ca0657194b77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Pigeon?= Date: Wed, 8 Oct 2014 16:15:48 +0200 Subject: [PATCH 01/18] [8.0][IMP] add export feature for help online --- help_online/__openerp__.py | 18 +- help_online/data/help_auto_backup.xml | 9 + help_online/data/ir_config_parameter_data.xml | 25 ++ help_online/models/__init__.py | 16 +- help_online/models/export_help_wizard.py | 285 ++++++++++++++++++ help_online/models/help_online.py | 27 +- help_online/models/ir_model.py | 81 +++++ help_online/static/description/icon.png | Bin 0 -> 80511 bytes help_online/static/description/index.html | 1 + .../static/src/img/snippet/snippet_thumbs.png | Bin 0 -> 43363 bytes help_online/tests/__init__.py | 35 +++ help_online/tests/data/help_test_data.xml | 78 +++++ help_online/tests/test_export_help_wizard.py | 169 +++++++++++ help_online/views/export_help_wizard_view.xml | 56 ++++ help_online/views/ir_ui_view_view.xml | 28 ++ 15 files changed, 815 insertions(+), 13 deletions(-) create mode 100644 help_online/data/help_auto_backup.xml create mode 100644 help_online/data/ir_config_parameter_data.xml create mode 100644 help_online/models/export_help_wizard.py create mode 100644 help_online/models/ir_model.py create mode 100644 help_online/static/description/icon.png create mode 100644 help_online/static/src/img/snippet/snippet_thumbs.png create mode 100644 help_online/tests/__init__.py create mode 100644 help_online/tests/data/help_test_data.xml create mode 100644 help_online/tests/test_export_help_wizard.py create mode 100644 help_online/views/export_help_wizard_view.xml create mode 100644 help_online/views/ir_ui_view_view.xml diff --git a/help_online/__openerp__.py b/help_online/__openerp__.py index c27f0e55..832d3be1 100644 --- a/help_online/__openerp__.py +++ b/help_online/__openerp__.py @@ -3,11 +3,19 @@ # # Authors: Nemry Jonathan # Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu) +# All Rights Reserved +# +# WARNING: This program as such is intended to be used by professional +# programmers who take the whole responsibility of assessing all potential +# consequences resulting from its eventual inadequacies and bugs. +# End users who are looking for a ready-to-use solution with commercial +# guarantees and support are strongly advised to contact a Free Software +# Service Company. # # This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -45,9 +53,13 @@ help page. The help pages are created and managed via the website Module. """, 'data': [ + 'data/help_auto_backup.xml', # must always be the first 'security/help_online_groups.xml', 'views/help_online_view.xml', 'views/website_help_online.xml', + 'views/ir_ui_view_view.xml', + 'views/export_help_wizard_view.xml', + 'data/ir_config_parameter_data.xml', ], 'qweb': [ 'static/src/xml/help_online.xml', diff --git a/help_online/data/help_auto_backup.xml b/help_online/data/help_auto_backup.xml new file mode 100644 index 00000000..ac6dcd57 --- /dev/null +++ b/help_online/data/help_auto_backup.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/help_online/data/ir_config_parameter_data.xml b/help_online/data/ir_config_parameter_data.xml new file mode 100644 index 00000000..94f859fa --- /dev/null +++ b/help_online/data/ir_config_parameter_data.xml @@ -0,0 +1,25 @@ + + + + + + help_online_autobackup_path + False + + + + + + help_online_page_prefix + help + + + + + + help_online_template_prefix + help-template + + + + \ No newline at end of file diff --git a/help_online/models/__init__.py b/help_online/models/__init__.py index fe7c6a0f..fd36eaa5 100644 --- a/help_online/models/__init__.py +++ b/help_online/models/__init__.py @@ -3,11 +3,19 @@ # # Authors: Nemry Jonathan # Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu) +# All Rights Reserved +# +# WARNING: This program as such is intended to be used by professional +# programmers who take the whole responsibility of assessing all potential +# consequences resulting from its eventual inadequacies and bugs. +# End users who are looking for a ready-to-use solution with commercial +# guarantees and support are strongly advised to contact a Free Software +# Service Company. # # This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -19,3 +27,5 @@ # ############################################################################## from . import help_online +from . import export_help_wizard +from . import ir_model diff --git a/help_online/models/export_help_wizard.py b/help_online/models/export_help_wizard.py new file mode 100644 index 00000000..c98ed837 --- /dev/null +++ b/help_online/models/export_help_wizard.py @@ -0,0 +1,285 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Authors: Cédric Pigeon +# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu) +# All Rights Reserved +# +# WARNING: This program as such is intended to be used by professional +# programmers who take the whole responsibility of assessing all potential +# consequences resulting from its eventual inadequacies and bugs. +# End users who are looking for a ready-to-use solution with commercial +# guarantees and support are strongly advised to contact a Free Software +# Service Company. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +import logging +import base64 +import time +import copy + +from lxml import etree as ET +from xml.dom import minidom as minidom +from openerp import models, fields, api, exceptions +from openerp.tools.translate import _ + +_logger = logging.getLogger(__name__) + +PAGE_PREFIX_PARAMETER = 'help_online_page_prefix' +TEMPLATE_PREFIX_PARAMETER = 'help_online_template_prefix' +AUTOBACKUP_PARAMETER = 'help_online_autobackup_path' +HELP_ONLINE_SNIPPET_IMAGE_PATH = '/help_online/static/src/'\ + 'img/snippet/snippet_thumbs.png' + + +class ExportHelpWizard(models.TransientModel): + _name = "export.help.wizard" + _description = 'Export Help Online' + + data = fields.Binary('XML', readonly=True) + export_filename = fields.Char('Export XML Filename', size=128) + + def _manage_images_on_page(self, page_node, data_node): + ''' + - Extract images from page and generate a xml node + - Replace db id in url with xml id + ''' + + def substitute_id_by_xml_id(): + new_src = False + attach_id = False + if 'id=' in img_src: + id_pos = img_src.index('id=') + 3 + attach_id = img_elem.get('src')[id_pos:] + new_src = img_src.replace(attach_id, xml_id) + else: + fragments = img_src.split('ir.attachment/') + attach_id, trail = fragments[1].split('_', 1) + new_src = "/website/image/ir.attachment/%s|%s" % \ + (xml_id, trail) + return new_src, attach_id + + i_img = 0 + img_model = 'ir.attachment' + for img_elem in page_node.iter('img'): + if img_model in img_elem.get('src'): + i_img += 1 + xml_id = "%s_img_%s" % \ + (page_node.attrib['name'], str(i_img).rjust(2, '0')) + img_src = img_elem.get('src') + + new_src, attach_id = substitute_id_by_xml_id() + + if not attach_id: + continue + + image = self.env[img_model].browse(int(attach_id)) + if not image: + continue + + img_elem.attrib['src'] = new_src + img_node = ET.SubElement(data_node, + 'record', + attrib={'id': xml_id, + 'model': img_model}) + field_node = ET.SubElement(img_node, + 'field', + attrib={'name': 'datas'}) + field_node.text = str(image.datas) + field_node = ET.SubElement(img_node, + 'field', + attrib={'name': 'datas_fname'}) + field_node.text = image.datas_fname + field_node = ET.SubElement(img_node, + 'field', + attrib={'name': 'name'}) + field_node.text = image.name + field_node = ET.SubElement(img_node, + 'field', + attrib={'name': 'res_model'}) + field_node.text = image.res_model + field_node = ET.SubElement(img_node, + 'field', + attrib={'name': 'mimetype'}) + field_node.text = image.mimetype + data_node.append(img_node) + + def _clean_href_urls(self, page_node, page_prefix, template_prefix): + ''' + Remove host address for href urls + ''' + for a_elem in page_node.iter('a'): + if not a_elem.get('href'): + continue + href = a_elem.get('href') + if not href.startswith('http:'): + continue + page_url = '/page/%s' % page_prefix + template_url = '/page/%s' % template_prefix + if not page_url in href and not template_url in href: + continue + elif page_url in href and not template_url in href: + pass + elif not page_url in href and template_url in href: + page_url = template_url + else: + if page_prefix in template_prefix: + page_url = template_url + else: + pass + + if page_url: + trail = href.split(page_url, 1)[1] + a_elem.attrib['href'] = page_url + trail + + def _generate_snippet_from_template(self, page_node, + template_id, template_prefix): + ''' + Generate a website snippet from a template + ''' + page = copy.deepcopy(page_node) + snippet = ET.Element('template') + snippet.attrib['id'] = template_id + '_snippet' + snippet.attrib['inherit_id'] = 'website.snippets' + snippet.attrib['name'] = page_node.attrib['name'] + + xpath = ET.SubElement(snippet, + 'xpath', + attrib={'expr': "//div[@id='snippet_structure']", + 'position': 'inside'}) + main_div = ET.SubElement(xpath, + 'div') + thumbnail = ET.SubElement(main_div, + 'div', + attrib={'class': 'oe_snippet_thumbnail'}) + img = ET.SubElement(thumbnail, + 'img', + attrib={'class': 'oe_snippet_thumbnail_img', + 'src': HELP_ONLINE_SNIPPET_IMAGE_PATH}) + span = ET.SubElement(thumbnail, + 'span', + attrib={'class': 'oe_snippet_thumbnail_title'}) + span.text = page_node.attrib['name'].replace(template_prefix, '') + body = ET.SubElement(main_div, + 'section', + attrib={'class': 'oe_snippet_body '\ + 'mt_simple_snippet'}) + + template = page.find(".//div[@id='wrap']") + + for node in template.getchildren(): + body.append(node) + + return snippet + + def _get_qweb_views_data(self): + parameter_model = self.env['ir.config_parameter'] + page_prefix = parameter_model.get_param(PAGE_PREFIX_PARAMETER, + False) + template_prefix = parameter_model.get_param(TEMPLATE_PREFIX_PARAMETER, + False) + + if not page_prefix or not template_prefix: + return False + + domain = [('type', '=', 'qweb'), + ('page', '=', True), + '|', + ('name', 'like', '%s%%' % page_prefix), + ('name', 'like', '%s%%' % template_prefix)] + + view_data_list = self.env['ir.ui.view'].search_read(domain, + ['arch', 'name'], + order='name') + xml_to_export = ET.Element('openerp') + data_node = ET.SubElement(xml_to_export, 'data') + + for view_data in view_data_list: + parser = ET.XMLParser(remove_blank_text=True) + root = ET.XML(view_data['arch'], parser=parser) + + root.tag = 'template' + template_id = root.attrib.pop('t-name') + root.attrib['name'] = view_data['name'].replace('website.', '') + root.attrib['id'] = template_id + root.attrib['page'] = 'True' + + self._manage_images_on_page(root, data_node) + self._clean_href_urls(root, page_prefix, template_prefix) + data_node.append(root) + + if root.attrib['name'].startswith(template_prefix): + snippet = self._generate_snippet_from_template(root, + template_id, + template_prefix) + data_node.append(snippet) + + if len(view_data_list) > 0: + rough_string = ET.tostring(xml_to_export, encoding='utf-8', + xml_declaration=True) + reparsed = minidom.parseString(rough_string) + return reparsed.toprettyxml(indent=" ", encoding='utf-8') + else: + return False + + @api.multi + def export_help(self): + """ + Export all Qweb views related to help online in a Odoo + data XML file + """ + xml_data = self._get_qweb_views_data() + if not xml_data: + raise exceptions.Warning(_('No data to export !')) + out = base64.encodestring(xml_data) + + self.write({'data': out, + 'export_filename': 'help_online_data.xml'}) + + return { + 'name': 'Help Online Export', + 'type': 'ir.actions.act_window', + 'res_model': self._name, + 'view_mode': 'form', + 'view_type': 'form', + 'res_id': self.id, + 'views': [(False, 'form')], + 'target': 'new', + } + + @api.model + def auto_backup(self): + """ + Export data to a file on home directory of user + """ + parameter_model = self.env['ir.config_parameter'] + autobackup_path = parameter_model.get_param(AUTOBACKUP_PARAMETER, + False) + + if autobackup_path: + xml_data = self._get_qweb_views_data() + try: + timestr = time.strftime("%Y%m%d-%H%M%S") + filename = '%s/help_online_backup-%s.xml' % (autobackup_path, + timestr) + backup_file = open(filename, + 'w') + backup_file.write(xml_data) + backup_file.close + except: + _logger.warning(_('Unable to write autobackup file '\ + 'in given directory: %s' + % autobackup_path)) diff --git a/help_online/models/help_online.py b/help_online/models/help_online.py index 15e41a70..5a076cd6 100644 --- a/help_online/models/help_online.py +++ b/help_online/models/help_online.py @@ -3,11 +3,19 @@ # # Authors: Laurent Mignon # Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu) +# All Rights Reserved +# +# WARNING: This program as such is intended to be used by professional +# programmers who take the whole responsibility of assessing all potential +# consequences resulting from its eventual inadequacies and bugs. +# End users who are looking for a ready-to-use solution with commercial +# guarantees and support are strongly advised to contact a Free Software +# Service Company. # # This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published -# by the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -18,15 +26,20 @@ # along with this program. If not, see . # ############################################################################## -from openerp.osv import orm +from openerp import models, exceptions from openerp.tools.translate import _ -class HelpOnline(orm.TransientModel): +class HelpOnline(models.TransientModel): _name = 'help.online' def _get_view_name(self, model, view_type, domain=None, context=None): - name = 'help-%s' % model.replace('.', '-') + parameter_model = self.env['ir.config_parameter'] + page_prefix = parameter_model.get_param('help_online_page_prefix', + False) + if not page_prefix: + raise exceptions.Warning(_('No page prefix parameter specified !')) + name = '%s-%s' % (page_prefix, model.replace('.', '-')) return name def page_exists(self, name): @@ -40,7 +53,7 @@ class HelpOnline(orm.TransientModel): ir_model = self.env['ir.model'] description = self.env[model]._description res = ir_model.name_search(model, operator='=') - if res: + if(res): description = res[0][1] name = self._get_view_name(model, view_type, domain, context) if self.page_exists(name): diff --git a/help_online/models/ir_model.py b/help_online/models/ir_model.py new file mode 100644 index 00000000..8cbccf69 --- /dev/null +++ b/help_online/models/ir_model.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Authors: Cédric Pigeon +# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu) +# All Rights Reserved +# +# WARNING: This program as such is intended to be used by professional +# programmers who take the whole responsibility of assessing all potential +# consequences resulting from its eventual inadequacies and bugs. +# End users who are looking for a ready-to-use solution with commercial +# guarantees and support are strongly advised to contact a Free Software +# Service Company. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from openerp import models, api + +from lxml import etree as ET + + +class ir_model_data(models.Model): + _inherit = 'ir.model.data' + + @api.model + def _update(self, model, module, values, xml_id=False, store=True, + noupdate=False, mode='init', res_id=False): + + if model == 'ir.ui.view': + parameter_model = self.env['ir.config_parameter'] + page_prefix = parameter_model.get_param('help_online_page_prefix', + False) + if page_prefix and xml_id.startswith('website.%s' % page_prefix): + xml_str = self.manageImageReferences(values['arch'], module) + values['arch'] = xml_str + + return super(ir_model_data, self)._update(model, + module, + values, + xml_id=xml_id, + store=store, + noupdate=noupdate, + mode=mode, + res_id=res_id) + + def manageImageReferences(self, xml_str, module): + parser = ET.XMLParser(remove_blank_text=True) + root = ET.XML(xml_str, parser=parser) + img_model = 'ir.attachment' + for img_elem in root.iter('img'): + if img_model in img_elem.get('src'): + img_src = img_elem.get('src') + try: + if '/ir.attachment/' in img_src: + fragments = img_src.split('/ir.attachment/') + xml_id = fragments[1].split('|')[0] + img_src = img_src.replace("|", "_") + else: + id_pos = img_src.index('id=') + 3 + xml_id = img_elem.get('src')[id_pos:] + + img_id = self.get_object_reference(module, + xml_id) + + img_elem.attrib['src'] = img_src.replace(xml_id, + str(img_id[1])) + except: + continue + return ET.tostring(root, encoding='utf-8', xml_declaration=False) diff --git a/help_online/static/description/icon.png b/help_online/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ab8d478d6a88fbdce713c25f88e2d692105b7d7c GIT binary patch literal 80511 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 jQoLiQd=dOFZovN^4?QL4

The help pages are created and managed via the website Module.


+

If you want to export your work, you simply have to use the export wizard through the settings menu.

diff --git a/help_online/static/src/img/snippet/snippet_thumbs.png b/help_online/static/src/img/snippet/snippet_thumbs.png new file mode 100644 index 0000000000000000000000000000000000000000..4d5c2d8907d20c89b52e798071d00959680b0107 GIT binary patch literal 43363 zcmV(`K-0g8P)400001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGmbN~PnbOGLGA9w%&sQ5`lK~#8N?Y#$} zZAV@2|J%Kte*4W$Pe_AMrHRslfPh#~Pyq`nVuAM*EPvD|hz$i5#3vw@ha!s76;OH) zBqSjTA*A2r=GIep-)oou_w$=I=j?m#IUxrUlJMT|oY^yL`uyfQzxmCqS!-oRBKvlv z;mAfAvw=+3GL{_-Y}D^tFE5WwRuTG^&kPkdw1G@-G$p^0wE49At7bW=W#- zGTr{r+Fj)**7a0CJ2C4FGuBs`#o@ry7IHZ&sH|KzYolz&CJOS;4y;(nS*=>Md~T>5 z`!Y2d#R_)iaYR$Yf+xi;O~(fzl{Ue>vrsv%K1vw~?xs=_^u6*-+hYL;Cgw zY0|ZkfYKL8+WnE`vpLJErR82-tuE8^!d_p%DhVnXD`$FU`JyKUmirGi?9j1ecIE9k zTWJsN@Uey+JhEU5D-D4tv9B#nT1Q~*CPQm=`)wgfOOi@kx_C)EoFGvNTkx)583aN=Sv)k!fNrEeD6E5u};}ntZ zUa>FT*0yV|J8G9+eb}zJabQOp)7BeK*+Tm^k7e1s{tK2Zlr1AL&(#mgPq_e?TuDZf zPXl2nDQKgi4F`QmIZ4Q&hJeJ~u}n$Pvl=LpzDZl?>N}8Y!<>~1Lo4UnHanTv`DgF2 z(@s0dp81FgJ8RcoN)E)xQB_B6NnAGGS!IOe{eK|6Pf zce*{9zHOha!aW;E+9iXLKq+7fjD#ug;tZoR#4@3~~&uKMbVUHO&U?8u6A&q~b-6-n0e z5vvxQa&!K24KlIFO@t8~8%rGmU7A-T7gp|H}WLwRWcGHH91NEE9V7ZMav0ls0dOw{kp4kLoJk; zw$U9&O6OC1UQ@rqnc`6=(1QW@@~|bzjJ(X)P!cmNuC!3WmvlkNz7 zl-?yzX#Plk<3xztnXs~7Wm4(@RBIGtGsUO*VN%wP4@rF(+7q7q6noV(w%NJoR5csqG%N*nR1MV~`J5yg zY+?IYUNIL?a)-LLlWp#LBh0Kf=@RBs@*~+kI`O3gnT2*_S z^vic&zGByW>TS%N^vCbDXFTa#+gXs#oTxTgb~CEh@8nEtJfA5>CaGSmt`5L^JKbkM+LjbRz0A>t z{X|oyI;I9BCL}jX_VzEf?9cw?a=Ycgil*|S?V3H^+LE;FD*}pKq6xMm4Y7*;sD`H? zMaP5zNax_QM)+ra`E??(uHGoVOGDgaY{i}T>0EyP&nzH0DSyC@?n@kGIZ_u%3Ye%F z;TeI`x1(ea)b?t%EW2-=cEj>g1<<=Y#gZL6aLnd3Bb+kbv!8qRh4$PZc<5>!M;aqE zd4ygpS(_<}ANP^nfcwyNzbuI&z({%ug`mgUS}nizV=MO8@BEZqb}(n#PJ57T*UEe@ zS+d&(6~VKi6|eL-fwnM`M4CT*lR*|IM08yLM0fmD)UFzQ&Ym}s(^ zw14~fA$!jUZnJmpuiME}McY=;R49qmw2CctikkjgRxOn!eY4WZBu%yQC~3ho915iR zi;^_jEKGvycp4&NHz4i;ttWhPsrM>dWd#@0J-`cBtF~qc3U-}S01vvSoJ{Y;7ZCAd zVFpmy4jT%DdDpA^*41JPb-I$P*mC2Dru3fW${NUnDLZ;>V1>pF_Mi)#gLXog}fzNNYyioRw+vl?I^t6wGx1q z6kbxC&Qjm<%Po7{h12#IzxOoTu^oL^aqlCd^j-(jLDIGa9j#cD9@?_0oEWTC{blvU z{^ng@v48*Yt=1Xrvzf`7RSSJdK&|Q(e<%rqbjXaPwQ51pPf^DvyxWqffN`L3u7f@n zZ9w6c$BEz#M2D^eqtc-rM}mdKh*Nd&1Faz);kgX?AjAYZ*~E4IQ;R@AN&KLj%2s6t zitjblwd<{l%U0EpeN;p)esrCOlU9Djfwb5{XQnQLUdKUQ&|hO^*}C1M_Us>jhQ0E~ z_S&|o8C&TI%o@PuOk&xj?7Ir3vIc!3iJYfh8Xm($lDoFbt8X>k>pOx<4q8qSdjz#75>o9UTFO{^@S{ z_tWV+0x{a7v;)@rn>uep8gbu9)++mul8O#kxJv!8api?XKuIJAXlgQst%RC>%jsSRQo+tD9WlQk zhDcbw;vJXU>;6L$wYS#>#g1hs)B#xmSgYJgnC}u(eS#EaOGUQ2dzGIK&eQ9Ro+A9gyQeYeZ6&OBTMNpOOQNY~=5N#3oojQSNdZGqT)4#7f)K$q)aK z%z><52VDSOTwr-Z8RY{|9h}4`UH~cjD+?|nw_7c%RV$!STw#YqX@(u!zdW!B0rr=l z^FO5uLG%uylI7FpT6yo{rVqWZeP7+ z&Zc*6vrcxwij}O4x|PEt-I7)FbJok$#dHBPCr|-EF_x*F>5}Pb9H2BbO#d)E_(vM% z!gQ>V)E^*|AO7om2arf|r>qNhaAy+Iq@baLQ`>=QNZ(s9B!ErKy(BJaC#l&mqm&)7-Vw!g0l{5vI3iK0BqzhBG=3@t@R0Wr~ z$`4TD4;WqI;ti0MANeqcdpQQEi?T1O*aX@xlGgYE|?lBlc7Pvr*o3N&oQ63!of{3{L%Dg3<{*? zB)y1@`9XW$G9@v)ShHJ~D)#-axxo(IeAud0B%y$2DF8J^$6I*WoUXx@5C!&z!wQ0v zb(5~usq#}4>*1lM;pSd-04trTY1%<5spEbj4eEmD?|@H1>^>}Tn^0u z!YsFuaMBi66_B(VoXTv3x}*3GWY3&pP%Xl$pSyNG4hT~lQ4NO4&6Q9MqL~SdoKXN``67gMw(g*e3M|V3&6ESimCg)ilQj%7i8QU7Xj*2dMB+1*JOpH4AXtukz^nW(i8$*!EcRdh%%=9RrUpmn)NLr{1xhV z2yiPe-zSwdM3)6PijM~%RayieQ#t7Xa^6qGlAHkL#T2eUWT=DH_f6FXA0$B{hZ_P! zR-JuN=$d1I^2fOTO4+1Qxq#LO67xTUL2-IRElS(RY@ZgWum6Leu?L^G!#e%8KViV* zGc2fb0%qS={X8DS;_B`t)r;ESeZ)YeziB(*%4uYBOEJ-?L>66o!@$1p6(6^3Wzs5E zSDYD-2(XZ#4pQ}XPWq^Kko;KC`|2A&`LjTj0U(iQ3e(S!lj~}lOHw?rJrD^U>J+4? znlBIEKE*!;Dda#!>Tg8SjR8SqU$l{E6z14+DXKWA1`eFS58`sW6{u+xdphojkp(~{ zU3Mgf>Dq6B!b74d!q6ooZUM|eO1?UVhwG7~BK4}O zuvV*M-K1f?#%=cB@AzMK;mK2qr}~KZeJyO^QLb1OpxIgri_*K3?skx}V)YqC2tkt3 z35>#0sc7%{!a;lCUtS~dP1%lO-EJ#wvt39CM;&^lCKcT3H1_QP6Vg`@_UT!ymqHJS z0WUyiTE|y1q8O%Z%0%yU$w^)s`D*~B_tP-YEQ%ndgGsLv@pZp7f@J~Kk$rI$AEwp- zxG?48rs4tYE-i@ye&o*fLb*)wF6casc&7MX73Ie@>nOm+MiiSBpvV7dZLzLq2tfBle!wISAES3(4zCu*M zGn6C+u-PuLaU%@{yi}t09qe)_j@$ZYFV*!=;<@A`ocfU;V5Dk<3%tq?7`uL|@b#;H z-c=Tq-y~zx=67>?huG)b?pbJ(+9Sf!vhUtZmZ+tv($XX`=y`su=DD zfv{lvVoJsr9)tl#<~pS%sY^pZC*z<-3<;D&ff$A|{S!YYy;V+kXHXSLj>oDU{SQ5n!l`;`_C9bC>p%?|-z%gVQ#KfvQ*@FBGC{ zZ)b?h58)mbF8LLhxyC=u7q|XHT={u=Y%cK&YEZ6Hc93(1Y(lXMxf#n=Pq$zC^*^?c zUVICgDW072yx371rHK+2oL!mu-OiK)>~ z|1)i>FisYcC!83UqIe*!HzJor>S33nT;ulX6;Np*gMbqtnEsh)^S+`-^&yQ`*+Fng zVo{D9%7%yZ5NNPsAc^Xdm4%hu9;Q5VStfk71zl5rJOD_1R`cMWI&)|x>$))#7PWzC zJz<^AWQ!OYxMC zRu{AvmZ@Tj-qxUEUp4gEH%nxDw^F{}w7yn@1ua0{fAK+k{+q9{GYVZRss4<17!J3h z-}%FaGs6+Iv5Cg`($d(CZ7Fi3VOT9rR{BUYapvuUK`si|B5bq)D$~Jh5^8k+OZ) zOWtjn%68jcEm_MY4V}U&UOnr>5XK-O#VnX3H`AOmEZys*bA4*YsDpAjjbuPUX8}MY zuR56N7OsUAKON3lOlf4k{!%)*BM=-MfQB03;WhIMLvq(9n5_FY)NIhAc!lF}I z(Fgrgz>wjtYw$z&WV)0zl{8*mTp^heT9RV;b6RU8=}Ua1@hBlJ^(7 za~pr$6b@j6?F%NPC%n+LZ&{HM{^+;ZiklJWDAN~T=&BgyR|Jq^N+)Sr(z@N=_Yc2n z55C_n70!Z-athYda=#?$!&9-Y?gUnT({#6kl!uG2xS?r3`s&Zxa;s`{S|lARooO>R z54!}coB+crhmkG}rqenjI4kh_h!;=*I)L$w_yW=i49P#wJfnOhp*$^MQyib}r8D_7 z53tD(AE^Yu&KFe5&!rte^>RZzZ2kd1(w>eTC+eM5$B@v$Kn%ZDm;*&11RD+xNh7&) zOxNjDPrs`~xkr|e9I(k|%JdyC<a4s0r79KL;viR2ZV+(Ibgr_p92l2>wz*`*iCJ4}^;G{A z_1}Jb*IR$b&fYtzJXL`Hy8?1CuLUl}iH+EI1>Nl+J-9TqXa4aQ?e_i4cJfr!zSgeV zL}g$l0R%R(%_P*xL`g~G0Ha!|u;|X0@z)=q1F#yY%u?k79F)VSTG9tl#3e%+w@Hp$x~dlx0Oot3fed$?5==KW}1Tdn=dk*wRANrmHj7Y1OUQx!v~cp0W46;TLW9u9Bpv z1Vd3XXFt(mOOB1%_6-qY<8GxN|I4dv`PwUON3~`*^mf{$z*e?nt{X+&hX#QQpXOtY zxR%9;goRAWfDs@f?TG7(8~Fv5Dh&s00F`U}0U-VW5<%5q83!O znWCopV>VmPTd_Q6U%I7XzxR88Nn(FFn~<#;pd+c?^TBaf(Oo7(7*{xB?Qxff+g%fcn-=p6M+oOZh5IQq+_y=~`+Z zvWfCZk{ng*Gi?>yRw=JYYV1_Gk|^1pjkMs)>v!qBr*^gHG%sKyh6Sknqjv zhcU!%0BS*o)xBsi=;?>J;(??xTTtk@NA}n4w_p0*_R<%8w{;s$E7oe()#|>eKlpH0 z&|L=7M7k%hB^Wd+R+vcaUq3Z(zxLXXSbp|YmpEaR0yw#4vu8=~#_1j)!QJ7gq%biH zz=2y{&Lw{rN+D@F-IJw2$R4cn_Jx#d4FQw|g;A!TgOs!idzye);p%YoFu**NR7jM^ zv{u*4?FFk$4+YSQtt=F*T0O}Y7jCh(R(b74-r6fg>$fXnn%bCIQ2miyv_7=~L~WKW z4a<}|R-EctWlDgr2t?h21f+niKJT~nqv?_R-bL{X0o?5gtlSDMaT>lYi3MOmn|Q*a z$rn*d%WEE0mQVjo{W47ZzJU+Qs0jKh0F#kRHrGty3THqw)uR%S6*?~At`6|%HSGv_ z_zeJZP<%k^cejSv0%*EV+7fTFt()yH|KMls`<`@v#qV23b@8|S`4sWZ(_IGAMUBK+ zG1u}HySCo3ANYkY+EP!_X=e`^c6K4jsA_=;E-X>;qHaT0ia!o+bRfNBS&Grsjr@P{H><(_S`snd`$zkL&%O{O zj!RO?Aw2*^!b{4!B-N_Frgg`4x7(@Pa`vC^`Yqc&)lm1$1yzJTz6UPA-73+d_}J<$OwV541BixbuxHdKbDq@v0hY89;& z?9%edcHoNrHredkBTuW^BOa8ohunX{&XH85X52Lk^PoDctvc1hDWyP>h1fuV$y1=y zVu`o#Ws<&q_-i}usvFyO>2-(fy84PGb2%&TELd%Jua(LAK>I=|$4 z9a4WVP+J5}ruL*K2q6&_HqdmBgjLPl_O1kwynd2|L=&)(hNuTDhFrrEI8g^Yq4Gi% z@Wa=NL*IBi6fTZw@f5b0*6#1iEtNz%37K1WFmI#IoHdRev`0O}?EU}e71nL`tW>@0 z7EgB>NJssaKvK28{rF|}f?xZJo%0>%Su$t}1b{~7I7zCGWUi$Z_@}FTI=G0gDL26K zqjyMC1?70-21)T_x)0e{DV4M?NhM`{I#+sb(FaM5znVxqQN^E&YABDyN`-{|BAOZJ?npJq>gM8Qrni9*Rs>sM?(H&9Z6UL8^qt9$_mjfxIQ*F_Y2%bq(MNYqr{U^uX2j+TZ>$`}ybb61BUI?lO?_ zVz)0W+-%SOt*=NTOxjenW5Wqa%#KDBQd7Og;wVT-q#RO}4rL|DiF!wxzfhK`BIu+z z)CqLDAC{IB7T`vH2v=d6(#wF4e_gX`CJkBTC3)!*pZdj3Zs;@Dx9k&NU9o@v!jkRpmu=tu_DDrvwnCRpb+wgTy0RUFsv0Nj@%QOo zEku&43p>2`Nj6h9VwdTfg;U1QNUE+RMgouNq_}-CmFlEGA)76FzOEhs&bZ)8f$I7O zQkW-o9h#efWQDwIsOP1`& zhs=KA(F1$YD=keT$X@oc9*QGLEUY)Y~ko3 zd-Nk8ZEt_WW2LuG+ps59t=!RK3iV~DW0 z%%#^`c`9pDb46RO*A<5s3Z$JuWBKEnEZmln9pZ$}ixQ9N-}gMZ_5d-Cy+noi<~yEB z=Kxh)rs25f=+abf?$IMj0lec?c1O(36**m`!5Zxs|?hx1g z<=5_YG}#HL?Y7np1>2?B=)LdzPy4s`Tprd3g`V+-?0jZMb>Lx2PrfDEvLy8ptct>n ztVU3#IAyKg$jOt7Q(-PuD~vt7!@R_!r1&z z-7Kc^T1gLt_F{P?9V!W@dw8BmS=rd$n4zmFArN{-3;ET`}$P`cjQ~$=WwUTTaDe4TEl1dInDq7VHyOE!rDD zc))hfZMUfjUf3Xp4JNGJ79&dB$)J5=Oj^M(g$H-Ah!Li22+OBwIdXtgo#88V=ZW%0 zV$w;<(~rh+XNpde(Q3veY;Y@{7GW%)a>bFK;OBAX{;-ZP@cYcUtOiq#bB}l2X?G_L z6AgBOZJ>s=x)}}hqQ<@k&Y)vw?`YZkfA<`F{A^-NH*d3KCXt>l-BH!`8yWBjwFW-u z4`}%;4WHl{*AbW`A{GF}c?W}1sZ&=uU4$iIt$_y(E8Ml}YR${_W$|m^{aF z{UxzilUGN2M_&Ne7^)8>>X~vOrXE?&B;3Iw0M>;mMmFGcKbI0P1~(NA@dyr5BlzpW z)c|)Z%+tsXP6^X|nUWMxr?4XVDF`#hu zI@+mU@JRbbyq4{5m@GS|1#P>>%O|wB)q+~XM!YXrqG`UR;CT>$-ud;AJ+BkT(9GFJI4%B=TvDAV|-#<#cOJn z-D6SE*U;=*Lo#q#zoV{nJI>z`Uy=L6rgi%Z-iaGgL7*#$r)r%8Co6ZhC~*2_a8Gqv z)ZlO0E1v&AdtUi#_O+v0XpK6yT`EdTb?(h{tduYLVleE6Fcq`)o|O*BmLE?zq*70y z3Qq=55LZ$Y9S>)gp+Bc z(+_b)L&Xnnhat@IIL=HbC`Ezgg6MLLDgateJD@05RaTNgr$UTk> zpwo5AX7ynTUKw@@;19BhU5EgYbz}nXWB`--+mele6T8fiA>-W=DtrG){?#)`E zH?ndvvYJNQOh0Qg@}C}bl`hdVtuzHOzM^z2-l*qLQ=V3{=yl8+qm1Ha>#}3scaDY{ z477dJ(?A$77)G{Dv%s5v{%mU;XxZXmS}`O=TS!FOuKL15A;@_KFZlCJ^pBtN^=lmK zD0&5Zt*)z4-Ju@^t>)_nDGhMd-qdDrChVb?GB!Q4!@lsj8|{l z)k`bZC^R(12{fn}ybrZBVO0&35_R)VDq2gb%R-@O)g)&nR|^IjdEs9MH7GrI<4=loi|KyyZ_eK!$&J zJY-G`^*mCepD-Y}7N7m8R&H&pd|&0Ga`5ge@u-vZY}cOi?bUz!_h~-z-y&^2MPbrD zc?7)${ed>m;{nHfpGr5~2m z)GBsVRvsKkkxo7umNl-!6R=yMq4axnxJ)tZY5IX?p1|y_*suNQ4m&e*$huOe=d)ew zNwV|At20;z)~xc?FSri*x?1HC?}#>rh4+#E$G2YtbolJ|+y zu*I~x6(!@F{R(4?iJk$#=<8BJ-9K9^*>t;SNx5v<1Bu=E@rM2Vb80rblLX-%M|qxA zQ3rI7-eSM=rCGcAwq@&d`P?|Cm4>!$$1ZCPm&FPJQl=znSCZi4iIt4%|IpK`_T&dl z+l9Nyvm@!QOowf8C_?XEj^(WFuc-N8+l>dBW2-_0`TS2S()YNB3NU%TIJx*6%2MV8vEVi|GA|v7+_xv@PAf-+t^z9%+B}s-Ga2Ez#y6 zl`hsVs9;u}O;wK$F1PKb`M!PM^WI_Y+8)c!NqQiO8grJL^yd0Vb&>DNzeW`(asS{3 zzyKB{-Lb4`nCInHjN+)HOR5f|RKO~5pgHyD+$cJqOGqB3l{9pfKtRt)2g1!F zqRh&lgB*%a9wo(#qJ(a<9r8J*-_si|1eUsKrmNf_~ zR>+pD&l_%1DZCMF3er(WWlErQBn2jv(TK(s`}V4TzQNw|cb~WX+?m#&R6(j-vAfs$ zHC50b$&lEW*kbBMqaWsZi~w1hmzz6D_;a3ApphGCkuM3vfCo2QObTOa2C(=eg1B3R z{^^oYE9-nA=&F87SNU*zG$-ln2c_lB`{7ljq&H#Vq&|mHIN>xmTeH^kg6*o#+77|) z%Fo`@jkc$7j=ku)GxnJKX?{*LsPlbWURku#Xs=bL(5Y3gJ4vHq z-P+knt7_r)(swlMAFp1qGiQp{6j=CbGdk>m?KBM>?wNHZeGc2ON|DunMI9@&{EI6sM|`alenoen1LPj8_=d8<>AI2`k@+DQT=+Io)s%qJO8== zVD-B6x`~}OEH3$Lu8YGtt?&gJfo~0@N~C%HM3CYy1`2$PPWCpl96n~6R(VKIww0Kk zIXNFBX#k-r6Q*+OGcmqFs8)?e>z#ooUZ{R9|37tkavdvbCkUpjvDJ zq_$|y!K_WF&6gib?9s1WvIm}CmoN!;e7LJK=t=qkQh~+a&WF_0PdHUCpnd}&<;y4= zk*f;m@t(I9i#}MuLPvEFfW^D42FkG0w)%42c270!($BrgT1iWNqFGu~ChCK~kZuz` zoH#sELh^E+(w}`F)CJIzeeKpoyY|+W6{=G{8ndIKz#-j|P46u*8dfuhgvFA&*+Gm= zQ1Fk}G0vJlmxQH8;3J9~ru}r`6~ag(qa?m}s&cCWT3P6?Nhd99pyaji;Ny<_lC$iB z(|Y#c@3_hKo|ITkx^$(`k+kaw5JQ`gT2av8qI0?1HmSijr2$z}Ig=`{Ch$&ZL`_XE zYx-&`-cDQAV7{%rV5dCM>D}nLo7Zhqkmg2wuu9TNX%o*NXMgtu}E4%aHo>WW4M2a6C`s;=c{=Qm;g}ucpd^O;3N|6 zly^wnid2P?BzmXO@fS#xrQb5*hxv}pWan&paJtos1MB6Ntik8TJqvXNix6=g#&R=5 z+NcaFgcePTRKkW?E$OU^AAMAn z+7eA!Sqdee9Y>#e{DZQ#)GRqKB2QM;ht!G`R`%Z*k@f@wQ&ko-C)}XF0$0%05f++> z$`#FI;Q)D83#+-^=h*N6@n3nKMd@(pz%J$2)peXUueGMGvJ#?yahK*c>8M}6p>MNA zF{Ha>7b>bP|6r+kHhcU1%P6NIeb9p>vFYBFR0F`k3SIFf zHAkotQc#BgOyy{V%1|{VL0CP{R3@!Bs0f2KNmseGm?=nQx~0{z9TOva){pG9-}t*P zXxSv`JDTvSZH4-h=1GDCR>D!$E<9&s^=>t&PLU5OulNh{Zq4v}S5kP76j-Hf8G#qO zpxKJD{Qai_F|RG}^`x)nChV#!Z?HONCZvb@)2a@`kk3Z6DM(pW@_tvg5V&*lh0ok- zw|2^|3-+b(c1K!Fp-V~-l*^I`>a*h*pvs3k5bo4yOTASjiw%Fy2IbCsi4MmEx5lRY z0YLO;B_BqcPw#*Ox6&esXdZW3UTHlAbL$|3%)L(I$hp^+I2zMCS2T))5ejo2q zK!4{Ny%VX+45me+RI9@a8T-(OFZMK91OqRVy#qd^&^eLlez4$MIx76itBzX2c81T- zOm<2NV5G0HSq>due(o@|drGrHl>BvBgqMb3quStI%+jp~G(7}(?BJdPCTO@LR*-&GB4{!*17U?cTcI4=;sD4_N|yeG&52Ph7)K!#<;!SpR{X!kpeG{PkB7yw~_xk z5@SxFO_IgI99y$dt2Uy|;*a|mm3fjqsOfLQ`m=4V(MNXWZH*9N3*=a2RLO=%W$C|p zjXvL}T;&O1l(j)akM}t-e9OdONV9Rts&WA&em)=w!#@RYK{FKFO<%g~D>lE#6rS}3tApheblAEmdLeW`Ws6;s+5XWQ9s35E7A!P?{1=?`%<6OrfxFatZ}IcWMt6pp}c07 zLcU_x-+agpF9wjJ3fvKGiaOUDDODi-?=RkLM?2DFq$dWc=>gw7c{UqY0by}Zk!v`2 zB?&OxB_3w@vP#=VrLyH~4V!OFhVU(rODpxf-_(!<<@us2DxFKxHS(J#-x3lSQ$Tu$ z;-*jK49~*h21@`I{e9qXky&XD?Zcn=O2|PAPE7^w-iS7Zg74|}0{Sn#@~bv1O!~?= zH2uzu(zQ67Nv05k-)JI5_wivqg{evmSYGw@7XUD3$ltfR*x?)cixC!wJv%z+ zSxY_*t*lp6*`~_vQj8jWRAtxXUtTQR^yr8kE=;SQ#}v3V;v1pX;*EVv>__=D+Rk)o zsme+F#pC&}Y{kHMOtnRI&7?MQ07zI&g}#aH;y%AW04Z&8mJ1pJkMknpevML%W$i%82g@-6sbSi!;& zCX^7MxL!us5rA+L$r%rxyeu(JHpMZr`wDZnTAwI-TVeQdccjbSuN1#TmE(>HP!DWM z4T&_cNKd_awKz8xdAuS~o!hENM`<~v)>T`1^&%TV!%B#x&Nl<0&L5+UGyB-%8V} zG+PBJ(pIy>5zU&lA<_8b$eEB54dV}6CQ1Z%r+)5E$*~ zIbJuAKj7@CV|wb4p4!!uq)*i0J;muNj=x7#QxjmM8!!QwB2}+H$~!1o`fxYJ-72Fg z>E0HQ`3^r{jO!~h1E3_mYo*h*rThU~%+6W$P{GccEs@)nh?DP3Ea4m@H&X;U-i0VrUq*`ELc%ew42mz z$M${pfe(Djqlda}Oq+u=rOUspX?~JdOiNtzIK($dXqxMZdWE{hjtX`FE|XHccFWn1 z&KVCQ@Ebd2)t`UTbFJjOyB_bM>rPS`kd{bIg>^L*wiJ&3IWJ%?DdM6MEy`X{JZ7Rr z4a~(s-uCjdI8*$pT`K81bn>`1BGXhI(2)uxUsi!EY1Z&rK zC%L+q8pwb3!;=bHGiku~tWuk?OTKtx2)_e1Y#yWq(sHX|quvfJI-1t$c2#f~6nEIn zD8cTK01iMTB6hfjf19_t~Hu%-vV0Wg@R-NYKoB! zDR3lE;L&E3X6ST$JW6%KiW#nE92}k+z+!8V_4*wv)$*!)N5Z3QE6XTN47!c!4)EKt z8*h~aDBoter3vG)oh~Qn;rVey(MVaX9{te6fmLD&M{o zcisVzD6g*Kb(OB$%UNAuY6z@I$sbqgc$Bx>kJhD+)vcJRSVFqy$eA z8ci@Kh=|T)d_FYcyh(W{!;}km0f2UnT3B&q#8hgneY*A_LDC=6Smbb={cm0Hg(h z^r){`b38z&kr3}{Y?z(bJpwVcQ-2S0M~LI$soQ<^Lwlg`Rb$zJErzR_025G#^r17T ziR+>QXwXR&A1i!zL78;B%CIA*gEe&2w!%8fAANM8FNvAj z?(X;PF#4zBwemTa!1Z3&76r=E(xMeQr`nQq&(6-KHEZ+s@kAFSD8l1`kXs|Od)AQ!Xc_3d0kvzC|@8Az_ z96)%kb}o+8gnuWOjEWokYcm=T9(N;?Ik3e;lYI#>9x*@c`%s(H9e~vA$gw3Az@(r~ zRVT5>wHY}>QhUvv{y8Ju!)xr}&Zyw&e?-6!spo+5OSKBH;!f>&4dCPkj7&!kM!!ay z5*DumzyURqgs;r?-2hUJWR=Z+CfiOOm5rX+7)b|}e^YrbuuxL`1p(7-q^sht6gzfk zuxPip=549p)FN!)Qn)s^+xnGd%T6uYp(4^pe6IaBWF*~{?{ZOk`d5kY^M_THahTYwS z8W0}T1n61=XwV%z{0)MXQFU}ldXG0is8=WPxJ78gkfy&`*AQ{sx^E-U?t%EPXw_DV+UQ%TWGb=peRoyvckHI7y7^UJr} zC07*eW3MaNf!FW1w>)W&UGws3`>qG8%-#V>QR%C_ywu3Dzu;@D#Dj&Cc^-K&`#+z! z+0Hs!5_?_^&_IKK&Sm(r+7B?2e}zY$%MPs$9yblo%X=vr`=Kd8h{ve~!ap`NOdrAR4B!s{65W&N$Foy@&N2Rp zgCPw@+*K8WRHdq(K$d6VS3ZrWX+3UqlMl^{64*P*y}jcAJNu<dS>BB`!GEyWe+$gB1q|lZ-ON-n9Q$0TVnYJCB=veQV z^5qPGKL8)v=Ln4XI=cv<-x$!rJ3v~2gey_#qe#IYihgThDXn^(5VA^MjpInIxVytK{l z^~z7(Z+UTrHwsH*^2b{-`0+j|PUnY@3}~Ed{vAoQp!E6h1B9gqc)f5n(7 zo#{7t8vq+eH@NxSLhg8j!oUSn6i^*TFuzu61-W$m>WW$kZYaJs$jg=gCj zJ#tRr>kx`jE@yXLhYWN!eG0MzW^lBSxa`-B4_-lvgKM852SD#9? zqi?;B8K&OXKIBOfeti7nLo4tM6kCHF5qrJ<9!lPrp6aNXAXBJWMrulpCu^5`)(r25 z+>kZ}=|~XoY93_Uhg(>%6znk`gM?I=EUrNW8EH0kJ;MP?69U6$3;6-Y#0MUquLS?@(NIl1od!CVnh~BIG8n$5%(l zPnJtmHr-tXkS8ht_Hs9CbrvgwDe0@?LUzu+_!)uoAHQP1`lJWhyI=KSd-V$@>;;eC zWlukQpY7Tab}}KJ>!Er809#nltb{1^qc8gN7H&vMQj2xH=!#ya?Lw~*iLfQc`z~$Ep1D7zHYrrOh{~Gwx z{M@K4m!66XP>D-_IcS4Kb(=gfy7pV7O4n6JY)PSu_mrrgOxv)Wv-$d*Ws5bt@v@QC zZ|vB={m$w3;}6K#HUT)(ER%@}SO^uk3y3EyN29I)*wmymvLZan_w3U8z+Ut3%XadE z_t@26yH0isZhRLa`-Fz?MEMZvYj!dL|xy6vQe%V()imfChgeLtdwTH{&G+=72ha8p$dG2;F0sy&8kNl<{qhVNK=KN z4QcZx5wf)gr$y3nF7-Kckn|Gqo{rdcJQks+m_pI#jFI0 z#)iMbQf(I_otL_Bo@4wE+xZ)q9^Ijj+JJQo-}RP zwV&zRj+*qkm8|6l+pU$KSAVN<^b?Hq{tA4g$&qhPRM0Qde)T@kC48 zoRD9RU60d7=@oUY%rM=vYs9O5=-eYrW2&uWqNemJcSP?Whu zHmgKdjC_YPJle~uQc<*u=brv3E5q_cnc`*{kOfdm$-QQ7{0{o4@8NbGD`O>feJm&2 z@Aa!}C6y6_`;ssTk5(f|k&Xhi;*BI7haI+!0#22U7$8a6Q&}>+(b>#tc-f2a;xPz?%NN~xix zM2j#VY+3}#u;T(}cqWb2xj3T*A7uxBczUV^IsyggFvx?`X z!T~Z|tLFuZ)i>c$_mo`ds67Y={5?qg@mHJcA4$&(jr)C$_Am>otUF-erXVG2e=#e- zAS>q}dFh&ldE;bMQ3|3AAV))^WW@1 z?hJ)rAQC;~qa+j(ItsyS*}KigEsJu8o<DcRs*6 zyE1n97n)XW0z7!2y1_n-*GqgmM-b`<`2w_<%eUT*8h z|M~G>S1N+(iEkXgwmo9w{3iBr40F%NG;!1@35mBOnz@3q`gyG@F#>E~e$n`jfb#Y? zY@-s$&|jgoTc`Lf0GLRdikhY9mogH2P_(bM%J$s9U9o4q>6l&h2(t(LaMmvQ#IhyV zX03AgN}K2xq`Pj@O4!*M1|&SyfDW@yYE(jS$9}>C354?lub1lUwck1=h)xk-S?0wKWHeZ8+P`15WIzAU z2kaStaI@VoTeORQ^jw=(J#YPB+eYmbTj)>PeC`74O3LQ#kn<@Fe(EDWz%%$ohIpr8 z7?)V?4e!*>)SoEMUmQ%m?h(^M<8~V6c4}6`$B3*&F@&;W%(WD0z0@W26>A=B*XzF# zNm|ZVY}>3Dl62MKTF(#LYL5y~kL8eh>Q%n0&V68%bbmvoYT_$!sRh2uMEWT&*n`q7 zOa!JW4sH$}12XVKBe<8I^;M=H`w+f~7j9K@)|Z2y+~4PxZCC{>Go^7IQt^1mjz>2V zfJl1f%W6HA13-cl2IK*JE-fhlkdnV_m$Y)TXUcW1tumW^pYr({AC&gVou-`1W3c39 ze`3k(H{Wy2e&~&#ve#U;VmC~W?2$jP&-TvL?8c8Cvc*eREZ?bEezeoFMc$a#v2JHt zE#lquS`kx6wMDJ)wOWoH6IE2LQ#fwT1n%|*YSBlZsbAFzjXe_YN3c=#DN43DFROjx9vuk~0UG{@;h(qmj3@@65l?Q)bcQIgY^HefB9OiSOb$o^7O;9cH>n$`qqv;R zN0)V+%fBy4>EQExR0E&dl}`c~xK>qqs&^N)M`3p`;_r}(W$P#6VIgBb`ihU)dv9K` z@*|&Ud+)cyDy5q3zvh_jzv_q&mV9a2pI{vfdcI$qS7k>7EwF|awIQ^F`pV&ai-$#& zLYCkuzR?G8)cXOO_Vg3!Ji*1@uqy$Yv#DCa%6wsP6WWyH{>`IG*%wbVhD}$$tw=#C4GZZN z9uaWQKz^ONMZS^lwP&P?VGckl8Y=E14Tj2Kdt<#5bWK{amOB6%(24c30k?zSrKtca zUS*K7ggem0Sao;+ouXh1z%Gq-?HRC`lK;3Ajq&lr_`*qXk@B?NRf=zbTB>A|k%e14 zJ^g|+?6&y@+yB)?J8;9YEgtQv0leP5Xq_&nngFKit$~4oHC|^K=bH?F4nD%1PoYBt zAcB8%5*+RD6N%1>9Tx0(wIv$QCX&GJ7+Ec!{+5fG7~NOSk`_(VQ{j!;o6#MLg>BoX z{QH(jD_(s=X9d=T0=<;95+~G<3d$>tB5_+LDCvL?u7(lr{vIcU5yvGYM*pD`1W>@E zg4PyI*t%v~X1Yd#GVMDU0jhHMPR3?{k%uIwFQm8@0OjY`fYI{_w!2wW#cP17d>IsJ zW1RfYo z;~jSZt`BJUlfjlBe~{arDOT{iTPZDjwIr_H^wmGq7ga%vbImL}c1)y^Hl{lS>ApQX z#XNP6dQaUiog)p11+Kbb>pF7GYB~@C9E>unizN*C2}MX!?k%GC zvU;rUW#Zt_FAdu=)p$iwgI67zO;u+63)Z>1{G|q<*A2SxSUP!*7bhr^%I6suI@I-W z-$H{gfgb=h!)^r~uDZD%h(B)ltmJI}h5nJl|5f{VeK(UA%>YWvi)8{**H1INaXP2J zp>W3j@aA*}Ann_>xmnND8KyGAUMK}|fdgLY2hVUBoi0UJNsL9;3>{2f0j&B7Qa~K_ z8#$f<4Zj z@R%90r>aDJNrUQAC#1JrGFu~`vWwxY>9Iz`j@0Yc^18H@T~{5!^sd1}y{TW?{;IFcZ2MYHsKK{rft*ZA~+9|1*NY`mU;kV{5^0dK>UvEmQ8IWNt zC&XV%rTQ~9skJBJIi!*p>XK6&3KB6?%5}@s z_$psvKC->40vSwpGyt!#3U%F5*WLm6Dm>iE!w?t7&}mvs$Q>lH@&s6_OTVM(TUGJT zvB*X*^^a|(i=MDAiapQ@UaS5duUk}==zKsUDdZ=mw4mv0m8oRDkV*s|H{4jzw4cuu ztla=enx5|9dqa0bd>?k;qD`sgu2!lxkeKGf7(ATDU9C=A^^_Rp)rc(qkPYxB-rn>t zt*FkcyDF|Y^X$Gvy#~C$1<(ChSqC1v4hY{!pY{)ad$#SbHtgF{$j1cex{%Q zBusWRP*_+go>u&-s+W)PGR5RjUc`aQpg!_1+BQq_%ht-*t=BDDHIuVbPuWG5o6;SE zbl=I-YJ^soMO9Was82g8$fc_q7OF|z5OZpl4``$1& z8r0^Xt*f2zOn(56iU<829{< zUiBQegT5$$O1e?C#HTCjvQ?5q=5Z1c4>tO3R`J3CqkPHSPXno3pH}4u&wOCgZrP!u zX+Cz~H!k;uRnC`i9S0LJ!h%oNDh#;0a0sd77vlwT$*FKa={!!uHzW_D%wYV=-621B z<4Wt|35IR)vY?r|+O~cBBs!3cSs3 z>y*#uQ*dZS-)dQzSCSVB>EH;`-=%0O+2J$oJbo1~1CL-Id6Au))Zb0G4*Ut1fzoT4 z(6h(WxL*Y3DnMl)m(@6hqTCUI8a>yp(m#0&hb_$rS~Lly-R_E=bKdSW*53SU$LorK$60->7&IK-iSCc4=A}R=fsg`>>gV85Rhra5oQP-W+5keFo zcMt+v5GG(cK#`D$nY7F>C=@JzpZ*DF>IO_?r?j}a^TB<2KnCDAAVSCcffBdJ4EOB? zRA1qv=ce)9R(QMK@pMUtdSJw%t z8Y`Rj&}R4sAKjmS`KNJ$7qb{VBLoWJX%xREEDn|pX&pd)ns?VG6!TTR-R0#SZ;0cz zC}Z5gR6U0UtJja&lP-F=``;053R2Ev_N;9Wf5cg~ERX^u-q5QiDv=nrS^?EAx?xiK z=hK+{*b3358xAfrjUq`MtV-*=AReG3D1e9q z_p_0ZY3B#sGq_!ywywc|t$0add4n!?6xRoeB zpFTO&gv6v+H34Dm2S?CN6*uYS0w@7CO+eyGl5))}9JBdJNmRagH?kwGj=kx+mB1tw z$-{73k}FdR*EO#eQ8ibM%4E{eI>G66pFV86_D$MyYsos4#{lwyq(JY)uqa_h$*K*U zfndNgf*pPc3LjNczi77_jjRg`%hWK-siElffluX_)bor?nBtEwaI-)i=|*W7NPY@R z=>RIylIeU^Y61v&2$(s-C$%8hx)xxL$D~_uSis1QR6Q2a|UVf_} z#Z5i{6%fh>pl;k>P>})V!44&dJcEI}u4%au1`uElakOBPWbU@>_V~v=(tTC|wFxON zk8uLIq?8!QX3O@@_upVI`nA_tZSQGT;3fQ2lurldi{YJWbubRXvFB-J!I3 zsRH}IBlfiC{DBS1`>a?2q^hvMn#q*}q=Fid zwZy?o$I?RrC^o?H+)kvNItVs$&R`W()RW1B4gugyI}TJC7%YDPDs+W#rRU?SP&}oB z?I*s~IrPCQIJuxadJ?8PLonfYs6`?EvE$sdf-M0PV z6V?;>mTq6Pm7_g%)P$z3qBUv@&JO@ar<5xdo0*xh)3-~4E*I^qU%bI`E!6`s0UX-M z-x#Cl5~gd2nS{E;ZgP;i173x6NG(7!4pJ6by4Vz?zAd!@t$wq99l2gAS`SigZTqTF z!1UYaT3|Di<5+Igq#5Ra7;V;~f90&NP?A@9!YX{wWi zTx@jgr+)eM_NA*5t8S~PLI9zt=}fCsB&Txk^NDf(G~#%kbfk{*&2LUzuP;J8$ogx6 zacfj_t&5>n2M$U_cU$?8A5znAtIFnYBrM1EhzGW9vEXMV zi||8f78Vxl*y0h(-m=}=%RS$3ZA-7sl*`r=stSDpT;=$*D?`y9Wb6#U0fFq%KPIPk6r{)CnX&@Cu-fF92TyD4}A0Y7=j~^T?K$7gP!*YcyJ# z)C)E{6$!bt0XcsIz8DeQWkwmaXP(Ww~y<=5|ZZ zR|i{5byWSS3_mK`SIHsyaiDNpAcaSqt#$oRe!ghb{67v-Y#|871dx*6uLWQlM&|2@ z@*Sib5cLx=C_;V0fZ`B#l%zi0^Kvyw&;spO9WwG8XhF>9+5u^|r#@IdV!!Z{-)+D3 z(q}5irs7rU2ygpF6nbm}Quf|P$A+ZpLmqgRO=#+B4Y-dlJuTY{qgpuxrYa&8N9w4O zzOCYJ{29S8iEuGYd8jH7HGzVnkp zOf{ZP>6vm;Lwq{a7i`ogwY~0SkC9*4uO!c*9TN|0YIjr9{OsI>wN;m9XVD6oodRQ3 z3#F1BRkAPFbM~dqF1x<5Y&R|4V#fsHQQ@FkdcdZOOLioyj>`0`&`hKPoNSAoft9ic zRi@ey>yfr2^cB}KR4TRM0aDZ7K_DOExlkpY1_riVP5{XVBFd}s8p`%39W-eAGHK4o z8^EWWf%^$YGXP(^V?hom*Y%A)5g4mf3+_DK&nx~RvN)RsTz5naf_IQbJo z$B+lVL*+x=SNHhR@FZOTj7w5y0cyiId6J>^O53d1I%3u0&=z_cUd2gG(Ov6IHLcX$ zX3gsw_UQ9=+YddnWIIl7+qO>Cx2?WVgofJrAh|VoeRu=#>u2KAVG7=o;pfhr%N`qwP%Jh*Vi;2WiFWpf*rNHNqK%gwUW+ zdvNDbH*kSuC*`m5`Y>B%(TNa#P~SlfJM;%9)7FQ#*ai0*$zznaS~f8z=6Y_*2hX5> z$R?T@yXY}R`_<>2VrQg_E=x3E3+E#(YBnYqwvqAa*_qE&O(U49xt3CnKZ8b%r8E3iD@=>bOWpW|`~6Jm!H`GT zcSI*69wR>(f8hd3zL<0716TiyKsqI*-#+g?_{KOy})i{^z8<;it~FQ`FW*y<`1R z&U(Bid{h?S{0(BNa?8#r5AD}~?1A=&zi^supXge@Cq2JCWs}9C<;nuI1C;iu%rPS< z$=<+-zsw-(&1M8B<3L@t{TG-rz>hcnc#m8s8Z7KPC~S;8sylG=!+*w_i~H?4&wiQ* z`4hAf|Nh-k_t}^>1*vMQHIH-{jgYL>I7Vux?w+#?&e>(1#u4d@TA`{V!ae!OTo|d^ zM6f#8Hm1nD<4mdstm%ot06ISu?d8NUBt!)A8W{b|sq2*ZE56bre?1=upUP(C>#NVy z7WlZ)aDq|%Y++>ePQ#Y#D^|{SY-Vtq{qA%3*@NzXiX|$4II3H<+EM+wnt3#|eV&u_ z*9_8={Grq8gt7LJA7A+H;Eoz|PsHS3K8f)ELNU5Z6p zW-}67Q#&{!ui2_&u^H?&BgiORQf-}a(4ji1zF&_hiC8Xp^ylS?@kuhUhg^87oqI~f z+I-X^-Lp<>=D!;erEW;7zJ4{$i4miILCi;2F?;E+K3l8Y{gU1*k}QceT70KN1vnE( zLjp#7s33*&dpvmxul#XFe*Q{x2bA(*isPCoOrYU55DL04y5Jh|Qsdy(pW8C4lE`%> zz=;GUj)28|N=dL)n>#!z!-38;n;QI@q%T+0p1zevEB2BfIm@1YPR&}r%8N(h(`k7 zxC#8kK+zVd+3S7BLAvU6RD~Wm?p}P1A>h%=4*XT4YowZ@9dAe%Y22MsC@NY`-s}1Y z^g*@D*z!u#Uh<1S5yHh!;`&Lo9^sqQrXUTZ(at8lVx_8_J@L^qcGBD_%AFJJE3ylg z7Y4XJ83BfF#HJB?hTluZkeEulXlKRf5E7^WRxs>CDl60!+N9`!EP#jCEIRc3TEPHT z#^a=*MDj&&vNaL_34nt=U}|>&DhfLQtF}6myc8CJPwB2+sJ_E4pTH^Ex%(#U`48W% zDSgGN%DbBCqS<1>C1*ch)0{K3ipuk|unOcuwfVx7jjB7;A$9wahwib*?>%gF@t`Nw zAOc_w5L_sw_~FxJN?{PEtyB28&8j`>+^%OUZ@&l6-8tTbCj-yjmJZMDZqF}Za?Hd* z!rEcXP%?Gm5B{iBc4?eX66HKGfDJH1dq&ppvWKqmJJ1YNDp_ZxWvA>Y+jl@xFDI#@xMQ$}W1`cUiM8{c4c#7`f`F+OR3@(g#3>%Ceb{ z4#-hHrX?pD;T(Y(G+T_8jqxZWy#My`ZV!ItNsk<5U8s>#|&u#NMRFK!Nv(IRO2zAdL);U z#0>G_uYihC-(bQ*PDTqsYUBvoz=SF|+|~^IRJQ&)q`;iCehO8mq}}OZ1k;nnLdm+l zHr*-pFwv?$vBy5@Y~d$-7Kl5Gd4w1@eTvj+b5a&tqr6Snk3auH%a1x%$*4fBPR-OQ z>U<7}(8)g9bnSppg`FH>TsmvLRjl%1DmKPjO2dinX@ZyA!&6z7&w*It3*RRvyuKKl>i4(o<*LG8`x^_VZRM*X;b0Gxl9)Dq=6OiV))U+XB%w zf`QW`9&)-}u!m1!l8@@(6&N#Wn>RakA8*uY@NLx&3}Q^7WAe5ZbW6DGcj$<-fnl+- zu?c`*Zvq9Ic=~ZSRieM?cLa@l!JqtsR6_C3=ET>Ml?!cq{*OJz!?#LX1}QI`z3{w~ z?a3EC(B=;v)M)5PRg9nz2ynYeK?*n>lz;a@}w*afFdXo^?*JP+d`8@EPz22xHdfANIJ z#P7eC57#Oe2d2tfZ@i5s8dc{6az8+WtqZ?SO;{YAXjUVvGXOhE$u*-8^5u_k>g>{$ z{)*xF`M>AW?alks2drlX-4%Q2Lw4K4gd11Swn$qBsgEpy!vh3HIPfw4N2i}!Wpt=lgdxuq!KfL7B|~fijx8u z$s26yrn1M3OJx~92Dr`u;BIfxmiiexd+&@@v?8@^HFQYY9e0+7ow{mQNVSNLoibaH z3Ze4p0;x4881I_nO_;Xfmwr>81se~)Shd%}m3IBKu4xukik>{)pu4X1$#KRr^ZztX zxDFJ6s$bc`@Mz3vfO^rl+Yf%(e)HE~py)vuY?WyJ)<~5*{p|IOP>?e~Mjh^t0YLaFuAa ztZ}oRqMu+)UwIz#Q+l8FMPijqsG#?o{_4s)P!A0nSm5#?&tTrQs?+`i2$s{4F?Y#5Ev=nL#+k_ zm}OWMa!j_WaGd94Y z29Vnf76)f)E1kOqPQPa_CWm|X!Q_fLP5BeHymHvkYhMNCt_>O5F{s_+j31{)ujGu@u~$&lG*2dBw+!gG%N2 z-Y9vl8fDA5U`au@HL$XIm6#JR(whz#cpvXD4SIdQO`Zq5;+u~_^>>eF#zu=;#n0Od zf8r_fR7?Hznme~dWVt2EYSmWqGo=~3@cg~@jPE_qh7IAeqlJ`KX`R-JC0f;0N+s*H z+rlJAxO&0@+dyh4r~wq*u0z_vC;^qDeVmxerG^gig@Gee(G`xAaOR51uBeMCVU-TZ zl=qkc$k~*k=%0QF!lf%cr2JCDrQ6Ccs07$D%9}j1!wH+p*X`EDhQD;Is03L~fNho8 z0w$X-f|F`dw3}B(R?de7hi5fbC$GZ^6S4S6phv7;cshIs%fm9F9iURLo8 z!NB=7!{2}#H3HvyBZb>PObb9W=*)`8Hc|XA2mQ7>JIU~}3?3$=ubIh;g}fD|w|819 zC0VkI9(O-`=!IvhM8Gca(~d3DmOJUJ3{x#leR30*opkgJcD`so~`jajKTA^n61O`la2W z58dGBmg2Z1!Iqz^Buei)0FngQ(T#+cLpevcIzk=8%fu#XH`~Xr%h;i2){5Pcb@B~z zql7z8<(Ad>MrnD$z9fKNe#17~R$1|Z;nIbQrp6^2UK<&OkDJg|8L??&ld4sB!uV9~ zr9jHt|HHMrqODrcq=ajzPtXsXlq!~j~e!pYC`K!;fDqB}0UMEDN ztrNA{5*0MsdWl9&p=izaik*Mzoc+iTJlu{QI^ZB=6F+Gu0xe2&FMXJdX&5kI)G~mI zg!8F3*yw=jv2?0OLWpsx8{=F-P{huWdlc@KZeYlZGH|E1Ut$*QML+ne8gOd#VC5u{4&%sWS%dSV)6yYBydtYw86$)%N!cdqyPI+H@f zf7eLY@L>bvv(X7g15#2g>qdM`4F`--r~GEiIs@Q0B=N(AjVzpWLD1VrR-LG5TF*-t%aiE7oB4&7is|5MMj3r^mq9$`=q{O%>)zg5~YNV%&-1BDcy66mg9fAMovxt28= zht&wlxkSqgiGz+tl>?D!89h&6W%~C6uxTT4xFkTL%J_5-17(=%eX|$P<~ja{DOyeg zgzu)~4pZL-hP(l++v>2ioUm~(X{ma-?I6a6dug0#D@{LH)~vD3cI-6!$koes?QJ8Q zDa$`UHwxKO(<_T{xp}u2AD<0Y&W(MprqtSVS@x{o-#w8^D zgP*AZwC;yJX7G2lVgo`RQ2Ht#olUIbRZh~gUboGq)+i%em|wJ=GcEhgUwoq0Fx<%D z5W3QN8$y0tA#r4Dl=xdbq;INkv#fNx4Ym&LwXgjZRrH8Ne%BwMTwYj2oe{$YPJu7p z9tE>kapX0`LNdOIbC}-C`=Y^a5kW09|uxz9bztR}?U13R3I~#iA9;9LIBB9cP>b z#-OWWr&8O?qwCf*I3zoMLCUAb2UdEgY*5jfD{HrZ=_cFu=pFWR@A{f89;UmtMof7J z<_q?}-gUc8p4Yd=RefuTL4L=G`F-3tQO5c|`6@cEGCI!Suep6AgKoyGwBE$&{Ww4P zy-KkjfnaNxVL}}OFD0b99jiC$zU9l--;pCntkW6VpZv*Bc@72YFr3oDx@`SH{0!*U zi2m6U6^r4K5+3e@q2*FVARF2bKKT@T+V?!#7LP4jGOAm-GPL|al8&bbha8Lzhhu3R z#$RiMU;zU)ec`eBgYsGr(sP!gKvKPPaO63$ z9_i;SDtJsp@+3TJkFcg#m(WeSMvIwOy!#4kRBF~+S+>Q6#OAn3O1b{0GO44ZK=pt( zn)WdO8RJ40UZvM-M%l1VLOO8YH8on`2VRWxCY7fCKq9vIM0xsG0+sFcP)(>jCRNpt zpeP~Emo%)eKFuXXt7##fWCYe0&oT||+24D8AxQqO$ zi$Ix{E<*>=Db#CVE4>w)M77WivT(&=Ep{^Ym6=`kxZnPoeeRI*mN56nRR+{+XysnU zii(@hA68wZ!>ZuJM{4#HulclHo15{s8ZTVau~D^e)jnH9p^Xj{2TT~4{say6mEX7~ zART7|qk&vtyJ($}pMNwCqdYNdi= zEtoVgdCrTsvGi5BYIVZOqh)*9&pqB}DQCLZSw*Qn@o%dn9>Jw=orE3GG&TO)aryf#K*=Vla0>Qjm_*K;>=VE&sgh*DU@Ty@r*x*X*qG&#~r( z`|QS#?YD=`OxTN_l(#ddb2d{dT1gA7o;v#I%FwPjlC=+A*0axie%a1`@(vB;fqm{n zU$m+6tlC$#`9|9&CfJmsX`vC(j%`}+&x_ACBA#JdPc$bFFO@XTOb7&k!pkgt>JXCv zDan1PN_hBeBLU(&F)a1~sM5iMD0DIoT;eQPzsJpvq8+^X6ZWrv^Kcf9{|w)gBAt?sp25DnH812D-zSpmw;qs6_ zoG&uGErq0hsVUr#Gb%s7DFVY35L7TpRdjrS%Zvwz%SSDz8~ zNxZBUNDO4xn*?V6AeB$^Cw2~1&v9089Z4=|F{cVS<3sb@R#aY{vk_6oM$}V>@r4Xt zTt=tleVWt|$Z;=z()ONrvh8|6)fUx;k*4#>&QZ0K*X|@XXqT<7Mb^QaTUr1&HQV$o zpRi!dTfSDcx;ne8VjYB3kG!$rOIjU=DpgLy*PuH_^5P}IC-kK9$*KP9LF)MfIFU<8 zB&pJ(Z)PPWgP-`v^YprA+iAeeB+&YvviwF`(UVu9lGuT(Z?$uF&e%Kt{)Kk(9`S** z6B*tdxG_(+N_QDZ8$B@`$)^QHUI4u0%3JJbU+`92$tJ0eD3Hp3D3JOBNNy->*wevC zO@Xv5HNYh&z)TPB@|PEQ^_TXSenPeV#>xgQ$a5nhjkDTBS$;QbgZRka6N!7!(!o{7 zHm@>QhgYjrs}-wuTVvj4LD=%hI?0?BP9E9H+*fRJez(SX?Wx*SePua?hMJnk5Aa-A1 z3yULwDGQ0KKO`rscm^c5J_9gy-R}t4sVcx!uLW^7BNgaa#m?Mu)c*K)o@|eNz`63* zz*dGu1k+j#zbU%wrh84V8EO0dUPq!Hv0AgY{nMxI=YQ)xwriiXF-`6H+z!9TTPb&} zIhyck+;8h?`gBPupkz4SrD5%FCUKKa^?oZ-l0XKv05`qkcZJk~*qN*3`(JBBI8Du^ z3cLd&1f{eFQqL+z5J1_105myGwY;raOmj)c<}~-V^LeduyLl~`W~@<`)Rd&`4~z0I zSyAmCcH34_8$0UsL@RKnW)4X6Dw>{YfYPS4%+L-7n0SFx6x)U!zPFmTE!qUba@oiC zX3#a=GX@B7xO{~!cL#C1Q;Js?3bS{U`2=GD6bBzpd!)o|6P#jA31Wt+e5tM-~# zKFfaknfF&(Eu|#U6A7yld{%v9-6O@iulK(ry6dKU5m_O zZ1?GBSg)J2Q;;T-LapMI00ssnIkgzzfC+azd=bUeD}ZL@4tsZLhshrm006V7qMKzRTUq6~$z z`lkJUrw@lLA7nzWKST*QxfQJb!tfeS&qMAE`)C3x3nUVDn#(p@Dcby@qqbwmF1zZQ zTkOZaXWIVu4}QiHsV*5#;;TKmLQQ#w`oM#6K>7ksG~QodkM252nvQS`ZdRcfX*l-0 zpZaV2&;P#G&V2A*t2gpo5Q(s3lE&^@zx0TnPJRhjx7r0P6@G;B1ddMORY4S-?3 z7&4S3jZE-x9P~wssd117n>xxSzZAIqgd=pp9RaDDNoOVwlAX>DHrLbvoB9KA-?`Dx zP=k(I#JIr@AYJRKl$0i@GwVtD2&7|udmND`6sK;d6r|&RxHY6bzHc)rU)M>66P|VF z6-C5h#qQ~8J1cj&*)R4Lyg;f%mT$IQMO$i1oy+xXaO^sJ%mdG|H~is`+f+pWZcDjZ6e(1S#bGmDcr+DE7=ZO|c@}4Fa42wCpMO?ayERTzlN3cG$6- zj%XI1(Uh*K0_BC3qnN-dlHKnSQwwfa&NVW{Fs32j8Ba&LA8u9{57%)D2afxw6>G4O zXPU44dSe0AC@R-OlOto+Y;})}chj07*nec!+40X4MY=aq*OV?A{A@4kuBxCB2(iHIbk*dnqx36FnBUAB)O6&eWmD9+9L1Nzh3ZL>lTyxST%S zvsiL4soxMP8su3mhyu!#pM(Kl#O8I4Wi_tT?JB5Y%LlKr55M&lcJ`cROsP+;Ue|IJ zErhx0Asw6Z1e)W#9_vk{cuiZ@hpi`i<}M+a11Nn2rEbVSMy2-dn4Ppwe*CpIH*?gI z1$8jn6foBJ=u}bHf5cHm4*oLA#}#@p%I~MUBt=5Y&%uE-2hX6-Y@XYE4mt-T0wd`IongI2k+(PfJm!YvSr?hH9Ty8`|4k|Q@3R_ z5iVMz*|&BlYt0td8d&PaY_s8g=X!H$A}+=$UK4&tlydu1{6Go-WDb8ICDd?6 zJ}Lq#0HB2_{L%hs)G?uYNHj5Q14E5Tw^sL*ac;rrHQS9}k*|h>Uuag4!Hy@hjCV~}r3$>XwxvK9H5#R;XL(j#blGQbw1+?K5ABq5_E;yE z*!1)cOPYy5ss>HQccMxK;O>(zn#71w)q&^tg;=Y_Kc6yMrHWaWwLiPV6QUR6w041!c~iaCxL z6yYVnq1-jn#LHtLUebvayDZwiqXKVIKi~6|jlZwp8HNHP$0+3peAIOBx~B#<>j3U1 zG5rrEDEiI36$H+lruIyxZpW4uEw{L2zwx3c+cPiPZQX^dt(=>+WVlV;AVo$Kqn{6O zqk4-c)CJyPVi;}!3V)(7!$f~5@^hR{^tp?vRAO|8KO`cLL_he^XV}L+{4$%#_iQvT zzV%luSMFG@da{kUb0UWN+xj#L{WL!fkRJ?o-ATsP0VDw7X~%FkBwQm=WwW)S&hW>q zy%UhqstKLs@l`?c2>el*!Qr;J>}rMbcE6N~(CXAE+A!SRL26*Tn>w!l!*3&h{ydEG zPc-9shw^1oo4WHCPE*A^2=iDWDs7|va(g}sXMsc=OX87bwHUHxOG-=DSU6_;MrYg0 ze)=)?)W@D~3kQzas5@)Dq$K@RDqEJ_98R-E1L)O9%8R_C;X1Ba#=~&O`a#ieobGl> z+G+9Lc&1q-DU8keE2;Ui+!rpr$$s;<-(uI?(zMx=_E}q_x(owB2wPDcsAWo%M9LQ` zfyt6E;iNucf*~VU(OGEuwvghoSI0i9n(w0;KL?#hL~`j;{<>NtPE6rX9LSSU?{FRc zee}y-FG(T%6Y7=HS{kxe{4}p|^79EB_)G4ku8k>nTeSVwrn2FfVektBgFzYgJyloV z4-Fs)`=)XWlu^IuR_WAe+8V=y*3b5>aj0)+PYvu@Pd(Y5_|TG6w6=9t65F%mBUCcBjI=BjA(qRktdh%k#DrWvEVNy7%({Os4`ecV~Pz zz^4$@1ELi@K41i#oVldUS?OG{@$R9T0lT=mUtRIb4{S^RhG_W6;c3M(b|hArC_69~ zkOnZOA?`;wJC?z3jY6lWEk50^bpuyCh!b2V5_$Rqe6q=dluY;3%O$o9Zm$z=SkKIo z8YT4^D(smGoSJFeR#-t(ymhx(d%k6J<%9OTADFcVpD*C8G!(yVvs1gYP#RiwYQk@% zaN~w;N7@Jw$K4T_(H;lpxI3EAw%`u@4DLG~u6F_D#JwK(y?sRUB;kZsf$B*8w>vE@ zruNzAKl>_s^uxE?{%a14p<&8qWU~+o$HBN}#0O>)=6*iiGgZkgso<}0r1R(nIz*ko z)I*p1rzL%=RC2;aVaoHKcBTM|xJ83sz)cLpD@;@FmI?0Q=PdSgaE~27lT(ejRNuKds9+ zAEJ#P6tC}gNeV!iXtenD4{Mc*O!op1ub>{41mK>Ps|8!`n7#bB{?7jXpD(kM&zP2^ zOe|a4uJqD3k)*iCC20(c?s2m! zE#-#1FH>6eyZb@9F?Bi}E0@cDs)q(pITlcV^v0{~FJALEHo1MbI=pX%>V)NaiGp+_ zbf!erEy^#;W7EC9AEWczn*yW1))0oNgOftq#jLhzEFgg~FhOw{I1cPoJ>U~Ois*4! zS$jN%#lytTJQ>eZsd?2SG|p7qd^91w2yxSJm)ILn&`D3E%|OcI8RQweEdW&U#UI~B z(lt_>^EHI!*y}}F3A`L^2?v)2w4`jkQA_?ZytG0|2fcz_uRPc>a&SfNfhYci2 z)l>&25|&1D|DO*C`1?E+KZ4QEtqP1hxyfxmI1(3OjsX3;WcB*Vt?Pk03;)$SS!tNR zlRs^Xmx){c{^brLuA`un9`8?lByz}cj66W#!6|ptOMP~9kjgDdnNvH$P6g7E2%1(k zA92GZOs~=@vrE>rvMnb?E#{kcZhqO$D|Kx5DNUQIu*z>)UbE7~^o*wWn)q*0)wD1Y z*Z?U4hW5op5jKV}{G%Uy7zZhC!q*$Z;6rpr1KndF?TcYlI94uRbHG-dwWC@^{=`qc z$u7C_Hk;g~it^HlG9QwFTUjfLYyDAIvsV?2s*^O$C_R7#utQEaq>>R3#s!x*UVq^r zHhZZ`j9&`EaKJi9TBd#^X+q_z|sxlW|bB&kdK z4Ty!1uhz*s?K;Hz+}#YQ+$Btd-@FF)72WVg!4v?!=rtx>Vvxw@UV^Ex|e z$IX^aG<~a1)k?`K)tcqXlNxv>t1-n3q<{?|`qR7OAJ-A6F$|#L7Xe6Ey!Jj${iA_j z_*3tA9SwAkfs|>UMp1mMoGZ-9(AtuawW+c#brSpg|MMw(!(V*VRx%5=ecK)}VcNP{ z%?~;GZf!A9l9anI0+t_sz!sDH1tgLF9H0WK!lGn#@Bk_Rf(>Kj^erm)mvoa2a9MW2 zs#S)i_K4jEan2>EOz_p<^Kt?<#zBg18{@1I;8vYCAYP}lKECIbc30$EB>#9YBtO?% zG42ivM%Pu-#V0ywBeT=Cb#J!QM_1bEwcBlKdSqSARMkPjDjI;LN=36)NdiM4EL3cw zRu)LZls+y=BUk|;hH(7HC2BNWkAoLp;*ZTW6#b)t?lF+YVyOt=jFs}QF#Ff+RiUgjQ>df?xJuFOmTF7-`@>Dr~AO%0U-A|Xq zqn>H>H3CGc--!gc@b|)3NrKx~;N%nehfS=Jrh9kG1c}KKQ`fTDeqsk?Fw(%*b>E7% zuW_wyFWqQ6YPZ@4{ws-b#{2 z8Y31*@XP;V*U9S1C zPHl%4pEawhjy3X~(R451@om(S097psV46?z;wwM}WSA&H*Gp2a0avsMi{V@Ya_n(n zMtf6pPl0qZ@(z#zwEmJZB!_x@*gxW{{OfP2+pGWL9roT2T&5{$hwVMt*tx%a!uSr@e&#qd?yQ@l-vJJXSck&ctSUmZS0d>$ImpGuJP6~(t+UoWc z1IVQwj1%z5Sqwx%`}UH;Q76Jzqvfw_e+0zymlu*v@fAc4sf~J|v>SARA4(y@I`Y@0 z%ikA3x_13kj*hjgB2ZR_6TWv`&onfp^8pI+vODcxMy?L8u)W>S*pA*&%a*4!jRUxX zz$!pWa^|HXl>|-z1rW>8Ujw`(RRAzWNgBauu{^HMHXP>>aW;=Fom!#-gWu{_TEvQ<(x>l#t5{P14 zx#Gtod&;LWG3l${01`1sQZyX!-~@gs$0e!K!7{*?%V{wLV8lom<*R>z5s3x^eSsrC zan!NK{;fL{Heit_f81;Vt?mS*wth7@=qN8uW{i-eQJ+{P)fb&oc?P}^j@~@9=|R>y zs(*Nc3X4#-_7dwK+h#NMt89DcVw)UXZ-Yw9TGK<@-rH`aY|&p=1kfVbq8&iG=3hZa z6{t1>DSW^`ri)+%WTe3#!}Yi%#o!NN)9=wHECTgj2U6$+kcyhkmaveucDrMIKMEzD zFQC2SKabkG-}eE#>DI&6kkUUfvr~(y2`g$L!EFRIvz!on{cfxFZ?f58-D+00OnJ8@)oCl| z8YVSfU_x3-?-bYo6z(Vyqd&j_qyQ{}G=ejNl{7IO{=^#xB4N=T{l`t@2kvOE^6K6U z($(8&>h@M$z>(dT#OxR_cVpo3kcKgS-ebjEcrJ<>RkMN}FZE8Y5 z%~&UqWMOI(qiHNUWB`@`g5(4cabFe2FvUlINz&l2YhM&0Jq3I@QA0dF`FMV5JePoi zvHVF3Xjxl9E*T>8W#Yc-iA4G9NC|iq4ivx{jrbxRIVZidAl{T$ZnDb4XDzdGjTS~< zleFGrgTf9C-o8y_`Zk$pMwt>|i_#s(Knj2&ST_PG{t={v0i^XHC7kPMh!ex3oA%>g ze+@-D@`?7{D?tiHkh(-wC-4@q<@$1Xlb+hKBsV(c!u*XkIl0aH{jx1D4egRkuC)*U z_lNB(hi0wY?OJ)FYB}juJo-?SPReVx!zn4igv8^Khx9fo{$viL96Vx_e^4xddVnq} zf264&x^_U4M8NfFUc*S}U0rnP&)-`mn{8VkAkKU_bb*CV>OH{482Q0v_e3ceBS0!| z4i$$m?vUj)r7O$Ur8cU6%<|2vtUAz2Ix}P2D*G%cAGKZ~QM>opM2LKPga9UjG6FGz6BGRb;&?oO730Kf!Z6WInsIPO6a9z-6r*1>^#8q5CxxgSZfw=o zlJ>H6%9>WKLxHtvT}}C2NyxII^XftN1-aEq+|i(GAO1ojz+Pdu9z14^ZpIo4nw*%k zVICc|FX<+RpbmmdNxo8n57#n1!z7+q71PiineH7c0la>iO197^Z`m+cal-;jX;~L2 z3E-jX02+x~NVgAIlm#iSj!^|VIo?^N*h=Fs@J&rCTT^0WFi#;!pVgmaku?-AKPpS- z78v>s8+7)ICkvK8^v_oAHLW7;sHie?d}^{N5S9g=e!=o8pjgzPt<6epI@L<~6#-`? z6TlcHA}_xHY=COqKY}v?5r060jUV7595W71Y)p(3{YZ;Df)PIm8-7H8=w1g>A33UA zv}5)7?F*EBfs^g4#82Sx)@dyc`U6Q#t#4Z`m!9ke_PR%<#}4hbBOSZ?+9mty4GVVg z;ED}PyDU*2YzY;rk{)6*3lCmLlcI?Gf0CeLU|#j;*CZuT=*3u=%b5V#9E_n(eisV{ zi{YxU^t>v_RNdsK#gBi?R(7^j*Yq!^;*S^vF3Ht_32)X@z7&rh46qe3Tb`G+%&W~B zJZ$Xe#gD?!Dp}>LS&H`|5xN{g~UB5p?LEtk|h; zSs)(Y_l#hy)i^M+CKaP(oS2wc^^alnPn4+9ME`g_?j|47Mv#sJGxjy^2-4NCdn-tz zI}+988i4lufHmBQ<{GsC(6rm_08&kfy}`WAFV?NomdsSg9y_{X`}f~wSA6w=tuzMK zXmbyLr=;l)fv2YUiDrAn%?Yykz9gdT%)n~>xgb%Il7I|m%FgyA=}MRsmsR!(l7Fvh3ctU?ITenz~yKKE&(RQki#eB!I#g@R@ zwvGl|yDK1F`)SP-S1SFNwfLF0nfxBBos7||WU2&m}z^*ZLbKYpae zAMoNIK^*fWEc#=QhecrGKOTlZWn#xT5OJUg(%Ap2*Y`G%Mmj-~rXU575ulg|SPTHg z;NO%~?R3<+?WVu_rzc4}lzrRbCA)hrqC$3g@3RJr^l}mNWE?Y7> zW)r2;tRNkeJ8u98Fwnu#9f1`=H9oCJe?Su@BVqVsxQ^-YkLmD_HimGn9a!Q8e%Qp1 z?r4Y;<6&Yyvy|q9vWWzmBjg z)9&`Q=vuL(3&-r>!n_?>oVUfLMO*1q6waf$IqMImtx(*l4w^KZ*cQqazy_MS{XmLD zX|~cxK`LefUT3%o@SMt0CxB%nC%9IUMgO{}M^}d_oTR#*$nDgkuwnhCBo4DC zqi)?=ZAr_1OZsPGRY}yDs-$`eNncgFXS5L8Vfpfe<)nmWDq7JGB(bFH0tNsDFzE0I zzRkcG{i7u1Is!4qAI~QOG=dSoXk$pjwYOFFc%0}D#q0GTg~kC2-D^P_2{4W~B7!qs z$LSsuRRQ93nwt81NLAux{JZ>1OUnxH3d~)t_668x)0S5jdl1t(`l9k6@1YXrGNLH2Yr>JB~d=Fm( z3TZFtKIpYI7&2Br^dIVkmK7vH3)Yf+?kT^X&1NS2wq<#;Z277djFR-dLD445=!{ya z%lJnyj57oiR;}?ZgV6B+C4wjdHiB^+Y~%hIt|QoRNB`&-O-vJkh8Yjzn*JFNi#B}& z#jps-asTynuLmhKUd8B+Ho&BT7yue1>(KI7E^HG&R+0)teOq0cWQr0JkM| z+kHz~0klm?-Hz0OmBxY{T|Oef&MR))7A0+yZqJ&Xo+NWyi!oG+o()P9ny$4lLM4!t z91K_xNfKqWs`e>eb>h7N(rdXrT5f(>F?+rhRiHzWqylfDvfURvIT>C&n`dFeU8suG z11+R@Q!`(4t`;)VQAd^(*>zAl$`VMqYlH;NSE|ZmO_z*diQpRtDgF_V5sZY7gEU?f z#x+2SVKKi5Gz|VRUu@z>JErG4_S<+kH15Bi?h_!rBLb8(A%YZ%$~9j}iE03!wC*M0 z<*+SD&weU(U56DwiNCT^_qc3hwVEy8DH!wzt_qNzxNX;Q+n&!d{%Lu<0XiXn4Gwk= zV6*Q8@F%8YIG_<0S9E0PVD}f$d@-f@Kc9jCH6f@3N~?HCZsIFI`e@kCWXp?t?SO(f z*rbnOTn{?j0F*HDiV`){C(TFs$Nf_LV_N*tVX>n>HrM0_MgK_TPdEmG$GBsDTcP_r zNU1&s-~bqGt^rU4F2=Wvjj zF}N|YOxnyfgiZXd(tRGJkzzBj0nd8CMv#nyG=eJv5u0m(7C{)pqkjZ7Zv10f4E}yY zA+1L=P#h$&6Qdi#jvXAY*8?HCW9LVAye3XGD*i zTyJD=h3@kp1q@JRQl!`{!f{6fSfU{ea6#M%h~W`%TmwLC{4f#ZF>cI*cwCQ%#k9ns zQ=u3h^t&} zcdQp~;zT#~CM^0#1L2PW05M+lkA8qCUPCcnG!dlh!y+ih^T18nxXEw4TTQK1M{h_EP;*T;_ws|d6hM*0|M9E34`41?BR-(B>79Y_HSjE%q> zC$1w1F#t7oRJ@L1F)jAEAy3OqM23il=Xz-_u_2FEP$BSVb*-#uzF~9M2cQ@VlKsrk7_deIQ{LZrd(pg2D zOufG;q65-Sgic_I`hw@z|Ky82A5^seac?sVSHDG%+hK6up5{cOj0Wzt6d!aBs?2qLNq6t$c{r;a^uTfy!> zU9c(8a{d)UXnaw`A#QHHu5UBf zYkr~K3%4v=<_)*m`Cn%C*nmlQGu=ZVm1Lr1b^4C*8hx{pfTwHCT&pyHd((dQ;uU+b z%qy=Cw-3jOq#wAVZhv#IZ?_+A+e;Mhg_kz%>Q&^g(M|i?_BTiRw(s02yXF~l_Q@yD z*%!Wd#=dV)#;(1xVIN5{)?Mk@Z-1_7`vvH~{@jZF;uluz<<}1Vw7W!3+Ic)eoUsS) zEZDkWy~CL;Hh_W^uGr6fNh*Uf;=a5~ zF$d7dF7xL?vi6Tp33a>isWbK)`@-D+$*b%3XE%54D+gQl($6>Sg;F~{Tc?c~o2=&T zyLRX8jB?KUEmWbVU9bG!ciD=)NcDfo)qUfgSCsYnuQu$}Hzam+xnnQ?LS6N2+b8Q@ zM4)bBuliEMUaYX6{ZiW&0Awez|E)CY99ullv|qleZO3?G^;<~y&~!htm;LJ@`_oR= zc2+q#q>4yd-PRb`&XZ^C@I@7yziGuz|725oSz5hP-hSn=+w3)`_w9afTC~DBQ+D}d ztM)tpdb|BmCuijm$MZC`f&QH}oBx3+n+qvLBm0NX&)ZL4(zm~O?rwYWOzJKF|GaF` zp7znZtwI>wpp?`DC zZa;a-u6xRaz3E*C?blW$nN){CE3Lz+6P7$>(lP@6^FOv=Z#xvGU68)-tQouY3F#Y9 zQu?niEZCDT?^td!Z{K&pw7v5}bRcMCuY2DSd&#^6WkxzGZ3Nh-Oj!GSC+*5>7VY65 z?AptpyUSjlZQBL!TCxLEdF#y!SR>V6lJwb+p0l@KP_Var;E?^yK~7Zh^ey=)e0$9< z|Nd!vpcZy7{K&k$>2~=${xddp+O*yHD6>cX%aUEkq1c{OglfgE`k`67prW+jB4QZd zBjnH%lXglMJE@wpy|N`pojFX+FS)#J^-kjJe}d&@!ykJLd0Q{Iz7IIR-L;1u8olaX$f{Lp4<6E^zAlWg?N z317`$4q!c2Bsw}sezGh1sy}Cc_KaO#hd((*tvi_5jT-+Szp-I&yES9K`Ltcue8CQT z-Pr}Z?WTtPN7!avrSEz8oPG2m6+1_r|E|v;)AV}4eq+C*CA4vnwcmeA$p5cSm;a%} zuGT`SO#M}US-b>uu8v5rAH7KRf5A38zcRG{yuM|(C=2R~{_@(V?)H2>_VA+W*|xtu zJhW@~*X>O=W$foK+F`91?6SAqzi2Dh*X?r?Rr}gACT&XVh$lQw>7G0HEd?lakAc(= zBhQrW15ev#7e95*F1~2e9$d`?9aRzurdq3OPyf3ER(<`veWW+E!>xg>Xj&d;5l{H; z*io=3c)nwg^tSB4goEQ~3Lq)pg|J>oDPzZ!rw#J<(Cr~F-oo>o2iHQdBoaLjfbWR- zigR^$!JZ-s%CQW~WG7|%&Z`zPR&{89{h=dPeZxU}!R4ywD6t!)4z$!MiGtgSGPwun z9s{Y9fVvP*wsl9=OBX0o)a-2ds0G5ues-TVe_@X;ykL*r_T)*MDUSTLIg#=L(b2;_ zyI2b@=##g0tu-jxlTPx>l%zv$F9@hZd&MVK?Do{x4%Y2CS4yPqEZQ@~3Emk6Nev6M zg+7s>w@w5w4Zz`usPdl0^GIT-^>A&BWfKM0>QzI$PBs)nIX8ADIssed&gd z9T*nuiF?EDg0-^t%aZv0Uph(k+-*n2^B1X}Y;D1Fb`$Oix`#kI(x_CcWz_!YWp!Pz zNMZ_l_LtvLwb^dV9{=V8R(s3@&N(d*NC{rMq#M@G8vg_CxHg6k@mcifXLL|NqDS3MF6^*V<@7D(k*LwP8l zx6Ip3QbT^~fmLH}@UfR0*h~N8u!n!|rG3kvU$vi+)IRsLN&6pXj_mdCJ8b#?eY?%R zQT6=ai!RA`&6Vsyn&m$Jp+lB=>wv$sRD7u?Z~(9=oq(kC@Kde{1FY zwH;Oa*9TA9g(ns5;b&IuUmjf5lpo4jqpUqZ2CQyLUm

a1Nw`|h+Y1?dOH zZAE+Pu7cHyIeW&Qf>mdf?`ai#g4*%~mHUL9e5Nub>9cQD9<$y4bYH>FR6b9* zVA5WZ=JTcNoA!Z1!T$MCGxnW(wfH-uYHxf{)%GAERmM})p1J9Qednnad!p+2nA1vj zk;*7bZTKGXt*SbF|Jh}`Xh+@`yWc9hkKYy@+DrfCpuK)#(ysm9DLd_+nT_r>bm&OS z9`UXPyYO*)?S1F0AEhIE^9K&w&oztog=fy$cZBmO_X#>d-rTn+W2b2mf#lU%>Hm7- zY0-!7F50Gxrhtzw&^||D*dB-Nz;A|D$hzGW-7ltbg$|g$#2o P00000NkvXXu0mjf)9gcZ literal 0 HcmV?d00001 diff --git a/help_online/tests/__init__.py b/help_online/tests/__init__.py new file mode 100644 index 00000000..6085ce18 --- /dev/null +++ b/help_online/tests/__init__.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu) +# All Rights Reserved +# +# WARNING: This program as such is intended to be used by professional +# programmers who take the whole responsibility of assessing all potential +# consequences resulting from its eventual inadequacies and bugs. +# End users who are looking for a ready-to-use solution with commercial +# guarantees and support are strongly advised to contact a Free Software +# Service Company. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from . import test_export_help_wizard + +fast_suite = [ +] + +checks = [ + test_export_help_wizard, +] diff --git a/help_online/tests/data/help_test_data.xml b/help_online/tests/data/help_test_data.xml new file mode 100644 index 00000000..3d939d21 --- /dev/null +++ b/help_online/tests/data/help_test_data.xml @@ -0,0 +1,78 @@ + + + + + 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 + + image + test.png + test.png + ir.ui.view + image/png + + + \ No newline at end of file diff --git a/help_online/tests/test_export_help_wizard.py b/help_online/tests/test_export_help_wizard.py new file mode 100644 index 00000000..6494f121 --- /dev/null +++ b/help_online/tests/test_export_help_wizard.py @@ -0,0 +1,169 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Authors: Cédric Pigeon +# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu) +# All Rights Reserved +# +# WARNING: This program as such is intended to be used by professional +# programmers who take the whole responsibility of assessing all potential +# consequences resulting from its eventual inadequacies and bugs. +# End users who are looking for a ready-to-use solution with commercial +# guarantees and support are strongly advised to contact a Free Software +# Service Company. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +import logging +import base64 +from lxml import etree as ET + +from anybox.testing.openerp import SharedSetupTransactionCase + +_logger = logging.getLogger(__name__) + + +class test_export_help_wizard(object): + _data_files = ('data/help_test_data.xml',) + + _module_ns = 'help_online' + + def createPage(self, pageName, imgXmlId=False): + imgId = False + if imgXmlId: + imgId = self.ref('%s.%s' % (self._module_ns, imgXmlId)) + + rootNode = ET.Element('t') + rootNode.attrib['name'] = pageName + rootNode.attrib['t-name'] = "website.%s" % pageName + tNode = ET.SubElement(rootNode, + 't', + attrib={'t-call': 'website.layout'}) + structDivNode = ET.SubElement(tNode, + 'div', + attrib={'class': 'oe_structure oe_empty', + 'id': 'wrap'}) + sectionNode = ET.SubElement(structDivNode, + 'section', + attrib={'class': 'mt16 mb16'}) + containerNode = ET.SubElement(sectionNode, + 'div', + attrib={'class': 'container'}) + rowNode = ET.SubElement(containerNode, + 'div', + attrib={'class': 'row'}) + bodyDivNode = ET.SubElement(rowNode, + 'div', + attrib={'class': 'col-md-12 '\ + 'text-center mt16 mb32'}) + style = "font-family: 'Helvetica Neue', Helvetica,"\ + " Arial, sans-serif; color: rgb(51, 51, 51);"\ + " text-align: left;" + h2Node = ET.SubElement(bodyDivNode, + 'h2', + attrib={'style': style}) + h2Node.text = "Test Sample Title" + if imgId: + imgDivNode = ET.SubElement(bodyDivNode, + 'div', + attrib={'style': 'text-align: left;'}) + src = "/website/image?field=datas&"\ + "model=ir.attachment&id=%s" % str(imgId) + imgNode = ET.SubElement(imgDivNode, + 'img', + attrib={'class': 'img-thumbnail', + 'src': src}) + imgDivNode = ET.SubElement(bodyDivNode, + 'div', + attrib={'style': 'text-align: left;'}) + src = "/website/image/ir.attachment/%s_ccc838d/datas" % str(imgId) + imgNode = ET.SubElement(imgDivNode, + 'img', + attrib={'class': 'img-thumbnail', + 'src': src}) + arch = ET.tostring(rootNode, encoding='utf-8', xml_declaration=False) + vals = { + 'name': pageName, + 'type': 'qweb', + 'arch': arch, + 'page': True, + } + view_id = self.env['ir.ui.view'].create(vals) + return view_id.id + + def setUp(self): + super(test_export_help_wizard, self).setUp() + self.pageName = False + self.imgXmlId = False + self.pageTemplate = False + + def test_export_help(self): + ''' + Export help data + ''' + self.createPage(pageName=self.pageName, imgXmlId=self.imgXmlId) + + wizardPool = self.env['export.help.wizard'] + wizard = wizardPool.create({}) + wizard.export_help() + xmlData = base64.decodestring(wizard.data) + + parser = ET.XMLParser(remove_blank_text=True) + rootXml = ET.XML(xmlData, parser=parser) + + xPath = ".//template[@id='website.%s']" % self.pageName + templateNodeList = rootXml.findall(xPath) + self.assertEqual(len(templateNodeList), 1) + self.assertNotIn("website.", templateNodeList[0].attrib['name']) + + if self.imgXmlId: + xPath = ".//record[@id='%s_img_01']" % self.pageName + imgNodeList = rootXml.findall(xPath) + self.assertEqual(len(imgNodeList), 1) + + for imgElem in templateNodeList[0].iter('img'): + imgSrc = imgElem.get('src') + if '/ir.attachment/' in imgSrc: + self.assertIn("/ir.attachment/%s_img_02|" \ + % self.pageName, imgSrc) + else: + self.assertIn("id=%s_img_01" % self.pageName, imgSrc) + + if self.pageTemplate: + xPath = ".//template[@id='website.%s_snippet']" % self.pageName + templateNodeList = rootXml.findall(xPath) + self.assertEqual(len(templateNodeList), 1) + self.assertNotIn("website.", templateNodeList[0].attrib['name']) + + +class test_export_help_with_image(test_export_help_wizard, + SharedSetupTransactionCase): + def setUp(self): + super(test_export_help_with_image, self).setUp() + parameter_model = self.env['ir.config_parameter'] + page_prefix = parameter_model.get_param('help_online_page_prefix') + self.pageName = '%stest-page' % page_prefix + self.imgXmlId = 'test_img_1' + + +class test_export_help_template(test_export_help_wizard, + SharedSetupTransactionCase): + def setUp(self): + super(test_export_help_template, self).setUp() + parameter_model = self.env['ir.config_parameter'] + template_prefix = parameter_model.get_param( + 'help_online_template_prefix') + self.pageName = '%stest-template' % template_prefix + self.pageTemplate = True diff --git a/help_online/views/export_help_wizard_view.xml b/help_online/views/export_help_wizard_view.xml new file mode 100644 index 00000000..7e5235df --- /dev/null +++ b/help_online/views/export_help_wizard_view.xml @@ -0,0 +1,56 @@ + + + + + export.help.wizard.view + export.help.wizard + form + +

+ + + + +

+ This wizard allow you to export all QWeb views + related to help online. The result will be an Odoo + data xml file. +

+
+ + + +
+ +
+
+ + + + + Export Help + export.help.wizard + + form + form + new + ir.actions.act_window + + + + + + + \ No newline at end of file diff --git a/help_online/views/ir_ui_view_view.xml b/help_online/views/ir_ui_view_view.xml new file mode 100644 index 00000000..85fc7783 --- /dev/null +++ b/help_online/views/ir_ui_view_view.xml @@ -0,0 +1,28 @@ + + + + + + ir.ui.view search (help_online) + + ir.ui.view + + + + + + + + + ir.ui.view form (help_online) + + ir.ui.view + + + + + + + + + From ed0697344c7a3591facb38faf043ef1b3890176a Mon Sep 17 00:00:00 2001 From: "Laurent Mignon (aka lmi)" Date: Thu, 9 Oct 2014 11:05:44 +0200 Subject: [PATCH 02/18] [PEP8] Fixes licences --- help_online/__openerp__.py | 14 +++----------- help_online/models/__init__.py | 14 +++----------- help_online/models/export_help_wizard.py | 14 +++----------- help_online/models/help_online.py | 16 ++++------------ help_online/models/ir_model.py | 14 +++----------- help_online/tests/__init__.py | 14 +++----------- help_online/tests/test_export_help_wizard.py | 14 +++----------- 7 files changed, 22 insertions(+), 78 deletions(-) diff --git a/help_online/__openerp__.py b/help_online/__openerp__.py index 832d3be1..f09ea63e 100644 --- a/help_online/__openerp__.py +++ b/help_online/__openerp__.py @@ -3,19 +3,11 @@ # # Authors: Nemry Jonathan # Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu) -# All Rights Reserved -# -# WARNING: This program as such is intended to be used by professional -# programmers who take the whole responsibility of assessing all potential -# consequences resulting from its eventual inadequacies and bugs. -# End users who are looking for a ready-to-use solution with commercial -# guarantees and support are strongly advised to contact a Free Software -# Service Company. # # This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/help_online/models/__init__.py b/help_online/models/__init__.py index fd36eaa5..198e5bb3 100644 --- a/help_online/models/__init__.py +++ b/help_online/models/__init__.py @@ -3,19 +3,11 @@ # # Authors: Nemry Jonathan # Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu) -# All Rights Reserved -# -# WARNING: This program as such is intended to be used by professional -# programmers who take the whole responsibility of assessing all potential -# consequences resulting from its eventual inadequacies and bugs. -# End users who are looking for a ready-to-use solution with commercial -# guarantees and support are strongly advised to contact a Free Software -# Service Company. # # This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/help_online/models/export_help_wizard.py b/help_online/models/export_help_wizard.py index c98ed837..c3003b5b 100644 --- a/help_online/models/export_help_wizard.py +++ b/help_online/models/export_help_wizard.py @@ -3,19 +3,11 @@ # # Authors: Cédric Pigeon # Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu) -# All Rights Reserved -# -# WARNING: This program as such is intended to be used by professional -# programmers who take the whole responsibility of assessing all potential -# consequences resulting from its eventual inadequacies and bugs. -# End users who are looking for a ready-to-use solution with commercial -# guarantees and support are strongly advised to contact a Free Software -# Service Company. # # This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/help_online/models/help_online.py b/help_online/models/help_online.py index 5a076cd6..25e34fbb 100644 --- a/help_online/models/help_online.py +++ b/help_online/models/help_online.py @@ -3,19 +3,11 @@ # # Authors: Laurent Mignon # Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu) -# All Rights Reserved -# -# WARNING: This program as such is intended to be used by professional -# programmers who take the whole responsibility of assessing all potential -# consequences resulting from its eventual inadequacies and bugs. -# End users who are looking for a ready-to-use solution with commercial -# guarantees and support are strongly advised to contact a Free Software -# Service Company. # # This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -53,7 +45,7 @@ class HelpOnline(models.TransientModel): ir_model = self.env['ir.model'] description = self.env[model]._description res = ir_model.name_search(model, operator='=') - if(res): + if res: description = res[0][1] name = self._get_view_name(model, view_type, domain, context) if self.page_exists(name): diff --git a/help_online/models/ir_model.py b/help_online/models/ir_model.py index 8cbccf69..fa9df396 100644 --- a/help_online/models/ir_model.py +++ b/help_online/models/ir_model.py @@ -3,19 +3,11 @@ # # Authors: Cédric Pigeon # Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu) -# All Rights Reserved -# -# WARNING: This program as such is intended to be used by professional -# programmers who take the whole responsibility of assessing all potential -# consequences resulting from its eventual inadequacies and bugs. -# End users who are looking for a ready-to-use solution with commercial -# guarantees and support are strongly advised to contact a Free Software -# Service Company. # # This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/help_online/tests/__init__.py b/help_online/tests/__init__.py index 6085ce18..cc5a18f0 100644 --- a/help_online/tests/__init__.py +++ b/help_online/tests/__init__.py @@ -2,19 +2,11 @@ ############################################################################## # # Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu) -# All Rights Reserved -# -# WARNING: This program as such is intended to be used by professional -# programmers who take the whole responsibility of assessing all potential -# consequences resulting from its eventual inadequacies and bugs. -# End users who are looking for a ready-to-use solution with commercial -# guarantees and support are strongly advised to contact a Free Software -# Service Company. # # This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/help_online/tests/test_export_help_wizard.py b/help_online/tests/test_export_help_wizard.py index 6494f121..48c3297d 100644 --- a/help_online/tests/test_export_help_wizard.py +++ b/help_online/tests/test_export_help_wizard.py @@ -3,19 +3,11 @@ # # Authors: Cédric Pigeon # Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu) -# All Rights Reserved -# -# WARNING: This program as such is intended to be used by professional -# programmers who take the whole responsibility of assessing all potential -# consequences resulting from its eventual inadequacies and bugs. -# End users who are looking for a ready-to-use solution with commercial -# guarantees and support are strongly advised to contact a Free Software -# Service Company. # # This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of From 53143757951580876648d16ddb56c2e6b2437f67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Pigeon?= Date: Tue, 14 Oct 2014 11:29:59 +0200 Subject: [PATCH 03/18] [ADD] import help feature + security + menu + french translation --- help_online/__openerp__.py | 6 +- help_online/i18n/fr_BE.po | 222 ++++++++++++++++++ help_online/models/__init__.py | 1 + help_online/models/export_help_wizard.py | 6 +- help_online/models/import_help_wizard.py | 49 ++++ help_online/security/help_online_rules.xml | 32 +++ help_online/views/help_online_view.xml | 15 ++ help_online/views/import_help_wizard_view.xml | 46 ++++ help_online/views/ir_ui_view_view.xml | 2 +- 9 files changed, 373 insertions(+), 6 deletions(-) create mode 100644 help_online/i18n/fr_BE.po create mode 100644 help_online/models/import_help_wizard.py create mode 100644 help_online/security/help_online_rules.xml create mode 100644 help_online/views/import_help_wizard_view.xml diff --git a/help_online/__openerp__.py b/help_online/__openerp__.py index f09ea63e..b0d02833 100644 --- a/help_online/__openerp__.py +++ b/help_online/__openerp__.py @@ -47,10 +47,12 @@ The help pages are created and managed via the website Module. 'data': [ 'data/help_auto_backup.xml', # must always be the first 'security/help_online_groups.xml', + 'security/help_online_rules.xml', + 'views/export_help_wizard_view.xml', + 'views/import_help_wizard_view.xml', + 'views/ir_ui_view_view.xml', 'views/help_online_view.xml', 'views/website_help_online.xml', - 'views/ir_ui_view_view.xml', - 'views/export_help_wizard_view.xml', 'data/ir_config_parameter_data.xml', ], 'qweb': [ diff --git a/help_online/i18n/fr_BE.po b/help_online/i18n/fr_BE.po new file mode 100644 index 00000000..d35153b5 --- /dev/null +++ b/help_online/i18n/fr_BE.po @@ -0,0 +1,222 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * help_online +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-10-14 09:06+0000\n" +"PO-Revision-Date: 2014-10-14 09:06+0000\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: help_online +#. openerp-web +#: code:addons/help_online/static/src/js/help_online.js:83 +#, python-format +msgid "Cancel" +msgstr "Annuler" + +#. module: help_online +#: view:export.help.wizard:help_online.export_help_wizard_view +#: view:import.help.wizard:help_online.import_help_wizard_view +msgid "Close" +msgstr "Fermer" + +#. module: help_online +#. openerp-web +#: code:addons/help_online/static/src/js/help_online.js:81 +#, python-format +msgid "Confirm" +msgstr "Confirmer" + +#. module: help_online +#: code:addons/help_online/models/help_online.py:60 +#, python-format +msgid "Create Help page for %s" +msgstr "Créer lapage d'aide pour %s" + +#. module: help_online +#: field:export.help.wizard,create_uid:0 +#: field:help.online,create_uid:0 +#: field:import.help.wizard,create_uid:0 +msgid "Created by" +msgstr "Créé par" + +#. module: help_online +#: field:export.help.wizard,create_date:0 +#: field:help.online,create_date:0 +#: field:import.help.wizard,create_date:0 +msgid "Created on" +msgstr "Créé le" + +#. module: help_online +#: view:export.help.wizard:help_online.export_help_wizard_view +msgid "Export" +msgstr "Export" + +#. module: help_online +#: model:ir.actions.act_window,name:help_online.action_export_help_wizard +msgid "Export Help" +msgstr "Export Help" + +#. module: help_online +#: view:export.help.wizard:help_online.export_help_wizard_view +msgid "Export Help Data" +msgstr "Export des pages d'aide" + +#. module: help_online +#: model:ir.model,name:help_online.model_export_help_wizard +#: model:ir.ui.menu,name:help_online.menu_help_export +msgid "Export Help Online" +msgstr "Export des pages d'aide" + +#. module: help_online +#: field:export.help.wizard,export_filename:0 +msgid "Export XML Filename" +msgstr "Fichier XML" + +#. module: help_online +#: model:ir.ui.menu,name:help_online.menu_help +#: model:ir.ui.menu,name:help_online.menu_help_main +msgid "Help Online" +msgstr "Aide en ligne" + +#. module: help_online +#: code:addons/help_online/models/help_online.py:55 +#, python-format +msgid "Help on %s" +msgstr "Aide sur %s" + +#. module: help_online +#: model:res.groups,name:help_online.help_online_group_reader +msgid "Help reader" +msgstr "Aide: lecteur" + +#. module: help_online +#: model:res.groups,name:help_online.help_online_group_writer +msgid "Help writer" +msgstr "Aide: rédacteur" + +#. module: help_online +#: field:export.help.wizard,id:0 +#: field:help.online,id:0 +#: field:import.help.wizard,id:0 +msgid "ID" +msgstr "ID" + +#. module: help_online +#: view:import.help.wizard:help_online.import_help_wizard_view +msgid "Import" +msgstr "Import" + +#. module: help_online +#: model:ir.actions.act_window,name:help_online.action_import_help_wizard +msgid "Import Help" +msgstr "Import des pages d'aide" + +#. module: help_online +#: view:import.help.wizard:help_online.import_help_wizard_view +msgid "Import Help Data" +msgstr "Import des pages d'aide" + +#. module: help_online +#: model:ir.ui.menu,name:help_online.menu_help_import +msgid "Import Help Online" +msgstr "Import des pages d'aide" + +#. module: help_online +#: field:export.help.wizard,write_uid:0 +#: field:help.online,write_uid:0 +#: field:import.help.wizard,write_uid:0 +msgid "Last Updated by" +msgstr "Mis à jour par" + +#. module: help_online +#: field:export.help.wizard,write_date:0 +#: field:help.online,write_date:0 +#: field:import.help.wizard,write_date:0 +msgid "Last Updated on" +msgstr "Mis à jour le" + +#. module: help_online +#: code:addons/help_online/models/export_help_wizard.py:238 +#, python-format +msgid "No data to export !" +msgstr "Aucune page à exporter !" + +#. module: help_online +#: code:addons/help_online/models/help_online.py:33 +#, python-format +msgid "No page prefix parameter specified !" +msgstr "Le paramètre spécifiant le préfixe des page n'est pas configuré !" + +#. module: help_online +#. openerp-web +#: code:addons/help_online/static/src/js/help_online.js:88 +#, python-format +msgid "Ok" +msgstr "Ok" + +#. module: help_online +#. openerp-web +#: code:addons/help_online/static/src/js/help_online.js:107 +#, python-format +msgid "Page does not exist. Do you want to create?" +msgstr "La page n'existe pas. Voulez-vous la créer?" + +#. module: help_online +#: field:import.help.wizard,source_file:0 +msgid "Source File" +msgstr "Fichier de données" + +#. module: help_online +#: view:export.help.wizard:help_online.export_help_wizard_view +msgid "This wizard allow you to export all QWeb views\n" +" related to help online. The result will be an Odoo\n" +" data xml file." +msgstr "Cet assistant vous permet d'exporter toutes les vues QWeb \n" +" concernant l'aide. Le résultat sera un\n" +" fichier de données Odoo." + +#. module: help_online +#: view:import.help.wizard:help_online.import_help_wizard_view +msgid "This wizard allow you to import QWeb views\n" +" related to help online. The required file format is an Odoo\n" +" data xml file." +msgstr "Cet assistant vous permet d'importer toutes les vues QWeb\n" +" concernant l'aide. Le format de fichier requis est un\n" +" fichier de données Odoo." + +#. module: help_online +#: code:addons/help_online/models/export_help_wizard.py:275 +#, python-format +msgid "Unable to write autobackup file in given directory: %s" +msgstr "Impossible d'écrire le fichier de sauvegarde dans le répertoire spécifié: %s" + +#. module: help_online +#: view:ir.ui.view:help_online.view_view_search +msgid "Website Page" +msgstr "Page du site" + +#. module: help_online +#: view:ir.ui.view:help_online.view_view_form +msgid "Website Page?" +msgstr "Page du site?" + +#. module: help_online +#: model:ir.actions.act_window,name:help_online.action_website_pages +#: model:ir.ui.menu,name:help_online.menu_help_pages +msgid "Website Pages" +msgstr "Pages du site" + +#. module: help_online +#: field:export.help.wizard,data:0 +msgid "XML" +msgstr "XML" + diff --git a/help_online/models/__init__.py b/help_online/models/__init__.py index 198e5bb3..615fa9cc 100644 --- a/help_online/models/__init__.py +++ b/help_online/models/__init__.py @@ -20,4 +20,5 @@ ############################################################################## from . import help_online from . import export_help_wizard +from . import import_help_wizard from . import ir_model diff --git a/help_online/models/export_help_wizard.py b/help_online/models/export_help_wizard.py index c3003b5b..e504a7b4 100644 --- a/help_online/models/export_help_wizard.py +++ b/help_online/models/export_help_wizard.py @@ -50,9 +50,10 @@ class ExportHelpWizard(models.TransientModel): - Replace db id in url with xml id ''' - def substitute_id_by_xml_id(): + def substitute_id_by_xml_id(img_elem): new_src = False attach_id = False + img_src = img_elem.get('src') if 'id=' in img_src: id_pos = img_src.index('id=') + 3 attach_id = img_elem.get('src')[id_pos:] @@ -71,9 +72,8 @@ class ExportHelpWizard(models.TransientModel): i_img += 1 xml_id = "%s_img_%s" % \ (page_node.attrib['name'], str(i_img).rjust(2, '0')) - img_src = img_elem.get('src') - new_src, attach_id = substitute_id_by_xml_id() + new_src, attach_id = substitute_id_by_xml_id(img_elem) if not attach_id: continue diff --git a/help_online/models/import_help_wizard.py b/help_online/models/import_help_wizard.py new file mode 100644 index 00000000..bb071784 --- /dev/null +++ b/help_online/models/import_help_wizard.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (c) 2014 Acsone SA/NV (http://www.acsone.eu) +# All Rights Reserved +# +# WARNING: This program as such is intended to be used by professional +# programmers who take the whole responsibility of assessing all potential +# consequences resulting from its eventual inadequacies and bugs. +# End users who are looking for a ready-to-use solution with commercial +# guarantees and support are strongly advised to contact a Free Software +# Service Company. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from openerp import models, fields, api +from openerp.tools import convert + +import base64 +from cStringIO import StringIO + + +class ImportHelpWizard(models.TransientModel): + _name = "import.help.wizard" + + source_file = fields.Binary('Source File') + + @api.one + def import_help(self): + source_file = base64.decodestring(self.source_file) + convert.convert_xml_import(self.env.cr, + self._module, + StringIO(source_file), + idref=None, + mode='init', + noupdate=False, + report=None) diff --git a/help_online/security/help_online_rules.xml b/help_online/security/help_online_rules.xml new file mode 100644 index 00000000..92a70a7a --- /dev/null +++ b/help_online/security/help_online_rules.xml @@ -0,0 +1,32 @@ + + + + + Online Help Hidden by Default + + [ + '|', + ('type', '!=', 'qweb'), + ('name','not like','help-%'), + ] + + + + + + + Online Help for Help Reader + + [(1, '=', 1)] + + + + + + \ No newline at end of file diff --git a/help_online/views/help_online_view.xml b/help_online/views/help_online_view.xml index c53cbce3..6ee45346 100644 --- a/help_online/views/help_online_view.xml +++ b/help_online/views/help_online_view.xml @@ -9,5 +9,20 @@ + + + Website Pages + ir.ui.view + + form + tree, form + {"search_default_website":1} + + + + + + + diff --git a/help_online/views/import_help_wizard_view.xml b/help_online/views/import_help_wizard_view.xml new file mode 100644 index 00000000..15aa93c3 --- /dev/null +++ b/help_online/views/import_help_wizard_view.xml @@ -0,0 +1,46 @@ + + + + + import.help.wizard.view + import.help.wizard + form + +
+ +

+ This wizard allow you to import QWeb views + related to help online. The required file format is an Odoo + data xml file. +

+
+ + + +
+ +
+
+
+
+ + + Import Help + import.help.wizard + + form + form + new + ir.actions.act_window + + +
+
\ No newline at end of file diff --git a/help_online/views/ir_ui_view_view.xml b/help_online/views/ir_ui_view_view.xml index 85fc7783..de42f9ca 100644 --- a/help_online/views/ir_ui_view_view.xml +++ b/help_online/views/ir_ui_view_view.xml @@ -8,7 +8,7 @@ ir.ui.view - + From ac4724a98d2392b3c1943c3d4625a24bab394ef4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Pigeon?= Date: Tue, 14 Oct 2014 12:07:30 +0200 Subject: [PATCH 04/18] [FIX] install python package for travis --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 68d5c15b..f06a86c5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,6 +12,7 @@ virtualenv: system_site_packages: true install: + - pip install anybox.testing.openerp - git clone https://github.com/OCA/maintainer-quality-tools.git ${HOME}/maintainer-quality-tools - export PATH=${HOME}/maintainer-quality-tools/travis:${PATH} - travis_install_nightly From 679e03c6680a3ebf30558da06a8400031e5871dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Pigeon?= Date: Tue, 14 Oct 2014 12:35:02 +0200 Subject: [PATCH 05/18] [FLAKE8] fix falke 8 issues --- help_online/models/export_help_wizard.py | 22 ++++++++--------- help_online/tests/test_export_help_wizard.py | 26 ++++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/help_online/models/export_help_wizard.py b/help_online/models/export_help_wizard.py index e504a7b4..afab8efc 100644 --- a/help_online/models/export_help_wizard.py +++ b/help_online/models/export_help_wizard.py @@ -121,11 +121,11 @@ class ExportHelpWizard(models.TransientModel): continue page_url = '/page/%s' % page_prefix template_url = '/page/%s' % template_prefix - if not page_url in href and not template_url in href: + if page_url not in href and template_url not in href: continue - elif page_url in href and not template_url in href: + elif page_url in href and template_url not in href: pass - elif not page_url in href and template_url in href: + elif page_url not in href and template_url in href: page_url = template_url else: if page_prefix in template_prefix: @@ -157,17 +157,17 @@ class ExportHelpWizard(models.TransientModel): thumbnail = ET.SubElement(main_div, 'div', attrib={'class': 'oe_snippet_thumbnail'}) - img = ET.SubElement(thumbnail, - 'img', - attrib={'class': 'oe_snippet_thumbnail_img', - 'src': HELP_ONLINE_SNIPPET_IMAGE_PATH}) + ET.SubElement(thumbnail, + 'img', + attrib={'class': 'oe_snippet_thumbnail_img', + 'src': HELP_ONLINE_SNIPPET_IMAGE_PATH}) span = ET.SubElement(thumbnail, 'span', attrib={'class': 'oe_snippet_thumbnail_title'}) span.text = page_node.attrib['name'].replace(template_prefix, '') body = ET.SubElement(main_div, 'section', - attrib={'class': 'oe_snippet_body '\ + attrib={'class': 'oe_snippet_body ' 'mt_simple_snippet'}) template = page.find(".//div[@id='wrap']") @@ -272,6 +272,6 @@ class ExportHelpWizard(models.TransientModel): backup_file.write(xml_data) backup_file.close except: - _logger.warning(_('Unable to write autobackup file '\ - 'in given directory: %s' - % autobackup_path)) + _logger.warning(_('Unable to write autobackup file ' + 'in given directory: %s' + % autobackup_path)) diff --git a/help_online/tests/test_export_help_wizard.py b/help_online/tests/test_export_help_wizard.py index 48c3297d..c608af5a 100644 --- a/help_online/tests/test_export_help_wizard.py +++ b/help_online/tests/test_export_help_wizard.py @@ -58,7 +58,7 @@ class test_export_help_wizard(object): attrib={'class': 'row'}) bodyDivNode = ET.SubElement(rowNode, 'div', - attrib={'class': 'col-md-12 '\ + attrib={'class': 'col-md-12 ' 'text-center mt16 mb32'}) style = "font-family: 'Helvetica Neue', Helvetica,"\ " Arial, sans-serif; color: rgb(51, 51, 51);"\ @@ -73,18 +73,18 @@ class test_export_help_wizard(object): attrib={'style': 'text-align: left;'}) src = "/website/image?field=datas&"\ "model=ir.attachment&id=%s" % str(imgId) - imgNode = ET.SubElement(imgDivNode, - 'img', - attrib={'class': 'img-thumbnail', - 'src': src}) + ET.SubElement(imgDivNode, + 'img', + attrib={'class': 'img-thumbnail', + 'src': src}) imgDivNode = ET.SubElement(bodyDivNode, 'div', attrib={'style': 'text-align: left;'}) src = "/website/image/ir.attachment/%s_ccc838d/datas" % str(imgId) - imgNode = ET.SubElement(imgDivNode, - 'img', - attrib={'class': 'img-thumbnail', - 'src': src}) + ET.SubElement(imgDivNode, + 'img', + attrib={'class': 'img-thumbnail', + 'src': src}) arch = ET.tostring(rootNode, encoding='utf-8', xml_declaration=False) vals = { 'name': pageName, @@ -128,7 +128,7 @@ class test_export_help_wizard(object): for imgElem in templateNodeList[0].iter('img'): imgSrc = imgElem.get('src') if '/ir.attachment/' in imgSrc: - self.assertIn("/ir.attachment/%s_img_02|" \ + self.assertIn("/ir.attachment/%s_img_02|" % self.pageName, imgSrc) else: self.assertIn("id=%s_img_01" % self.pageName, imgSrc) @@ -151,11 +151,11 @@ class test_export_help_with_image(test_export_help_wizard, class test_export_help_template(test_export_help_wizard, - SharedSetupTransactionCase): + SharedSetupTransactionCase): def setUp(self): super(test_export_help_template, self).setUp() parameter_model = self.env['ir.config_parameter'] - template_prefix = parameter_model.get_param( - 'help_online_template_prefix') + param = 'help_online_template_prefix' + template_prefix = parameter_model.get_param(param) self.pageName = '%stest-template' % template_prefix self.pageTemplate = True From e062ec2d96da8e83965aab2cf27287d373b0a7ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Pigeon?= Date: Wed, 15 Oct 2014 09:53:55 +0200 Subject: [PATCH 06/18] [PEP8] docstrings with double quotes --- help_online/models/export_help_wizard.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/help_online/models/export_help_wizard.py b/help_online/models/export_help_wizard.py index afab8efc..760c8d7b 100644 --- a/help_online/models/export_help_wizard.py +++ b/help_online/models/export_help_wizard.py @@ -45,10 +45,10 @@ class ExportHelpWizard(models.TransientModel): export_filename = fields.Char('Export XML Filename', size=128) def _manage_images_on_page(self, page_node, data_node): - ''' + """ - Extract images from page and generate a xml node - Replace db id in url with xml id - ''' + """ def substitute_id_by_xml_id(img_elem): new_src = False @@ -110,9 +110,9 @@ class ExportHelpWizard(models.TransientModel): data_node.append(img_node) def _clean_href_urls(self, page_node, page_prefix, template_prefix): - ''' + """ Remove host address for href urls - ''' + """ for a_elem in page_node.iter('a'): if not a_elem.get('href'): continue @@ -139,9 +139,9 @@ class ExportHelpWizard(models.TransientModel): def _generate_snippet_from_template(self, page_node, template_id, template_prefix): - ''' + """ Generate a website snippet from a template - ''' + """ page = copy.deepcopy(page_node) snippet = ET.Element('template') snippet.attrib['id'] = template_id + '_snippet' From 3dc64137de0f396e9eb496ec5ffb7ea1eee621d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Pigeon?= Date: Wed, 15 Oct 2014 10:02:59 +0200 Subject: [PATCH 07/18] [PEP8] docstrings with double quotes --- help_online/tests/test_export_help_wizard.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/help_online/tests/test_export_help_wizard.py b/help_online/tests/test_export_help_wizard.py index c608af5a..2ce0015e 100644 --- a/help_online/tests/test_export_help_wizard.py +++ b/help_online/tests/test_export_help_wizard.py @@ -102,9 +102,9 @@ class test_export_help_wizard(object): self.pageTemplate = False def test_export_help(self): - ''' + """ Export help data - ''' + """ self.createPage(pageName=self.pageName, imgXmlId=self.imgXmlId) wizardPool = self.env['export.help.wizard'] From f54d362f914d464028c0ced271204a47a2b13e5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Pigeon?= Date: Wed, 15 Oct 2014 15:12:54 +0200 Subject: [PATCH 08/18] [FIX] take https website in account --- help_online/models/export_help_wizard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/help_online/models/export_help_wizard.py b/help_online/models/export_help_wizard.py index 760c8d7b..61530278 100644 --- a/help_online/models/export_help_wizard.py +++ b/help_online/models/export_help_wizard.py @@ -117,7 +117,7 @@ class ExportHelpWizard(models.TransientModel): if not a_elem.get('href'): continue href = a_elem.get('href') - if not href.startswith('http:'): + if not href.startswith('http'): continue page_url = '/page/%s' % page_prefix template_url = '/page/%s' % template_prefix From d1948fb8b15622a4c74c72c37bfb2013c6c19722 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Pigeon?= Date: Wed, 15 Oct 2014 15:24:50 +0200 Subject: [PATCH 09/18] [FIX] remove usage of minidom, use pretty print feature from lxml --- help_online/models/export_help_wizard.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/help_online/models/export_help_wizard.py b/help_online/models/export_help_wizard.py index 61530278..ea0d65cd 100644 --- a/help_online/models/export_help_wizard.py +++ b/help_online/models/export_help_wizard.py @@ -24,7 +24,6 @@ import time import copy from lxml import etree as ET -from xml.dom import minidom as minidom from openerp import models, fields, api, exceptions from openerp.tools.translate import _ @@ -220,10 +219,9 @@ class ExportHelpWizard(models.TransientModel): data_node.append(snippet) if len(view_data_list) > 0: - rough_string = ET.tostring(xml_to_export, encoding='utf-8', - xml_declaration=True) - reparsed = minidom.parseString(rough_string) - return reparsed.toprettyxml(indent=" ", encoding='utf-8') + return ET.tostring(xml_to_export, encoding='utf-8', + xml_declaration=True, + pretty_print=True) else: return False @@ -275,3 +273,4 @@ class ExportHelpWizard(models.TransientModel): _logger.warning(_('Unable to write autobackup file ' 'in given directory: %s' % autobackup_path)) + From 520130abbec7ef21c21373629eeff3807d981b37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Pigeon?= Date: Wed, 15 Oct 2014 15:37:54 +0200 Subject: [PATCH 10/18] [FIX] remove usage of minidom, use pretty print feature from lxml --- help_online/models/export_help_wizard.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/help_online/models/export_help_wizard.py b/help_online/models/export_help_wizard.py index 61530278..53883aee 100644 --- a/help_online/models/export_help_wizard.py +++ b/help_online/models/export_help_wizard.py @@ -24,7 +24,6 @@ import time import copy from lxml import etree as ET -from xml.dom import minidom as minidom from openerp import models, fields, api, exceptions from openerp.tools.translate import _ @@ -220,10 +219,9 @@ class ExportHelpWizard(models.TransientModel): data_node.append(snippet) if len(view_data_list) > 0: - rough_string = ET.tostring(xml_to_export, encoding='utf-8', - xml_declaration=True) - reparsed = minidom.parseString(rough_string) - return reparsed.toprettyxml(indent=" ", encoding='utf-8') + return ET.tostring(xml_to_export, encoding='utf-8', + xml_declaration=True, + pretty_print=True) else: return False From 6b8ea4f2b07781f2f45c7c161cdb067151c7a589 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Pigeon?= Date: Wed, 15 Oct 2014 15:51:34 +0200 Subject: [PATCH 11/18] [FLAKE8] fix flake 8 issue --- help_online/models/export_help_wizard.py | 1 - 1 file changed, 1 deletion(-) diff --git a/help_online/models/export_help_wizard.py b/help_online/models/export_help_wizard.py index ea0d65cd..53883aee 100644 --- a/help_online/models/export_help_wizard.py +++ b/help_online/models/export_help_wizard.py @@ -273,4 +273,3 @@ class ExportHelpWizard(models.TransientModel): _logger.warning(_('Unable to write autobackup file ' 'in given directory: %s' % autobackup_path)) - From 3c6ca4fdbbe9329d0dc17b0026ef441840321526 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Pigeon?= Date: Fri, 17 Oct 2014 16:39:53 +0200 Subject: [PATCH 12/18] [FIX] change updatable property of data + note for record rules in description --- help_online/__openerp__.py | 2 ++ help_online/data/ir_config_parameter_data.xml | 8 ++++---- help_online/security/help_online_rules.xml | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/help_online/__openerp__.py b/help_online/__openerp__.py index b0d02833..de1d7c03 100644 --- a/help_online/__openerp__.py +++ b/help_online/__openerp__.py @@ -43,6 +43,8 @@ the group 'Help writer', the module generate a button allowing the creation an help page. The help pages are created and managed via the website Module. + +Note: When updating the page prefix parameters, the record rules must be adapted. """, 'data': [ 'data/help_auto_backup.xml', # must always be the first diff --git a/help_online/data/ir_config_parameter_data.xml b/help_online/data/ir_config_parameter_data.xml index 94f859fa..3f3cf68f 100644 --- a/help_online/data/ir_config_parameter_data.xml +++ b/help_online/data/ir_config_parameter_data.xml @@ -1,25 +1,25 @@ - + help_online_autobackup_path False - + help_online_page_prefix help - + help_online_template_prefix help-template - \ No newline at end of file + diff --git a/help_online/security/help_online_rules.xml b/help_online/security/help_online_rules.xml index 92a70a7a..08880d9c 100644 --- a/help_online/security/help_online_rules.xml +++ b/help_online/security/help_online_rules.xml @@ -1,6 +1,6 @@ - + Online Help Hidden by Default @@ -29,4 +29,4 @@ - \ No newline at end of file + From abc954b042f5f95f0130e13afb01bf93d09adc36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Pigeon?= Date: Fri, 17 Oct 2014 16:57:11 +0200 Subject: [PATCH 13/18] [FIX] flake 8 --- help_online/__openerp__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/help_online/__openerp__.py b/help_online/__openerp__.py index de1d7c03..eae8deb0 100644 --- a/help_online/__openerp__.py +++ b/help_online/__openerp__.py @@ -44,7 +44,8 @@ help page. The help pages are created and managed via the website Module. -Note: When updating the page prefix parameters, the record rules must be adapted. +Note: When updating the page prefix parameters, the record rules must be + adapted. """, 'data': [ 'data/help_auto_backup.xml', # must always be the first From de2ee7dbdd1f61fe3f051516eb0c57ba3db9e0d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Pigeon?= Date: Mon, 20 Oct 2014 12:05:15 +0200 Subject: [PATCH 14/18] [FIX] fix translation --- help_online/i18n/fr_BE.po | 4 ++-- help_online/models/export_help_wizard.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/help_online/i18n/fr_BE.po b/help_online/i18n/fr_BE.po index d35153b5..7648f4e5 100644 --- a/help_online/i18n/fr_BE.po +++ b/help_online/i18n/fr_BE.po @@ -39,7 +39,7 @@ msgstr "Confirmer" #: code:addons/help_online/models/help_online.py:60 #, python-format msgid "Create Help page for %s" -msgstr "Créer lapage d'aide pour %s" +msgstr "Créer la page d'aide pour %s" #. module: help_online #: field:export.help.wizard,create_uid:0 @@ -63,7 +63,7 @@ msgstr "Export" #. module: help_online #: model:ir.actions.act_window,name:help_online.action_export_help_wizard msgid "Export Help" -msgstr "Export Help" +msgstr "Export des pages d'aide" #. module: help_online #: view:export.help.wizard:help_online.export_help_wizard_view diff --git a/help_online/models/export_help_wizard.py b/help_online/models/export_help_wizard.py index 53883aee..017057f1 100644 --- a/help_online/models/export_help_wizard.py +++ b/help_online/models/export_help_wizard.py @@ -240,7 +240,7 @@ class ExportHelpWizard(models.TransientModel): 'export_filename': 'help_online_data.xml'}) return { - 'name': 'Help Online Export', + 'name': _('Export Help'), 'type': 'ir.actions.act_window', 'res_model': self._name, 'view_mode': 'form', From f5b74160a0bfa08c0a90fc684b89786674da1389 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Pigeon?= Date: Mon, 20 Oct 2014 12:13:19 +0200 Subject: [PATCH 15/18] [FIX] remove space between availables views --- help_online/views/export_help_wizard_view.xml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/help_online/views/export_help_wizard_view.xml b/help_online/views/export_help_wizard_view.xml index 7e5235df..a9788438 100644 --- a/help_online/views/export_help_wizard_view.xml +++ b/help_online/views/export_help_wizard_view.xml @@ -48,9 +48,5 @@ new ir.actions.act_window - - - - - + \ No newline at end of file From 391de8e1bc151834eced0781d760d0c1f4764028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Pigeon?= Date: Mon, 20 Oct 2014 12:13:37 +0200 Subject: [PATCH 16/18] [FIX] remove unused menus --- help_online/views/help_online_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/help_online/views/help_online_view.xml b/help_online/views/help_online_view.xml index 6ee45346..b4c9137a 100644 --- a/help_online/views/help_online_view.xml +++ b/help_online/views/help_online_view.xml @@ -15,7 +15,7 @@ ir.ui.view form - tree, form + tree,form {"search_default_website":1} From 7164d875b3df3260b9de3d2f07f74c0ab57be580 Mon Sep 17 00:00:00 2001 From: "Olivier LAURENT (ACSONE)" Date: Tue, 21 Oct 2014 09:28:07 +0200 Subject: [PATCH 17/18] Update fr_BE.po spelling --- help_online/i18n/fr_BE.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/help_online/i18n/fr_BE.po b/help_online/i18n/fr_BE.po index 7648f4e5..40cf06d9 100644 --- a/help_online/i18n/fr_BE.po +++ b/help_online/i18n/fr_BE.po @@ -154,7 +154,7 @@ msgstr "Aucune page à exporter !" #: code:addons/help_online/models/help_online.py:33 #, python-format msgid "No page prefix parameter specified !" -msgstr "Le paramètre spécifiant le préfixe des page n'est pas configuré !" +msgstr "Le paramètre spécifiant le préfixe des pages n'est pas configuré !" #. module: help_online #. openerp-web From 2e530a0ef6acbbb624390ba9c57f84893109519e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Pigeon?= Date: Tue, 21 Oct 2014 10:57:16 +0200 Subject: [PATCH 18/18] [FIX] rename translation file + fix spelling mistake --- help_online/i18n/{fr_BE.po => fr.po} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename help_online/i18n/{fr_BE.po => fr.po} (98%) diff --git a/help_online/i18n/fr_BE.po b/help_online/i18n/fr.po similarity index 98% rename from help_online/i18n/fr_BE.po rename to help_online/i18n/fr.po index 7648f4e5..40cf06d9 100644 --- a/help_online/i18n/fr_BE.po +++ b/help_online/i18n/fr.po @@ -154,7 +154,7 @@ msgstr "Aucune page à exporter !" #: code:addons/help_online/models/help_online.py:33 #, python-format msgid "No page prefix parameter specified !" -msgstr "Le paramètre spécifiant le préfixe des page n'est pas configuré !" +msgstr "Le paramètre spécifiant le préfixe des pages n'est pas configuré !" #. module: help_online #. openerp-web