From d190ef00cee75e57fef51487d2f5d58d636072a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Thu, 19 Apr 2018 22:00:49 +0000 Subject: [PATCH 01/49] Std API for user --- api/serializers.py | 907 +++++++++++++++++++--------------- api/urls.py | 90 ++-- api/utils.py | 123 ----- api/views.py | 1181 +++++++++++++++++++++++--------------------- re2o/settings.py | 5 + 5 files changed, 1190 insertions(+), 1116 deletions(-) delete mode 100644 api/utils.py diff --git a/api/serializers.py b/api/serializers.py index f2604068..e274f942 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -23,7 +23,17 @@ Serializers for the API app """ from rest_framework import serializers -from users.models import Club, Adherent +from users.models import ( + User, + Club, + Adherent, + ServiceUser, + School, + ListRight, + ListShell, + Ban, + Whitelist +) from machines.models import ( Interface, IpType, @@ -40,407 +50,524 @@ from machines.models import ( ) -class ServiceLinkSerializer(serializers.ModelSerializer): - """ Serializer for the ServiceLink objects """ - - name = serializers.CharField(source='service.service_type') +class UserSerializer(serializers.HyperlinkedModelSerializer): + access = serializers.BooleanField(source='has_access') + uid = serializers.IntegerField(source='uid_number') class Meta: - model = Service_link - fields = ('name',) + model = User + fields = ('name', 'pseudo', 'email', 'school', 'shell', 'comment', + 'state', 'registered', 'telephone', 'solde', #'room', + 'access', 'end_access', 'uid', 'class_name', 'api_url') + extra_kwargs = { + 'school': {'view_name': 'api:school-detail'}, + 'shell': {'view_name': 'api:shell-detail'}, + #'room': {'view_name': 'api:room-detail'}, + 'api_url': {'view_name': 'api:user-detail'} + } -class MailingSerializer(serializers.ModelSerializer): - """ Serializer to build Mailing objects """ - - name = serializers.CharField(source='pseudo') +class ClubSerializer(serializers.HyperlinkedModelSerializer): + name = serializers.CharField(source='surname') + access = serializers.BooleanField(source='has_access') + uid = serializers.IntegerField(source='uid_number') class Meta: model = Club - fields = ('name',) + fields = ('name', 'pseudo', 'email', 'school', 'shell', 'comment', + 'state', 'registered', 'telephone', 'solde', #'room', + 'access', 'end_access', 'administrators', 'members', + 'mailing', 'uid', 'api_url') + extra_kwargs = { + 'school': {'view_name': 'api:school-detail'}, + 'shell': {'view_name': 'api:shell-detail'}, + #'room': {'view_name': 'api:room-detail'}, + 'administrators': {'view_name': 'api:adherent-detail'}, + 'members': {'view_name': 'api:adherent-detail'}, + 'api_url': {'view_name': 'api:club-detail'} + } -class MailingMemberSerializer(serializers.ModelSerializer): - """ Serializer fot the Adherent objects (who belong to a - Mailing) """ +class AdherentSerializer(serializers.HyperlinkedModelSerializer): + access = serializers.BooleanField(source='has_access') + uid = serializers.IntegerField(source='uid_number') class Meta: model = Adherent - fields = ('email',) - - -class IpTypeField(serializers.RelatedField): - """ Serializer for an IpType object field """ - - def to_representation(self, value): - return value.type - - def to_internal_value(self, data): - pass - - -class IpListSerializer(serializers.ModelSerializer): - """ Serializer for an Ipv4List obejct using the IpType serialization """ - - ip_type = IpTypeField(read_only=True) - - class Meta: - model = IpList - fields = ('ipv4', 'ip_type') - - -class Ipv6ListSerializer(serializers.ModelSerializer): - """ Serializer for an Ipv6List object """ - - class Meta: - model = Ipv6List - fields = ('ipv6', 'slaac_ip') - - -class InterfaceSerializer(serializers.ModelSerializer): - """ Serializer for an Interface object. Use SerializerMethodField - to get ForeignKey values """ - - ipv4 = IpListSerializer(read_only=True) - # TODO : use serializer.RelatedField to avoid duplicate code - mac_address = serializers.SerializerMethodField('get_macaddress') - domain = serializers.SerializerMethodField('get_dns') - extension = serializers.SerializerMethodField('get_interface_extension') - - class Meta: - model = Interface - fields = ('ipv4', 'mac_address', 'domain', 'extension') - - @staticmethod - def get_dns(obj): - """ The name of the associated DNS object """ - return obj.domain.name - - @staticmethod - def get_interface_extension(obj): - """ The name of the associated Interface object """ - return obj.domain.extension.name - - @staticmethod - def get_macaddress(obj): - """ The string representation of the associated MAC address """ - return str(obj.mac_address) - - -class FullInterfaceSerializer(serializers.ModelSerializer): - """ Serializer for an Interface obejct. Use SerializerMethodField - to get ForeignKey values """ - - ipv4 = IpListSerializer(read_only=True) - ipv6 = Ipv6ListSerializer(read_only=True, many=True) - # TODO : use serializer.RelatedField to avoid duplicate code - mac_address = serializers.SerializerMethodField('get_macaddress') - domain = serializers.SerializerMethodField('get_dns') - extension = serializers.SerializerMethodField('get_interface_extension') - - class Meta: - model = Interface - fields = ('ipv4', 'ipv6', 'mac_address', 'domain', 'extension') - - @staticmethod - def get_dns(obj): - """ The name of the associated DNS object """ - return obj.domain.name - - @staticmethod - def get_interface_extension(obj): - """ The name of the associated Extension object """ - return obj.domain.extension.name - - @staticmethod - def get_macaddress(obj): - """ The string representation of the associated MAC address """ - return str(obj.mac_address) - - -class ExtensionNameField(serializers.RelatedField): - """ Serializer for Extension object field """ - - def to_representation(self, value): - return value.name - - def to_internal_value(self, data): - pass - - -class TypeSerializer(serializers.ModelSerializer): - """ Serializer for an IpType object. Use SerializerMethodField to - get ForeignKey values """ - - extension = ExtensionNameField(read_only=True) - ouverture_ports_tcp_in = serializers\ - .SerializerMethodField('get_port_policy_input_tcp') - ouverture_ports_tcp_out = serializers\ - .SerializerMethodField('get_port_policy_output_tcp') - ouverture_ports_udp_in = serializers\ - .SerializerMethodField('get_port_policy_input_udp') - ouverture_ports_udp_out = serializers\ - .SerializerMethodField('get_port_policy_output_udp') - - class Meta: - model = IpType - fields = ('type', 'extension', 'domaine_ip_start', 'domaine_ip_stop', - 'prefix_v6', - 'ouverture_ports_tcp_in', 'ouverture_ports_tcp_out', - 'ouverture_ports_udp_in', 'ouverture_ports_udp_out',) - - @staticmethod - def get_port_policy(obj, protocole, io): - """ Generic utility function to get the policy for a given - port, protocole and IN or OUT """ - if obj.ouverture_ports is None: - return [] - return map( - str, - obj.ouverture_ports.ouvertureport_set.filter( - protocole=protocole - ).filter(io=io) - ) - - def get_port_policy_input_tcp(self, obj): - """Renvoie la liste des ports ouverts en entrée tcp""" - return self.get_port_policy(obj, OuverturePort.TCP, OuverturePort.IN) - - def get_port_policy_output_tcp(self, obj): - """Renvoie la liste des ports ouverts en sortie tcp""" - return self.get_port_policy(obj, OuverturePort.TCP, OuverturePort.OUT) - - def get_port_policy_input_udp(self, obj): - """Renvoie la liste des ports ouverts en entrée udp""" - return self.get_port_policy(obj, OuverturePort.UDP, OuverturePort.IN) - - def get_port_policy_output_udp(self, obj): - """Renvoie la liste des ports ouverts en sortie udp""" - return self.get_port_policy(obj, OuverturePort.UDP, OuverturePort.OUT) - - -class ExtensionSerializer(serializers.ModelSerializer): - """Serialisation d'une extension : origin_ip et la zone sont - des foreign_key donc evalués en get_...""" - origin = serializers.SerializerMethodField('get_origin_ip') - zone_entry = serializers.SerializerMethodField('get_zone_name') - soa = serializers.SerializerMethodField('get_soa_data') - - class Meta: - model = Extension - fields = ('name', 'origin', 'origin_v6', 'zone_entry', 'soa') - - @staticmethod - def get_origin_ip(obj): - """ The IP of the associated origin for the zone """ - return obj.origin.ipv4 - - @staticmethod - def get_zone_name(obj): - """ The name of the associated zone """ - return str(obj.dns_entry) - - @staticmethod - def get_soa_data(obj): - """ The representation of the associated SOA """ - return {'mail': obj.soa.dns_soa_mail, 'param': obj.soa.dns_soa_param} - - -class MxSerializer(serializers.ModelSerializer): - """Serialisation d'un MX, evaluation du nom, de la zone - et du serveur cible, etant des foreign_key""" - name = serializers.SerializerMethodField('get_entry_name') - zone = serializers.SerializerMethodField('get_zone_name') - mx_entry = serializers.SerializerMethodField('get_mx_name') - - class Meta: - model = Mx - fields = ('zone', 'priority', 'name', 'mx_entry') - - @staticmethod - def get_entry_name(obj): - """ The name of the DNS MX entry """ - return str(obj.name) - - @staticmethod - def get_zone_name(obj): - """ The name of the associated zone of the MX record """ - return obj.zone.name - - @staticmethod - def get_mx_name(obj): - """ The string representation of the entry to add to the DNS """ - return str(obj.dns_entry) - - -class TxtSerializer(serializers.ModelSerializer): - """Serialisation d'un txt : zone cible et l'entrée txt - sont evaluées à part""" - zone = serializers.SerializerMethodField('get_zone_name') - txt_entry = serializers.SerializerMethodField('get_txt_name') - - class Meta: - model = Txt - fields = ('zone', 'txt_entry', 'field1', 'field2') - - @staticmethod - def get_zone_name(obj): - """ The name of the associated zone """ - return str(obj.zone.name) - - @staticmethod - def get_txt_name(obj): - """ The string representation of the entry to add to the DNS """ - return str(obj.dns_entry) - - -class SrvSerializer(serializers.ModelSerializer): - """Serialisation d'un srv : zone cible et l'entrée txt""" - extension = serializers.SerializerMethodField('get_extension_name') - srv_entry = serializers.SerializerMethodField('get_srv_name') - - class Meta: - model = Srv - fields = ( - 'service', - 'protocole', - 'extension', - 'ttl', - 'priority', - 'weight', - 'port', - 'target', - 'srv_entry' - ) - - @staticmethod - def get_extension_name(obj): - """ The name of the associated extension """ - return str(obj.extension.name) - - @staticmethod - def get_srv_name(obj): - """ The string representation of the entry to add to the DNS """ - return str(obj.dns_entry) - - -class NsSerializer(serializers.ModelSerializer): - """Serialisation d'un NS : la zone, l'entrée ns complète et le serveur - ns sont évalués à part""" - zone = serializers.SerializerMethodField('get_zone_name') - ns = serializers.SerializerMethodField('get_domain_name') - ns_entry = serializers.SerializerMethodField('get_text_name') - - class Meta: - model = Ns - fields = ('zone', 'ns', 'ns_entry') - - @staticmethod - def get_zone_name(obj): - """ The name of the associated zone """ - return obj.zone.name - - @staticmethod - def get_domain_name(obj): - """ The name of the associated NS target """ - return str(obj.ns) - - @staticmethod - def get_text_name(obj): - """ The string representation of the entry to add to the DNS """ - return str(obj.dns_entry) - - -class DomainSerializer(serializers.ModelSerializer): - """Serialisation d'un domain, extension, cname sont des foreign_key, - et l'entrée complète, sont évalués à part""" - extension = serializers.SerializerMethodField('get_zone_name') - cname = serializers.SerializerMethodField('get_alias_name') - cname_entry = serializers.SerializerMethodField('get_cname_name') - - class Meta: - model = Domain - fields = ('name', 'extension', 'cname', 'cname_entry') - - @staticmethod - def get_zone_name(obj): - """ The name of the associated zone """ - return obj.extension.name - - @staticmethod - def get_alias_name(obj): - """ The name of the associated alias """ - return str(obj.cname) - - @staticmethod - def get_cname_name(obj): - """ The name of the associated CNAME target """ - return str(obj.dns_entry) - - -class ServicesSerializer(serializers.ModelSerializer): - """Evaluation d'un Service, et serialisation""" - server = serializers.SerializerMethodField('get_server_name') - service = serializers.SerializerMethodField('get_service_name') - need_regen = serializers.SerializerMethodField('get_regen_status') - - class Meta: - model = Service_link - fields = ('server', 'service', 'need_regen') - - @staticmethod - def get_server_name(obj): - """ The name of the associated server """ - return str(obj.server.domain.name) - - @staticmethod - def get_service_name(obj): - """ The name of the service name """ - return str(obj.service) - - @staticmethod - def get_regen_status(obj): - """ The string representation of the regen status """ - return obj.need_regen() - - -class OuverturePortsSerializer(serializers.Serializer): - """Serialisation de l'ouverture des ports""" - ipv4 = serializers.SerializerMethodField() - ipv6 = serializers.SerializerMethodField() - - def create(self, validated_data): - """ Creates a new object based on the un-serialized data. - Used to implement an abstract inherited method """ - pass - - def update(self, instance, validated_data): - """ Updates an object based on the un-serialized data. - Used to implement an abstract inherited method """ - pass - - @staticmethod - def get_ipv4(): - """ The representation of the policy for the IPv4 addresses """ - return { - i.ipv4.ipv4: { - "tcp_in": [j.tcp_ports_in() for j in i.port_lists.all()], - "tcp_out": [j.tcp_ports_out()for j in i.port_lists.all()], - "udp_in": [j.udp_ports_in() for j in i.port_lists.all()], - "udp_out": [j.udp_ports_out() for j in i.port_lists.all()], - } - for i in Interface.objects.all() if i.ipv4 + fields = ('name', 'surname', 'pseudo', 'email', 'school', 'shell', + 'comment', 'state', 'registered', 'telephone', #'room', + 'solde', 'access', 'end_access', 'uid', 'api_url') + extra_kwargs = { + 'school': {'view_name': 'api:school-detail'}, + 'shell': {'view_name': 'api:shell-detail'}, + #'room': {'view_name': 'api:room-detail'}, + 'api_url': {'view_name': 'api:adherent-detail'} } - @staticmethod - def get_ipv6(): - """ The representation of the policy for the IPv6 addresses """ - return { - i.ipv6: { - "tcp_in": [j.tcp_ports_in() for j in i.port_lists.all()], - "tcp_out": [j.tcp_ports_out()for j in i.port_lists.all()], - "udp_in": [j.udp_ports_in() for j in i.port_lists.all()], - "udp_out": [j.udp_ports_out() for j in i.port_lists.all()], - } - for i in Interface.objects.all() if i.ipv6 + +class ServiceUserSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = ServiceUser + fields = ('pseudo', 'access_group', 'comment', 'api_url') + extra_kwargs = { + 'api_url': {'view_name': 'api:serviceuser-detail'} } + + +class SchoolSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = School + fields = ('name', 'api_url') + extra_kwargs = { + 'api_url': {'view_name': 'api:school-detail'} + } + + +class ListRightSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = ListRight + fields = ('unix_name', 'gid', 'critical', 'details', 'api_url') + extra_kwargs = { + 'api_url': {'view_name': 'api:listright-detail'} + } + + +class ShellSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = ListShell + fields = ('shell', 'api_url') + extra_kwargs = { + 'api_url': {'view_name': 'api:shell-detail'} + } + + +class BanSerializer(serializers.HyperlinkedModelSerializer): + active = serializers.BooleanField(source='is_active') + + class Meta: + model = Ban + fields = ('user', 'raison', 'date_start', 'date_end', 'state', + 'active', 'api_url') + extra_kwargs = { + 'user': {'view_name': 'api:user-detail'}, + 'api_url': {'view_name': 'api:ban-detail'} + } + + +class WhitelistSerializer(serializers.HyperlinkedModelSerializer): + active = serializers.BooleanField(source='is_active') + + class Meta: + model = Whitelist + fields = ('user', 'raison', 'date_start', 'date_end', 'active', 'api_url') + extra_kwargs = { + 'user': {'view_name': 'api:user-detail'}, + 'api_url': {'view_name': 'api:whitelist-detail'} + } + + + +# class ServiceLinkSerializer(serializers.ModelSerializer): +# """ Serializer for the ServiceLink objects """ +# +# name = serializers.CharField(source='service.service_type') +# +# class Meta: +# model = Service_link +# fields = ('name',) +# +# +# class MailingSerializer(serializers.ModelSerializer): +# """ Serializer to build Mailing objects """ +# +# name = serializers.CharField(source='pseudo') +# +# class Meta: +# model = Club +# fields = ('name',) +# +# +# class MailingMemberSerializer(serializers.ModelSerializer): +# """ Serializer fot the Adherent objects (who belong to a +# Mailing) """ +# +# class Meta: +# model = Adherent +# fields = ('email',) +# +# +# class IpTypeField(serializers.RelatedField): +# """ Serializer for an IpType object field """ +# +# def to_representation(self, value): +# return value.type +# +# def to_internal_value(self, data): +# pass +# +# +# class IpListSerializer(serializers.ModelSerializer): +# """ Serializer for an Ipv4List obejct using the IpType serialization """ +# +# ip_type = IpTypeField(read_only=True) +# +# class Meta: +# model = IpList +# fields = ('ipv4', 'ip_type') +# +# +# class Ipv6ListSerializer(serializers.ModelSerializer): +# """ Serializer for an Ipv6List object """ +# +# class Meta: +# model = Ipv6List +# fields = ('ipv6', 'slaac_ip') +# +# +# class InterfaceSerializer(serializers.ModelSerializer): +# """ Serializer for an Interface object. Use SerializerMethodField +# to get ForeignKey values """ +# +# ipv4 = IpListSerializer(read_only=True) +# # TODO : use serializer.RelatedField to avoid duplicate code +# mac_address = serializers.SerializerMethodField('get_macaddress') +# domain = serializers.SerializerMethodField('get_dns') +# extension = serializers.SerializerMethodField('get_interface_extension') +# +# class Meta: +# model = Interface +# fields = ('ipv4', 'mac_address', 'domain', 'extension') +# +# @staticmethod +# def get_dns(obj): +# """ The name of the associated DNS object """ +# return obj.domain.name +# +# @staticmethod +# def get_interface_extension(obj): +# """ The name of the associated Interface object """ +# return obj.domain.extension.name +# +# @staticmethod +# def get_macaddress(obj): +# """ The string representation of the associated MAC address """ +# return str(obj.mac_address) +# +# +# class FullInterfaceSerializer(serializers.ModelSerializer): +# """ Serializer for an Interface obejct. Use SerializerMethodField +# to get ForeignKey values """ +# +# ipv4 = IpListSerializer(read_only=True) +# ipv6 = Ipv6ListSerializer(read_only=True, many=True) +# # TODO : use serializer.RelatedField to avoid duplicate code +# mac_address = serializers.SerializerMethodField('get_macaddress') +# domain = serializers.SerializerMethodField('get_dns') +# extension = serializers.SerializerMethodField('get_interface_extension') +# +# class Meta: +# model = Interface +# fields = ('ipv4', 'ipv6', 'mac_address', 'domain', 'extension') +# +# @staticmethod +# def get_dns(obj): +# """ The name of the associated DNS object """ +# return obj.domain.name +# +# @staticmethod +# def get_interface_extension(obj): +# """ The name of the associated Extension object """ +# return obj.domain.extension.name +# +# @staticmethod +# def get_macaddress(obj): +# """ The string representation of the associated MAC address """ +# return str(obj.mac_address) +# +# +# class ExtensionNameField(serializers.RelatedField): +# """ Serializer for Extension object field """ +# +# def to_representation(self, value): +# return value.name +# +# def to_internal_value(self, data): +# pass +# +# +# class TypeSerializer(serializers.ModelSerializer): +# """ Serializer for an IpType object. Use SerializerMethodField to +# get ForeignKey values """ +# +# extension = ExtensionNameField(read_only=True) +# ouverture_ports_tcp_in = serializers\ +# .SerializerMethodField('get_port_policy_input_tcp') +# ouverture_ports_tcp_out = serializers\ +# .SerializerMethodField('get_port_policy_output_tcp') +# ouverture_ports_udp_in = serializers\ +# .SerializerMethodField('get_port_policy_input_udp') +# ouverture_ports_udp_out = serializers\ +# .SerializerMethodField('get_port_policy_output_udp') +# +# class Meta: +# model = IpType +# fields = ('type', 'extension', 'domaine_ip_start', 'domaine_ip_stop', +# 'prefix_v6', +# 'ouverture_ports_tcp_in', 'ouverture_ports_tcp_out', +# 'ouverture_ports_udp_in', 'ouverture_ports_udp_out',) +# +# @staticmethod +# def get_port_policy(obj, protocole, io): +# """ Generic utility function to get the policy for a given +# port, protocole and IN or OUT """ +# if obj.ouverture_ports is None: +# return [] +# return map( +# str, +# obj.ouverture_ports.ouvertureport_set.filter( +# protocole=protocole +# ).filter(io=io) +# ) +# +# def get_port_policy_input_tcp(self, obj): +# """Renvoie la liste des ports ouverts en entrée tcp""" +# return self.get_port_policy(obj, OuverturePort.TCP, OuverturePort.IN) +# +# def get_port_policy_output_tcp(self, obj): +# """Renvoie la liste des ports ouverts en sortie tcp""" +# return self.get_port_policy(obj, OuverturePort.TCP, OuverturePort.OUT) +# +# def get_port_policy_input_udp(self, obj): +# """Renvoie la liste des ports ouverts en entrée udp""" +# return self.get_port_policy(obj, OuverturePort.UDP, OuverturePort.IN) +# +# def get_port_policy_output_udp(self, obj): +# """Renvoie la liste des ports ouverts en sortie udp""" +# return self.get_port_policy(obj, OuverturePort.UDP, OuverturePort.OUT) +# +# +# class ExtensionSerializer(serializers.ModelSerializer): +# """Serialisation d'une extension : origin_ip et la zone sont +# des foreign_key donc evalués en get_...""" +# origin = serializers.SerializerMethodField('get_origin_ip') +# zone_entry = serializers.SerializerMethodField('get_zone_name') +# soa = serializers.SerializerMethodField('get_soa_data') +# +# class Meta: +# model = Extension +# fields = ('name', 'origin', 'origin_v6', 'zone_entry', 'soa') +# +# @staticmethod +# def get_origin_ip(obj): +# """ The IP of the associated origin for the zone """ +# return obj.origin.ipv4 +# +# @staticmethod +# def get_zone_name(obj): +# """ The name of the associated zone """ +# return str(obj.dns_entry) +# +# @staticmethod +# def get_soa_data(obj): +# """ The representation of the associated SOA """ +# return {'mail': obj.soa.dns_soa_mail, 'param': obj.soa.dns_soa_param} +# +# +# class MxSerializer(serializers.ModelSerializer): +# """Serialisation d'un MX, evaluation du nom, de la zone +# et du serveur cible, etant des foreign_key""" +# name = serializers.SerializerMethodField('get_entry_name') +# zone = serializers.SerializerMethodField('get_zone_name') +# mx_entry = serializers.SerializerMethodField('get_mx_name') +# +# class Meta: +# model = Mx +# fields = ('zone', 'priority', 'name', 'mx_entry') +# +# @staticmethod +# def get_entry_name(obj): +# """ The name of the DNS MX entry """ +# return str(obj.name) +# +# @staticmethod +# def get_zone_name(obj): +# """ The name of the associated zone of the MX record """ +# return obj.zone.name +# +# @staticmethod +# def get_mx_name(obj): +# """ The string representation of the entry to add to the DNS """ +# return str(obj.dns_entry) +# +# +# class TxtSerializer(serializers.ModelSerializer): +# """Serialisation d'un txt : zone cible et l'entrée txt +# sont evaluées à part""" +# zone = serializers.SerializerMethodField('get_zone_name') +# txt_entry = serializers.SerializerMethodField('get_txt_name') +# +# class Meta: +# model = Txt +# fields = ('zone', 'txt_entry', 'field1', 'field2') +# +# @staticmethod +# def get_zone_name(obj): +# """ The name of the associated zone """ +# return str(obj.zone.name) +# +# @staticmethod +# def get_txt_name(obj): +# """ The string representation of the entry to add to the DNS """ +# return str(obj.dns_entry) +# +# +# class SrvSerializer(serializers.ModelSerializer): +# """Serialisation d'un srv : zone cible et l'entrée txt""" +# extension = serializers.SerializerMethodField('get_extension_name') +# srv_entry = serializers.SerializerMethodField('get_srv_name') +# +# class Meta: +# model = Srv +# fields = ( +# 'service', +# 'protocole', +# 'extension', +# 'ttl', +# 'priority', +# 'weight', +# 'port', +# 'target', +# 'srv_entry' +# ) +# +# @staticmethod +# def get_extension_name(obj): +# """ The name of the associated extension """ +# return str(obj.extension.name) +# +# @staticmethod +# def get_srv_name(obj): +# """ The string representation of the entry to add to the DNS """ +# return str(obj.dns_entry) +# +# +# class NsSerializer(serializers.ModelSerializer): +# """Serialisation d'un NS : la zone, l'entrée ns complète et le serveur +# ns sont évalués à part""" +# zone = serializers.SerializerMethodField('get_zone_name') +# ns = serializers.SerializerMethodField('get_domain_name') +# ns_entry = serializers.SerializerMethodField('get_text_name') +# +# class Meta: +# model = Ns +# fields = ('zone', 'ns', 'ns_entry') +# +# @staticmethod +# def get_zone_name(obj): +# """ The name of the associated zone """ +# return obj.zone.name +# +# @staticmethod +# def get_domain_name(obj): +# """ The name of the associated NS target """ +# return str(obj.ns) +# +# @staticmethod +# def get_text_name(obj): +# """ The string representation of the entry to add to the DNS """ +# return str(obj.dns_entry) +# +# +# class DomainSerializer(serializers.ModelSerializer): +# """Serialisation d'un domain, extension, cname sont des foreign_key, +# et l'entrée complète, sont évalués à part""" +# extension = serializers.SerializerMethodField('get_zone_name') +# cname = serializers.SerializerMethodField('get_alias_name') +# cname_entry = serializers.SerializerMethodField('get_cname_name') +# +# class Meta: +# model = Domain +# fields = ('name', 'extension', 'cname', 'cname_entry') +# +# @staticmethod +# def get_zone_name(obj): +# """ The name of the associated zone """ +# return obj.extension.name +# +# @staticmethod +# def get_alias_name(obj): +# """ The name of the associated alias """ +# return str(obj.cname) +# +# @staticmethod +# def get_cname_name(obj): +# """ The name of the associated CNAME target """ +# return str(obj.dns_entry) +# +# +# class ServicesSerializer(serializers.ModelSerializer): +# """Evaluation d'un Service, et serialisation""" +# server = serializers.SerializerMethodField('get_server_name') +# service = serializers.SerializerMethodField('get_service_name') +# need_regen = serializers.SerializerMethodField('get_regen_status') +# +# class Meta: +# model = Service_link +# fields = ('server', 'service', 'need_regen') +# +# @staticmethod +# def get_server_name(obj): +# """ The name of the associated server """ +# return str(obj.server.domain.name) +# +# @staticmethod +# def get_service_name(obj): +# """ The name of the service name """ +# return str(obj.service) +# +# @staticmethod +# def get_regen_status(obj): +# """ The string representation of the regen status """ +# return obj.need_regen() +# +# +# class OuverturePortsSerializer(serializers.Serializer): +# """Serialisation de l'ouverture des ports""" +# ipv4 = serializers.SerializerMethodField() +# ipv6 = serializers.SerializerMethodField() +# +# def create(self, validated_data): +# """ Creates a new object based on the un-serialized data. +# Used to implement an abstract inherited method """ +# pass +# +# def update(self, instance, validated_data): +# """ Updates an object based on the un-serialized data. +# Used to implement an abstract inherited method """ +# pass +# +# @staticmethod +# def get_ipv4(): +# """ The representation of the policy for the IPv4 addresses """ +# return { +# i.ipv4.ipv4: { +# "tcp_in": [j.tcp_ports_in() for j in i.port_lists.all()], +# "tcp_out": [j.tcp_ports_out()for j in i.port_lists.all()], +# "udp_in": [j.udp_ports_in() for j in i.port_lists.all()], +# "udp_out": [j.udp_ports_out() for j in i.port_lists.all()], +# } +# for i in Interface.objects.all() if i.ipv4 +# } +# +# @staticmethod +# def get_ipv6(): +# """ The representation of the policy for the IPv6 addresses """ +# return { +# i.ipv6: { +# "tcp_in": [j.tcp_ports_in() for j in i.port_lists.all()], +# "tcp_out": [j.tcp_ports_out()for j in i.port_lists.all()], +# "udp_in": [j.udp_ports_in() for j in i.port_lists.all()], +# "udp_out": [j.udp_ports_out() for j in i.port_lists.all()], +# } +# for i in Interface.objects.all() if i.ipv6 +# } diff --git a/api/urls.py b/api/urls.py index 9b77f308..662dd8c4 100644 --- a/api/urls.py +++ b/api/urls.py @@ -24,48 +24,60 @@ Urls de l'api, pointant vers les fonctions de views from __future__ import unicode_literals -from django.conf.urls import url +from django.conf.urls import url, include +from rest_framework.routers import DefaultRouter from . import views +router = DefaultRouter() +router.register(r'users', views.UserViewSet) +router.register(r'clubs', views.ClubViewSet) +router.register(r'adherents', views.AdherentViewSet) +router.register(r'serviceusers', views.ServiceUserViewSet) +router.register(r'schools', views.SchoolViewSet) +router.register(r'listrights', views.ListRightViewSet) +router.register(r'shells', views.ShellViewSet, 'shell') +router.register(r'bans', views.BanViewSet) +router.register(r'whitelists', views.WhitelistViewSet) urlpatterns = [ - # Services - url(r'^services/$', views.services), - url( - r'^services/(?P\w+)/(?P\w+)/regen/$', - views.services_server_service_regen - ), - url(r'^services/(?P\w+)/$', views.services_server), - - # DNS - url(r'^dns/mac-ip-dns/$', views.dns_mac_ip_dns), - url(r'^dns/alias/$', views.dns_alias), - url(r'^dns/corresp/$', views.dns_corresp), - url(r'^dns/mx/$', views.dns_mx), - url(r'^dns/ns/$', views.dns_ns), - url(r'^dns/txt/$', views.dns_txt), - url(r'^dns/srv/$', views.dns_srv), - url(r'^dns/zones/$', views.dns_zones), - - # Unifi controler AP names - url(r'^unifi/ap_names/$', views.accesspoint_ip_dns), - - # Firewall - url(r'^firewall/ouverture_ports/$', views.firewall_ouverture_ports), - - # DHCP - url(r'^dhcp/mac-ip/$', views.dhcp_mac_ip), - - # Mailings - url(r'^mailing/standard/$', views.mailing_standard), - url( - r'^mailing/standard/(?P\w+)/members/$', - views.mailing_standard_ml_members - ), - url(r'^mailing/club/$', views.mailing_club), - url( - r'^mailing/club/(?P\w+)/members/$', - views.mailing_club_ml_members - ), + url(r'^', include(router.urls)), +# # Services +# url(r'^services/$', views.services), +# url( +# r'^services/(?P\w+)/(?P\w+)/regen/$', +# views.services_server_service_regen +# ), +# url(r'^services/(?P\w+)/$', views.services_server), +# +# # DNS +# url(r'^dns/mac-ip-dns/$', views.dns_mac_ip_dns), +# url(r'^dns/alias/$', views.dns_alias), +# url(r'^dns/corresp/$', views.dns_corresp), +# url(r'^dns/mx/$', views.dns_mx), +# url(r'^dns/ns/$', views.dns_ns), +# url(r'^dns/txt/$', views.dns_txt), +# url(r'^dns/srv/$', views.dns_srv), +# url(r'^dns/zones/$', views.dns_zones), +# +# # Unifi controler AP names +# url(r'^unifi/ap_names/$', views.accesspoint_ip_dns), +# +# # Firewall +# url(r'^firewall/ouverture_ports/$', views.firewall_ouverture_ports), +# +# # DHCP +# url(r'^dhcp/mac-ip/$', views.dhcp_mac_ip), +# +# # Mailings +# url(r'^mailing/standard/$', views.mailing_standard), +# url( +# r'^mailing/standard/(?P\w+)/members/$', +# views.mailing_standard_ml_members +# ), +# url(r'^mailing/club/$', views.mailing_club), +# url( +# r'^mailing/club/(?P\w+)/members/$', +# views.mailing_club_ml_members +# ), ] diff --git a/api/utils.py b/api/utils.py deleted file mode 100644 index d65cff44..00000000 --- a/api/utils.py +++ /dev/null @@ -1,123 +0,0 @@ -# Re2o est un logiciel d'administration développé initiallement au rezometz. Il -# se veut agnostique au réseau considéré, de manière à être installable en -# quelques clics. -# -# Copyright © 2018 Maël Kervella -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -"""api.utils. - -Set of various and usefull functions for the API app -""" - -from rest_framework.renderers import JSONRenderer -from django.http import HttpResponse - - -class JSONResponse(HttpResponse): - """A JSON response that can be send as an HTTP response. - Usefull in case of REST API. - """ - - def __init__(self, data, **kwargs): - """Initialisz a JSONResponse object. - - Args: - data: the data to render as JSON (often made of lists, dicts, - strings, boolean and numbers). See `JSONRenderer.render(data)` for - further details. - - Creates: - An HTTPResponse containing the data in JSON format. - """ - - content = JSONRenderer().render(data) - kwargs['content_type'] = 'application/json' - super(JSONResponse, self).__init__(content, **kwargs) - - -class JSONError(JSONResponse): - """A JSON response when the request failed. - """ - - def __init__(self, error_msg, data=None, **kwargs): - """Initialise a JSONError object. - - Args: - error_msg: A message explaining where the error is. - data: An optional field for further data to send along. - - Creates: - A JSONResponse containing a field `status` set to `error` and a - field `reason` containing `error_msg`. If `data` argument has been - given, a field `data` containing it is added to the JSON response. - """ - - response = { - 'status': 'error', - 'reason': error_msg - } - if data is not None: - response['data'] = data - super(JSONError, self).__init__(response, **kwargs) - - -class JSONSuccess(JSONResponse): - """A JSON response when the request suceeded. - """ - - def __init__(self, data=None, **kwargs): - """Initialise a JSONSucess object. - - Args: - error_msg: A message explaining where the error is. - data: An optional field for further data to send along. - - Creates: - A JSONResponse containing a field `status` set to `sucess`. If - `data` argument has been given, a field `data` containing it is - added to the JSON response. - """ - - response = { - 'status': 'success', - } - if data is not None: - response['data'] = data - super(JSONSuccess, self).__init__(response, **kwargs) - - -def accept_method(methods): - """Decorator to set a list of accepted request method. - Check if the method used is accepted. If not, send a NotAllowed response. - """ - - def decorator(view): - """The decorator to use on a specific view - """ - def wrapper(request, *args, **kwargs): - """The wrapper used for a specific request - """ - if request.method in methods: - return view(request, *args, **kwargs) - else: - return JSONError( - 'Invalid request method. Request methods authorize are ' + - str(methods) - ) - return view(request, *args, **kwargs) - return wrapper - return decorator diff --git a/api/views.py b/api/views.py index eda4dd59..00389eb7 100644 --- a/api/views.py +++ b/api/views.py @@ -27,12 +27,25 @@ HTML pages such as the login and index pages for a better integration. from django.contrib.auth.decorators import login_required, permission_required from django.views.decorators.csrf import csrf_exempt +from rest_framework.response import Response +from rest_framework import status, mixins, generics, viewsets + from re2o.utils import ( all_has_access, all_active_assigned_interfaces, filter_active_interfaces ) -from users.models import Club +from users.models import ( + User, + Club, + Adherent, + ServiceUser, + School, + ListRight, + ListShell, + Ban, + Whitelist +) from machines.models import ( Service_link, Service, @@ -49,569 +62,609 @@ from machines.models import ( ) from .serializers import ( - ServicesSerializer, - ServiceLinkSerializer, - FullInterfaceSerializer, - DomainSerializer, - TypeSerializer, - MxSerializer, - NsSerializer, - TxtSerializer, - SrvSerializer, - ExtensionSerializer, - InterfaceSerializer, - MailingMemberSerializer, - MailingSerializer + UserSerializer, + ClubSerializer, + AdherentSerializer, + ServiceUserSerializer, + SchoolSerializer, + ListRightSerializer, + ShellSerializer, + BanSerializer, + WhitelistSerializer ) -from .utils import JSONError, JSONSuccess, accept_method -@csrf_exempt -@login_required -@permission_required('machines.serveur') -@accept_method(['GET']) -def services(_request): - """The list of the different services and servers couples - - Return: - GET: - A JSONSuccess response with a field `data` containing: - * a list of dictionnaries (one for each service-server couple) - containing: - * a field `server`: the server name - * a field `service`: the service name - * a field `need_regen`: does the service need a regeneration ? - """ - - service_link = (Service_link.objects.all() - .select_related('server__domain') - .select_related('service')) - seria = ServicesSerializer(service_link, many=True) - return JSONSuccess(seria.data) - - -@csrf_exempt -@login_required -@permission_required('machines.serveur') -@accept_method(['GET', 'POST']) -def services_server_service_regen(request, server_name, service_name): - """The status of a particular service linked to a particular server. - Mark the service as regenerated if POST used. - - Returns: - GET: - A JSONSucess response with a field `data` containing: - * a field `need_regen`: does the service need a regeneration ? - - POST: - An empty JSONSuccess response. - """ - - query = Service_link.objects.filter( - service__in=Service.objects.filter(service_type=service_name), - server__in=Interface.objects.filter( - domain__in=Domain.objects.filter(name=server_name) - ) - ) - if not query: - return JSONError("This service is not active for this server") - - service = query.first() - if request.method == 'GET': - return JSONSuccess({'need_regen': service.need_regen()}) - else: - service.done_regen() - return JSONSuccess() - - -@csrf_exempt -@login_required -@permission_required('machines.serveur') -@accept_method(['GET']) -def services_server(_request, server_name): - """The list of services attached to a specific server - - Returns: - GET: - A JSONSuccess response with a field `data` containing: - * a list of dictionnaries (one for each service) containing: - * a field `name`: the name of a service - """ - - query = Service_link.objects.filter( - server__in=Interface.objects.filter( - domain__in=Domain.objects.filter(name=server_name) - ) - ) - if not query: - return JSONError("This service is not active for this server") - - services_objects = query.all() - seria = ServiceLinkSerializer(services_objects, many=True) - return JSONSuccess(seria.data) - - -@csrf_exempt -@login_required -@permission_required('machines.serveur') -@accept_method(['GET']) -def dns_mac_ip_dns(_request): - """The list of all active interfaces with all the associated infos - (MAC, IP, IpType, DNS name and associated zone extension) - - Returns: - GET: - A JSON Success response with a field `data` containing: - * a list of dictionnaries (one for each interface) containing: - * a field `ipv4` containing: - * a field `ipv4`: the ip for this interface - * a field `ip_type`: the name of the IpType of this interface - * a field `ipv6` containing `null` if ipv6 is deactivated else: - * a field `ipv6`: the ip for this interface - * a field `ip_type`: the name of the IpType of this interface - * a field `mac_address`: the MAC of this interface - * a field `domain`: the DNS name for this interface - * a field `extension`: the extension for the DNS zone of this - interface - """ - - interfaces = all_active_assigned_interfaces(full=True) - seria = FullInterfaceSerializer(interfaces, many=True) - return JSONSuccess(seria.data) - - -@csrf_exempt -@login_required -@permission_required('machines.serveur') -@accept_method(['GET']) -def dns_alias(_request): - """The list of all the alias used and the DNS info associated - - Returns: - GET: - A JSON Success response with a field `data` containing: - * a list of dictionnaries (one for each alias) containing: - * a field `name`: the alias used - * a field `cname`: the target of the alias (real name of the - interface) - * a field `cname_entry`: the entry to write in the DNS to have - the alias - * a field `extension`: the extension for the DNS zone of this - interface - """ - - alias = (Domain.objects - .filter(interface_parent=None) - .filter( - cname__in=Domain.objects.filter( - interface_parent__in=Interface.objects.exclude(ipv4=None) - ) - ) - .select_related('extension') - .select_related('cname__extension')) - seria = DomainSerializer(alias, many=True) - return JSONSuccess(seria.data) - - -@csrf_exempt -@login_required -@permission_required('machines.serveur') -@accept_method(['GET']) -def accesspoint_ip_dns(_request): - """The list of all active interfaces with all the associated infos - (MAC, IP, IpType, DNS name and associated zone extension) - - Only display access points. Use to gen unifi controler names - - Returns: - GET: - A JSON Success response with a field `data` containing: - * a list of dictionnaries (one for each interface) containing: - * a field `ipv4` containing: - * a field `ipv4`: the ip for this interface - * a field `ip_type`: the name of the IpType of this interface - * a field `ipv6` containing `null` if ipv6 is deactivated else: - * a field `ipv6`: the ip for this interface - * a field `ip_type`: the name of the IpType of this interface - * a field `mac_address`: the MAC of this interface - * a field `domain`: the DNS name for this interface - * a field `extension`: the extension for the DNS zone of this - interface - """ - - interfaces = (all_active_assigned_interfaces(full=True) - .filter(machine__accesspoint__isnull=False)) - seria = FullInterfaceSerializer(interfaces, many=True) - return JSONSuccess(seria.data) - - -@csrf_exempt -@login_required -@permission_required('machines.serveur') -@accept_method(['GET']) -def dns_corresp(_request): - """The list of the IpTypes possible with the infos about each - - Returns: - GET: - A JSON Success response with a field `data` containing: - * a list of dictionnaries (one for each IpType) containing: - * a field `type`: the name of the type - * a field `extension`: the DNS extension associated - * a field `domain_ip_start`: the first ip to use for this type - * a field `domain_ip_stop`: the last ip to use for this type - * a field `prefix_v6`: `null` if IPv6 is deactivated else the - prefix to use - * a field `ouverture_ports_tcp_in`: the policy for TCP IN ports - * a field `ouverture_ports_tcp_out`: the policy for TCP OUT ports - * a field `ouverture_ports_udp_in`: the policy for UDP IN ports - * a field `ouverture_ports_udp_out`: the policy for UDP OUT ports - """ - - ip_type = IpType.objects.all().select_related('extension') - seria = TypeSerializer(ip_type, many=True) - return JSONSuccess(seria.data) - - -@csrf_exempt -@login_required -@permission_required('machines.serveur') -@accept_method(['GET']) -def dns_mx(_request): - """The list of MX record to add to the DNS - - Returns: - GET: - A JSON Success response with a field `data` containing: - * a list of dictionnaries (one for each MX record) containing: - * a field `zone`: the extension for the concerned zone - * a field `priority`: the priority to use - * a field `name`: the name of the target - * a field `mx_entry`: the full entry to add in the DNS for this - MX record - """ - - mx = (Mx.objects.all() - .select_related('zone') - .select_related('name__extension')) - seria = MxSerializer(mx, many=True) - return JSONSuccess(seria.data) - - -@csrf_exempt -@login_required -@permission_required('machines.serveur') -@accept_method(['GET']) -def dns_ns(_request): - """The list of NS record to add to the DNS - - Returns: - GET: - A JSON Success response with a field `data` containing: - * a list of dictionnaries (one for each NS record) containing: - * a field `zone`: the extension for the concerned zone - * a field `ns`: the DNS name for the NS server targeted - * a field `ns_entry`: the full entry to add in the DNS for this - NS record - """ - - ns = (Ns.objects - .exclude( - ns__in=Domain.objects.filter( - interface_parent__in=Interface.objects.filter(ipv4=None) - ) - ) - .select_related('zone') - .select_related('ns__extension')) - seria = NsSerializer(ns, many=True) - return JSONSuccess(seria.data) - - -@csrf_exempt -@login_required -@permission_required('machines.serveur') -@accept_method(['GET']) -def dns_txt(_request): - """The list of TXT record to add to the DNS - - Returns: - GET: - A JSON Success response with a field `data` containing: - * a list of dictionnaries (one for each TXT record) containing: - * a field `zone`: the extension for the concerned zone - * a field `field1`: the first field in the record (target) - * a field `field2`: the second field in the record (value) - * a field `txt_entry`: the full entry to add in the DNS for this - TXT record - """ - - txt = Txt.objects.all().select_related('zone') - seria = TxtSerializer(txt, many=True) - return JSONSuccess(seria.data) - - -@csrf_exempt -@login_required -@permission_required('machines.serveur') -@accept_method(['GET']) -def dns_srv(_request): - """The list of SRV record to add to the DNS - - Returns: - GET: - A JSON Success response with a field `data` containing: - * a list of dictionnaries (one for each SRV record) containing: - * a field `extension`: the extension for the concerned zone - * a field `service`: the name of the service concerned - * a field `protocole`: the name of the protocol to use - * a field `ttl`: the Time To Live to use - * a field `priority`: the priority for this service - * a field `weight`: the weight for same priority entries - * a field `port`: the port targeted - * a field `target`: the interface targeted by this service - * a field `srv_entry`: the full entry to add in the DNS for this - SRV record - """ - - srv = (Srv.objects.all() - .select_related('extension') - .select_related('target__extension')) - seria = SrvSerializer(srv, many=True) - return JSONSuccess(seria.data) - - -@csrf_exempt -@login_required -@permission_required('machines.serveur') -@accept_method(['GET']) -def dns_zones(_request): - """The list of the zones managed - - Returns: - GET: - A JSON Success response with a field `data` containing: - * a list of dictionnaries (one for each zone) containing: - * a field `name`: the extension for the zone - * a field `origin`: the server IPv4 for the orgin of the zone - * a field `origin_v6`: `null` if ipv6 is deactivated else the - server IPv6 for the origin of the zone - * a field `soa` containing: - * a field `mail` containing the mail to contact in case of - problem with the zone - * a field `param` containing the full soa paramters to use - in the DNS for this zone - * a field `zone_entry`: the full entry to add in the DNS for the - origin of the zone - """ - - zones = Extension.objects.all().select_related('origin') - seria = ExtensionSerializer(zones, many=True) - return JSONSuccess(seria.data) - - -@csrf_exempt -@login_required -@permission_required('machines.serveur') -@accept_method(['GET']) -def firewall_ouverture_ports(_request): - """The list of the ports authorized to be openned by the firewall - - Returns: - GET: - A JSONSuccess response with a `data` field containing: - * a field `ipv4` containing: - * a field `tcp_in` containing: - * a list of port number where ipv4 tcp in should be ok - * a field `tcp_out` containing: - * a list of port number where ipv4 tcp ou should be ok - * a field `udp_in` containing: - * a list of port number where ipv4 udp in should be ok - * a field `udp_out` containing: - * a list of port number where ipv4 udp out should be ok - * a field `ipv6` containing: - * a field `tcp_in` containing: - * a list of port number where ipv6 tcp in should be ok - * a field `tcp_out` containing: - * a list of port number where ipv6 tcp ou should be ok - * a field `udp_in` containing: - * a list of port number where ipv6 udp in should be ok - * a field `udp_out` containing: - * a list of port number where ipv6 udp out should be ok - """ - - r = {'ipv4': {}, 'ipv6': {}} - for o in (OuverturePortList.objects.all() - .prefetch_related('ouvertureport_set') - .prefetch_related('interface_set', 'interface_set__ipv4')): - pl = { - "tcp_in": set(map( - str, - o.ouvertureport_set.filter( - protocole=OuverturePort.TCP, - io=OuverturePort.IN - ) - )), - "tcp_out": set(map( - str, - o.ouvertureport_set.filter( - protocole=OuverturePort.TCP, - io=OuverturePort.OUT - ) - )), - "udp_in": set(map( - str, - o.ouvertureport_set.filter( - protocole=OuverturePort.UDP, - io=OuverturePort.IN - ) - )), - "udp_out": set(map( - str, - o.ouvertureport_set.filter( - protocole=OuverturePort.UDP, - io=OuverturePort.OUT - ) - )), - } - for i in filter_active_interfaces(o.interface_set): - if i.may_have_port_open(): - d = r['ipv4'].get(i.ipv4.ipv4, {}) - d["tcp_in"] = (d.get("tcp_in", set()) - .union(pl["tcp_in"])) - d["tcp_out"] = (d.get("tcp_out", set()) - .union(pl["tcp_out"])) - d["udp_in"] = (d.get("udp_in", set()) - .union(pl["udp_in"])) - d["udp_out"] = (d.get("udp_out", set()) - .union(pl["udp_out"])) - r['ipv4'][i.ipv4.ipv4] = d - if i.ipv6(): - for ipv6 in i.ipv6(): - d = r['ipv6'].get(ipv6.ipv6, {}) - d["tcp_in"] = (d.get("tcp_in", set()) - .union(pl["tcp_in"])) - d["tcp_out"] = (d.get("tcp_out", set()) - .union(pl["tcp_out"])) - d["udp_in"] = (d.get("udp_in", set()) - .union(pl["udp_in"])) - d["udp_out"] = (d.get("udp_out", set()) - .union(pl["udp_out"])) - r['ipv6'][ipv6.ipv6] = d - return JSONSuccess(r) - - -@csrf_exempt -@login_required -@permission_required('machines.serveur') -@accept_method(['GET']) -def dhcp_mac_ip(_request): - """The list of all active interfaces with all the associated infos - (MAC, IP, IpType, DNS name and associated zone extension) - - Returns: - GET: - A JSON Success response with a field `data` containing: - * a list of dictionnaries (one for each interface) containing: - * a field `ipv4` containing: - * a field `ipv4`: the ip for this interface - * a field `ip_type`: the name of the IpType of this interface - * a field `mac_address`: the MAC of this interface - * a field `domain`: the DNS name for this interface - * a field `extension`: the extension for the DNS zone of this - interface - """ - - interfaces = all_active_assigned_interfaces() - seria = InterfaceSerializer(interfaces, many=True) - return JSONSuccess(seria.data) - - -@csrf_exempt -@login_required -@permission_required('machines.serveur') -@accept_method(['GET']) -def mailing_standard(_request): - """All the available standard mailings. - - Returns: - GET: - A JSONSucess response with a field `data` containing: - * a list of dictionnaries (one for each mailing) containing: - * a field `name`: the name of a mailing - """ - - return JSONSuccess([ - {'name': 'adherents'} - ]) - - -@csrf_exempt -@login_required -@permission_required('machines.serveur') -@accept_method(['GET']) -def mailing_standard_ml_members(_request, ml_name): - """All the members of a specific standard mailing - - Returns: - GET: - A JSONSucess response with a field `data` containing: - * a list if dictionnaries (one for each member) containing: - * a field `email`: the email of the member - * a field `name`: the name of the member - * a field `surname`: the surname of the member - * a field `pseudo`: the pseudo of the member - """ - - # All with active connextion - if ml_name == 'adherents': - members = all_has_access().values('email').distinct() - # Unknown mailing - else: - return JSONError("This mailing does not exist") - seria = MailingMemberSerializer(members, many=True) - return JSONSuccess(seria.data) - - -@csrf_exempt -@login_required -@permission_required('machines.serveur') -@accept_method(['GET']) -def mailing_club(_request): - """All the available club mailings. - - Returns: - GET: - A JSONSucess response with a field `data` containing: - * a list of dictionnaries (one for each mailing) containing: - * a field `name` indicating the name of a mailing - """ - - clubs = Club.objects.filter(mailing=True).values('pseudo') - seria = MailingSerializer(clubs, many=True) - return JSONSuccess(seria.data) - - -@csrf_exempt -@login_required -@permission_required('machines.serveur') -@accept_method(['GET']) -def mailing_club_ml_members(_request, ml_name): - """All the members of a specific club mailing - - Returns: - GET: - A JSONSucess response with a field `data` containing: - * a list if dictionnaries (one for each member) containing: - * a field `email`: the email of the member - * a field `name`: the name of the member - * a field `surname`: the surname of the member - * a field `pseudo`: the pseudo of the member - """ - - try: - club = Club.objects.get(mailing=True, pseudo=ml_name) - except Club.DoesNotExist: - return JSONError("This mailing does not exist") - members = club.administrators.all().values('email').distinct() - seria = MailingMemberSerializer(members, many=True) - return JSONSuccess(seria.data) +class UserViewSet(viewsets.ReadOnlyModelViewSet): + queryset = User.objects.all() + serializer_class = UserSerializer + + +class ClubViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Club.objects.all() + serializer_class = ClubSerializer + + +class AdherentViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Adherent.objects.all() + serializer_class = AdherentSerializer + + +class ServiceUserViewSet(viewsets.ReadOnlyModelViewSet): + queryset = ServiceUser.objects.all() + serializer_class = ServiceUserSerializer + + +class SchoolViewSet(viewsets.ReadOnlyModelViewSet): + queryset = School.objects.all() + serializer_class = SchoolSerializer + + +class ListRightViewSet(viewsets.ReadOnlyModelViewSet): + queryset = ListRight.objects.all() + serializer_class = ListRightSerializer + + +class ShellViewSet(viewsets.ReadOnlyModelViewSet): + queryset = ListShell.objects.all() + serializer_class = ShellSerializer + + +class BanViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Ban.objects.all() + serializer_class = BanSerializer + + +class WhitelistViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Whitelist.objects.all() + serializer_class = WhitelistSerializer + +# +# @csrf_exempt +# @login_required +# @permission_required('machines.serveur') +# @accept_method(['GET']) +# def services(_request): +# """The list of the different services and servers couples +# +# Return: +# GET: +# A JSONSuccess response with a field `data` containing: +# * a list of dictionnaries (one for each service-server couple) +# containing: +# * a field `server`: the server name +# * a field `service`: the service name +# * a field `need_regen`: does the service need a regeneration ? +# """ +# +# service_link = (Service_link.objects.all() +# .select_related('server__domain') +# .select_related('service')) +# seria = ServicesSerializer(service_link, many=True) +# return JSONSuccess(seria.data) +# +# +# @csrf_exempt +# @login_required +# @permission_required('machines.serveur') +# @accept_method(['GET', 'POST']) +# def services_server_service_regen(request, server_name, service_name): +# """The status of a particular service linked to a particular server. +# Mark the service as regenerated if POST used. +# +# Returns: +# GET: +# A JSONSucess response with a field `data` containing: +# * a field `need_regen`: does the service need a regeneration ? +# +# POST: +# An empty JSONSuccess response. +# """ +# +# query = Service_link.objects.filter( +# service__in=Service.objects.filter(service_type=service_name), +# server__in=Interface.objects.filter( +# domain__in=Domain.objects.filter(name=server_name) +# ) +# ) +# if not query: +# return JSONError("This service is not active for this server") +# +# service = query.first() +# if request.method == 'GET': +# return JSONSuccess({'need_regen': service.need_regen()}) +# else: +# service.done_regen() +# return JSONSuccess() +# +# +# @csrf_exempt +# @login_required +# @permission_required('machines.serveur') +# @accept_method(['GET']) +# def services_server(_request, server_name): +# """The list of services attached to a specific server +# +# Returns: +# GET: +# A JSONSuccess response with a field `data` containing: +# * a list of dictionnaries (one for each service) containing: +# * a field `name`: the name of a service +# """ +# +# query = Service_link.objects.filter( +# server__in=Interface.objects.filter( +# domain__in=Domain.objects.filter(name=server_name) +# ) +# ) +# if not query: +# return JSONError("This service is not active for this server") +# +# services_objects = query.all() +# seria = ServiceLinkSerializer(services_objects, many=True) +# return JSONSuccess(seria.data) +# +# +# @csrf_exempt +# @login_required +# @permission_required('machines.serveur') +# @accept_method(['GET']) +# def dns_mac_ip_dns(_request): +# """The list of all active interfaces with all the associated infos +# (MAC, IP, IpType, DNS name and associated zone extension) +# +# Returns: +# GET: +# A JSON Success response with a field `data` containing: +# * a list of dictionnaries (one for each interface) containing: +# * a field `ipv4` containing: +# * a field `ipv4`: the ip for this interface +# * a field `ip_type`: the name of the IpType of this interface +# * a field `ipv6` containing `null` if ipv6 is deactivated else: +# * a field `ipv6`: the ip for this interface +# * a field `ip_type`: the name of the IpType of this interface +# * a field `mac_address`: the MAC of this interface +# * a field `domain`: the DNS name for this interface +# * a field `extension`: the extension for the DNS zone of this +# interface +# """ +# +# interfaces = all_active_assigned_interfaces(full=True) +# seria = FullInterfaceSerializer(interfaces, many=True) +# return JSONSuccess(seria.data) +# +# +# @csrf_exempt +# @login_required +# @permission_required('machines.serveur') +# @accept_method(['GET']) +# def dns_alias(_request): +# """The list of all the alias used and the DNS info associated +# +# Returns: +# GET: +# A JSON Success response with a field `data` containing: +# * a list of dictionnaries (one for each alias) containing: +# * a field `name`: the alias used +# * a field `cname`: the target of the alias (real name of the +# interface) +# * a field `cname_entry`: the entry to write in the DNS to have +# the alias +# * a field `extension`: the extension for the DNS zone of this +# interface +# """ +# +# alias = (Domain.objects +# .filter(interface_parent=None) +# .filter( +# cname__in=Domain.objects.filter( +# interface_parent__in=Interface.objects.exclude(ipv4=None) +# ) +# ) +# .select_related('extension') +# .select_related('cname__extension')) +# seria = DomainSerializer(alias, many=True) +# return JSONSuccess(seria.data) +# +# +# @csrf_exempt +# @login_required +# @permission_required('machines.serveur') +# @accept_method(['GET']) +# def accesspoint_ip_dns(_request): +# """The list of all active interfaces with all the associated infos +# (MAC, IP, IpType, DNS name and associated zone extension) +# +# Only display access points. Use to gen unifi controler names +# +# Returns: +# GET: +# A JSON Success response with a field `data` containing: +# * a list of dictionnaries (one for each interface) containing: +# * a field `ipv4` containing: +# * a field `ipv4`: the ip for this interface +# * a field `ip_type`: the name of the IpType of this interface +# * a field `ipv6` containing `null` if ipv6 is deactivated else: +# * a field `ipv6`: the ip for this interface +# * a field `ip_type`: the name of the IpType of this interface +# * a field `mac_address`: the MAC of this interface +# * a field `domain`: the DNS name for this interface +# * a field `extension`: the extension for the DNS zone of this +# interface +# """ +# +# interfaces = (all_active_assigned_interfaces(full=True) +# .filter(machine__accesspoint__isnull=False)) +# seria = FullInterfaceSerializer(interfaces, many=True) +# return JSONSuccess(seria.data) +# +# +# @csrf_exempt +# @login_required +# @permission_required('machines.serveur') +# @accept_method(['GET']) +# def dns_corresp(_request): +# """The list of the IpTypes possible with the infos about each +# +# Returns: +# GET: +# A JSON Success response with a field `data` containing: +# * a list of dictionnaries (one for each IpType) containing: +# * a field `type`: the name of the type +# * a field `extension`: the DNS extension associated +# * a field `domain_ip_start`: the first ip to use for this type +# * a field `domain_ip_stop`: the last ip to use for this type +# * a field `prefix_v6`: `null` if IPv6 is deactivated else the +# prefix to use +# * a field `ouverture_ports_tcp_in`: the policy for TCP IN ports +# * a field `ouverture_ports_tcp_out`: the policy for TCP OUT ports +# * a field `ouverture_ports_udp_in`: the policy for UDP IN ports +# * a field `ouverture_ports_udp_out`: the policy for UDP OUT ports +# """ +# +# ip_type = IpType.objects.all().select_related('extension') +# seria = TypeSerializer(ip_type, many=True) +# return JSONSuccess(seria.data) +# +# +# @csrf_exempt +# @login_required +# @permission_required('machines.serveur') +# @accept_method(['GET']) +# def dns_mx(_request): +# """The list of MX record to add to the DNS +# +# Returns: +# GET: +# A JSON Success response with a field `data` containing: +# * a list of dictionnaries (one for each MX record) containing: +# * a field `zone`: the extension for the concerned zone +# * a field `priority`: the priority to use +# * a field `name`: the name of the target +# * a field `mx_entry`: the full entry to add in the DNS for this +# MX record +# """ +# +# mx = (Mx.objects.all() +# .select_related('zone') +# .select_related('name__extension')) +# seria = MxSerializer(mx, many=True) +# return JSONSuccess(seria.data) +# +# +# @csrf_exempt +# @login_required +# @permission_required('machines.serveur') +# @accept_method(['GET']) +# def dns_ns(_request): +# """The list of NS record to add to the DNS +# +# Returns: +# GET: +# A JSON Success response with a field `data` containing: +# * a list of dictionnaries (one for each NS record) containing: +# * a field `zone`: the extension for the concerned zone +# * a field `ns`: the DNS name for the NS server targeted +# * a field `ns_entry`: the full entry to add in the DNS for this +# NS record +# """ +# +# ns = (Ns.objects +# .exclude( +# ns__in=Domain.objects.filter( +# interface_parent__in=Interface.objects.filter(ipv4=None) +# ) +# ) +# .select_related('zone') +# .select_related('ns__extension')) +# seria = NsSerializer(ns, many=True) +# return JSONSuccess(seria.data) +# +# +# @csrf_exempt +# @login_required +# @permission_required('machines.serveur') +# @accept_method(['GET']) +# def dns_txt(_request): +# """The list of TXT record to add to the DNS +# +# Returns: +# GET: +# A JSON Success response with a field `data` containing: +# * a list of dictionnaries (one for each TXT record) containing: +# * a field `zone`: the extension for the concerned zone +# * a field `field1`: the first field in the record (target) +# * a field `field2`: the second field in the record (value) +# * a field `txt_entry`: the full entry to add in the DNS for this +# TXT record +# """ +# +# txt = Txt.objects.all().select_related('zone') +# seria = TxtSerializer(txt, many=True) +# return JSONSuccess(seria.data) +# +# +# @csrf_exempt +# @login_required +# @permission_required('machines.serveur') +# @accept_method(['GET']) +# def dns_srv(_request): +# """The list of SRV record to add to the DNS +# +# Returns: +# GET: +# A JSON Success response with a field `data` containing: +# * a list of dictionnaries (one for each SRV record) containing: +# * a field `extension`: the extension for the concerned zone +# * a field `service`: the name of the service concerned +# * a field `protocole`: the name of the protocol to use +# * a field `ttl`: the Time To Live to use +# * a field `priority`: the priority for this service +# * a field `weight`: the weight for same priority entries +# * a field `port`: the port targeted +# * a field `target`: the interface targeted by this service +# * a field `srv_entry`: the full entry to add in the DNS for this +# SRV record +# """ +# +# srv = (Srv.objects.all() +# .select_related('extension') +# .select_related('target__extension')) +# seria = SrvSerializer(srv, many=True) +# return JSONSuccess(seria.data) +# +# +# @csrf_exempt +# @login_required +# @permission_required('machines.serveur') +# @accept_method(['GET']) +# def dns_zones(_request): +# """The list of the zones managed +# +# Returns: +# GET: +# A JSON Success response with a field `data` containing: +# * a list of dictionnaries (one for each zone) containing: +# * a field `name`: the extension for the zone +# * a field `origin`: the server IPv4 for the orgin of the zone +# * a field `origin_v6`: `null` if ipv6 is deactivated else the +# server IPv6 for the origin of the zone +# * a field `soa` containing: +# * a field `mail` containing the mail to contact in case of +# problem with the zone +# * a field `param` containing the full soa paramters to use +# in the DNS for this zone +# * a field `zone_entry`: the full entry to add in the DNS for the +# origin of the zone +# """ +# +# zones = Extension.objects.all().select_related('origin') +# seria = ExtensionSerializer(zones, many=True) +# return JSONSuccess(seria.data) +# +# +# @csrf_exempt +# @login_required +# @permission_required('machines.serveur') +# @accept_method(['GET']) +# def firewall_ouverture_ports(_request): +# """The list of the ports authorized to be openned by the firewall +# +# Returns: +# GET: +# A JSONSuccess response with a `data` field containing: +# * a field `ipv4` containing: +# * a field `tcp_in` containing: +# * a list of port number where ipv4 tcp in should be ok +# * a field `tcp_out` containing: +# * a list of port number where ipv4 tcp ou should be ok +# * a field `udp_in` containing: +# * a list of port number where ipv4 udp in should be ok +# * a field `udp_out` containing: +# * a list of port number where ipv4 udp out should be ok +# * a field `ipv6` containing: +# * a field `tcp_in` containing: +# * a list of port number where ipv6 tcp in should be ok +# * a field `tcp_out` containing: +# * a list of port number where ipv6 tcp ou should be ok +# * a field `udp_in` containing: +# * a list of port number where ipv6 udp in should be ok +# * a field `udp_out` containing: +# * a list of port number where ipv6 udp out should be ok +# """ +# +# r = {'ipv4': {}, 'ipv6': {}} +# for o in (OuverturePortList.objects.all() +# .prefetch_related('ouvertureport_set') +# .prefetch_related('interface_set', 'interface_set__ipv4')): +# pl = { +# "tcp_in": set(map( +# str, +# o.ouvertureport_set.filter( +# protocole=OuverturePort.TCP, +# io=OuverturePort.IN +# ) +# )), +# "tcp_out": set(map( +# str, +# o.ouvertureport_set.filter( +# protocole=OuverturePort.TCP, +# io=OuverturePort.OUT +# ) +# )), +# "udp_in": set(map( +# str, +# o.ouvertureport_set.filter( +# protocole=OuverturePort.UDP, +# io=OuverturePort.IN +# ) +# )), +# "udp_out": set(map( +# str, +# o.ouvertureport_set.filter( +# protocole=OuverturePort.UDP, +# io=OuverturePort.OUT +# ) +# )), +# } +# for i in filter_active_interfaces(o.interface_set): +# if i.may_have_port_open(): +# d = r['ipv4'].get(i.ipv4.ipv4, {}) +# d["tcp_in"] = (d.get("tcp_in", set()) +# .union(pl["tcp_in"])) +# d["tcp_out"] = (d.get("tcp_out", set()) +# .union(pl["tcp_out"])) +# d["udp_in"] = (d.get("udp_in", set()) +# .union(pl["udp_in"])) +# d["udp_out"] = (d.get("udp_out", set()) +# .union(pl["udp_out"])) +# r['ipv4'][i.ipv4.ipv4] = d +# if i.ipv6(): +# for ipv6 in i.ipv6(): +# d = r['ipv6'].get(ipv6.ipv6, {}) +# d["tcp_in"] = (d.get("tcp_in", set()) +# .union(pl["tcp_in"])) +# d["tcp_out"] = (d.get("tcp_out", set()) +# .union(pl["tcp_out"])) +# d["udp_in"] = (d.get("udp_in", set()) +# .union(pl["udp_in"])) +# d["udp_out"] = (d.get("udp_out", set()) +# .union(pl["udp_out"])) +# r['ipv6'][ipv6.ipv6] = d +# return JSONSuccess(r) +# +# +# @csrf_exempt +# @login_required +# @permission_required('machines.serveur') +# @accept_method(['GET']) +# def dhcp_mac_ip(_request): +# """The list of all active interfaces with all the associated infos +# (MAC, IP, IpType, DNS name and associated zone extension) +# +# Returns: +# GET: +# A JSON Success response with a field `data` containing: +# * a list of dictionnaries (one for each interface) containing: +# * a field `ipv4` containing: +# * a field `ipv4`: the ip for this interface +# * a field `ip_type`: the name of the IpType of this interface +# * a field `mac_address`: the MAC of this interface +# * a field `domain`: the DNS name for this interface +# * a field `extension`: the extension for the DNS zone of this +# interface +# """ +# +# interfaces = all_active_assigned_interfaces() +# seria = InterfaceSerializer(interfaces, many=True) +# return JSONSuccess(seria.data) +# +# +# @csrf_exempt +# @login_required +# @permission_required('machines.serveur') +# @accept_method(['GET']) +# def mailing_standard(_request): +# """All the available standard mailings. +# +# Returns: +# GET: +# A JSONSucess response with a field `data` containing: +# * a list of dictionnaries (one for each mailing) containing: +# * a field `name`: the name of a mailing +# """ +# +# return JSONSuccess([ +# {'name': 'adherents'} +# ]) +# +# +# @csrf_exempt +# @login_required +# @permission_required('machines.serveur') +# @accept_method(['GET']) +# def mailing_standard_ml_members(_request, ml_name): +# """All the members of a specific standard mailing +# +# Returns: +# GET: +# A JSONSucess response with a field `data` containing: +# * a list if dictionnaries (one for each member) containing: +# * a field `email`: the email of the member +# * a field `name`: the name of the member +# * a field `surname`: the surname of the member +# * a field `pseudo`: the pseudo of the member +# """ +# +# # All with active connextion +# if ml_name == 'adherents': +# members = all_has_access().values('email').distinct() +# # Unknown mailing +# else: +# return JSONError("This mailing does not exist") +# seria = MailingMemberSerializer(members, many=True) +# return JSONSuccess(seria.data) +# +# +# @csrf_exempt +# @login_required +# @permission_required('machines.serveur') +# @accept_method(['GET']) +# def mailing_club(_request): +# """All the available club mailings. +# +# Returns: +# GET: +# A JSONSucess response with a field `data` containing: +# * a list of dictionnaries (one for each mailing) containing: +# * a field `name` indicating the name of a mailing +# """ +# +# clubs = Club.objects.filter(mailing=True).values('pseudo') +# seria = MailingSerializer(clubs, many=True) +# return JSONSuccess(seria.data) +# +# +# @csrf_exempt +# @login_required +# @permission_required('machines.serveur') +# @accept_method(['GET']) +# def mailing_club_ml_members(_request, ml_name): +# """All the members of a specific club mailing +# +# Returns: +# GET: +# A JSONSucess response with a field `data` containing: +# * a list if dictionnaries (one for each member) containing: +# * a field `email`: the email of the member +# * a field `name`: the name of the member +# * a field `surname`: the surname of the member +# * a field `pseudo`: the pseudo of the member +# """ +# +# try: +# club = Club.objects.get(mailing=True, pseudo=ml_name) +# except Club.DoesNotExist: +# return JSONError("This mailing does not exist") +# members = club.administrators.all().values('email').distinct() +# seria = MailingMemberSerializer(members, many=True) +# return JSONSuccess(seria.data) diff --git a/re2o/settings.py b/re2o/settings.py index 24226817..c9f9bef5 100644 --- a/re2o/settings.py +++ b/re2o/settings.py @@ -174,3 +174,8 @@ GRAPH_MODELS = { 'all_applications': True, 'group_models': True, } + +#RestFramework config fot API +REST_FRAMEWORK = { + 'URL_FIELD_NAME': 'api_url' +} From 510a0c9b437321f8a0a443bd715f572fc584a10d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Fri, 20 Apr 2018 18:10:45 +0000 Subject: [PATCH 02/49] Isolate API settings from project settings --- api/settings.py | 37 +++++++++++++++++++++++++++++++++++++ re2o/settings.py | 8 +++----- 2 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 api/settings.py diff --git a/api/settings.py b/api/settings.py new file mode 100644 index 00000000..4475a950 --- /dev/null +++ b/api/settings.py @@ -0,0 +1,37 @@ +# -*- mode: python; coding: utf-8 -*- +# Re2o est un logiciel d'administration développé initiallement au rezometz. Il +# se veut agnostique au réseau considéré, de manière à être installable en +# quelques clics. +# +# Copyright © 2017 Gabriel Détraz +# Copyright © 2017 Goulven Kermarec +# Copyright © 2017 Augustin Lemesle +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +"""api.settings +Django settings specific to the API. +""" + +# RestFramework config for API +REST_FRAMEWORK = { + 'URL_FIELD_NAME': 'api_url', + 'DEFAULT_AUTHENTICATION_CLASSES': ( + 'rest_framework.authentication.SessionAuthentication', + ), + 'DEFAULT_PERMISSION_CLASSES': ( + 'rest_framework.permissions.IsAuthenticated', + ) +} diff --git a/re2o/settings.py b/re2o/settings.py index c9f9bef5..ad1c4c9c 100644 --- a/re2o/settings.py +++ b/re2o/settings.py @@ -75,7 +75,6 @@ LOCAL_APPS = ( 're2o', 'preferences', 'logs', - 'api', ) INSTALLED_APPS = ( DJANGO_CONTRIB_APPS + @@ -175,7 +174,6 @@ GRAPH_MODELS = { 'group_models': True, } -#RestFramework config fot API -REST_FRAMEWORK = { - 'URL_FIELD_NAME': 'api_url' -} +# Activate API +if 'api' in INSTALLED_APPS: + from api.settings import * From 6478a0aed9cbb069fc5e701cf8dcb534bf1f9a14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Fri, 20 Apr 2018 20:17:50 +0000 Subject: [PATCH 03/49] Add ACL permission on API --- api/permissions.py | 106 +++++++++++++++++++++++++++++++++++++++++++++ api/settings.py | 2 +- 2 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 api/permissions.py diff --git a/api/permissions.py b/api/permissions.py new file mode 100644 index 00000000..6ede9491 --- /dev/null +++ b/api/permissions.py @@ -0,0 +1,106 @@ +from rest_framework import permissions +from re2o.acl import can_create, can_edit, can_delete, can_view_all + +class DefaultACLPermission(permissions.BasePermission): + """ + Permission subclass in charge of checking the ACL to determine + if a user can access the models + """ + perms_map = { + 'GET': [lambda model: model.can_view_all], + 'OPTIONS': [lambda model: model.can_view_all], + 'HEAD': [lambda model: model.can_view_all], + 'POST': [lambda model: model.can_create], + #'PUT': [], + #'PATCH': [], + #'DELETE': [], + } + perms_obj_map = { + 'GET': [lambda obj: obj.can_view], + 'OPTIONS': [lambda obj: obj.can_view], + 'HEAD': [lambda obj: obj.can_view], + #'POST': [], + 'PUT': [lambda obj: obj.can_edit], + #'PATCH': [], + 'DELETE': [lambda obj: obj.can_delete], + } + + def get_required_permissions(self, method, model): + """ + Given a model and an HTTP method, return the list of acl + functions that the user is required to verify. + """ + if method not in self.perms_map: + raise exceptions.MethodNotAllowed(method) + + return [perm(model) for perm in self.perms_map[method]] + + def get_required_object_permissions(self, method, obj): + """ + Given an object and an HTTP method, return the list of acl + functions that the user is required to verify. + """ + if method not in self.perms_map: + raise exceptions.MethodNotAllowed(method) + + return [perm(obj) for perm in self.perms_map[method]] + + def _queryset(self, view): + """ + Return the queryset associated with view and raise an error + is there is none. + """ + assert hasattr(view, 'get_queryset') \ + or getattr(view, 'queryset', None) is not None, ( + 'Cannot apply {} on a view that does not set ' + '`.queryset` or have a `.get_queryset()` method.' + ).format(self.__class__.__name__) + + if hasattr(view, 'get_queryset'): + queryset = view.get_queryset() + assert queryset is not None, ( + '{}.get_queryset() returned None'.format(view.__class__.__name__) + ) + return queryset + return view.queryset + + def has_permission(self, request, view): + # Workaround to ensure ACLPermissions are not applied + # to the root view when using DefaultRouter. + if getattr(view, '_ignore_model_permissions', False): + return True + + if not request.user or not request.user.is_authenticated: + return False + + queryset = self._queryset(view) + perms = self.get_required_permissions(request.method, queryset.model) + + return all(perm(request.user)[0] for perm in perms) + + def has_object_permission(self, request, view, obj): + # authentication checks have already executed via has_permission + queryset = self._queryset(view) + user = request.user + + perms = self.get_required_object_permissions(request.method, obj) + + if not all(perm(request.user)[0] for perm in perms): + # If the user does not have permissions we need to determine if + # they have read permissions to see 403, or not, and simply see + # a 404 response. + + if request.method in SAFE_METHODS: + # Read permissions already checked and failed, no need + # to make another lookup. + raise Http404 + + read_perms = self.get_required_object_permissions('GET', obj) + if not read_perms(request.user)[0]: + raise Http404 + + # Has read permissions. + return False + + return True + diff --git a/api/settings.py b/api/settings.py index 4475a950..767082ce 100644 --- a/api/settings.py +++ b/api/settings.py @@ -32,6 +32,6 @@ REST_FRAMEWORK = { 'rest_framework.authentication.SessionAuthentication', ), 'DEFAULT_PERMISSION_CLASSES': ( - 'rest_framework.permissions.IsAuthenticated', + 'api.permissions.DefaultACLPermission', ) } From 0c7e944b07b1d228b764b9c3c27c16c2c6bff398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Fri, 20 Apr 2018 22:09:33 +0000 Subject: [PATCH 04/49] Add permission for API view --- api/initial_perm.py | 17 +++++++++++++++++ api/settings.py | 6 ++++++ api/urls.py | 1 + re2o/urls.py | 7 +++++-- 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 api/initial_perm.py diff --git a/api/initial_perm.py b/api/initial_perm.py new file mode 100644 index 00000000..f4482fd9 --- /dev/null +++ b/api/initial_perm.py @@ -0,0 +1,17 @@ +from django.contrib.contenttypes.models import ContentType +from django.contrib.auth.models import Permission +from django.conf import settings + +api_content_type, created = ContentType.objects.get_or_create( + app_label=settings.API_CONTENT_TYPE_APP_LABEL, + model=settings.API_CONTENT_TYPE_MODEL +) +if created: + api_content_type.save() +api_permission, created = Permission.objects.get_or_create( + name=settings.API_PERMISSION_NAME, + content_type=api_content_type, + codename=settings.API_PERMISSION_CODENAME +) +if created: + api_permission.save() diff --git a/api/settings.py b/api/settings.py index 767082ce..8cf152f2 100644 --- a/api/settings.py +++ b/api/settings.py @@ -35,3 +35,9 @@ REST_FRAMEWORK = { 'api.permissions.DefaultACLPermission', ) } + +# API permission settings +API_CONTENT_TYPE_APP_LABEL = 'api' +API_CONTENT_TYPE_MODEL = 'api' +API_PERMISSION_NAME = 'Can use the API' +API_PERMISSION_CODENAME = 'use_api' diff --git a/api/urls.py b/api/urls.py index 662dd8c4..90672b47 100644 --- a/api/urls.py +++ b/api/urls.py @@ -28,6 +28,7 @@ from django.conf.urls import url, include from rest_framework.routers import DefaultRouter from . import views +from . import initial_perm router = DefaultRouter() router.register(r'users', views.UserViewSet) diff --git a/re2o/urls.py b/re2o/urls.py index 47172521..34cb0b15 100644 --- a/re2o/urls.py +++ b/re2o/urls.py @@ -42,6 +42,7 @@ Including another URLconf """ from __future__ import unicode_literals +from django.conf import settings from django.conf.urls import include, url from django.contrib import admin from django.contrib.auth import views as auth_views @@ -70,6 +71,8 @@ urlpatterns = [ r'^preferences/', include('preferences.urls', namespace='preferences') ), - url(r'^api/', include('api.urls', namespace='api')), - ] +if 'api' in settings.INSTALLED_APPS: + urlpatterns += [ + url(r'^api/', include('api.urls', namespace='api')), + ] From 0be63ad58e200e7f760dbffc068038d7cd414ea8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Fri, 20 Apr 2018 23:24:10 +0000 Subject: [PATCH 05/49] Use the use_api permission to access API --- api/acl.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ api/permissions.py | 24 +++++++++++++++--------- 2 files changed, 60 insertions(+), 9 deletions(-) create mode 100644 api/acl.py diff --git a/api/acl.py b/api/acl.py new file mode 100644 index 00000000..da0c9a29 --- /dev/null +++ b/api/acl.py @@ -0,0 +1,45 @@ +# -*- mode: python; coding: utf-8 -*- +# Re2o est un logiciel d'administration développé initiallement au rezometz. Il +# se veut agnostique au réseau considéré, de manière à être installable en +# quelques clics. +# +# Copyright © 2018 Maël Kervella +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +"""api.acl + +Here are defined some functions to check acl on the application. +""" + +from django.conf import settings + + +def can_view(user): + """Check if an user can view the application. + + Args: + user: The user who wants to view the application. + + Returns: + A couple (allowed, msg) where allowed is a boolean which is True if + viewing is granted and msg is a message (can be None). + """ + kwargs = { + 'app_label': settings.API_CONTENT_TYPE_APP_LABEL, + 'codename': settings.API_PERMISSION_CODENAME + } + can = user.has_perm('%(app_label)s.%(codename)s' % kwargs) + return can, None if can else "Vous ne pouvez pas voir cette application." diff --git a/api/permissions.py b/api/permissions.py index 6ede9491..a1d79b21 100644 --- a/api/permissions.py +++ b/api/permissions.py @@ -1,28 +1,34 @@ from rest_framework import permissions from re2o.acl import can_create, can_edit, can_delete, can_view_all +from . import acl + +def can_see_api(_): + return lambda user: acl.can_view(user) + + class DefaultACLPermission(permissions.BasePermission): """ Permission subclass in charge of checking the ACL to determine if a user can access the models """ perms_map = { - 'GET': [lambda model: model.can_view_all], - 'OPTIONS': [lambda model: model.can_view_all], - 'HEAD': [lambda model: model.can_view_all], - 'POST': [lambda model: model.can_create], + 'GET': [can_see_api, lambda model: model.can_view_all], + 'OPTIONS': [can_see_api, lambda model: model.can_view_all], + 'HEAD': [can_see_api, lambda model: model.can_view_all], + 'POST': [can_see_api, lambda model: model.can_create], #'PUT': [], #'PATCH': [], #'DELETE': [], } perms_obj_map = { - 'GET': [lambda obj: obj.can_view], - 'OPTIONS': [lambda obj: obj.can_view], - 'HEAD': [lambda obj: obj.can_view], + 'GET': [can_see_api, lambda obj: obj.can_view], + 'OPTIONS': [can_see_api, lambda obj: obj.can_view], + 'HEAD': [can_see_api, lambda obj: obj.can_view], #'POST': [], - 'PUT': [lambda obj: obj.can_edit], + 'PUT': [can_see_api, lambda obj: obj.can_edit], #'PATCH': [], - 'DELETE': [lambda obj: obj.can_delete], + 'DELETE': [can_see_api, lambda obj: obj.can_delete], } def get_required_permissions(self, method, model): From a5715d69b6858c4414053e49855f3db3ba79c2c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Sat, 21 Apr 2018 16:32:12 +0000 Subject: [PATCH 06/49] Include 'use_api' permission in the api.acl module --- api/acl.py | 22 ++++++++++++++++++++++ api/initial_perm.py | 17 ----------------- api/urls.py | 1 - 3 files changed, 22 insertions(+), 18 deletions(-) delete mode 100644 api/initial_perm.py diff --git a/api/acl.py b/api/acl.py index da0c9a29..0c7faae7 100644 --- a/api/acl.py +++ b/api/acl.py @@ -24,7 +24,29 @@ Here are defined some functions to check acl on the application. """ + from django.conf import settings +from django.contrib.contenttypes.models import ContentType +from django.contrib.auth.models import Permission + + +# Creates the 'use_api' permission if not created +# The 'use_api' is a fake permission in the sense +# it is not associated with an existing model and +# this ensure the permission is created every tun +api_content_type, created = ContentType.objects.get_or_create( + app_label=settings.API_CONTENT_TYPE_APP_LABEL, + model=settings.API_CONTENT_TYPE_MODEL +) +if created: + api_content_type.save() +api_permission, created = Permission.objects.get_or_create( + name=settings.API_PERMISSION_NAME, + content_type=api_content_type, + codename=settings.API_PERMISSION_CODENAME +) +if created: + api_permission.save() def can_view(user): diff --git a/api/initial_perm.py b/api/initial_perm.py deleted file mode 100644 index f4482fd9..00000000 --- a/api/initial_perm.py +++ /dev/null @@ -1,17 +0,0 @@ -from django.contrib.contenttypes.models import ContentType -from django.contrib.auth.models import Permission -from django.conf import settings - -api_content_type, created = ContentType.objects.get_or_create( - app_label=settings.API_CONTENT_TYPE_APP_LABEL, - model=settings.API_CONTENT_TYPE_MODEL -) -if created: - api_content_type.save() -api_permission, created = Permission.objects.get_or_create( - name=settings.API_PERMISSION_NAME, - content_type=api_content_type, - codename=settings.API_PERMISSION_CODENAME -) -if created: - api_permission.save() diff --git a/api/urls.py b/api/urls.py index 90672b47..662dd8c4 100644 --- a/api/urls.py +++ b/api/urls.py @@ -28,7 +28,6 @@ from django.conf.urls import url, include from rest_framework.routers import DefaultRouter from . import views -from . import initial_perm router = DefaultRouter() router.register(r'users', views.UserViewSet) From 6562f32ebf99811cd261a93f06db5f961a6eb9c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Sat, 21 Apr 2018 19:48:33 +0000 Subject: [PATCH 07/49] Add token authentication with expiration of tokens --- api/authentication.py | 25 +++++++++++++++++++ api/settings.py | 7 ++++++ api/urls.py | 1 + api/views.py | 38 +++++++++++++++++++++++------ install_utils/apache2/re2o-tls.conf | 1 + install_utils/apache2/re2o.conf | 1 + re2o/settings.py | 1 + 7 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 api/authentication.py diff --git a/api/authentication.py b/api/authentication.py new file mode 100644 index 00000000..4dc5a6f3 --- /dev/null +++ b/api/authentication.py @@ -0,0 +1,25 @@ +import datetime +from django.conf import settings +from django.utils.translation import ugettext_lazy as _ +from rest_framework.authentication import TokenAuthentication +from rest_framework import exceptions + +class ExpiringTokenAuthentication(TokenAuthentication): + def authenticate_credentials(self, key): + model = self.get_model() + try: + token = model.objects.select_related('user').get(key=key) + except model.DoesNotExist: + raise exceptions.AuthenticationFailed(_('Invalid token.')) + + if not token.user.is_active: + raise exceptions.AuthenticationFailed(_('User inactive or deleted.')) + + token_duration = datetime.timedelta( + seconds=settings.API_TOKEN_DURATION + ) + utc_now = datetime.datetime.now(datetime.timezone.utc) + if token.created < utc_now - token_duration: + raise exceptions.AuthenticationFailed(_('Token has expired')) + + return (token.user, token) diff --git a/api/settings.py b/api/settings.py index 8cf152f2..028ec01d 100644 --- a/api/settings.py +++ b/api/settings.py @@ -29,6 +29,7 @@ Django settings specific to the API. REST_FRAMEWORK = { 'URL_FIELD_NAME': 'api_url', 'DEFAULT_AUTHENTICATION_CLASSES': ( + 'api.authentication.ExpiringTokenAuthentication', 'rest_framework.authentication.SessionAuthentication', ), 'DEFAULT_PERMISSION_CLASSES': ( @@ -41,3 +42,9 @@ API_CONTENT_TYPE_APP_LABEL = 'api' API_CONTENT_TYPE_MODEL = 'api' API_PERMISSION_NAME = 'Can use the API' API_PERMISSION_CODENAME = 'use_api' + +# Activate token authentication +API_APPS = ( + 'rest_framework.authtoken', +) +API_TOKEN_DURATION = 86400 # 24 hours diff --git a/api/urls.py b/api/urls.py index 662dd8c4..3379d083 100644 --- a/api/urls.py +++ b/api/urls.py @@ -42,6 +42,7 @@ router.register(r'whitelists', views.WhitelistViewSet) urlpatterns = [ url(r'^', include(router.urls)), + url(r'^token-auth/', views.ObtainExpiringAuthToken.as_view()) # # Services # url(r'^services/$', views.services), # url( diff --git a/api/views.py b/api/views.py index 00389eb7..f3e2a6c7 100644 --- a/api/views.py +++ b/api/views.py @@ -24,17 +24,15 @@ The views for the API app. They should all return JSON data and not fallback on HTML pages such as the login and index pages for a better integration. """ -from django.contrib.auth.decorators import login_required, permission_required -from django.views.decorators.csrf import csrf_exempt +import datetime +from django.conf import settings + +from rest_framework.authtoken.views import ObtainAuthToken +from rest_framework.authtoken.models import Token from rest_framework.response import Response -from rest_framework import status, mixins, generics, viewsets +from rest_framework import viewsets, status -from re2o.utils import ( - all_has_access, - all_active_assigned_interfaces, - filter_active_interfaces -) from users.models import ( User, Club, @@ -118,6 +116,30 @@ class WhitelistViewSet(viewsets.ReadOnlyModelViewSet): queryset = Whitelist.objects.all() serializer_class = WhitelistSerializer +# Subclass the standard rest_framework.auth_token.views.ObtainAuthToken +# in order to renew the lease of the token and add expiration time +class ObtainExpiringAuthToken(ObtainAuthToken): + def post(self, request, *args, **kwargs): + serializer = self.serializer_class(data=request.data) + serializer.is_valid(raise_exception=True) + user = serializer.validated_data['user'] + token, created = Token.objects.get_or_create(user=user) + + token_duration = datetime.timedelta( + seconds=settings.API_TOKEN_DURATION + ) + utc_now = datetime.datetime.now(datetime.timezone.utc) + if not created and token.created < utc_now - token_duration: + token.delete() + token = Token.objects.create(user=user) + token.created = datetime.datetime.utcnow() + token.save() + + return Response({ + 'token': token.key, + 'expiration_date': token.created + token_duration + }) + # # @csrf_exempt # @login_required diff --git a/install_utils/apache2/re2o-tls.conf b/install_utils/apache2/re2o-tls.conf index 83e2cf13..eb8f2c42 100644 --- a/install_utils/apache2/re2o-tls.conf +++ b/install_utils/apache2/re2o-tls.conf @@ -26,6 +26,7 @@ WSGIScriptAlias / PATH/re2o/wsgi.py WSGIProcessGroup re2o WSGIDaemonProcess re2o processes=2 threads=16 maximum-requests=1000 display-name=re2o + WSGIPassAuthorization On SSLCertificateFile /etc/letsencrypt/live/LE_PATH/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/LE_PATH/privkey.pem diff --git a/install_utils/apache2/re2o.conf b/install_utils/apache2/re2o.conf index 680fb05d..1b4e02b3 100644 --- a/install_utils/apache2/re2o.conf +++ b/install_utils/apache2/re2o.conf @@ -19,5 +19,6 @@ WSGIScriptAlias / PATH/re2o/wsgi.py WSGIProcessGroup re2o WSGIDaemonProcess re2o processes=2 threads=16 maximum-requests=1000 display-name=re2o + WSGIPassAuthorization On diff --git a/re2o/settings.py b/re2o/settings.py index ad1c4c9c..7c119a55 100644 --- a/re2o/settings.py +++ b/re2o/settings.py @@ -177,3 +177,4 @@ GRAPH_MODELS = { # Activate API if 'api' in INSTALLED_APPS: from api.settings import * + INSTALLED_APPS += API_APPS From 98dc4205bef1265e16570e8e008b7653a9eaaa5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Sat, 21 Apr 2018 22:36:10 +0000 Subject: [PATCH 08/49] API support for app cotisations --- api/serializers.py | 76 ++++++++++++++++++++++++++++++++++++++++++++++ api/urls.py | 8 +++++ api/views.py | 53 ++++++++++++++++++++++++++++++++ 3 files changed, 137 insertions(+) diff --git a/api/serializers.py b/api/serializers.py index e274f942..9acacce1 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -23,6 +23,15 @@ Serializers for the API app """ from rest_framework import serializers + +from cotisations.models import ( + Facture, + Vente, + Article, + Banque, + Paiement, + Cotisation +) from users.models import ( User, Club, @@ -49,6 +58,73 @@ from machines.models import ( Ipv6List ) +# COTISATION APP + +class FactureSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Facture + fields = ('user', 'paiement', 'banque', 'cheque', 'date', 'valid', + 'control', 'prix_total', 'name', 'api_url') + extra_kwargs = { + 'user': {'view_name': 'api:user-detail'}, + 'paiement': {'view_name': 'api:paiement-detail'}, + 'banque': {'view_name': 'api:banque-detail'}, + 'api_url': {'view_name': 'api:facture-detail'} + } + + +class VenteSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Vente + fields = ('facture', 'number', 'name', 'prix', 'duration', + 'type_cotisation', 'prix_total', 'api_url') + extra_kwargs = { + 'facture': {'view_name': 'api:facture-detail'}, + 'api_url': {'view_name': 'api:vente-detail'} + } + + +class ArticleSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Article + fields = ('name', 'prix', 'duration', 'type_user', + 'type_cotisation', 'api_url') + extra_kwargs = { + 'api_url': {'view_name': 'api:article-detail'} + } + + +class BanqueSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Banque + fields = ('name', 'api_url') + extra_kwargs = { + 'api_url': {'view_name': 'api:banque-detail'} + } + + +class PaiementSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Paiement + fields = ('moyen', 'type_paiement', 'api_url') + extra_kwargs = { + 'api_url': {'view_name': 'api:paiement-detail'} + } + + +class CotisationSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Cotisation + fields = ('vente', 'type_cotisation', 'date_start', 'date_end', + 'api_url') + extra_kwargs = { + 'vente': {'view_name': 'api:vente-detail'}, + 'api_url': {'view_name': 'api:cotisation-detail'} + } + + +# USER APP + class UserSerializer(serializers.HyperlinkedModelSerializer): access = serializers.BooleanField(source='has_access') diff --git a/api/urls.py b/api/urls.py index 3379d083..3281d326 100644 --- a/api/urls.py +++ b/api/urls.py @@ -30,6 +30,14 @@ from rest_framework.routers import DefaultRouter from . import views router = DefaultRouter() +# COTISATION APP +router.register(r'factures', views.FactureViewSet) +router.register(r'ventes', views.VenteViewSet) +router.register(r'articles', views.ArticleViewSet) +router.register(r'banques', views.BanqueViewSet) +router.register(r'paiements', views.PaiementViewSet) +router.register(r'cotisations', views.CotisationViewSet) +# USER APP router.register(r'users', views.UserViewSet) router.register(r'clubs', views.ClubViewSet) router.register(r'adherents', views.AdherentViewSet) diff --git a/api/views.py b/api/views.py index f3e2a6c7..29531fb8 100644 --- a/api/views.py +++ b/api/views.py @@ -33,6 +33,15 @@ from rest_framework.authtoken.models import Token from rest_framework.response import Response from rest_framework import viewsets, status + +from cotisations.models import ( + Facture, + Vente, + Article, + Banque, + Paiement, + Cotisation +) from users.models import ( User, Club, @@ -60,6 +69,14 @@ from machines.models import ( ) from .serializers import ( + # COTISATION APP + FactureSerializer, + VenteSerializer, + ArticleSerializer, + BanqueSerializer, + PaiementSerializer, + CotisationSerializer, + # USER APP UserSerializer, ClubSerializer, AdherentSerializer, @@ -72,6 +89,42 @@ from .serializers import ( ) +# COTISATION APP + + +class FactureViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Facture.objects.all() + serializer_class = FactureSerializer + + +class VenteViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Vente.objects.all() + serializer_class = VenteSerializer + + +class ArticleViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Article.objects.all() + serializer_class = ArticleSerializer + + +class BanqueViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Banque.objects.all() + serializer_class = BanqueSerializer + + +class PaiementViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Paiement.objects.all() + serializer_class = PaiementSerializer + + +class CotisationViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Cotisation.objects.all() + serializer_class = CotisationSerializer + + +# USER APP + + class UserViewSet(viewsets.ReadOnlyModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer From e2736e17dff7885549e2d281b6fc2c68f7752993 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Sun, 22 Apr 2018 00:36:06 +0000 Subject: [PATCH 09/49] API support for app machines --- api/serializers.py | 261 ++++++++++++++++++++++++++++++++++++++++++--- api/urls.py | 24 ++++- api/views.py | 141 ++++++++++++++++++++++-- 3 files changed, 400 insertions(+), 26 deletions(-) diff --git a/api/serializers.py b/api/serializers.py index 9acacce1..90d00418 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -32,6 +32,27 @@ from cotisations.models import ( Paiement, Cotisation ) +from machines.models import ( + Machine, + MachineType, + IpType, + Vlan, + Nas, + SOA, + Extension, + Mx, + Ns, + Txt, + Srv, + Interface, + Ipv6List, + Domain, + IpList, + Service, + Service_link, + OuverturePortList, + OuverturePort +) from users.models import ( User, Club, @@ -43,22 +64,9 @@ from users.models import ( Ban, Whitelist ) -from machines.models import ( - Interface, - IpType, - Extension, - IpList, - Domain, - Txt, - Mx, - Srv, - Service_link, - Ns, - OuverturePort, - Ipv6List -) -# COTISATION APP + +# COTISATIONS APP class FactureSerializer(serializers.HyperlinkedModelSerializer): class Meta: @@ -123,7 +131,228 @@ class CotisationSerializer(serializers.HyperlinkedModelSerializer): } -# USER APP +# MACHINES APP + + +class MachineSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Machine + fields = ('user', 'name', 'active', 'api_url') + extra_kwargs = { + 'user': {'view_name': 'api:user-detail'}, + 'api_url': {'view_name': 'api:machine-detail'} + } + + +class MachineTypeSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = MachineType + fields = ('type', 'ip_type', 'api_url') + extra_kwargs = { + 'ip_type': {'view_name': 'api:iptype-detail'}, + 'api_url': {'view_name': 'api:machinetype-detail'} + } + + +class IpTypeSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = IpType + fields = ('type', 'extension', 'need_infra', 'domaine_ip_start', + 'domaine_ip_stop', 'prefix_v6', 'vlan', 'ouverture_ports', + 'api_url') + extra_kwargs = { + 'extension': {'view_name': 'api:extension-detail'}, + 'vlan': {'view_name': 'api:vlan-detail'}, + 'ouverture_ports': {'view_name': 'api:ouvertureportlist-detail'}, + 'api_url': {'view_name': 'api:iptype-detail'} + } + + +class VlanSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Vlan + fields = ('vlan_id', 'name', 'comment', 'api_url') + extra_kwargs = { + 'api_url': {'view_name': 'api:vlan-detail'} + } + + +class NasSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Nas + fields = ('name', 'nas_type', 'machine_type', 'port_access_mode', + 'autocapture_mac', 'api_url') + extra_kwargs = { + 'nas_type': {'view_name': 'api:machinetype-detail'}, + 'machine_type': {'view_name': 'api:machinetype-detail'}, + 'api_url': {'view_name': 'api:nas-detail'} + } + + +class SOASerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = SOA + fields = ('name', 'mail', 'refresh', 'retry', 'expire', 'ttl', + 'api_url') + extra_kwargs = { + 'api_url': {'view_name': 'api:soa-detail'} + } + + +class ExtensionSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Extension + fields = ('name', 'need_infra', 'origin', 'origin_v6', 'soa', + 'api_url') + extra_kwargs = { + 'origin': {'view_name': 'api:iplist-detail'}, + 'soa': {'view_name': 'api:soa-detail'}, + 'api_url': {'view_name': 'api:extension-detail'} + } + + +class MxSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Mx + fields = ('zone', 'priority', 'name', 'api_url') + extra_kwargs = { + 'zone': {'view_name': 'api:extension-detail'}, + 'name': {'view_name': 'api:domain-detail'}, + 'api_url': {'view_name': 'api:mx-detail'} + } + + +class NsSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Ns + fields = ('zone', 'ns', 'api_url') + extra_kwargs = { + 'zone': {'view_name': 'api:extension-detail'}, + 'ns': {'view_name': 'api:domain-detail'}, + 'api_url': {'view_name': 'api:ns-detail'} + } + + +class TxtSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Txt + fields = ('zone', 'field1', 'field2', 'api_url') + extra_kwargs = { + 'zone': {'view_name': 'api:extension-detail'}, + 'api_url': {'view_name': 'api:txt-detail'} + } + + +class SrvSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Srv + fields = ('service', 'protocole', 'extension', 'ttl', 'priority', + 'weight', 'port', 'target', 'api_url') + extra_kwargs = { + 'extension': {'view_name': 'api:extension-detail'}, + 'target': {'view_name': 'api:domain-detail'}, + 'api_url': {'view_name': 'api:mx-detail'} + } + + +class InterfaceSerializer(serializers.HyperlinkedModelSerializer): + active = serializers.BooleanField(source='is_active') + + class Meta: + model = Interface + fields = ('ipv4', 'mac_address', 'machine', 'type', 'details', + 'port_lists', 'active', 'api_url') + extra_kwargs = { + 'ipv4': {'view_name': 'api:iplist-detail'}, + 'machine': {'view_name': 'api:machine-detail'}, + 'type': {'view_name': 'api:machinetype-detail'}, + 'port_lists': {'view_name': 'api:ouvertureportlist-detail'}, + 'api_url': {'view_name': 'api:interface-detail'} + } + + +class Ipv6ListSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Ipv6List + fields = ('ipv6', 'interface', 'slaac_ip', 'date_end', + 'api_url') + extra_kwargs = { + 'interface': {'view_name': 'api:interface-detail'}, + 'api_url': {'view_name': 'api:ipv6list-detail'} + } + + +class DomainSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Domain + fields = ('interface_parent', 'name', 'extension', 'cname', + 'api_url') + extra_kwargs = { + 'interface_parent': {'view_name': 'api:interface-detail'}, + 'extension': {'view_name': 'api:extension-detail'}, + 'cname': {'view_name': 'api:domain-detail'}, + 'api_url': {'view_name': 'api:domain-detail'} + } + + +class IpListSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = IpList + fields = ('ipv4', 'ip_type', 'need_infra', 'api_url') + extra_kwargs = { + 'ip_type': {'view_name': 'api:iptype-detail'}, + 'api_url': {'view_name': 'api:iplist-detail'} + } + + +class ServiceSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Service + fields = ('service_type', 'min_time_regen', 'regular_time_regen', + 'servers', 'api_url') + extra_kwargs = { + 'servers': {'view_name': 'api:interface-detail'}, + 'api_url': {'view_name': 'api:service-detail'} + } + + +class ServiceLinkSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Service_link + fields = ('service', 'server', 'last_regen', 'asked_regen', + 'need_regen', 'api_url') + extra_kwargs = { + 'service': {'view_name': 'api:service-detail'}, + 'server': {'view_name': 'api:interface-detail'}, + 'api_url': {'view_name': 'api:servicelink-detail'} + } + + +class OuverturePortListSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = OuverturePortList + fields = ('name', 'tcp_ports_in', 'udp_ports_in', 'tcp_ports_out', + 'udp_ports_out', 'api_url') + extra_kwargs = { + 'tcp_ports_in': {'view_name': 'api:ouvertureport-detail'}, + 'udp_ports_in': {'view_name': 'api:ouvertureport-detail'}, + 'tcp_ports_out': {'view_name': 'api:ouvertureport-detail'}, + 'udp_ports_out': {'view_name': 'api:ouvertureport-detail'}, + 'api_url': {'view_name': 'api:ouvertureportlist-detail'} + } + + +class OuverturePortSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = OuverturePort + fields = ('begin', 'end', 'port_list', 'protocole', 'io', 'api_url') + extra_kwargs = { + 'port_list': {'view_name': 'api:ouvertureportlist-detail'}, + 'api_url': {'view_name': 'api:ouvertureport-detail'} + } + + +# USERS APP class UserSerializer(serializers.HyperlinkedModelSerializer): diff --git a/api/urls.py b/api/urls.py index 3281d326..a712cacd 100644 --- a/api/urls.py +++ b/api/urls.py @@ -30,14 +30,34 @@ from rest_framework.routers import DefaultRouter from . import views router = DefaultRouter() -# COTISATION APP +# COTISATIONS APP router.register(r'factures', views.FactureViewSet) router.register(r'ventes', views.VenteViewSet) router.register(r'articles', views.ArticleViewSet) router.register(r'banques', views.BanqueViewSet) router.register(r'paiements', views.PaiementViewSet) router.register(r'cotisations', views.CotisationViewSet) -# USER APP +# MACHINES APP +router.register(r'machines', views.MachineViewSet) +router.register(r'machinetypes', views.MachineTypeViewSet) +router.register(r'iptypes', views.IpTypeViewSet) +router.register(r'vlans', views.VlanViewSet) +router.register(r'nas', views.NasViewSet) +router.register(r'soa', views.SOAViewSet) +router.register(r'extensions', views.ExtensionViewSet) +router.register(r'mx', views.MxViewSet) +router.register(r'ns', views.NsViewSet) +router.register(r'txt', views.TxtViewSet) +router.register(r'srv', views.SrvViewSet) +router.register(r'interfaces', views.InterfaceViewSet) +router.register(r'ipv6lists', views.Ipv6ListViewSet) +router.register(r'domains', views.DomainViewSet) +router.register(r'iplists', views.IpListViewSet) +router.register(r'services', views.ServiceViewSet) +router.register(r'servicelinks', views.ServiceLinkViewSet, 'servicelink') +router.register(r'ouvertureportlists', views.OuverturePortListViewSet) +router.register(r'ouvertureports', views.OuverturePortViewSet) +# USERS APP router.register(r'users', views.UserViewSet) router.register(r'clubs', views.ClubViewSet) router.register(r'adherents', views.AdherentViewSet) diff --git a/api/views.py b/api/views.py index 29531fb8..db119ce3 100644 --- a/api/views.py +++ b/api/views.py @@ -54,29 +54,56 @@ from users.models import ( Whitelist ) from machines.models import ( - Service_link, - Service, - Interface, - Domain, + Machine, + MachineType, IpType, + Vlan, + Nas, + SOA, + Extension, Mx, Ns, Txt, Srv, - Extension, + Interface, + Ipv6List, + Domain, + IpList, + Service, + Service_link, OuverturePortList, OuverturePort ) from .serializers import ( - # COTISATION APP + # COTISATIONS APP FactureSerializer, VenteSerializer, ArticleSerializer, BanqueSerializer, PaiementSerializer, CotisationSerializer, - # USER APP + # MACHINES APP + MachineSerializer, + MachineTypeSerializer, + IpTypeSerializer, + VlanSerializer, + NasSerializer, + SOASerializer, + ExtensionSerializer, + MxSerializer, + NsSerializer, + TxtSerializer, + SrvSerializer, + InterfaceSerializer, + Ipv6ListSerializer, + DomainSerializer, + IpListSerializer, + ServiceSerializer, + ServiceLinkSerializer, + OuverturePortListSerializer, + OuverturePortSerializer, + # USERS APP UserSerializer, ClubSerializer, AdherentSerializer, @@ -89,7 +116,7 @@ from .serializers import ( ) -# COTISATION APP +# COTISATIONS APP class FactureViewSet(viewsets.ReadOnlyModelViewSet): @@ -122,6 +149,104 @@ class CotisationViewSet(viewsets.ReadOnlyModelViewSet): serializer_class = CotisationSerializer +# MACHINES APP + + +class MachineViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Machine.objects.all() + serializer_class = MachineSerializer + + +class MachineTypeViewSet(viewsets.ReadOnlyModelViewSet): + queryset = MachineType.objects.all() + serializer_class = MachineTypeSerializer + + +class IpTypeViewSet(viewsets.ReadOnlyModelViewSet): + queryset = IpType.objects.all() + serializer_class = IpTypeSerializer + + +class VlanViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Vlan.objects.all() + serializer_class = VlanSerializer + + +class NasViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Nas.objects.all() + serializer_class = NasSerializer + + +class SOAViewSet(viewsets.ReadOnlyModelViewSet): + queryset = SOA.objects.all() + serializer_class = SOASerializer + + +class ExtensionViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Extension.objects.all() + serializer_class = ExtensionSerializer + + +class MxViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Mx.objects.all() + serializer_class = MxSerializer + + +class NsViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Ns.objects.all() + serializer_class = NsSerializer + + +class TxtViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Txt.objects.all() + serializer_class = TxtSerializer + + +class SrvViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Srv.objects.all() + serializer_class = SrvSerializer + + +class InterfaceViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Interface.objects.all() + serializer_class = InterfaceSerializer + + +class Ipv6ListViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Ipv6List.objects.all() + serializer_class = Ipv6ListSerializer + + +class DomainViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Domain.objects.all() + serializer_class = DomainSerializer + + +class IpListViewSet(viewsets.ReadOnlyModelViewSet): + queryset = IpList.objects.all() + serializer_class = IpListSerializer + + +class ServiceViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Service.objects.all() + serializer_class = ServiceSerializer + + +class ServiceLinkViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Service_link.objects.all() + serializer_class = ServiceLinkSerializer + + +class OuverturePortListViewSet(viewsets.ReadOnlyModelViewSet): + queryset = OuverturePortList.objects.all() + serializer_class = OuverturePortListSerializer + + +class OuverturePortViewSet(viewsets.ReadOnlyModelViewSet): + queryset = OuverturePort.objects.all() + serializer_class = OuverturePortSerializer + + # USER APP From 2ef8930ffed75a5d0c58245023a659f16ee7fb6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Sun, 22 Apr 2018 18:28:01 +0000 Subject: [PATCH 10/49] API support for app preferences --- api/serializers.py | 104 +++++++++++++++++++++++++++++++++++++++++++++ api/urls.py | 9 ++++ api/views.py | 84 +++++++++++++++++++++++++++++++----- 3 files changed, 186 insertions(+), 11 deletions(-) diff --git a/api/serializers.py b/api/serializers.py index 90d00418..888891f0 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -53,6 +53,17 @@ from machines.models import ( OuverturePortList, OuverturePort ) +from preferences.models import ( + OptionalUser, + OptionalMachine, + OptionalTopologie, + GeneralOption, + AssoOption, + HomeOption, + MailMessageOption +) +# Avoid duplicate names +from preferences.models import Service as ServiceOption from users.models import ( User, Club, @@ -352,6 +363,99 @@ class OuverturePortSerializer(serializers.HyperlinkedModelSerializer): } +# PREFERENCES APP + + +# class OptionalUserSerializer(serializers.HyperlinkedModelSerializer): +# tel_mandatory = serializers.BooleanField(source='is_tel_mandatory') +# +# class Meta: +# model = OptionalUser +# fields = ('tel_mandatory', 'user_solde', 'solde_negatif', 'max_solde', +# 'min_online_payement', 'gpg_fingerprint', +# 'all_can_create_club', 'self_adhesion', 'shell_default', +# 'api_url') +# extra_kwargs = { +# 'shell_default': {'view_name': 'api:shell-detail'}, +# 'api_url': {'view_name': 'api:optionaluser-detail'} +# } +# +# +# class OptionalMachineSerializer(serializers.HyperlinkedModelSerializer): +# class Meta: +# model = OptionalMachine +# fields = ('password_machine', 'max_lambdauser_interfaces', +# 'max_lambdauser_aliases', 'ipv6_mode', 'create_machine', +# 'ipv6', 'api_url') +# extra_kwargs = { +# 'api_url': {'view_name': 'api:optionalmachine-detail'} +# } +# +# +# class OptionalTopologieSerializer(serializers.HyperlinkedModelSerializer): +# class Meta: +# model = OptionalTopologie +# fields = ('radius_general_policy', 'vlan_decision_ok', +# 'vlan_decision_no', 'api_url') +# extra_kwargs = { +# 'vlan_decision_ok': {'view_name': 'api:vlan-detail'}, +# 'vlan_decision_nok': {'view_name': 'api:vlan-detail'}, +# 'api_url': {'view_name': 'api:optionaltopologie-detail'} +# } +# +# +# class GeneralOptionSerializer(serializers.HyperlinkedModelSerializer): +# class Meta: +# model = GeneralOption +# fields = ('general_message', 'search_display_page', +# 'pagination_number', 'pagination_large_number', +# 'req_expire_hrs', 'site_name', 'email_from', 'GTU_sum_up', +# 'GTU', 'api_url') +# extra_kwargs = { +# 'api_url': {'view_name': 'api:generaloption-detail'} +# } +# +# +# class ServiceOptionSerializer(serializers.HyperlinkedModelSerializer): +# class Meta: +# model = ServiceOption +# fields = ('name', 'url', 'description', 'image', 'api_url') +# extra_kwargs = { +# 'api_url': {'view_name': 'api:serviceoption-detail'} +# } +# +# +# class AssoOptionSerializer(serializers.HyperlinkedModelSerializer): +# class Meta: +# model = AssoOption +# fields = ('name', 'siret', 'adresse1', 'adresse2', 'contact', +# 'telephone', 'pseudo', 'utilisateur_asso', 'payement', +# 'payement_id', 'payement_pass', 'description', 'api_url') +# extra_kwargs = { +# 'utilisateur_asso': {'view_name': 'api:user-detail'}, +# 'api_url': {'view_name': 'api:assooption-detail'} +# } +# +# +# class HomeOptionSerializer(serializers.HyperlinkedModelSerializer): +# class Meta: +# model = HomeOption +# fields = ('facebook_url', 'twitter_url', 'twitter_account_name', +# 'api_url') +# extra_kwargs = { +# 'api_url': {'view_name': 'api:homeoption-detail'} +# } +# +# +# class MailMessageOptionSerializer(serializers.HyperlinkedModelSerializer): +# class Meta: +# model = MailMessageOption +# fields = ('welcome_mail_fr', 'welcome_mail_en', 'api_url') +# extra_kwargs = { +# 'api_url': {'view_name': 'api:mailmessageoption-detail'} +# } + + # USERS APP diff --git a/api/urls.py b/api/urls.py index a712cacd..c2ba0c2a 100644 --- a/api/urls.py +++ b/api/urls.py @@ -57,6 +57,15 @@ router.register(r'services', views.ServiceViewSet) router.register(r'servicelinks', views.ServiceLinkViewSet, 'servicelink') router.register(r'ouvertureportlists', views.OuverturePortListViewSet) router.register(r'ouvertureports', views.OuverturePortViewSet) +# PREFERENCES APP +#router.register(r'optionaluser', views.OptionalUserSerializer) +#router.register(r'optionalmachine', views.OptionalMachineSerializer) +#router.register(r'optionaltopologie', views.OptionalTopologieSerializer) +#router.register(r'generaloption', views.GeneralOptionSerializer) +#router.register(r'serviceoption', views.ServiceOptionSerializer) +#router.register(r'assooption', views.AssoOptionSerializer) +#router.register(r'homeoption', views.HomeOptionSerializer) +#router.register(r'mailmessageoption', views.MailMessageOptionSerializer) # USERS APP router.register(r'users', views.UserViewSet) router.register(r'clubs', views.ClubViewSet) diff --git a/api/views.py b/api/views.py index db119ce3..f970745c 100644 --- a/api/views.py +++ b/api/views.py @@ -42,17 +42,6 @@ from cotisations.models import ( Paiement, Cotisation ) -from users.models import ( - User, - Club, - Adherent, - ServiceUser, - School, - ListRight, - ListShell, - Ban, - Whitelist -) from machines.models import ( Machine, MachineType, @@ -74,6 +63,28 @@ from machines.models import ( OuverturePortList, OuverturePort ) +# from preferences.models import ( +# OptionalUser, +# OptionalMachine, +# OptionalTopologie, +# GeneralOption, +# AssoOption, +# HomeOption, +# MailMessageOption +# ) +# # Avoid duplicate names +# from preferences.models import Service as ServiceOption +from users.models import ( + User, + Club, + Adherent, + ServiceUser, + School, + ListRight, + ListShell, + Ban, + Whitelist +) from .serializers import ( # COTISATIONS APP @@ -103,6 +114,15 @@ from .serializers import ( ServiceLinkSerializer, OuverturePortListSerializer, OuverturePortSerializer, + # PREFERENCES APP + # OptionalUserSerializer, + # OptionalMachineSerializer, + # OptionalTopologieSerializer, + # GeneralOptionSerializer, + # ServiceOptionSerializer, + # AssoOptionSerializer, + # HomeOptionSerializer, + # MailMessageOptionSerializer, # USERS APP UserSerializer, ClubSerializer, @@ -247,6 +267,48 @@ class OuverturePortViewSet(viewsets.ReadOnlyModelViewSet): serializer_class = OuverturePortSerializer +# PREFERENCES APP + +# class OptionalUserViewSet(viewsets.ReadOnlyModelViewSet): +# queryset = OptionalUser.objects.all() +# serializer_class = OptionalUserSerializer +# +# +# class OptionalMachineViewSet(viewsets.ReadOnlyModelViewSet): +# queryset = OptionalMachine.objects.all() +# serializer_class = OptionalMachineSerializer +# +# +# class OptionalTopologieViewSet(viewsets.ReadOnlyModelViewSet): +# queryset = OptionalTopologie.objects.all() +# serializer_class = OptionalTopologieSerializer +# +# +# class GeneralOptionViewSet(viewsets.ReadOnlyModelViewSet): +# queryset = GeneralOption.objects.all() +# serializer_class = GeneralOptionSerializer +# +# +# class ServiceOptionViewSet(viewsets.ReadOnlyModelViewSet): +# queryset = ServiceOption.objects.all() +# serializer_class = ServiceOptionSerializer +# +# +# class AssoOptionViewSet(viewsets.ReadOnlyModelViewSet): +# queryset = AssoOption.objects.all() +# serializer_class = AssoOptionSerializer +# +# +# class HomeOptionViewSet(viewsets.ReadOnlyModelViewSet): +# queryset = HomeOption.objects.all() +# serializer_class = HomeOptionSerializer +# +# +# class MailMessageOptionViewSet(viewsets.ReadOnlyModelViewSet): +# queryset = MailMessageOption.objects.all() +# serializer_class = MailMessageOptionSerializer + + # USER APP From 95acdb2ecd987d01e022c589b533b86c3d6057c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Tue, 24 Apr 2018 13:59:18 +0000 Subject: [PATCH 11/49] API support for app topologie --- api/serializers.py | 111 +++++++++++++++++++++++++++++++++++++++++++++ api/urls.py | 10 ++++ api/views.py | 69 ++++++++++++++++++++++++++++ 3 files changed, 190 insertions(+) diff --git a/api/serializers.py b/api/serializers.py index 888891f0..192125a7 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -64,6 +64,17 @@ from preferences.models import ( ) # Avoid duplicate names from preferences.models import Service as ServiceOption +from topologie.models import ( + Stack, + AccessPoint, + Switch, + ModelSwitch, + ConstructorSwitch, + SwitchBay, + Building, + Room +) +from topologie.models import Port as SwitchPort from users.models import ( User, Club, @@ -456,6 +467,106 @@ class OuverturePortSerializer(serializers.HyperlinkedModelSerializer): # } + +# TOPOLOGIE APP + + +class StackSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Stack + fields = ('name', 'stack_id', 'details', 'member_id_min', + 'member_id_max', 'api_url') + extra_kwargs = { + 'api_url': {'view_name': 'api:stack-detail'} + } + + +class AccessPointSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = AccessPoint + fields = ('user', 'name', 'active', 'location', 'api_url') + extra_kwargs = { + 'user': {'view_name': 'api:user-detail'}, + 'api_url': {'view_name': 'api:accesspoint-detail'} + } + + +class SwitchSerializer(serializers.HyperlinkedModelSerializer): + port_amount = serializers.IntegerField(source='number') + class Meta: + model = Switch + fields = ('port_amount', 'stack', 'stack_member_id', 'model', + 'switchbay', 'api_url') + extra_kwargs = { + 'stack': {'view_name': 'api:stack-detail'}, + 'model': {'view_name': 'api:modelswitch-detail'}, + 'switchbay': {'view_name': 'api:switchbay-detail'}, + 'api_url': {'view_name': 'api:switch-detail'} + } + + +class ModelSwitchSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = ModelSwitch + fields = ('reference', 'constructor', 'api_url') + extra_kwargs = { + 'constructor': {'view_name': 'api:constructorswitch-detail'}, + 'api_url': {'view_name': 'api:modelswitch-detail'} + } + + +class ConstructorSwitchSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = ConstructorSwitch + fields = ('name', 'api_url') + extra_kwargs = { + 'api_url': {'view_name': 'api:constructorswitch-detail'} + } + + +class SwitchBaySerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = SwitchBay + fields = ('name', 'building', 'info', 'api_url') + extra_kwargs = { + 'building': {'view_name': 'api:building-detail'}, + 'api_url': {'view_name': 'api:switchbay-detail'} + } + + +class BuildingSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Building + fields = ('name', 'api_url') + extra_kwargs = { + 'api_url': {'view_name': 'api:building-detail'} + } + + +class SwitchPortSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = SwitchPort + fields = ('switch', 'port', 'room', 'machine_interface', 'related', + 'radius', 'vlan_force', 'details', 'api_url') + extra_kwargs = { + 'switch': {'view_name': 'api:switch-detail'}, + 'room': {'view_name': 'api:room-detail'}, + 'machine_interface': {'view_name': 'api:interface-detail'}, + 'related': {'view_name': 'api:switchport-detail'}, + 'vlan_force': {'view_name': 'api:vlan-detail'}, + 'api_url': {'view_name': 'api:switchport-detail'} + } + + +class RoomSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Room + fields = ('name', 'details', 'api_url') + extra_kwargs = { + 'api_url': {'view_name': 'api:room-detail'} + } + + # USERS APP diff --git a/api/urls.py b/api/urls.py index c2ba0c2a..f01e6a3e 100644 --- a/api/urls.py +++ b/api/urls.py @@ -66,6 +66,16 @@ router.register(r'ouvertureports', views.OuverturePortViewSet) #router.register(r'assooption', views.AssoOptionSerializer) #router.register(r'homeoption', views.HomeOptionSerializer) #router.register(r'mailmessageoption', views.MailMessageOptionSerializer) +# TOPOLOGIE APP +router.register(r'stack', views.StackViewSet) +router.register(r'acesspoint', views.AccessPointViewSet) +router.register(r'switch', views.SwitchViewSet) +router.register(r'modelswitch', views.ModelSwitchViewSet) +router.register(r'constructorswitch', views.ConstructorSwitchViewSet) +router.register(r'switchbay', views.SwitchBayViewSet) +router.register(r'building', views.BuildingViewSet) +router.register(r'switchport', views.SwitchPortViewSet, 'switchport') +router.register(r'room', views.RoomViewSet) # USERS APP router.register(r'users', views.UserViewSet) router.register(r'clubs', views.ClubViewSet) diff --git a/api/views.py b/api/views.py index f970745c..34f8a947 100644 --- a/api/views.py +++ b/api/views.py @@ -74,6 +74,17 @@ from machines.models import ( # ) # # Avoid duplicate names # from preferences.models import Service as ServiceOption +from topologie.models import ( + Stack, + AccessPoint, + Switch, + ModelSwitch, + ConstructorSwitch, + SwitchBay, + Building, + Room +) +from topologie.models import Port as SwitchPort from users.models import ( User, Club, @@ -123,6 +134,16 @@ from .serializers import ( # AssoOptionSerializer, # HomeOptionSerializer, # MailMessageOptionSerializer, + # TOPOLOGIE APP + StackSerializer, + AccessPointSerializer, + SwitchSerializer, + ModelSwitchSerializer, + ConstructorSwitchSerializer, + SwitchBaySerializer, + BuildingSerializer, + SwitchPortSerializer, + RoomSerializer, # USERS APP UserSerializer, ClubSerializer, @@ -309,6 +330,54 @@ class OuverturePortViewSet(viewsets.ReadOnlyModelViewSet): # serializer_class = MailMessageOptionSerializer +# TOPOLOGIE APP + + +class StackViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Stack.objects.all() + serializer_class = StackSerializer + + +class AccessPointViewSet(viewsets.ReadOnlyModelViewSet): + queryset = AccessPoint.objects.all() + serializer_class = AccessPointSerializer + + +class SwitchViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Switch.objects.all() + serializer_class = SwitchSerializer + + +class ModelSwitchViewSet(viewsets.ReadOnlyModelViewSet): + queryset = ModelSwitch.objects.all() + serializer_class = ModelSwitchSerializer + + +class ConstructorSwitchViewSet(viewsets.ReadOnlyModelViewSet): + queryset = ConstructorSwitch.objects.all() + serializer_class = ConstructorSwitchSerializer + + +class SwitchBayViewSet(viewsets.ReadOnlyModelViewSet): + queryset = SwitchBay.objects.all() + serializer_class = SwitchBaySerializer + + +class BuildingViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Building.objects.all() + serializer_class = BuildingSerializer + + +class SwitchPortViewSet(viewsets.ReadOnlyModelViewSet): + queryset = SwitchPort.objects.all() + serializer_class = SwitchPortSerializer + + +class RoomViewSet(viewsets.ReadOnlyModelViewSet): + queryset = Room.objects.all() + serializer_class = RoomSerializer + + # USER APP From 187138f6e3287b8fd8a918363102afa9ccb5750f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Tue, 24 Apr 2018 15:57:55 +0000 Subject: [PATCH 12/49] API cleanup code --- api/serializers.py | 519 ++++++++++++--------------------------------- api/views.py | 331 ++++++++++------------------- 2 files changed, 244 insertions(+), 606 deletions(-) diff --git a/api/serializers.py b/api/serializers.py index 192125a7..eab81940 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -24,666 +24,419 @@ Serializers for the API app from rest_framework import serializers -from cotisations.models import ( - Facture, - Vente, - Article, - Banque, - Paiement, - Cotisation -) -from machines.models import ( - Machine, - MachineType, - IpType, - Vlan, - Nas, - SOA, - Extension, - Mx, - Ns, - Txt, - Srv, - Interface, - Ipv6List, - Domain, - IpList, - Service, - Service_link, - OuverturePortList, - OuverturePort -) -from preferences.models import ( - OptionalUser, - OptionalMachine, - OptionalTopologie, - GeneralOption, - AssoOption, - HomeOption, - MailMessageOption -) -# Avoid duplicate names -from preferences.models import Service as ServiceOption -from topologie.models import ( - Stack, - AccessPoint, - Switch, - ModelSwitch, - ConstructorSwitch, - SwitchBay, - Building, - Room -) -from topologie.models import Port as SwitchPort -from users.models import ( - User, - Club, - Adherent, - ServiceUser, - School, - ListRight, - ListShell, - Ban, - Whitelist -) +import cotisations.models as cotisations +import machines.models as machines +import preferences.models as preferences +import topologie.models as topologie +import users.models as users + + +API_NAMESPACE = 'api' + + +class NamespacedHRField(serializers.HyperlinkedRelatedField): + """ A HyperlinkedRelatedField subclass to automatically prefix + view names with a namespace """ + def __init__(self, view_name=None, **kwargs): + if view_name is not None: + view_name = '%s:%s' % (API_NAMESPACE, view_name) + super(NamespacedHRField, self).__init__(view_name=view_name, **kwargs) + + +class NamespacedHIField(serializers.HyperlinkedIdentityField): + """ A HyperlinkedIdentityField subclass to automatically prefix + view names with a namespace """ + def __init__(self, view_name=None, **kwargs): + if view_name is not None: + view_name = '%s:%s' % (API_NAMESPACE, view_name) + super(NamespacedHIField, self).__init__(view_name=view_name, **kwargs) + + +class NamespacedHMSerializer(serializers.HyperlinkedModelSerializer): + """ A HyperlinkedModelSerializer subclass to use `NamespacedHRField` as + field and automatically prefix view names with a namespace """ + serializer_related_field = NamespacedHRField + serializer_url_field = NamespacedHIField # COTISATIONS APP -class FactureSerializer(serializers.HyperlinkedModelSerializer): + +class FactureSerializer(NamespacedHMSerializer): class Meta: - model = Facture + model = cotisations.Facture fields = ('user', 'paiement', 'banque', 'cheque', 'date', 'valid', 'control', 'prix_total', 'name', 'api_url') - extra_kwargs = { - 'user': {'view_name': 'api:user-detail'}, - 'paiement': {'view_name': 'api:paiement-detail'}, - 'banque': {'view_name': 'api:banque-detail'}, - 'api_url': {'view_name': 'api:facture-detail'} - } -class VenteSerializer(serializers.HyperlinkedModelSerializer): +class VenteSerializer(NamespacedHMSerializer): class Meta: - model = Vente + model = cotisations.Vente fields = ('facture', 'number', 'name', 'prix', 'duration', 'type_cotisation', 'prix_total', 'api_url') - extra_kwargs = { - 'facture': {'view_name': 'api:facture-detail'}, - 'api_url': {'view_name': 'api:vente-detail'} - } -class ArticleSerializer(serializers.HyperlinkedModelSerializer): +class ArticleSerializer(NamespacedHMSerializer): class Meta: - model = Article + model = cotisations.Article fields = ('name', 'prix', 'duration', 'type_user', 'type_cotisation', 'api_url') - extra_kwargs = { - 'api_url': {'view_name': 'api:article-detail'} - } -class BanqueSerializer(serializers.HyperlinkedModelSerializer): +class BanqueSerializer(NamespacedHMSerializer): class Meta: - model = Banque + model = cotisations.Banque fields = ('name', 'api_url') - extra_kwargs = { - 'api_url': {'view_name': 'api:banque-detail'} - } -class PaiementSerializer(serializers.HyperlinkedModelSerializer): +class PaiementSerializer(NamespacedHMSerializer): class Meta: - model = Paiement + model = cotisations.Paiement fields = ('moyen', 'type_paiement', 'api_url') - extra_kwargs = { - 'api_url': {'view_name': 'api:paiement-detail'} - } -class CotisationSerializer(serializers.HyperlinkedModelSerializer): +class CotisationSerializer(NamespacedHMSerializer): class Meta: - model = Cotisation + model = cotisations.Cotisation fields = ('vente', 'type_cotisation', 'date_start', 'date_end', 'api_url') - extra_kwargs = { - 'vente': {'view_name': 'api:vente-detail'}, - 'api_url': {'view_name': 'api:cotisation-detail'} - } # MACHINES APP -class MachineSerializer(serializers.HyperlinkedModelSerializer): +class MachineSerializer(NamespacedHMSerializer): class Meta: - model = Machine + model = machines.Machine fields = ('user', 'name', 'active', 'api_url') - extra_kwargs = { - 'user': {'view_name': 'api:user-detail'}, - 'api_url': {'view_name': 'api:machine-detail'} - } -class MachineTypeSerializer(serializers.HyperlinkedModelSerializer): +class MachineTypeSerializer(NamespacedHMSerializer): class Meta: - model = MachineType + model = machines.MachineType fields = ('type', 'ip_type', 'api_url') - extra_kwargs = { - 'ip_type': {'view_name': 'api:iptype-detail'}, - 'api_url': {'view_name': 'api:machinetype-detail'} - } -class IpTypeSerializer(serializers.HyperlinkedModelSerializer): +class IpTypeSerializer(NamespacedHMSerializer): class Meta: - model = IpType + model = machines.IpType fields = ('type', 'extension', 'need_infra', 'domaine_ip_start', 'domaine_ip_stop', 'prefix_v6', 'vlan', 'ouverture_ports', 'api_url') - extra_kwargs = { - 'extension': {'view_name': 'api:extension-detail'}, - 'vlan': {'view_name': 'api:vlan-detail'}, - 'ouverture_ports': {'view_name': 'api:ouvertureportlist-detail'}, - 'api_url': {'view_name': 'api:iptype-detail'} - } -class VlanSerializer(serializers.HyperlinkedModelSerializer): +class VlanSerializer(NamespacedHMSerializer): class Meta: - model = Vlan + model = machines.Vlan fields = ('vlan_id', 'name', 'comment', 'api_url') - extra_kwargs = { - 'api_url': {'view_name': 'api:vlan-detail'} - } -class NasSerializer(serializers.HyperlinkedModelSerializer): +class NasSerializer(NamespacedHMSerializer): class Meta: - model = Nas + model = machines.Nas fields = ('name', 'nas_type', 'machine_type', 'port_access_mode', 'autocapture_mac', 'api_url') - extra_kwargs = { - 'nas_type': {'view_name': 'api:machinetype-detail'}, - 'machine_type': {'view_name': 'api:machinetype-detail'}, - 'api_url': {'view_name': 'api:nas-detail'} - } -class SOASerializer(serializers.HyperlinkedModelSerializer): +class SOASerializer(NamespacedHMSerializer): class Meta: - model = SOA + model = machines.SOA fields = ('name', 'mail', 'refresh', 'retry', 'expire', 'ttl', 'api_url') - extra_kwargs = { - 'api_url': {'view_name': 'api:soa-detail'} - } -class ExtensionSerializer(serializers.HyperlinkedModelSerializer): +class ExtensionSerializer(NamespacedHMSerializer): class Meta: - model = Extension + model = machines.Extension fields = ('name', 'need_infra', 'origin', 'origin_v6', 'soa', 'api_url') - extra_kwargs = { - 'origin': {'view_name': 'api:iplist-detail'}, - 'soa': {'view_name': 'api:soa-detail'}, - 'api_url': {'view_name': 'api:extension-detail'} - } -class MxSerializer(serializers.HyperlinkedModelSerializer): +class MxSerializer(NamespacedHMSerializer): class Meta: - model = Mx + model = machines.Mx fields = ('zone', 'priority', 'name', 'api_url') - extra_kwargs = { - 'zone': {'view_name': 'api:extension-detail'}, - 'name': {'view_name': 'api:domain-detail'}, - 'api_url': {'view_name': 'api:mx-detail'} - } -class NsSerializer(serializers.HyperlinkedModelSerializer): +class NsSerializer(NamespacedHMSerializer): class Meta: - model = Ns + model = machines.Ns fields = ('zone', 'ns', 'api_url') - extra_kwargs = { - 'zone': {'view_name': 'api:extension-detail'}, - 'ns': {'view_name': 'api:domain-detail'}, - 'api_url': {'view_name': 'api:ns-detail'} - } -class TxtSerializer(serializers.HyperlinkedModelSerializer): +class TxtSerializer(NamespacedHMSerializer): class Meta: - model = Txt + model = machines.Txt fields = ('zone', 'field1', 'field2', 'api_url') - extra_kwargs = { - 'zone': {'view_name': 'api:extension-detail'}, - 'api_url': {'view_name': 'api:txt-detail'} - } -class SrvSerializer(serializers.HyperlinkedModelSerializer): +class SrvSerializer(NamespacedHMSerializer): class Meta: - model = Srv + model = machines.Srv fields = ('service', 'protocole', 'extension', 'ttl', 'priority', 'weight', 'port', 'target', 'api_url') - extra_kwargs = { - 'extension': {'view_name': 'api:extension-detail'}, - 'target': {'view_name': 'api:domain-detail'}, - 'api_url': {'view_name': 'api:mx-detail'} - } -class InterfaceSerializer(serializers.HyperlinkedModelSerializer): +class InterfaceSerializer(NamespacedHMSerializer): active = serializers.BooleanField(source='is_active') class Meta: - model = Interface + model = machines.Interface fields = ('ipv4', 'mac_address', 'machine', 'type', 'details', 'port_lists', 'active', 'api_url') - extra_kwargs = { - 'ipv4': {'view_name': 'api:iplist-detail'}, - 'machine': {'view_name': 'api:machine-detail'}, - 'type': {'view_name': 'api:machinetype-detail'}, - 'port_lists': {'view_name': 'api:ouvertureportlist-detail'}, - 'api_url': {'view_name': 'api:interface-detail'} - } -class Ipv6ListSerializer(serializers.HyperlinkedModelSerializer): +class Ipv6ListSerializer(NamespacedHMSerializer): class Meta: - model = Ipv6List + model = machines.Ipv6List fields = ('ipv6', 'interface', 'slaac_ip', 'date_end', 'api_url') - extra_kwargs = { - 'interface': {'view_name': 'api:interface-detail'}, - 'api_url': {'view_name': 'api:ipv6list-detail'} - } -class DomainSerializer(serializers.HyperlinkedModelSerializer): +class DomainSerializer(NamespacedHMSerializer): class Meta: - model = Domain + model = machines.Domain fields = ('interface_parent', 'name', 'extension', 'cname', 'api_url') - extra_kwargs = { - 'interface_parent': {'view_name': 'api:interface-detail'}, - 'extension': {'view_name': 'api:extension-detail'}, - 'cname': {'view_name': 'api:domain-detail'}, - 'api_url': {'view_name': 'api:domain-detail'} - } -class IpListSerializer(serializers.HyperlinkedModelSerializer): +class IpListSerializer(NamespacedHMSerializer): class Meta: - model = IpList + model = machines.IpList fields = ('ipv4', 'ip_type', 'need_infra', 'api_url') - extra_kwargs = { - 'ip_type': {'view_name': 'api:iptype-detail'}, - 'api_url': {'view_name': 'api:iplist-detail'} - } -class ServiceSerializer(serializers.HyperlinkedModelSerializer): +class ServiceSerializer(NamespacedHMSerializer): class Meta: - model = Service + model = machines.Service fields = ('service_type', 'min_time_regen', 'regular_time_regen', 'servers', 'api_url') - extra_kwargs = { - 'servers': {'view_name': 'api:interface-detail'}, - 'api_url': {'view_name': 'api:service-detail'} - } -class ServiceLinkSerializer(serializers.HyperlinkedModelSerializer): +class ServiceLinkSerializer(NamespacedHMSerializer): class Meta: - model = Service_link + model = machines.Service_link fields = ('service', 'server', 'last_regen', 'asked_regen', 'need_regen', 'api_url') - extra_kwargs = { - 'service': {'view_name': 'api:service-detail'}, - 'server': {'view_name': 'api:interface-detail'}, - 'api_url': {'view_name': 'api:servicelink-detail'} - } -class OuverturePortListSerializer(serializers.HyperlinkedModelSerializer): +class OuverturePortListSerializer(NamespacedHMSerializer): class Meta: - model = OuverturePortList + model = machines.OuverturePortList fields = ('name', 'tcp_ports_in', 'udp_ports_in', 'tcp_ports_out', 'udp_ports_out', 'api_url') - extra_kwargs = { - 'tcp_ports_in': {'view_name': 'api:ouvertureport-detail'}, - 'udp_ports_in': {'view_name': 'api:ouvertureport-detail'}, - 'tcp_ports_out': {'view_name': 'api:ouvertureport-detail'}, - 'udp_ports_out': {'view_name': 'api:ouvertureport-detail'}, - 'api_url': {'view_name': 'api:ouvertureportlist-detail'} - } -class OuverturePortSerializer(serializers.HyperlinkedModelSerializer): +class OuverturePortSerializer(NamespacedHMSerializer): class Meta: - model = OuverturePort + model = machines.OuverturePort fields = ('begin', 'end', 'port_list', 'protocole', 'io', 'api_url') - extra_kwargs = { - 'port_list': {'view_name': 'api:ouvertureportlist-detail'}, - 'api_url': {'view_name': 'api:ouvertureport-detail'} - } # PREFERENCES APP -# class OptionalUserSerializer(serializers.HyperlinkedModelSerializer): +# class OptionalUserSerializer(NamespacedHMSerializer): # tel_mandatory = serializers.BooleanField(source='is_tel_mandatory') # # class Meta: -# model = OptionalUser +# model = preferences.OptionalUser # fields = ('tel_mandatory', 'user_solde', 'solde_negatif', 'max_solde', # 'min_online_payement', 'gpg_fingerprint', # 'all_can_create_club', 'self_adhesion', 'shell_default', # 'api_url') -# extra_kwargs = { -# 'shell_default': {'view_name': 'api:shell-detail'}, -# 'api_url': {'view_name': 'api:optionaluser-detail'} -# } # # -# class OptionalMachineSerializer(serializers.HyperlinkedModelSerializer): +# class OptionalMachineSerializer(NamespacedHMSerializer): # class Meta: -# model = OptionalMachine +# model = preferences.OptionalMachine # fields = ('password_machine', 'max_lambdauser_interfaces', # 'max_lambdauser_aliases', 'ipv6_mode', 'create_machine', # 'ipv6', 'api_url') -# extra_kwargs = { -# 'api_url': {'view_name': 'api:optionalmachine-detail'} -# } # # -# class OptionalTopologieSerializer(serializers.HyperlinkedModelSerializer): +# class OptionalTopologieSerializer(NamespacedHMSerializer): # class Meta: -# model = OptionalTopologie +# model = preferences.OptionalTopologie # fields = ('radius_general_policy', 'vlan_decision_ok', # 'vlan_decision_no', 'api_url') -# extra_kwargs = { -# 'vlan_decision_ok': {'view_name': 'api:vlan-detail'}, -# 'vlan_decision_nok': {'view_name': 'api:vlan-detail'}, -# 'api_url': {'view_name': 'api:optionaltopologie-detail'} -# } # # -# class GeneralOptionSerializer(serializers.HyperlinkedModelSerializer): +# class GeneralOptionSerializer(NamespacedHMSerializer): # class Meta: -# model = GeneralOption +# model = preferences.GeneralOption # fields = ('general_message', 'search_display_page', # 'pagination_number', 'pagination_large_number', # 'req_expire_hrs', 'site_name', 'email_from', 'GTU_sum_up', # 'GTU', 'api_url') -# extra_kwargs = { -# 'api_url': {'view_name': 'api:generaloption-detail'} -# } # # -# class ServiceOptionSerializer(serializers.HyperlinkedModelSerializer): +# class ServiceOptionSerializer(NamespacedHMSerializer): # class Meta: -# model = ServiceOption +# model = preferences.ServiceOption # fields = ('name', 'url', 'description', 'image', 'api_url') -# extra_kwargs = { -# 'api_url': {'view_name': 'api:serviceoption-detail'} -# } # # -# class AssoOptionSerializer(serializers.HyperlinkedModelSerializer): +# class AssoOptionSerializer(NamespacedHMSerializer): # class Meta: -# model = AssoOption +# model = preferences.AssoOption # fields = ('name', 'siret', 'adresse1', 'adresse2', 'contact', # 'telephone', 'pseudo', 'utilisateur_asso', 'payement', # 'payement_id', 'payement_pass', 'description', 'api_url') -# extra_kwargs = { -# 'utilisateur_asso': {'view_name': 'api:user-detail'}, -# 'api_url': {'view_name': 'api:assooption-detail'} -# } # # -# class HomeOptionSerializer(serializers.HyperlinkedModelSerializer): +# class HomeOptionSerializer(NamespacedHMSerializer): # class Meta: -# model = HomeOption +# model = preferences.HomeOption # fields = ('facebook_url', 'twitter_url', 'twitter_account_name', # 'api_url') -# extra_kwargs = { -# 'api_url': {'view_name': 'api:homeoption-detail'} -# } # # -# class MailMessageOptionSerializer(serializers.HyperlinkedModelSerializer): +# class MailMessageOptionSerializer(NamespacedHMSerializer): # class Meta: -# model = MailMessageOption +# model = preferences.MailMessageOption # fields = ('welcome_mail_fr', 'welcome_mail_en', 'api_url') -# extra_kwargs = { -# 'api_url': {'view_name': 'api:mailmessageoption-detail'} -# } # TOPOLOGIE APP -class StackSerializer(serializers.HyperlinkedModelSerializer): +class StackSerializer(NamespacedHMSerializer): class Meta: - model = Stack + model = topologie.Stack fields = ('name', 'stack_id', 'details', 'member_id_min', 'member_id_max', 'api_url') - extra_kwargs = { - 'api_url': {'view_name': 'api:stack-detail'} - } -class AccessPointSerializer(serializers.HyperlinkedModelSerializer): +class AccessPointSerializer(NamespacedHMSerializer): class Meta: - model = AccessPoint + model = topologie.AccessPoint fields = ('user', 'name', 'active', 'location', 'api_url') - extra_kwargs = { - 'user': {'view_name': 'api:user-detail'}, - 'api_url': {'view_name': 'api:accesspoint-detail'} - } -class SwitchSerializer(serializers.HyperlinkedModelSerializer): +class SwitchSerializer(NamespacedHMSerializer): port_amount = serializers.IntegerField(source='number') class Meta: - model = Switch + model = topologie.Switch fields = ('port_amount', 'stack', 'stack_member_id', 'model', 'switchbay', 'api_url') - extra_kwargs = { - 'stack': {'view_name': 'api:stack-detail'}, - 'model': {'view_name': 'api:modelswitch-detail'}, - 'switchbay': {'view_name': 'api:switchbay-detail'}, - 'api_url': {'view_name': 'api:switch-detail'} - } -class ModelSwitchSerializer(serializers.HyperlinkedModelSerializer): +class ModelSwitchSerializer(NamespacedHMSerializer): class Meta: - model = ModelSwitch + model = topologie.ModelSwitch fields = ('reference', 'constructor', 'api_url') - extra_kwargs = { - 'constructor': {'view_name': 'api:constructorswitch-detail'}, - 'api_url': {'view_name': 'api:modelswitch-detail'} - } -class ConstructorSwitchSerializer(serializers.HyperlinkedModelSerializer): +class ConstructorSwitchSerializer(NamespacedHMSerializer): class Meta: - model = ConstructorSwitch + model = topologie.ConstructorSwitch fields = ('name', 'api_url') - extra_kwargs = { - 'api_url': {'view_name': 'api:constructorswitch-detail'} - } -class SwitchBaySerializer(serializers.HyperlinkedModelSerializer): +class SwitchBaySerializer(NamespacedHMSerializer): class Meta: - model = SwitchBay + model = topologie.SwitchBay fields = ('name', 'building', 'info', 'api_url') - extra_kwargs = { - 'building': {'view_name': 'api:building-detail'}, - 'api_url': {'view_name': 'api:switchbay-detail'} - } -class BuildingSerializer(serializers.HyperlinkedModelSerializer): +class BuildingSerializer(NamespacedHMSerializer): class Meta: - model = Building + model = topologie.Building fields = ('name', 'api_url') - extra_kwargs = { - 'api_url': {'view_name': 'api:building-detail'} - } -class SwitchPortSerializer(serializers.HyperlinkedModelSerializer): +class SwitchPortSerializer(NamespacedHMSerializer): class Meta: - model = SwitchPort + model = topologie.Port fields = ('switch', 'port', 'room', 'machine_interface', 'related', 'radius', 'vlan_force', 'details', 'api_url') - extra_kwargs = { - 'switch': {'view_name': 'api:switch-detail'}, - 'room': {'view_name': 'api:room-detail'}, - 'machine_interface': {'view_name': 'api:interface-detail'}, - 'related': {'view_name': 'api:switchport-detail'}, - 'vlan_force': {'view_name': 'api:vlan-detail'}, - 'api_url': {'view_name': 'api:switchport-detail'} - } -class RoomSerializer(serializers.HyperlinkedModelSerializer): +class RoomSerializer(NamespacedHMSerializer): class Meta: - model = Room + model = topologie.Room fields = ('name', 'details', 'api_url') - extra_kwargs = { - 'api_url': {'view_name': 'api:room-detail'} - } # USERS APP -class UserSerializer(serializers.HyperlinkedModelSerializer): +class UserSerializer(NamespacedHMSerializer): access = serializers.BooleanField(source='has_access') uid = serializers.IntegerField(source='uid_number') class Meta: - model = User + model = users.User fields = ('name', 'pseudo', 'email', 'school', 'shell', 'comment', 'state', 'registered', 'telephone', 'solde', #'room', 'access', 'end_access', 'uid', 'class_name', 'api_url') - extra_kwargs = { - 'school': {'view_name': 'api:school-detail'}, - 'shell': {'view_name': 'api:shell-detail'}, - #'room': {'view_name': 'api:room-detail'}, - 'api_url': {'view_name': 'api:user-detail'} - } -class ClubSerializer(serializers.HyperlinkedModelSerializer): +class ClubSerializer(NamespacedHMSerializer): name = serializers.CharField(source='surname') access = serializers.BooleanField(source='has_access') uid = serializers.IntegerField(source='uid_number') class Meta: - model = Club + model = users.Club fields = ('name', 'pseudo', 'email', 'school', 'shell', 'comment', 'state', 'registered', 'telephone', 'solde', #'room', 'access', 'end_access', 'administrators', 'members', 'mailing', 'uid', 'api_url') - extra_kwargs = { - 'school': {'view_name': 'api:school-detail'}, - 'shell': {'view_name': 'api:shell-detail'}, - #'room': {'view_name': 'api:room-detail'}, - 'administrators': {'view_name': 'api:adherent-detail'}, - 'members': {'view_name': 'api:adherent-detail'}, - 'api_url': {'view_name': 'api:club-detail'} - } -class AdherentSerializer(serializers.HyperlinkedModelSerializer): +class AdherentSerializer(NamespacedHMSerializer): access = serializers.BooleanField(source='has_access') uid = serializers.IntegerField(source='uid_number') class Meta: - model = Adherent + model = users.Adherent fields = ('name', 'surname', 'pseudo', 'email', 'school', 'shell', 'comment', 'state', 'registered', 'telephone', #'room', 'solde', 'access', 'end_access', 'uid', 'api_url') - extra_kwargs = { - 'school': {'view_name': 'api:school-detail'}, - 'shell': {'view_name': 'api:shell-detail'}, - #'room': {'view_name': 'api:room-detail'}, - 'api_url': {'view_name': 'api:adherent-detail'} - } -class ServiceUserSerializer(serializers.HyperlinkedModelSerializer): +class ServiceUserSerializer(NamespacedHMSerializer): class Meta: - model = ServiceUser + model = users.ServiceUser fields = ('pseudo', 'access_group', 'comment', 'api_url') - extra_kwargs = { - 'api_url': {'view_name': 'api:serviceuser-detail'} - } -class SchoolSerializer(serializers.HyperlinkedModelSerializer): +class SchoolSerializer(NamespacedHMSerializer): class Meta: - model = School + model = users.School fields = ('name', 'api_url') - extra_kwargs = { - 'api_url': {'view_name': 'api:school-detail'} - } -class ListRightSerializer(serializers.HyperlinkedModelSerializer): +class ListRightSerializer(NamespacedHMSerializer): class Meta: - model = ListRight + model = users.ListRight fields = ('unix_name', 'gid', 'critical', 'details', 'api_url') - extra_kwargs = { - 'api_url': {'view_name': 'api:listright-detail'} - } -class ShellSerializer(serializers.HyperlinkedModelSerializer): +class ShellSerializer(NamespacedHMSerializer): class Meta: - model = ListShell + model = users.ListShell fields = ('shell', 'api_url') - extra_kwargs = { - 'api_url': {'view_name': 'api:shell-detail'} - } -class BanSerializer(serializers.HyperlinkedModelSerializer): +class BanSerializer(NamespacedHMSerializer): active = serializers.BooleanField(source='is_active') class Meta: - model = Ban + model = users.Ban fields = ('user', 'raison', 'date_start', 'date_end', 'state', 'active', 'api_url') - extra_kwargs = { - 'user': {'view_name': 'api:user-detail'}, - 'api_url': {'view_name': 'api:ban-detail'} - } -class WhitelistSerializer(serializers.HyperlinkedModelSerializer): +class WhitelistSerializer(NamespacedHMSerializer): active = serializers.BooleanField(source='is_active') class Meta: - model = Whitelist + model = users.Whitelist fields = ('user', 'raison', 'date_start', 'date_end', 'active', 'api_url') - extra_kwargs = { - 'user': {'view_name': 'api:user-detail'}, - 'api_url': {'view_name': 'api:whitelist-detail'} - } diff --git a/api/views.py b/api/views.py index 34f8a947..439ede8b 100644 --- a/api/views.py +++ b/api/views.py @@ -33,397 +33,282 @@ from rest_framework.authtoken.models import Token from rest_framework.response import Response from rest_framework import viewsets, status +import cotisations.models as cotisations +import machines.models as machines +import preferences.models as preferences +import topologie.models as topologie +import users.models as users -from cotisations.models import ( - Facture, - Vente, - Article, - Banque, - Paiement, - Cotisation -) -from machines.models import ( - Machine, - MachineType, - IpType, - Vlan, - Nas, - SOA, - Extension, - Mx, - Ns, - Txt, - Srv, - Interface, - Ipv6List, - Domain, - IpList, - Service, - Service_link, - OuverturePortList, - OuverturePort -) -# from preferences.models import ( -# OptionalUser, -# OptionalMachine, -# OptionalTopologie, -# GeneralOption, -# AssoOption, -# HomeOption, -# MailMessageOption -# ) -# # Avoid duplicate names -# from preferences.models import Service as ServiceOption -from topologie.models import ( - Stack, - AccessPoint, - Switch, - ModelSwitch, - ConstructorSwitch, - SwitchBay, - Building, - Room -) -from topologie.models import Port as SwitchPort -from users.models import ( - User, - Club, - Adherent, - ServiceUser, - School, - ListRight, - ListShell, - Ban, - Whitelist -) - -from .serializers import ( - # COTISATIONS APP - FactureSerializer, - VenteSerializer, - ArticleSerializer, - BanqueSerializer, - PaiementSerializer, - CotisationSerializer, - # MACHINES APP - MachineSerializer, - MachineTypeSerializer, - IpTypeSerializer, - VlanSerializer, - NasSerializer, - SOASerializer, - ExtensionSerializer, - MxSerializer, - NsSerializer, - TxtSerializer, - SrvSerializer, - InterfaceSerializer, - Ipv6ListSerializer, - DomainSerializer, - IpListSerializer, - ServiceSerializer, - ServiceLinkSerializer, - OuverturePortListSerializer, - OuverturePortSerializer, - # PREFERENCES APP - # OptionalUserSerializer, - # OptionalMachineSerializer, - # OptionalTopologieSerializer, - # GeneralOptionSerializer, - # ServiceOptionSerializer, - # AssoOptionSerializer, - # HomeOptionSerializer, - # MailMessageOptionSerializer, - # TOPOLOGIE APP - StackSerializer, - AccessPointSerializer, - SwitchSerializer, - ModelSwitchSerializer, - ConstructorSwitchSerializer, - SwitchBaySerializer, - BuildingSerializer, - SwitchPortSerializer, - RoomSerializer, - # USERS APP - UserSerializer, - ClubSerializer, - AdherentSerializer, - ServiceUserSerializer, - SchoolSerializer, - ListRightSerializer, - ShellSerializer, - BanSerializer, - WhitelistSerializer -) +from . import serializers # COTISATIONS APP class FactureViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Facture.objects.all() - serializer_class = FactureSerializer + queryset = cotisations.Facture.objects.all() + serializer_class = serializers.FactureSerializer class VenteViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Vente.objects.all() - serializer_class = VenteSerializer + queryset = cotisations.Vente.objects.all() + serializer_class = serializers.VenteSerializer class ArticleViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Article.objects.all() - serializer_class = ArticleSerializer + queryset = cotisations.Article.objects.all() + serializer_class = serializers.ArticleSerializer class BanqueViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Banque.objects.all() - serializer_class = BanqueSerializer + queryset = cotisations.Banque.objects.all() + serializer_class = serializers.BanqueSerializer class PaiementViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Paiement.objects.all() - serializer_class = PaiementSerializer + queryset = cotisations.Paiement.objects.all() + serializer_class = serializers.PaiementSerializer class CotisationViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Cotisation.objects.all() - serializer_class = CotisationSerializer + queryset = cotisations.Cotisation.objects.all() + serializer_class = serializers.CotisationSerializer # MACHINES APP class MachineViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Machine.objects.all() - serializer_class = MachineSerializer + queryset = machines.Machine.objects.all() + serializer_class = serializers.MachineSerializer class MachineTypeViewSet(viewsets.ReadOnlyModelViewSet): - queryset = MachineType.objects.all() - serializer_class = MachineTypeSerializer + queryset = machines.MachineType.objects.all() + serializer_class = serializers.MachineTypeSerializer class IpTypeViewSet(viewsets.ReadOnlyModelViewSet): - queryset = IpType.objects.all() - serializer_class = IpTypeSerializer + queryset = machines.IpType.objects.all() + serializer_class = serializers.IpTypeSerializer class VlanViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Vlan.objects.all() - serializer_class = VlanSerializer + queryset = machines.Vlan.objects.all() + serializer_class = serializers.VlanSerializer class NasViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Nas.objects.all() - serializer_class = NasSerializer + queryset = machines.Nas.objects.all() + serializer_class = serializers.NasSerializer class SOAViewSet(viewsets.ReadOnlyModelViewSet): - queryset = SOA.objects.all() - serializer_class = SOASerializer + queryset = machines.SOA.objects.all() + serializer_class = serializers.SOASerializer class ExtensionViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Extension.objects.all() - serializer_class = ExtensionSerializer + queryset = machines.Extension.objects.all() + serializer_class = serializers.ExtensionSerializer class MxViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Mx.objects.all() - serializer_class = MxSerializer + queryset = machines.Mx.objects.all() + serializer_class = serializers.MxSerializer class NsViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Ns.objects.all() - serializer_class = NsSerializer + queryset = machines.Ns.objects.all() + serializer_class = serializers.NsSerializer class TxtViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Txt.objects.all() - serializer_class = TxtSerializer + queryset = machines.Txt.objects.all() + serializer_class = serializers.TxtSerializer class SrvViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Srv.objects.all() - serializer_class = SrvSerializer + queryset = machines.Srv.objects.all() + serializer_class = serializers.SrvSerializer class InterfaceViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Interface.objects.all() - serializer_class = InterfaceSerializer + queryset = machines.Interface.objects.all() + serializer_class = serializers.InterfaceSerializer class Ipv6ListViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Ipv6List.objects.all() - serializer_class = Ipv6ListSerializer + queryset = machines.Ipv6List.objects.all() + serializer_class = serializers.Ipv6ListSerializer class DomainViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Domain.objects.all() - serializer_class = DomainSerializer + queryset = machines.Domain.objects.all() + serializer_class = serializers.DomainSerializer class IpListViewSet(viewsets.ReadOnlyModelViewSet): - queryset = IpList.objects.all() - serializer_class = IpListSerializer + queryset = machines.IpList.objects.all() + serializer_class = serializers.IpListSerializer class ServiceViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Service.objects.all() - serializer_class = ServiceSerializer + queryset = machines.Service.objects.all() + serializer_class = serializers.ServiceSerializer class ServiceLinkViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Service_link.objects.all() - serializer_class = ServiceLinkSerializer + queryset = machines.Service_link.objects.all() + serializer_class = serializers.ServiceLinkSerializer class OuverturePortListViewSet(viewsets.ReadOnlyModelViewSet): - queryset = OuverturePortList.objects.all() - serializer_class = OuverturePortListSerializer + queryset = machines.OuverturePortList.objects.all() + serializer_class = serializers.OuverturePortListSerializer class OuverturePortViewSet(viewsets.ReadOnlyModelViewSet): - queryset = OuverturePort.objects.all() - serializer_class = OuverturePortSerializer + queryset = machines.OuverturePort.objects.all() + serializer_class = serializers.OuverturePortSerializer # PREFERENCES APP # class OptionalUserViewSet(viewsets.ReadOnlyModelViewSet): -# queryset = OptionalUser.objects.all() -# serializer_class = OptionalUserSerializer +# queryset = preferences.OptionalUser.objects.all() +# serializer_class = serializers.OptionalUserSerializer # # # class OptionalMachineViewSet(viewsets.ReadOnlyModelViewSet): -# queryset = OptionalMachine.objects.all() -# serializer_class = OptionalMachineSerializer +# queryset = preferences.OptionalMachine.objects.all() +# serializer_class = serializers.OptionalMachineSerializer # # # class OptionalTopologieViewSet(viewsets.ReadOnlyModelViewSet): -# queryset = OptionalTopologie.objects.all() -# serializer_class = OptionalTopologieSerializer +# queryset = preferences.OptionalTopologie.objects.all() +# serializer_class = serializers.OptionalTopologieSerializer # # # class GeneralOptionViewSet(viewsets.ReadOnlyModelViewSet): -# queryset = GeneralOption.objects.all() -# serializer_class = GeneralOptionSerializer +# queryset = preferences.GeneralOption.objects.all() +# serializer_class = serializers.GeneralOptionSerializer # # # class ServiceOptionViewSet(viewsets.ReadOnlyModelViewSet): -# queryset = ServiceOption.objects.all() -# serializer_class = ServiceOptionSerializer +# queryset = preferences.ServiceOption.objects.all() +# serializer_class = serializers.ServiceOptionSerializer # # # class AssoOptionViewSet(viewsets.ReadOnlyModelViewSet): -# queryset = AssoOption.objects.all() -# serializer_class = AssoOptionSerializer +# queryset = preferences.AssoOption.objects.all() +# serializer_class = serializers.AssoOptionSerializer # # # class HomeOptionViewSet(viewsets.ReadOnlyModelViewSet): -# queryset = HomeOption.objects.all() -# serializer_class = HomeOptionSerializer +# queryset = preferences.HomeOption.objects.all() +# serializer_class = serializers.HomeOptionSerializer # # # class MailMessageOptionViewSet(viewsets.ReadOnlyModelViewSet): -# queryset = MailMessageOption.objects.all() -# serializer_class = MailMessageOptionSerializer +# queryset = preferences.MailMessageOption.objects.all() +# serializer_class = serializers.MailMessageOptionSerializer # TOPOLOGIE APP class StackViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Stack.objects.all() - serializer_class = StackSerializer + queryset = topologie.Stack.objects.all() + serializer_class = serializers.StackSerializer class AccessPointViewSet(viewsets.ReadOnlyModelViewSet): - queryset = AccessPoint.objects.all() - serializer_class = AccessPointSerializer + queryset = topologie.AccessPoint.objects.all() + serializer_class = serializers.AccessPointSerializer class SwitchViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Switch.objects.all() - serializer_class = SwitchSerializer + queryset = topologie.Switch.objects.all() + serializer_class = serializers.SwitchSerializer class ModelSwitchViewSet(viewsets.ReadOnlyModelViewSet): - queryset = ModelSwitch.objects.all() - serializer_class = ModelSwitchSerializer + queryset = topologie.ModelSwitch.objects.all() + serializer_class = serializers.ModelSwitchSerializer class ConstructorSwitchViewSet(viewsets.ReadOnlyModelViewSet): - queryset = ConstructorSwitch.objects.all() - serializer_class = ConstructorSwitchSerializer + queryset = topologie.ConstructorSwitch.objects.all() + serializer_class = serializers.ConstructorSwitchSerializer class SwitchBayViewSet(viewsets.ReadOnlyModelViewSet): - queryset = SwitchBay.objects.all() - serializer_class = SwitchBaySerializer + queryset = topologie.SwitchBay.objects.all() + serializer_class = serializers.SwitchBaySerializer class BuildingViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Building.objects.all() - serializer_class = BuildingSerializer + queryset = topologie.Building.objects.all() + serializer_class = serializers.BuildingSerializer class SwitchPortViewSet(viewsets.ReadOnlyModelViewSet): - queryset = SwitchPort.objects.all() - serializer_class = SwitchPortSerializer + queryset = topologie.Port.objects.all() + serializer_class = serializers.SwitchPortSerializer class RoomViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Room.objects.all() - serializer_class = RoomSerializer + queryset = topologie.Room.objects.all() + serializer_class = serializers.RoomSerializer # USER APP class UserViewSet(viewsets.ReadOnlyModelViewSet): - queryset = User.objects.all() - serializer_class = UserSerializer + queryset = users.User.objects.all() + serializer_class = serializers.UserSerializer class ClubViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Club.objects.all() - serializer_class = ClubSerializer + queryset = users.Club.objects.all() + serializer_class = serializers.ClubSerializer class AdherentViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Adherent.objects.all() - serializer_class = AdherentSerializer + queryset = users.Adherent.objects.all() + serializer_class = serializers.AdherentSerializer class ServiceUserViewSet(viewsets.ReadOnlyModelViewSet): - queryset = ServiceUser.objects.all() - serializer_class = ServiceUserSerializer + queryset = users.ServiceUser.objects.all() + serializer_class = serializers.ServiceUserSerializer class SchoolViewSet(viewsets.ReadOnlyModelViewSet): - queryset = School.objects.all() - serializer_class = SchoolSerializer + queryset = users.School.objects.all() + serializer_class = serializers.SchoolSerializer class ListRightViewSet(viewsets.ReadOnlyModelViewSet): - queryset = ListRight.objects.all() - serializer_class = ListRightSerializer + queryset = users.ListRight.objects.all() + serializer_class = serializers.ListRightSerializer class ShellViewSet(viewsets.ReadOnlyModelViewSet): - queryset = ListShell.objects.all() - serializer_class = ShellSerializer + queryset = users.ListShell.objects.all() + serializer_class = serializers.ShellSerializer class BanViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Ban.objects.all() - serializer_class = BanSerializer + queryset = users.Ban.objects.all() + serializer_class = serializers.BanSerializer class WhitelistViewSet(viewsets.ReadOnlyModelViewSet): - queryset = Whitelist.objects.all() - serializer_class = WhitelistSerializer + queryset = users.Whitelist.objects.all() + serializer_class = serializers.WhitelistSerializer # Subclass the standard rest_framework.auth_token.views.ObtainAuthToken # in order to renew the lease of the token and add expiration time From 59c48759f20dd2b2ec4bcf9c857053f0092539a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Tue, 24 Apr 2018 16:22:56 +0000 Subject: [PATCH 13/49] Separation of url according to app --- api/urls.py | 102 ++++++++++++++++++++++++++-------------------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/api/urls.py b/api/urls.py index f01e6a3e..a6d63af2 100644 --- a/api/urls.py +++ b/api/urls.py @@ -31,61 +31,61 @@ from . import views router = DefaultRouter() # COTISATIONS APP -router.register(r'factures', views.FactureViewSet) -router.register(r'ventes', views.VenteViewSet) -router.register(r'articles', views.ArticleViewSet) -router.register(r'banques', views.BanqueViewSet) -router.register(r'paiements', views.PaiementViewSet) -router.register(r'cotisations', views.CotisationViewSet) +router.register(r'cotisations/factures', views.FactureViewSet) +router.register(r'cotisations/ventes', views.VenteViewSet) +router.register(r'cotisations/articles', views.ArticleViewSet) +router.register(r'cotisations/banques', views.BanqueViewSet) +router.register(r'cotisations/paiements', views.PaiementViewSet) +router.register(r'cotisations/cotisations', views.CotisationViewSet) # MACHINES APP -router.register(r'machines', views.MachineViewSet) -router.register(r'machinetypes', views.MachineTypeViewSet) -router.register(r'iptypes', views.IpTypeViewSet) -router.register(r'vlans', views.VlanViewSet) -router.register(r'nas', views.NasViewSet) -router.register(r'soa', views.SOAViewSet) -router.register(r'extensions', views.ExtensionViewSet) -router.register(r'mx', views.MxViewSet) -router.register(r'ns', views.NsViewSet) -router.register(r'txt', views.TxtViewSet) -router.register(r'srv', views.SrvViewSet) -router.register(r'interfaces', views.InterfaceViewSet) -router.register(r'ipv6lists', views.Ipv6ListViewSet) -router.register(r'domains', views.DomainViewSet) -router.register(r'iplists', views.IpListViewSet) -router.register(r'services', views.ServiceViewSet) -router.register(r'servicelinks', views.ServiceLinkViewSet, 'servicelink') -router.register(r'ouvertureportlists', views.OuverturePortListViewSet) -router.register(r'ouvertureports', views.OuverturePortViewSet) +router.register(r'machines/machines', views.MachineViewSet) +router.register(r'machines/machinetypes', views.MachineTypeViewSet) +router.register(r'machines/iptypes', views.IpTypeViewSet) +router.register(r'machines/vlans', views.VlanViewSet) +router.register(r'machines/nas', views.NasViewSet) +router.register(r'machines/soa', views.SOAViewSet) +router.register(r'machines/extensions', views.ExtensionViewSet) +router.register(r'machines/mx', views.MxViewSet) +router.register(r'machines/ns', views.NsViewSet) +router.register(r'machines/txt', views.TxtViewSet) +router.register(r'machines/srv', views.SrvViewSet) +router.register(r'machines/interfaces', views.InterfaceViewSet) +router.register(r'machines/ipv6lists', views.Ipv6ListViewSet) +router.register(r'machines/domains', views.DomainViewSet) +router.register(r'machines/iplists', views.IpListViewSet) +router.register(r'machines/services', views.ServiceViewSet) +router.register(r'machines/servicelinks', views.ServiceLinkViewSet, base_name='servicelink') +router.register(r'machines/ouvertureportlists', views.OuverturePortListViewSet) +router.register(r'machines/ouvertureports', views.OuverturePortViewSet) # PREFERENCES APP -#router.register(r'optionaluser', views.OptionalUserSerializer) -#router.register(r'optionalmachine', views.OptionalMachineSerializer) -#router.register(r'optionaltopologie', views.OptionalTopologieSerializer) -#router.register(r'generaloption', views.GeneralOptionSerializer) -#router.register(r'serviceoption', views.ServiceOptionSerializer) -#router.register(r'assooption', views.AssoOptionSerializer) -#router.register(r'homeoption', views.HomeOptionSerializer) -#router.register(r'mailmessageoption', views.MailMessageOptionSerializer) +#router.register(r'preferences/optionaluser', views.OptionalUserSerializer) +#router.register(r'preferences/optionalmachine', views.OptionalMachineSerializer) +#router.register(r'preferences/optionaltopologie', views.OptionalTopologieSerializer) +#router.register(r'preferences/generaloption', views.GeneralOptionSerializer) +#router.register(r'preferences/serviceoption', views.ServiceOptionSerializer) +#router.register(r'preferences/assooption', views.AssoOptionSerializer) +#router.register(r'preferences/homeoption', views.HomeOptionSerializer) +#router.register(r'preferences/mailmessageoption', views.MailMessageOptionSerializer) # TOPOLOGIE APP -router.register(r'stack', views.StackViewSet) -router.register(r'acesspoint', views.AccessPointViewSet) -router.register(r'switch', views.SwitchViewSet) -router.register(r'modelswitch', views.ModelSwitchViewSet) -router.register(r'constructorswitch', views.ConstructorSwitchViewSet) -router.register(r'switchbay', views.SwitchBayViewSet) -router.register(r'building', views.BuildingViewSet) -router.register(r'switchport', views.SwitchPortViewSet, 'switchport') -router.register(r'room', views.RoomViewSet) +router.register(r'topologie/stack', views.StackViewSet) +router.register(r'topologie/acesspoint', views.AccessPointViewSet) +router.register(r'topologie/switch', views.SwitchViewSet) +router.register(r'topologie/modelswitch', views.ModelSwitchViewSet) +router.register(r'topologie/constructorswitch', views.ConstructorSwitchViewSet) +router.register(r'topologie/switchbay', views.SwitchBayViewSet) +router.register(r'topologie/building', views.BuildingViewSet) +router.register(r'topologie/switchport', views.SwitchPortViewSet, base_name='switchport') +router.register(r'topologie/room', views.RoomViewSet) # USERS APP -router.register(r'users', views.UserViewSet) -router.register(r'clubs', views.ClubViewSet) -router.register(r'adherents', views.AdherentViewSet) -router.register(r'serviceusers', views.ServiceUserViewSet) -router.register(r'schools', views.SchoolViewSet) -router.register(r'listrights', views.ListRightViewSet) -router.register(r'shells', views.ShellViewSet, 'shell') -router.register(r'bans', views.BanViewSet) -router.register(r'whitelists', views.WhitelistViewSet) +router.register(r'users/users', views.UserViewSet) +router.register(r'users/clubs', views.ClubViewSet) +router.register(r'users/adherents', views.AdherentViewSet) +router.register(r'users/serviceusers', views.ServiceUserViewSet) +router.register(r'users/schools', views.SchoolViewSet) +router.register(r'users/listrights', views.ListRightViewSet) +router.register(r'users/shells', views.ShellViewSet, base_name='shell') +router.register(r'users/bans', views.BanViewSet) +router.register(r'users/whitelists', views.WhitelistViewSet) urlpatterns = [ url(r'^', include(router.urls)), From b1738f189baacd865a1e0e0bb789cf03d81665b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Thu, 26 Apr 2018 18:41:13 +0000 Subject: [PATCH 14/49] Add pagination to API results --- api/settings.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/api/settings.py b/api/settings.py index 028ec01d..6bf48e33 100644 --- a/api/settings.py +++ b/api/settings.py @@ -34,7 +34,9 @@ REST_FRAMEWORK = { ), 'DEFAULT_PERMISSION_CLASSES': ( 'api.permissions.DefaultACLPermission', - ) + ), + 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', + 'PAGE_SIZE': 100 } # API permission settings From 7daa53663a5a0d694e36b57eaf2582486b1eadd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Thu, 26 Apr 2018 22:44:27 +0000 Subject: [PATCH 15/49] Cleanup API --- api/serializers.py | 439 +++--------------------------------- api/urls.py | 38 ---- api/views.py | 551 --------------------------------------------- 3 files changed, 26 insertions(+), 1002 deletions(-) diff --git a/api/serializers.py b/api/serializers.py index eab81940..fe01bf02 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -178,6 +178,7 @@ class SrvSerializer(NamespacedHMSerializer): class InterfaceSerializer(NamespacedHMSerializer): + mac_address = serializers.CharField() active = serializers.BooleanField(source='is_active') class Meta: @@ -218,6 +219,9 @@ class ServiceLinkSerializer(NamespacedHMSerializer): model = machines.Service_link fields = ('service', 'server', 'last_regen', 'asked_regen', 'need_regen', 'api_url') + extra_kwargs = { + 'api_url': {'view_name': 'servicelink-detail'} + } class OuverturePortListSerializer(NamespacedHMSerializer): @@ -319,8 +323,8 @@ class SwitchSerializer(NamespacedHMSerializer): port_amount = serializers.IntegerField(source='number') class Meta: model = topologie.Switch - fields = ('port_amount', 'stack', 'stack_member_id', 'model', - 'switchbay', 'api_url') + fields = ('user', 'name', 'active', 'port_amount', 'stack', + 'stack_member_id', 'model', 'switchbay', 'api_url') class ModelSwitchSerializer(NamespacedHMSerializer): @@ -352,6 +356,10 @@ class SwitchPortSerializer(NamespacedHMSerializer): model = topologie.Port fields = ('switch', 'port', 'room', 'machine_interface', 'related', 'radius', 'vlan_force', 'details', 'api_url') + extra_kwargs = { + 'related': {'view_name': 'switchport-detail'}, + 'api_url': {'view_name': 'switchport-detail'} + } class RoomSerializer(NamespacedHMSerializer): @@ -370,8 +378,11 @@ class UserSerializer(NamespacedHMSerializer): class Meta: model = users.User fields = ('name', 'pseudo', 'email', 'school', 'shell', 'comment', - 'state', 'registered', 'telephone', 'solde', #'room', - 'access', 'end_access', 'uid', 'class_name', 'api_url') + 'state', 'registered', 'telephone', 'solde', 'access', + 'end_access', 'uid', 'class_name', 'api_url') + extra_kwargs = { + 'shell': {'view_name': 'shell-detail'} + } class ClubSerializer(NamespacedHMSerializer): @@ -382,9 +393,12 @@ class ClubSerializer(NamespacedHMSerializer): class Meta: model = users.Club fields = ('name', 'pseudo', 'email', 'school', 'shell', 'comment', - 'state', 'registered', 'telephone', 'solde', #'room', + 'state', 'registered', 'telephone', 'solde', 'room', 'access', 'end_access', 'administrators', 'members', 'mailing', 'uid', 'api_url') + extra_kwargs = { + 'shell': {'view_name': 'shell-detail'} + } class AdherentSerializer(NamespacedHMSerializer): @@ -394,8 +408,11 @@ class AdherentSerializer(NamespacedHMSerializer): class Meta: model = users.Adherent fields = ('name', 'surname', 'pseudo', 'email', 'school', 'shell', - 'comment', 'state', 'registered', 'telephone', #'room', + 'comment', 'state', 'registered', 'telephone', 'room', 'solde', 'access', 'end_access', 'uid', 'api_url') + extra_kwargs = { + 'shell': {'view_name': 'shell-detail'} + } class ServiceUserSerializer(NamespacedHMSerializer): @@ -420,6 +437,9 @@ class ShellSerializer(NamespacedHMSerializer): class Meta: model = users.ListShell fields = ('shell', 'api_url') + extra_kwargs = { + 'api_url': {'view_name': 'shell-detail'} + } class BanSerializer(NamespacedHMSerializer): @@ -437,410 +457,3 @@ class WhitelistSerializer(NamespacedHMSerializer): class Meta: model = users.Whitelist fields = ('user', 'raison', 'date_start', 'date_end', 'active', 'api_url') - - - -# class ServiceLinkSerializer(serializers.ModelSerializer): -# """ Serializer for the ServiceLink objects """ -# -# name = serializers.CharField(source='service.service_type') -# -# class Meta: -# model = Service_link -# fields = ('name',) -# -# -# class MailingSerializer(serializers.ModelSerializer): -# """ Serializer to build Mailing objects """ -# -# name = serializers.CharField(source='pseudo') -# -# class Meta: -# model = Club -# fields = ('name',) -# -# -# class MailingMemberSerializer(serializers.ModelSerializer): -# """ Serializer fot the Adherent objects (who belong to a -# Mailing) """ -# -# class Meta: -# model = Adherent -# fields = ('email',) -# -# -# class IpTypeField(serializers.RelatedField): -# """ Serializer for an IpType object field """ -# -# def to_representation(self, value): -# return value.type -# -# def to_internal_value(self, data): -# pass -# -# -# class IpListSerializer(serializers.ModelSerializer): -# """ Serializer for an Ipv4List obejct using the IpType serialization """ -# -# ip_type = IpTypeField(read_only=True) -# -# class Meta: -# model = IpList -# fields = ('ipv4', 'ip_type') -# -# -# class Ipv6ListSerializer(serializers.ModelSerializer): -# """ Serializer for an Ipv6List object """ -# -# class Meta: -# model = Ipv6List -# fields = ('ipv6', 'slaac_ip') -# -# -# class InterfaceSerializer(serializers.ModelSerializer): -# """ Serializer for an Interface object. Use SerializerMethodField -# to get ForeignKey values """ -# -# ipv4 = IpListSerializer(read_only=True) -# # TODO : use serializer.RelatedField to avoid duplicate code -# mac_address = serializers.SerializerMethodField('get_macaddress') -# domain = serializers.SerializerMethodField('get_dns') -# extension = serializers.SerializerMethodField('get_interface_extension') -# -# class Meta: -# model = Interface -# fields = ('ipv4', 'mac_address', 'domain', 'extension') -# -# @staticmethod -# def get_dns(obj): -# """ The name of the associated DNS object """ -# return obj.domain.name -# -# @staticmethod -# def get_interface_extension(obj): -# """ The name of the associated Interface object """ -# return obj.domain.extension.name -# -# @staticmethod -# def get_macaddress(obj): -# """ The string representation of the associated MAC address """ -# return str(obj.mac_address) -# -# -# class FullInterfaceSerializer(serializers.ModelSerializer): -# """ Serializer for an Interface obejct. Use SerializerMethodField -# to get ForeignKey values """ -# -# ipv4 = IpListSerializer(read_only=True) -# ipv6 = Ipv6ListSerializer(read_only=True, many=True) -# # TODO : use serializer.RelatedField to avoid duplicate code -# mac_address = serializers.SerializerMethodField('get_macaddress') -# domain = serializers.SerializerMethodField('get_dns') -# extension = serializers.SerializerMethodField('get_interface_extension') -# -# class Meta: -# model = Interface -# fields = ('ipv4', 'ipv6', 'mac_address', 'domain', 'extension') -# -# @staticmethod -# def get_dns(obj): -# """ The name of the associated DNS object """ -# return obj.domain.name -# -# @staticmethod -# def get_interface_extension(obj): -# """ The name of the associated Extension object """ -# return obj.domain.extension.name -# -# @staticmethod -# def get_macaddress(obj): -# """ The string representation of the associated MAC address """ -# return str(obj.mac_address) -# -# -# class ExtensionNameField(serializers.RelatedField): -# """ Serializer for Extension object field """ -# -# def to_representation(self, value): -# return value.name -# -# def to_internal_value(self, data): -# pass -# -# -# class TypeSerializer(serializers.ModelSerializer): -# """ Serializer for an IpType object. Use SerializerMethodField to -# get ForeignKey values """ -# -# extension = ExtensionNameField(read_only=True) -# ouverture_ports_tcp_in = serializers\ -# .SerializerMethodField('get_port_policy_input_tcp') -# ouverture_ports_tcp_out = serializers\ -# .SerializerMethodField('get_port_policy_output_tcp') -# ouverture_ports_udp_in = serializers\ -# .SerializerMethodField('get_port_policy_input_udp') -# ouverture_ports_udp_out = serializers\ -# .SerializerMethodField('get_port_policy_output_udp') -# -# class Meta: -# model = IpType -# fields = ('type', 'extension', 'domaine_ip_start', 'domaine_ip_stop', -# 'prefix_v6', -# 'ouverture_ports_tcp_in', 'ouverture_ports_tcp_out', -# 'ouverture_ports_udp_in', 'ouverture_ports_udp_out',) -# -# @staticmethod -# def get_port_policy(obj, protocole, io): -# """ Generic utility function to get the policy for a given -# port, protocole and IN or OUT """ -# if obj.ouverture_ports is None: -# return [] -# return map( -# str, -# obj.ouverture_ports.ouvertureport_set.filter( -# protocole=protocole -# ).filter(io=io) -# ) -# -# def get_port_policy_input_tcp(self, obj): -# """Renvoie la liste des ports ouverts en entrée tcp""" -# return self.get_port_policy(obj, OuverturePort.TCP, OuverturePort.IN) -# -# def get_port_policy_output_tcp(self, obj): -# """Renvoie la liste des ports ouverts en sortie tcp""" -# return self.get_port_policy(obj, OuverturePort.TCP, OuverturePort.OUT) -# -# def get_port_policy_input_udp(self, obj): -# """Renvoie la liste des ports ouverts en entrée udp""" -# return self.get_port_policy(obj, OuverturePort.UDP, OuverturePort.IN) -# -# def get_port_policy_output_udp(self, obj): -# """Renvoie la liste des ports ouverts en sortie udp""" -# return self.get_port_policy(obj, OuverturePort.UDP, OuverturePort.OUT) -# -# -# class ExtensionSerializer(serializers.ModelSerializer): -# """Serialisation d'une extension : origin_ip et la zone sont -# des foreign_key donc evalués en get_...""" -# origin = serializers.SerializerMethodField('get_origin_ip') -# zone_entry = serializers.SerializerMethodField('get_zone_name') -# soa = serializers.SerializerMethodField('get_soa_data') -# -# class Meta: -# model = Extension -# fields = ('name', 'origin', 'origin_v6', 'zone_entry', 'soa') -# -# @staticmethod -# def get_origin_ip(obj): -# """ The IP of the associated origin for the zone """ -# return obj.origin.ipv4 -# -# @staticmethod -# def get_zone_name(obj): -# """ The name of the associated zone """ -# return str(obj.dns_entry) -# -# @staticmethod -# def get_soa_data(obj): -# """ The representation of the associated SOA """ -# return {'mail': obj.soa.dns_soa_mail, 'param': obj.soa.dns_soa_param} -# -# -# class MxSerializer(serializers.ModelSerializer): -# """Serialisation d'un MX, evaluation du nom, de la zone -# et du serveur cible, etant des foreign_key""" -# name = serializers.SerializerMethodField('get_entry_name') -# zone = serializers.SerializerMethodField('get_zone_name') -# mx_entry = serializers.SerializerMethodField('get_mx_name') -# -# class Meta: -# model = Mx -# fields = ('zone', 'priority', 'name', 'mx_entry') -# -# @staticmethod -# def get_entry_name(obj): -# """ The name of the DNS MX entry """ -# return str(obj.name) -# -# @staticmethod -# def get_zone_name(obj): -# """ The name of the associated zone of the MX record """ -# return obj.zone.name -# -# @staticmethod -# def get_mx_name(obj): -# """ The string representation of the entry to add to the DNS """ -# return str(obj.dns_entry) -# -# -# class TxtSerializer(serializers.ModelSerializer): -# """Serialisation d'un txt : zone cible et l'entrée txt -# sont evaluées à part""" -# zone = serializers.SerializerMethodField('get_zone_name') -# txt_entry = serializers.SerializerMethodField('get_txt_name') -# -# class Meta: -# model = Txt -# fields = ('zone', 'txt_entry', 'field1', 'field2') -# -# @staticmethod -# def get_zone_name(obj): -# """ The name of the associated zone """ -# return str(obj.zone.name) -# -# @staticmethod -# def get_txt_name(obj): -# """ The string representation of the entry to add to the DNS """ -# return str(obj.dns_entry) -# -# -# class SrvSerializer(serializers.ModelSerializer): -# """Serialisation d'un srv : zone cible et l'entrée txt""" -# extension = serializers.SerializerMethodField('get_extension_name') -# srv_entry = serializers.SerializerMethodField('get_srv_name') -# -# class Meta: -# model = Srv -# fields = ( -# 'service', -# 'protocole', -# 'extension', -# 'ttl', -# 'priority', -# 'weight', -# 'port', -# 'target', -# 'srv_entry' -# ) -# -# @staticmethod -# def get_extension_name(obj): -# """ The name of the associated extension """ -# return str(obj.extension.name) -# -# @staticmethod -# def get_srv_name(obj): -# """ The string representation of the entry to add to the DNS """ -# return str(obj.dns_entry) -# -# -# class NsSerializer(serializers.ModelSerializer): -# """Serialisation d'un NS : la zone, l'entrée ns complète et le serveur -# ns sont évalués à part""" -# zone = serializers.SerializerMethodField('get_zone_name') -# ns = serializers.SerializerMethodField('get_domain_name') -# ns_entry = serializers.SerializerMethodField('get_text_name') -# -# class Meta: -# model = Ns -# fields = ('zone', 'ns', 'ns_entry') -# -# @staticmethod -# def get_zone_name(obj): -# """ The name of the associated zone """ -# return obj.zone.name -# -# @staticmethod -# def get_domain_name(obj): -# """ The name of the associated NS target """ -# return str(obj.ns) -# -# @staticmethod -# def get_text_name(obj): -# """ The string representation of the entry to add to the DNS """ -# return str(obj.dns_entry) -# -# -# class DomainSerializer(serializers.ModelSerializer): -# """Serialisation d'un domain, extension, cname sont des foreign_key, -# et l'entrée complète, sont évalués à part""" -# extension = serializers.SerializerMethodField('get_zone_name') -# cname = serializers.SerializerMethodField('get_alias_name') -# cname_entry = serializers.SerializerMethodField('get_cname_name') -# -# class Meta: -# model = Domain -# fields = ('name', 'extension', 'cname', 'cname_entry') -# -# @staticmethod -# def get_zone_name(obj): -# """ The name of the associated zone """ -# return obj.extension.name -# -# @staticmethod -# def get_alias_name(obj): -# """ The name of the associated alias """ -# return str(obj.cname) -# -# @staticmethod -# def get_cname_name(obj): -# """ The name of the associated CNAME target """ -# return str(obj.dns_entry) -# -# -# class ServicesSerializer(serializers.ModelSerializer): -# """Evaluation d'un Service, et serialisation""" -# server = serializers.SerializerMethodField('get_server_name') -# service = serializers.SerializerMethodField('get_service_name') -# need_regen = serializers.SerializerMethodField('get_regen_status') -# -# class Meta: -# model = Service_link -# fields = ('server', 'service', 'need_regen') -# -# @staticmethod -# def get_server_name(obj): -# """ The name of the associated server """ -# return str(obj.server.domain.name) -# -# @staticmethod -# def get_service_name(obj): -# """ The name of the service name """ -# return str(obj.service) -# -# @staticmethod -# def get_regen_status(obj): -# """ The string representation of the regen status """ -# return obj.need_regen() -# -# -# class OuverturePortsSerializer(serializers.Serializer): -# """Serialisation de l'ouverture des ports""" -# ipv4 = serializers.SerializerMethodField() -# ipv6 = serializers.SerializerMethodField() -# -# def create(self, validated_data): -# """ Creates a new object based on the un-serialized data. -# Used to implement an abstract inherited method """ -# pass -# -# def update(self, instance, validated_data): -# """ Updates an object based on the un-serialized data. -# Used to implement an abstract inherited method """ -# pass -# -# @staticmethod -# def get_ipv4(): -# """ The representation of the policy for the IPv4 addresses """ -# return { -# i.ipv4.ipv4: { -# "tcp_in": [j.tcp_ports_in() for j in i.port_lists.all()], -# "tcp_out": [j.tcp_ports_out()for j in i.port_lists.all()], -# "udp_in": [j.udp_ports_in() for j in i.port_lists.all()], -# "udp_out": [j.udp_ports_out() for j in i.port_lists.all()], -# } -# for i in Interface.objects.all() if i.ipv4 -# } -# -# @staticmethod -# def get_ipv6(): -# """ The representation of the policy for the IPv6 addresses """ -# return { -# i.ipv6: { -# "tcp_in": [j.tcp_ports_in() for j in i.port_lists.all()], -# "tcp_out": [j.tcp_ports_out()for j in i.port_lists.all()], -# "udp_in": [j.udp_ports_in() for j in i.port_lists.all()], -# "udp_out": [j.udp_ports_out() for j in i.port_lists.all()], -# } -# for i in Interface.objects.all() if i.ipv6 -# } diff --git a/api/urls.py b/api/urls.py index a6d63af2..03e5026b 100644 --- a/api/urls.py +++ b/api/urls.py @@ -90,42 +90,4 @@ router.register(r'users/whitelists', views.WhitelistViewSet) urlpatterns = [ url(r'^', include(router.urls)), url(r'^token-auth/', views.ObtainExpiringAuthToken.as_view()) -# # Services -# url(r'^services/$', views.services), -# url( -# r'^services/(?P\w+)/(?P\w+)/regen/$', -# views.services_server_service_regen -# ), -# url(r'^services/(?P\w+)/$', views.services_server), -# -# # DNS -# url(r'^dns/mac-ip-dns/$', views.dns_mac_ip_dns), -# url(r'^dns/alias/$', views.dns_alias), -# url(r'^dns/corresp/$', views.dns_corresp), -# url(r'^dns/mx/$', views.dns_mx), -# url(r'^dns/ns/$', views.dns_ns), -# url(r'^dns/txt/$', views.dns_txt), -# url(r'^dns/srv/$', views.dns_srv), -# url(r'^dns/zones/$', views.dns_zones), -# -# # Unifi controler AP names -# url(r'^unifi/ap_names/$', views.accesspoint_ip_dns), -# -# # Firewall -# url(r'^firewall/ouverture_ports/$', views.firewall_ouverture_ports), -# -# # DHCP -# url(r'^dhcp/mac-ip/$', views.dhcp_mac_ip), -# -# # Mailings -# url(r'^mailing/standard/$', views.mailing_standard), -# url( -# r'^mailing/standard/(?P\w+)/members/$', -# views.mailing_standard_ml_members -# ), -# url(r'^mailing/club/$', views.mailing_club), -# url( -# r'^mailing/club/(?P\w+)/members/$', -# views.mailing_club_ml_members -# ), ] diff --git a/api/views.py b/api/views.py index 439ede8b..c337de50 100644 --- a/api/views.py +++ b/api/views.py @@ -333,554 +333,3 @@ class ObtainExpiringAuthToken(ObtainAuthToken): 'token': token.key, 'expiration_date': token.created + token_duration }) - -# -# @csrf_exempt -# @login_required -# @permission_required('machines.serveur') -# @accept_method(['GET']) -# def services(_request): -# """The list of the different services and servers couples -# -# Return: -# GET: -# A JSONSuccess response with a field `data` containing: -# * a list of dictionnaries (one for each service-server couple) -# containing: -# * a field `server`: the server name -# * a field `service`: the service name -# * a field `need_regen`: does the service need a regeneration ? -# """ -# -# service_link = (Service_link.objects.all() -# .select_related('server__domain') -# .select_related('service')) -# seria = ServicesSerializer(service_link, many=True) -# return JSONSuccess(seria.data) -# -# -# @csrf_exempt -# @login_required -# @permission_required('machines.serveur') -# @accept_method(['GET', 'POST']) -# def services_server_service_regen(request, server_name, service_name): -# """The status of a particular service linked to a particular server. -# Mark the service as regenerated if POST used. -# -# Returns: -# GET: -# A JSONSucess response with a field `data` containing: -# * a field `need_regen`: does the service need a regeneration ? -# -# POST: -# An empty JSONSuccess response. -# """ -# -# query = Service_link.objects.filter( -# service__in=Service.objects.filter(service_type=service_name), -# server__in=Interface.objects.filter( -# domain__in=Domain.objects.filter(name=server_name) -# ) -# ) -# if not query: -# return JSONError("This service is not active for this server") -# -# service = query.first() -# if request.method == 'GET': -# return JSONSuccess({'need_regen': service.need_regen()}) -# else: -# service.done_regen() -# return JSONSuccess() -# -# -# @csrf_exempt -# @login_required -# @permission_required('machines.serveur') -# @accept_method(['GET']) -# def services_server(_request, server_name): -# """The list of services attached to a specific server -# -# Returns: -# GET: -# A JSONSuccess response with a field `data` containing: -# * a list of dictionnaries (one for each service) containing: -# * a field `name`: the name of a service -# """ -# -# query = Service_link.objects.filter( -# server__in=Interface.objects.filter( -# domain__in=Domain.objects.filter(name=server_name) -# ) -# ) -# if not query: -# return JSONError("This service is not active for this server") -# -# services_objects = query.all() -# seria = ServiceLinkSerializer(services_objects, many=True) -# return JSONSuccess(seria.data) -# -# -# @csrf_exempt -# @login_required -# @permission_required('machines.serveur') -# @accept_method(['GET']) -# def dns_mac_ip_dns(_request): -# """The list of all active interfaces with all the associated infos -# (MAC, IP, IpType, DNS name and associated zone extension) -# -# Returns: -# GET: -# A JSON Success response with a field `data` containing: -# * a list of dictionnaries (one for each interface) containing: -# * a field `ipv4` containing: -# * a field `ipv4`: the ip for this interface -# * a field `ip_type`: the name of the IpType of this interface -# * a field `ipv6` containing `null` if ipv6 is deactivated else: -# * a field `ipv6`: the ip for this interface -# * a field `ip_type`: the name of the IpType of this interface -# * a field `mac_address`: the MAC of this interface -# * a field `domain`: the DNS name for this interface -# * a field `extension`: the extension for the DNS zone of this -# interface -# """ -# -# interfaces = all_active_assigned_interfaces(full=True) -# seria = FullInterfaceSerializer(interfaces, many=True) -# return JSONSuccess(seria.data) -# -# -# @csrf_exempt -# @login_required -# @permission_required('machines.serveur') -# @accept_method(['GET']) -# def dns_alias(_request): -# """The list of all the alias used and the DNS info associated -# -# Returns: -# GET: -# A JSON Success response with a field `data` containing: -# * a list of dictionnaries (one for each alias) containing: -# * a field `name`: the alias used -# * a field `cname`: the target of the alias (real name of the -# interface) -# * a field `cname_entry`: the entry to write in the DNS to have -# the alias -# * a field `extension`: the extension for the DNS zone of this -# interface -# """ -# -# alias = (Domain.objects -# .filter(interface_parent=None) -# .filter( -# cname__in=Domain.objects.filter( -# interface_parent__in=Interface.objects.exclude(ipv4=None) -# ) -# ) -# .select_related('extension') -# .select_related('cname__extension')) -# seria = DomainSerializer(alias, many=True) -# return JSONSuccess(seria.data) -# -# -# @csrf_exempt -# @login_required -# @permission_required('machines.serveur') -# @accept_method(['GET']) -# def accesspoint_ip_dns(_request): -# """The list of all active interfaces with all the associated infos -# (MAC, IP, IpType, DNS name and associated zone extension) -# -# Only display access points. Use to gen unifi controler names -# -# Returns: -# GET: -# A JSON Success response with a field `data` containing: -# * a list of dictionnaries (one for each interface) containing: -# * a field `ipv4` containing: -# * a field `ipv4`: the ip for this interface -# * a field `ip_type`: the name of the IpType of this interface -# * a field `ipv6` containing `null` if ipv6 is deactivated else: -# * a field `ipv6`: the ip for this interface -# * a field `ip_type`: the name of the IpType of this interface -# * a field `mac_address`: the MAC of this interface -# * a field `domain`: the DNS name for this interface -# * a field `extension`: the extension for the DNS zone of this -# interface -# """ -# -# interfaces = (all_active_assigned_interfaces(full=True) -# .filter(machine__accesspoint__isnull=False)) -# seria = FullInterfaceSerializer(interfaces, many=True) -# return JSONSuccess(seria.data) -# -# -# @csrf_exempt -# @login_required -# @permission_required('machines.serveur') -# @accept_method(['GET']) -# def dns_corresp(_request): -# """The list of the IpTypes possible with the infos about each -# -# Returns: -# GET: -# A JSON Success response with a field `data` containing: -# * a list of dictionnaries (one for each IpType) containing: -# * a field `type`: the name of the type -# * a field `extension`: the DNS extension associated -# * a field `domain_ip_start`: the first ip to use for this type -# * a field `domain_ip_stop`: the last ip to use for this type -# * a field `prefix_v6`: `null` if IPv6 is deactivated else the -# prefix to use -# * a field `ouverture_ports_tcp_in`: the policy for TCP IN ports -# * a field `ouverture_ports_tcp_out`: the policy for TCP OUT ports -# * a field `ouverture_ports_udp_in`: the policy for UDP IN ports -# * a field `ouverture_ports_udp_out`: the policy for UDP OUT ports -# """ -# -# ip_type = IpType.objects.all().select_related('extension') -# seria = TypeSerializer(ip_type, many=True) -# return JSONSuccess(seria.data) -# -# -# @csrf_exempt -# @login_required -# @permission_required('machines.serveur') -# @accept_method(['GET']) -# def dns_mx(_request): -# """The list of MX record to add to the DNS -# -# Returns: -# GET: -# A JSON Success response with a field `data` containing: -# * a list of dictionnaries (one for each MX record) containing: -# * a field `zone`: the extension for the concerned zone -# * a field `priority`: the priority to use -# * a field `name`: the name of the target -# * a field `mx_entry`: the full entry to add in the DNS for this -# MX record -# """ -# -# mx = (Mx.objects.all() -# .select_related('zone') -# .select_related('name__extension')) -# seria = MxSerializer(mx, many=True) -# return JSONSuccess(seria.data) -# -# -# @csrf_exempt -# @login_required -# @permission_required('machines.serveur') -# @accept_method(['GET']) -# def dns_ns(_request): -# """The list of NS record to add to the DNS -# -# Returns: -# GET: -# A JSON Success response with a field `data` containing: -# * a list of dictionnaries (one for each NS record) containing: -# * a field `zone`: the extension for the concerned zone -# * a field `ns`: the DNS name for the NS server targeted -# * a field `ns_entry`: the full entry to add in the DNS for this -# NS record -# """ -# -# ns = (Ns.objects -# .exclude( -# ns__in=Domain.objects.filter( -# interface_parent__in=Interface.objects.filter(ipv4=None) -# ) -# ) -# .select_related('zone') -# .select_related('ns__extension')) -# seria = NsSerializer(ns, many=True) -# return JSONSuccess(seria.data) -# -# -# @csrf_exempt -# @login_required -# @permission_required('machines.serveur') -# @accept_method(['GET']) -# def dns_txt(_request): -# """The list of TXT record to add to the DNS -# -# Returns: -# GET: -# A JSON Success response with a field `data` containing: -# * a list of dictionnaries (one for each TXT record) containing: -# * a field `zone`: the extension for the concerned zone -# * a field `field1`: the first field in the record (target) -# * a field `field2`: the second field in the record (value) -# * a field `txt_entry`: the full entry to add in the DNS for this -# TXT record -# """ -# -# txt = Txt.objects.all().select_related('zone') -# seria = TxtSerializer(txt, many=True) -# return JSONSuccess(seria.data) -# -# -# @csrf_exempt -# @login_required -# @permission_required('machines.serveur') -# @accept_method(['GET']) -# def dns_srv(_request): -# """The list of SRV record to add to the DNS -# -# Returns: -# GET: -# A JSON Success response with a field `data` containing: -# * a list of dictionnaries (one for each SRV record) containing: -# * a field `extension`: the extension for the concerned zone -# * a field `service`: the name of the service concerned -# * a field `protocole`: the name of the protocol to use -# * a field `ttl`: the Time To Live to use -# * a field `priority`: the priority for this service -# * a field `weight`: the weight for same priority entries -# * a field `port`: the port targeted -# * a field `target`: the interface targeted by this service -# * a field `srv_entry`: the full entry to add in the DNS for this -# SRV record -# """ -# -# srv = (Srv.objects.all() -# .select_related('extension') -# .select_related('target__extension')) -# seria = SrvSerializer(srv, many=True) -# return JSONSuccess(seria.data) -# -# -# @csrf_exempt -# @login_required -# @permission_required('machines.serveur') -# @accept_method(['GET']) -# def dns_zones(_request): -# """The list of the zones managed -# -# Returns: -# GET: -# A JSON Success response with a field `data` containing: -# * a list of dictionnaries (one for each zone) containing: -# * a field `name`: the extension for the zone -# * a field `origin`: the server IPv4 for the orgin of the zone -# * a field `origin_v6`: `null` if ipv6 is deactivated else the -# server IPv6 for the origin of the zone -# * a field `soa` containing: -# * a field `mail` containing the mail to contact in case of -# problem with the zone -# * a field `param` containing the full soa paramters to use -# in the DNS for this zone -# * a field `zone_entry`: the full entry to add in the DNS for the -# origin of the zone -# """ -# -# zones = Extension.objects.all().select_related('origin') -# seria = ExtensionSerializer(zones, many=True) -# return JSONSuccess(seria.data) -# -# -# @csrf_exempt -# @login_required -# @permission_required('machines.serveur') -# @accept_method(['GET']) -# def firewall_ouverture_ports(_request): -# """The list of the ports authorized to be openned by the firewall -# -# Returns: -# GET: -# A JSONSuccess response with a `data` field containing: -# * a field `ipv4` containing: -# * a field `tcp_in` containing: -# * a list of port number where ipv4 tcp in should be ok -# * a field `tcp_out` containing: -# * a list of port number where ipv4 tcp ou should be ok -# * a field `udp_in` containing: -# * a list of port number where ipv4 udp in should be ok -# * a field `udp_out` containing: -# * a list of port number where ipv4 udp out should be ok -# * a field `ipv6` containing: -# * a field `tcp_in` containing: -# * a list of port number where ipv6 tcp in should be ok -# * a field `tcp_out` containing: -# * a list of port number where ipv6 tcp ou should be ok -# * a field `udp_in` containing: -# * a list of port number where ipv6 udp in should be ok -# * a field `udp_out` containing: -# * a list of port number where ipv6 udp out should be ok -# """ -# -# r = {'ipv4': {}, 'ipv6': {}} -# for o in (OuverturePortList.objects.all() -# .prefetch_related('ouvertureport_set') -# .prefetch_related('interface_set', 'interface_set__ipv4')): -# pl = { -# "tcp_in": set(map( -# str, -# o.ouvertureport_set.filter( -# protocole=OuverturePort.TCP, -# io=OuverturePort.IN -# ) -# )), -# "tcp_out": set(map( -# str, -# o.ouvertureport_set.filter( -# protocole=OuverturePort.TCP, -# io=OuverturePort.OUT -# ) -# )), -# "udp_in": set(map( -# str, -# o.ouvertureport_set.filter( -# protocole=OuverturePort.UDP, -# io=OuverturePort.IN -# ) -# )), -# "udp_out": set(map( -# str, -# o.ouvertureport_set.filter( -# protocole=OuverturePort.UDP, -# io=OuverturePort.OUT -# ) -# )), -# } -# for i in filter_active_interfaces(o.interface_set): -# if i.may_have_port_open(): -# d = r['ipv4'].get(i.ipv4.ipv4, {}) -# d["tcp_in"] = (d.get("tcp_in", set()) -# .union(pl["tcp_in"])) -# d["tcp_out"] = (d.get("tcp_out", set()) -# .union(pl["tcp_out"])) -# d["udp_in"] = (d.get("udp_in", set()) -# .union(pl["udp_in"])) -# d["udp_out"] = (d.get("udp_out", set()) -# .union(pl["udp_out"])) -# r['ipv4'][i.ipv4.ipv4] = d -# if i.ipv6(): -# for ipv6 in i.ipv6(): -# d = r['ipv6'].get(ipv6.ipv6, {}) -# d["tcp_in"] = (d.get("tcp_in", set()) -# .union(pl["tcp_in"])) -# d["tcp_out"] = (d.get("tcp_out", set()) -# .union(pl["tcp_out"])) -# d["udp_in"] = (d.get("udp_in", set()) -# .union(pl["udp_in"])) -# d["udp_out"] = (d.get("udp_out", set()) -# .union(pl["udp_out"])) -# r['ipv6'][ipv6.ipv6] = d -# return JSONSuccess(r) -# -# -# @csrf_exempt -# @login_required -# @permission_required('machines.serveur') -# @accept_method(['GET']) -# def dhcp_mac_ip(_request): -# """The list of all active interfaces with all the associated infos -# (MAC, IP, IpType, DNS name and associated zone extension) -# -# Returns: -# GET: -# A JSON Success response with a field `data` containing: -# * a list of dictionnaries (one for each interface) containing: -# * a field `ipv4` containing: -# * a field `ipv4`: the ip for this interface -# * a field `ip_type`: the name of the IpType of this interface -# * a field `mac_address`: the MAC of this interface -# * a field `domain`: the DNS name for this interface -# * a field `extension`: the extension for the DNS zone of this -# interface -# """ -# -# interfaces = all_active_assigned_interfaces() -# seria = InterfaceSerializer(interfaces, many=True) -# return JSONSuccess(seria.data) -# -# -# @csrf_exempt -# @login_required -# @permission_required('machines.serveur') -# @accept_method(['GET']) -# def mailing_standard(_request): -# """All the available standard mailings. -# -# Returns: -# GET: -# A JSONSucess response with a field `data` containing: -# * a list of dictionnaries (one for each mailing) containing: -# * a field `name`: the name of a mailing -# """ -# -# return JSONSuccess([ -# {'name': 'adherents'} -# ]) -# -# -# @csrf_exempt -# @login_required -# @permission_required('machines.serveur') -# @accept_method(['GET']) -# def mailing_standard_ml_members(_request, ml_name): -# """All the members of a specific standard mailing -# -# Returns: -# GET: -# A JSONSucess response with a field `data` containing: -# * a list if dictionnaries (one for each member) containing: -# * a field `email`: the email of the member -# * a field `name`: the name of the member -# * a field `surname`: the surname of the member -# * a field `pseudo`: the pseudo of the member -# """ -# -# # All with active connextion -# if ml_name == 'adherents': -# members = all_has_access().values('email').distinct() -# # Unknown mailing -# else: -# return JSONError("This mailing does not exist") -# seria = MailingMemberSerializer(members, many=True) -# return JSONSuccess(seria.data) -# -# -# @csrf_exempt -# @login_required -# @permission_required('machines.serveur') -# @accept_method(['GET']) -# def mailing_club(_request): -# """All the available club mailings. -# -# Returns: -# GET: -# A JSONSucess response with a field `data` containing: -# * a list of dictionnaries (one for each mailing) containing: -# * a field `name` indicating the name of a mailing -# """ -# -# clubs = Club.objects.filter(mailing=True).values('pseudo') -# seria = MailingSerializer(clubs, many=True) -# return JSONSuccess(seria.data) -# -# -# @csrf_exempt -# @login_required -# @permission_required('machines.serveur') -# @accept_method(['GET']) -# def mailing_club_ml_members(_request, ml_name): -# """All the members of a specific club mailing -# -# Returns: -# GET: -# A JSONSucess response with a field `data` containing: -# * a list if dictionnaries (one for each member) containing: -# * a field `email`: the email of the member -# * a field `name`: the name of the member -# * a field `surname`: the surname of the member -# * a field `pseudo`: the pseudo of the member -# """ -# -# try: -# club = Club.objects.get(mailing=True, pseudo=ml_name) -# except Club.DoesNotExist: -# return JSONError("This mailing does not exist") -# members = club.administrators.all().values('email').distinct() -# seria = MailingMemberSerializer(members, many=True) -# return JSONSuccess(seria.data) From 6b777754e523bfc6bd501476e8f19b4b89b6e4cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Wed, 23 May 2018 15:26:41 +0000 Subject: [PATCH 16/49] API: Add tests --- api/tests.py | 330 ++++++++++++++++++++++++++++++++- re2o/settings_local.example.py | 4 + 2 files changed, 332 insertions(+), 2 deletions(-) diff --git a/api/tests.py b/api/tests.py index bfcda28f..aa4747eb 100644 --- a/api/tests.py +++ b/api/tests.py @@ -23,6 +23,332 @@ The tests for the API module. """ -# from django.test import TestCase +import json +from rest_framework.test import APITestCase +from requests import codes + +#import cotisations.models as cotisations +#import machines.models as machines +#import topologie.models as topologie +import users.models as users + + +class APIEndpointsTestCase(APITestCase): + # URLs that don't require to be authenticated + no_auth_endpoints = [ + '/api/' + ] + # URLs that require to be authenticated and have no special permissions + auth_no_perm_endpoints = [] + # URLs that require to be authenticated and have special permissions + auth_perm_endpoints = [ + '/api/cotisations/articles/', +# '/api/cotisations/articles//', + '/api/cotisations/banques/', +# '/api/cotisations/banques//', + '/api/cotisations/cotisations/', +# '/api/cotisations/cotisations//', + '/api/cotisations/factures/', +# '/api/cotisations/factures//', + '/api/cotisations/paiements/', +# '/api/cotisations/paiements//', + '/api/cotisations/ventes/', +# '/api/cotisations/ventes//', + '/api/machines/domains/', +# '/api/machines/domains//', + '/api/machines/extensions/', +# '/api/machines/extensions//', + '/api/machines/interfaces/', +# '/api/machines/interfaces//', + '/api/machines/iplists/', +# '/api/machines/iplists//', + '/api/machines/iptypes/', +# '/api/machines/iptypes//', + '/api/machines/ipv6lists/', +# '/api/machines/ipv6lists//', + '/api/machines/machines/', +# '/api/machines/machines//', + '/api/machines/machinetypes/', +# '/api/machines/machinetypes//', + '/api/machines/mx/', +# '/api/machines/mx//', + '/api/machines/nas/', +# '/api/machines/nas//', + '/api/machines/ns/', +# '/api/machines/ns//', + '/api/machines/ouvertureportlists/', +# '/api/machines/ouvertureportlists//', + '/api/machines/ouvertureports/', +# '/api/machines/ouvertureports//', + '/api/machines/servicelinks/', +# '/api/machines/servicelinks//', + '/api/machines/services/', +# '/api/machines/services//', + '/api/machines/soa/', +# '/api/machines/soa//', + '/api/machines/srv/', +# '/api/machines/srv//', + '/api/machines/txt/', +# '/api/machines/txt//', + '/api/machines/vlans/', +# '/api/machines/vlans//', + '/api/topologie/acesspoint/', +# '/api/topologie/acesspoint//', + '/api/topologie/building/', +# '/api/topologie/building//', + '/api/topologie/constructorswitch/', +# '/api/topologie/constructorswitch//', + '/api/topologie/modelswitch/', +# '/api/topologie/modelswitch//', + '/api/topologie/room/', +# '/api/topologie/room//', + '/api/topologie/stack/', +# '/api/topologie/stack//', + '/api/topologie/switch/', +# '/api/topologie/switch//', + '/api/topologie/switchbay/', +# '/api/topologie/switchbay//', + '/api/topologie/switchport/', +# '/api/topologie/switchport//', + '/api/users/adherents/', +# '/api/users/adherents//', + '/api/users/bans/', +# '/api/users/bans//', + '/api/users/clubs/', +# '/api/users/clubs//', + '/api/users/listrights/', +# '/api/users/listrights//', + '/api/users/schools/', +# '/api/users/schools//', + '/api/users/serviceusers/', +# '/api/users/serviceusers//', + '/api/users/shells/', +# '/api/users/shells//', + '/api/users/users/', +# '/api/users/users//', + '/api/users/whitelists/', +# '/api/users/whitelists//', + ] + + stduser = None + superuser = None + + @classmethod + def setUpTestData(cls): + # A user with no rights + cls.stduser = users.User.objects.create_user( + "apistduser", + "apistduser", + "apistduser@example.net", + "apistduser" + ) + # A user with all the rights + cls.superuser = users.User.objects.create_superuser( + "apisuperuser", + "apisuperuser", + "apisuperuser@example.net", + "apisuperuser" + ) + + # TODO : + # Create 1 object of every model so there is an exisiting object + # when quering for pk=1 + + @classmethod + def tearDownClass(cls): + cls.stduser.delete() + cls.superuser.delete() + super().tearDownClass() + + def check_responses_code(self, urls, expected_code, formats=[None], + assert_more=None): + """ + Utility function to test if a list of urls answer an expected code + + :param urls: (list) The list of urls to test + :param expected_code: (int) The HTTP return code expected + :param formats: (list) The list of formats to use for the request + (Default: [None]) + :param assert_more: (func) A function to assert more specific data + in the same test. It is evaluated with the responsem object, the + url and the format used. + """ + for url in urls: + for format in formats: + with self.subTest(url=url, format=format): + response = self.client.get(url, format=format) + assert response.status_code == expected_code + if assert_more: + assert_more(response, url, format) + + def test_no_auth_endpoints_with_no_auth(self): + """ + Test that every endpoint that does not require to be authenticated, + returns a Ok (200) response when not authenticated. + """ + urls = [endpoint.replace('', '1') + for endpoint in self.no_auth_endpoints] + self.check_responses_code(urls, codes.ok) + + def test_auth_endpoints_with_no_auth(self): + """ + Test that every endpoint that does require to be authenticated, + returns a Unauthorized (401) response when not authenticated. + """ + urls = [endpoint.replace('', '1') for endpoint in \ + self.auth_no_perm_endpoints + self.auth_perm_endpoints] + self.check_responses_code(urls, codes.unauthorized) + + def test_no_auth_endpoints_with_auth(self): + """ + Test that every endpoint that does not require to be authenticated, + returns a Ok (200) response when authenticated. + """ + self.client.force_authenticate(user=self.stduser) + urls = [endpoint.replace('', '1') + for endpoint in self.no_auth_endpoints] + self.check_responses_code(urls, codes.ok) + + def test_auth_no_perm_endpoints_with_auth_and_no_perm(self): + """ + Test that every endpoint that does require to be authenticated and + no special permissions, returns a Ok (200) response when + authenticated but without permissions. + """ + self.client.force_authenticate(user=self.stduser) + urls = [endpoint.replace('', '1') + for endpoint in self.auth_no_perm_endpoints] + self.check_responses_code(urls, codes.ok) + + def test_auth_perm_endpoints_with_auth_and_no_perm(self): + """ + Test that every endpoint that does require to be authenticated and + special permissions, returns a Forbidden (403) response when + authenticated but without permissions. + """ + self.client.force_authenticate(user=self.stduser) + urls = [endpoint.replace('', '1') + for endpoint in self.auth_perm_endpoints] + self.check_responses_code(urls, codes.forbidden) + + def test_auth_endpoints_with_auth_and_perm(self): + """ + Test that every endpoint that does require to be authenticated, + returns a Ok (200) response when authenticated with all permissions + """ + self.client.force_authenticate(user=self.superuser) + urls = [endpoint.replace('', '1') for endpoint \ + in self.auth_no_perm_endpoints + self.auth_perm_endpoints] + self.check_responses_code(urls, codes.ok) + + def test_endpoints_not_found(self): + """ + Test that every endpoint that uses a primary key parameter, + returns a Not Found (404) response when queried with non-existing + primary key + """ + self.client.force_authenticate(user=self.superuser) + # Select only the URLs with '' and replace it with '42' + urls = [endpoint.replace('', '42') for endpoint in \ + self.no_auth_endpoints + self.auth_no_perm_endpoints + \ + self.auth_perm_endpoints if '' in endpoint] + self.check_responses_code(urls, codes.not_found) + + def test_formats(self): + """ + Test that every endpoint returns a Ok (200) response when using + different formats. Also checks that 'json' format returns a valid json + """ + self.client.force_authenticate(user=self.superuser) + + urls = [endpoint.replace('', '1') for endpoint in \ + self.no_auth_endpoints + self.auth_no_perm_endpoints + \ + self.auth_perm_endpoints] + + def assert_more(response, url, format): + """Assert the response is valid json when format is json""" + if format is 'json': + json.loads(response.content.decode()) + + self.check_responses_code(urls, codes.ok, + formats=[None, 'json', 'api'], + assert_more=assert_more) + +class APIPaginationTestCase(APITestCase): + endpoints = [ + '/api/cotisations/articles/', + '/api/cotisations/banques/', + '/api/cotisations/cotisations/', + '/api/cotisations/factures/', + '/api/cotisations/paiements/', + '/api/cotisations/ventes/', + '/api/machines/domains/', + '/api/machines/extensions/', + '/api/machines/interfaces/', + '/api/machines/iplists/', + '/api/machines/iptypes/', + '/api/machines/ipv6lists/', + '/api/machines/machines/', + '/api/machines/machinetypes/', + '/api/machines/mx/', + '/api/machines/nas/', + '/api/machines/ns/', + '/api/machines/ouvertureportlists/', + '/api/machines/ouvertureports/', + '/api/machines/servicelinks/', + '/api/machines/services/', + '/api/machines/soa/', + '/api/machines/srv/', + '/api/machines/txt/', + '/api/machines/vlans/', + '/api/topologie/acesspoint/', + '/api/topologie/building/', + '/api/topologie/constructorswitch/', + '/api/topologie/modelswitch/', + '/api/topologie/room/', + '/api/topologie/stack/', + '/api/topologie/switch/', + '/api/topologie/switchbay/', + '/api/topologie/switchport/', + '/api/users/adherents/', + '/api/users/bans/', + '/api/users/clubs/', + '/api/users/listrights/', + '/api/users/schools/', + '/api/users/serviceusers/', + '/api/users/shells/', + '/api/users/users/', + '/api/users/whitelists/', + ] + superuser = None + + @classmethod + def setUpTestData(cls): + # A user with all the rights + cls.superuser = users.User.objects.create_superuser( + "apisuperuser", + "apisuperuser", + "apisuperuser@example.net", + "apisuperuser" + ) + + @classmethod + def tearDownClass(cls): + cls.superuser.delete() + super().tearDownClass() + + def test_pagination(self): + """ + Test that every endpoint is using the pagination correctly + """ + self.client.force_authenticate(self.superuser) + for url in self.endpoints: + with self.subTest(url=url): + response = self.client.get(url, format='json') + res_json = json.loads(response.content.decode()) + assert 'count' in res_json.keys() + assert 'next' in res_json.keys() + assert 'previous' in res_json.keys() + assert 'results' in res_json.keys() + assert not len('results') > 100 -# Create your tests here. diff --git a/re2o/settings_local.example.py b/re2o/settings_local.example.py index e15455df..662c1447 100644 --- a/re2o/settings_local.example.py +++ b/re2o/settings_local.example.py @@ -56,6 +56,10 @@ DATABASES = { 'USER': 'db_user_value', 'PASSWORD': DB_PASSWORD, 'HOST': 'db_host_value', + 'TEST': { + 'CHARSET': 'utf8', + 'COLLATION': 'utf8_general_ci' + } }, 'ldap': { # The LDAP 'ENGINE': 'ldapdb.backends.ldap', From 7f6126432bfe4d8684016eccb1d8ae855658f785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Thu, 24 May 2018 17:56:00 +0000 Subject: [PATCH 17/49] Change token data to expiration --- api/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/views.py b/api/views.py index c337de50..ba4129c2 100644 --- a/api/views.py +++ b/api/views.py @@ -331,5 +331,5 @@ class ObtainExpiringAuthToken(ObtainAuthToken): return Response({ 'token': token.key, - 'expiration_date': token.created + token_duration + 'expiration': token.created + token_duration }) From 37458db314ab6b0bc80a78d9295da291b1cd394c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Thu, 24 May 2018 23:02:39 +0000 Subject: [PATCH 18/49] Add custom pagination for setting page_size --- api/pagination.py | 47 +++++++++++++++++++++++++++++++++++++++++++++++ api/settings.py | 2 +- 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 api/pagination.py diff --git a/api/pagination.py b/api/pagination.py new file mode 100644 index 00000000..a6a6adcb --- /dev/null +++ b/api/pagination.py @@ -0,0 +1,47 @@ +from rest_framework import pagination +from django.core import paginator +from django.utils.functional import cached_property + + +class AllowNegativePaginator(paginator.Paginator): + """ + Paginator subclass to allow negative or null `per_page` argument, + meaning to show all items in one page. + """ + def page(self, number): + """ + Bypass the default page creation to render all items if `per_page` + argument is negative or null. + """ + if self.per_page <= 0: + return self._get_page(self.object_list, 1, self) + return super(AllowNegativePaginator, self).page(number) + + @cached_property + def num_pages(self): + """ + Bypass the default number of page to return 1 if `per_page` argument + is negative or null. + """ + if self.per_page <= 0: + return 1 + return super(AllowNegativePaginator, self).num_pages + + +class PageSizedPagination(pagination.PageNumberPagination): + """ + Pagination subclass to all to control the page size + """ + page_size_query_param = 'page_size' + all_pages_strings = ('all',) + django_paginator_class = AllowNegativePaginator + + def get_page_size(self, request): + try: + page_size_str = request.query_params[self.page_size_query_param] + if page_size_str in self.all_pages_strings: + return -1 + except KeyError: + pass + + return super(PageSizedPagination, self).get_page_size(request) diff --git a/api/settings.py b/api/settings.py index 6bf48e33..c1ec4786 100644 --- a/api/settings.py +++ b/api/settings.py @@ -35,7 +35,7 @@ REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'api.permissions.DefaultACLPermission', ), - 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', + 'DEFAULT_PAGINATION_CLASS': 'api.pagination.PageSizedPagination', 'PAGE_SIZE': 100 } From 1f0a3434dd8b7013dc6deb29e41c11f7b605b30a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Thu, 24 May 2018 23:06:03 +0000 Subject: [PATCH 19/49] Limit to 10000 results per_page --- api/pagination.py | 31 ++----------------------------- 1 file changed, 2 insertions(+), 29 deletions(-) diff --git a/api/pagination.py b/api/pagination.py index a6a6adcb..2fc0aaf7 100644 --- a/api/pagination.py +++ b/api/pagination.py @@ -1,31 +1,4 @@ from rest_framework import pagination -from django.core import paginator -from django.utils.functional import cached_property - - -class AllowNegativePaginator(paginator.Paginator): - """ - Paginator subclass to allow negative or null `per_page` argument, - meaning to show all items in one page. - """ - def page(self, number): - """ - Bypass the default page creation to render all items if `per_page` - argument is negative or null. - """ - if self.per_page <= 0: - return self._get_page(self.object_list, 1, self) - return super(AllowNegativePaginator, self).page(number) - - @cached_property - def num_pages(self): - """ - Bypass the default number of page to return 1 if `per_page` argument - is negative or null. - """ - if self.per_page <= 0: - return 1 - return super(AllowNegativePaginator, self).num_pages class PageSizedPagination(pagination.PageNumberPagination): @@ -34,13 +7,13 @@ class PageSizedPagination(pagination.PageNumberPagination): """ page_size_query_param = 'page_size' all_pages_strings = ('all',) - django_paginator_class = AllowNegativePaginator + max_page_size = 10000 def get_page_size(self, request): try: page_size_str = request.query_params[self.page_size_query_param] if page_size_str in self.all_pages_strings: - return -1 + return self.max_page_size except KeyError: pass From f5267eae6c4c1a6dd635904b7e65f41c2fd1bdef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Thu, 24 May 2018 23:07:23 +0000 Subject: [PATCH 20/49] Add DHCP_hostmacip API view --- api/serializers.py | 13 +++++++++++++ api/urls.py | 1 + api/views.py | 12 +++++++++++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/api/serializers.py b/api/serializers.py index fe01bf02..0620d9cc 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -457,3 +457,16 @@ class WhitelistSerializer(NamespacedHMSerializer): class Meta: model = users.Whitelist fields = ('user', 'raison', 'date_start', 'date_end', 'active', 'api_url') + + +# DHCP + + +class HostMacIpSerializer(serializers.ModelSerializer): + hostname = serializers.CharField(source='domain.name', read_only=True) + extension = serializers.CharField(source='domain.extension.name', read_only=True) + ipv4 = serializers.CharField(source='ipv4.ipv4', read_only=True) + + class Meta: + model = machines.Interface + fields = ('hostname', 'extension', 'mac_address', 'ipv4') diff --git a/api/urls.py b/api/urls.py index 03e5026b..cc73ab2c 100644 --- a/api/urls.py +++ b/api/urls.py @@ -89,5 +89,6 @@ router.register(r'users/whitelists', views.WhitelistViewSet) urlpatterns = [ url(r'^', include(router.urls)), + url(r'^dhcp/hostmacip', views.HostMacIpView.as_view()), url(r'^token-auth/', views.ObtainExpiringAuthToken.as_view()) ] diff --git a/api/views.py b/api/views.py index ba4129c2..79f81d33 100644 --- a/api/views.py +++ b/api/views.py @@ -31,7 +31,7 @@ from django.conf import settings from rest_framework.authtoken.views import ObtainAuthToken from rest_framework.authtoken.models import Token from rest_framework.response import Response -from rest_framework import viewsets, status +from rest_framework import viewsets, status, generics import cotisations.models as cotisations import machines.models as machines @@ -39,6 +39,8 @@ import preferences.models as preferences import topologie.models as topologie import users.models as users +from re2o.utils import all_active_interfaces + from . import serializers @@ -310,6 +312,14 @@ class WhitelistViewSet(viewsets.ReadOnlyModelViewSet): queryset = users.Whitelist.objects.all() serializer_class = serializers.WhitelistSerializer + +# DHCP views + +class HostMacIpView(generics.ListAPIView): + queryset = all_active_interfaces() + serializer_class = serializers.HostMacIpSerializer + + # Subclass the standard rest_framework.auth_token.views.ObtainAuthToken # in order to renew the lease of the token and add expiration time class ObtainExpiringAuthToken(ObtainAuthToken): From 3590e1ed512eb0a36625fd5123ab50c59c30e685 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Fri, 25 May 2018 15:36:07 +0000 Subject: [PATCH 21/49] Fix serialization of MAC --- api/serializers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/api/serializers.py b/api/serializers.py index 0620d9cc..37530bbe 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -465,6 +465,7 @@ class WhitelistSerializer(NamespacedHMSerializer): class HostMacIpSerializer(serializers.ModelSerializer): hostname = serializers.CharField(source='domain.name', read_only=True) extension = serializers.CharField(source='domain.extension.name', read_only=True) + mac_address = serializers.CharField(read_only=True) ipv4 = serializers.CharField(source='ipv4.ipv4', read_only=True) class Meta: From ed1284c06dc734fdbccc31ca5a18a4b413164662 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Fri, 25 May 2018 20:10:31 +0000 Subject: [PATCH 22/49] Fix missing view_service_link perm --- .../migrations/0082_auto_20180525_2209.py | 19 +++++++++++++++++++ machines/models.py | 5 +++++ 2 files changed, 24 insertions(+) create mode 100644 machines/migrations/0082_auto_20180525_2209.py diff --git a/machines/migrations/0082_auto_20180525_2209.py b/machines/migrations/0082_auto_20180525_2209.py new file mode 100644 index 00000000..1da2370c --- /dev/null +++ b/machines/migrations/0082_auto_20180525_2209.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2018-05-25 20:09 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('machines', '0081_auto_20180521_1413'), + ] + + operations = [ + migrations.AlterModelOptions( + name='service_link', + options={'permissions': (('view_service_link', 'Peut voir un objet service_link'),)}, + ), + ] diff --git a/machines/models.py b/machines/models.py index fe1923bb..7027ca6f 100644 --- a/machines/models.py +++ b/machines/models.py @@ -1388,6 +1388,11 @@ class Service_link(RevMixin, AclMixin, models.Model): last_regen = models.DateTimeField(auto_now_add=True) asked_regen = models.BooleanField(default=False) + class Meta: + permissions = ( + ("view_service_link", "Peut voir un objet service_link"), + ) + def done_regen(self): """ Appellé lorsqu'un serveur a regénéré son service""" self.last_regen = timezone.now() From 4fe1be5d31942f8d8f84afaed9d28fe772312cb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Sat, 26 May 2018 21:08:03 +0000 Subject: [PATCH 23/49] Allow update and quick check of need_regen info --- api/permissions.py | 12 ++++++------ api/serializers.py | 17 +++++++++++++++++ api/urls.py | 3 ++- api/views.py | 22 ++++++++++++++++++++-- machines/models.py | 14 ++++++++++++++ machines/serializers.py | 2 +- 6 files changed, 60 insertions(+), 10 deletions(-) diff --git a/api/permissions.py b/api/permissions.py index a1d79b21..66480af6 100644 --- a/api/permissions.py +++ b/api/permissions.py @@ -1,4 +1,4 @@ -from rest_framework import permissions +from rest_framework import permissions, exceptions from re2o.acl import can_create, can_edit, can_delete, can_view_all from . import acl @@ -17,17 +17,17 @@ class DefaultACLPermission(permissions.BasePermission): 'OPTIONS': [can_see_api, lambda model: model.can_view_all], 'HEAD': [can_see_api, lambda model: model.can_view_all], 'POST': [can_see_api, lambda model: model.can_create], - #'PUT': [], - #'PATCH': [], - #'DELETE': [], + 'PUT': [], # No restrictions, apply to objects + 'PATCH': [], # No restrictions, apply to objects + 'DELETE': [], # No restrictions, apply to objects } perms_obj_map = { 'GET': [can_see_api, lambda obj: obj.can_view], 'OPTIONS': [can_see_api, lambda obj: obj.can_view], 'HEAD': [can_see_api, lambda obj: obj.can_view], - #'POST': [], + 'POST': [], # No restrictions, apply to models 'PUT': [can_see_api, lambda obj: obj.can_edit], - #'PATCH': [], + 'PATCH': [can_see_api, lambda obj: obj.can_edit], 'DELETE': [can_see_api, lambda obj: obj.can_delete], } diff --git a/api/serializers.py b/api/serializers.py index 37530bbe..b41bd694 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -215,6 +215,8 @@ class ServiceSerializer(NamespacedHMSerializer): class ServiceLinkSerializer(NamespacedHMSerializer): + need_regen = serializers.BooleanField() + class Meta: model = machines.Service_link fields = ('service', 'server', 'last_regen', 'asked_regen', @@ -459,6 +461,21 @@ class WhitelistSerializer(NamespacedHMSerializer): fields = ('user', 'raison', 'date_start', 'date_end', 'active', 'api_url') +# Services + + +class ServiceRegenSerializer(NamespacedHMSerializer): + hostname = serializers.CharField(source='server.domain.name', read_only=True) + service_name = serializers.CharField(source='service.service_type', read_only=True) + + class Meta: + model = machines.Service_link + fields = ('hostname', 'service_name', 'need_regen', 'api_url') + extra_kwargs = { + 'api_url': {'view_name': 'servicelink-detail'} + } + + # DHCP diff --git a/api/urls.py b/api/urls.py index cc73ab2c..fc8ef7ef 100644 --- a/api/urls.py +++ b/api/urls.py @@ -90,5 +90,6 @@ router.register(r'users/whitelists', views.WhitelistViewSet) urlpatterns = [ url(r'^', include(router.urls)), url(r'^dhcp/hostmacip', views.HostMacIpView.as_view()), - url(r'^token-auth/', views.ObtainExpiringAuthToken.as_view()) + url(r'^services/regen', views.ServiceRegenView.as_view()), + url(r'^token-auth', views.ObtainExpiringAuthToken.as_view()) ] diff --git a/api/views.py b/api/views.py index 79f81d33..036a9241 100644 --- a/api/views.py +++ b/api/views.py @@ -31,7 +31,7 @@ from django.conf import settings from rest_framework.authtoken.views import ObtainAuthToken from rest_framework.authtoken.models import Token from rest_framework.response import Response -from rest_framework import viewsets, status, generics +from rest_framework import viewsets, generics import cotisations.models as cotisations import machines.models as machines @@ -160,7 +160,7 @@ class ServiceViewSet(viewsets.ReadOnlyModelViewSet): serializer_class = serializers.ServiceSerializer -class ServiceLinkViewSet(viewsets.ReadOnlyModelViewSet): +class ServiceLinkViewSet(viewsets.ModelViewSet): queryset = machines.Service_link.objects.all() serializer_class = serializers.ServiceLinkSerializer @@ -313,6 +313,24 @@ class WhitelistViewSet(viewsets.ReadOnlyModelViewSet): serializer_class = serializers.WhitelistSerializer +# Services views + + +class ServiceRegenView(generics.ListAPIView): + serializer_class = serializers.ServiceRegenSerializer + + def get_queryset(self): + queryset = machines.Service_link.objects.select_related( + 'server__domain' + ).select_related( + 'service' + ) + if 'hostname' in self.request.GET: + hostname = self.request.GET['hostname'] + queryset = queryset.filter(server__domain__name__iexact=hostname) + return queryset + + # DHCP views class HostMacIpView(generics.ListAPIView): diff --git a/machines/models.py b/machines/models.py index 7027ca6f..82d6e21f 100644 --- a/machines/models.py +++ b/machines/models.py @@ -1399,6 +1399,7 @@ class Service_link(RevMixin, AclMixin, models.Model): self.asked_regen = False self.save() + @property def need_regen(self): """ Décide si le temps minimal écoulé est suffisant pour provoquer une régénération de service""" @@ -1411,6 +1412,19 @@ class Service_link(RevMixin, AclMixin, models.Model): ) < timezone.now() ) + @need_regen.setter + def need_regen(self, value): + """ + Force to set the need_regen value. True means a regen is asked and False + means a regen has been done. + + :param value: (bool) The value to set to + """ + if not value: + self.last_regen = timezone.now() + self.asked_regen = value + self.save() + def __str__(self): return str(self.server) + " " + str(self.service) diff --git a/machines/serializers.py b/machines/serializers.py index 9476e9d0..f3a47c55 100644 --- a/machines/serializers.py +++ b/machines/serializers.py @@ -376,7 +376,7 @@ class ServiceServersSerializer(serializers.ModelSerializer): @staticmethod def get_regen_status(obj): """ The string representation of the regen status """ - return obj.need_regen() + return obj.need_regen class OuverturePortsSerializer(serializers.Serializer): From e6884ab4da2022d2d24cef209be1b1167b8fd376 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Sun, 10 Jun 2018 00:47:25 +0000 Subject: [PATCH 24/49] Add DNS info per zone endpoint --- api/serializers.py | 94 +++++++++++++++++++++++++++++++++++++++++++++- api/urls.py | 1 + api/views.py | 7 ++++ machines/models.py | 9 +++++ 4 files changed, 109 insertions(+), 2 deletions(-) diff --git a/api/serializers.py b/api/serializers.py index b41bd694..44dfc0bc 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -190,8 +190,7 @@ class InterfaceSerializer(NamespacedHMSerializer): class Ipv6ListSerializer(NamespacedHMSerializer): class Meta: model = machines.Ipv6List - fields = ('ipv6', 'interface', 'slaac_ip', 'date_end', - 'api_url') + fields = ('ipv6', 'interface', 'slaac_ip', 'api_url') class DomainSerializer(NamespacedHMSerializer): @@ -488,3 +487,94 @@ class HostMacIpSerializer(serializers.ModelSerializer): class Meta: model = machines.Interface fields = ('hostname', 'extension', 'mac_address', 'ipv4') + + +# DNS + + +class SOARecordSerializer(SOASerializer): + class Meta: + model = machines.SOA + fields = ('name', 'mail', 'refresh', 'retry', 'expire', 'ttl') + + +class OriginV4RecordSerializer(IpListSerializer): + class Meta(IpListSerializer.Meta): + fields = ('ipv4',) + + +class OriginV6RecordSerializer(Ipv6ListSerializer): + class Meta(Ipv6ListSerializer.Meta): + fields = ('ipv6',) + + +class NSRecordSerializer(NsSerializer): + target = serializers.CharField(source='ns.name', read_only=True) + + class Meta(NsSerializer.Meta): + fields = ('target',) + + +class MXRecordSerializer(MxSerializer): + target = serializers.CharField(source='name.name', read_only=True) + + class Meta(MxSerializer.Meta): + fields = ('target', 'priority') + + +class TXTRecordSerializer(TxtSerializer): + class Meta(TxtSerializer.Meta): + fields = ('field1', 'field2') + + +class SRVRecordSerializer(SrvSerializer): + target = serializers.CharField(source='target.name', read_only=True) + + class Meta(SrvSerializer.Meta): + fields = ('service', 'protocole', 'ttl', 'priority', 'weight', 'port', 'target') + + +class ARecordSerializer(serializers.ModelSerializer): + hostname = serializers.CharField(source='domain.name', read_only=True) + ipv4 = serializers.CharField(source='ipv4.ipv4', read_only=True) + + class Meta: + model = machines.Interface + fields = ('hostname', 'ipv4') + + +class AAAARecordSerializer(serializers.ModelSerializer): + hostname = serializers.CharField(source='domain.name', read_only=True) + ipv6 = serializers.CharField(read_only=True) + + class Meta: + model = machines.Interface + fields = ('hostname', 'ipv6') + + +class CNAMERecordSerializer(serializers.ModelSerializer): + alias = serializers.CharField(source='cname.name', read_only=True) + hostname = serializers.CharField(source='name', read_only=True) + + class Meta: + model = machines.Domain + fields = ('alias', 'hostname') + + +class DNSZonesSerializer(serializers.ModelSerializer): + soa = SOARecordSerializer() + ns_records = NSRecordSerializer(many=True, source='ns_set') + originv4 = OriginV4RecordSerializer(source='origin') + originv6 = OriginV6RecordSerializer(source='origin_v6') + mx_records = MXRecordSerializer(many=True, source='mx_set') + txt_records = TXTRecordSerializer(many=True, source='txt_set') + srv_records = SRVRecordSerializer(many=True, source='srv_set') + a_records = ARecordSerializer(many=True, source='get_associated_a_records') + aaaa_records = AAAARecordSerializer(many=True, source='get_associated_aaaa_records') + cname_records = CNAMERecordSerializer(many=True, source='get_associated_cname_records') + + class Meta: + model = machines.Extension + fields = ('name', 'soa', 'ns_records', 'originv4', 'originv6', + 'mx_records', 'txt_records', 'srv_records', 'a_records', + 'aaaa_records', 'cname_records') diff --git a/api/urls.py b/api/urls.py index fc8ef7ef..07f83afb 100644 --- a/api/urls.py +++ b/api/urls.py @@ -90,6 +90,7 @@ router.register(r'users/whitelists', views.WhitelistViewSet) urlpatterns = [ url(r'^', include(router.urls)), url(r'^dhcp/hostmacip', views.HostMacIpView.as_view()), + url(r'^dns/zones', views.DNSZonesView.as_view()), url(r'^services/regen', views.ServiceRegenView.as_view()), url(r'^token-auth', views.ObtainExpiringAuthToken.as_view()) ] diff --git a/api/views.py b/api/views.py index 036a9241..1530fbb3 100644 --- a/api/views.py +++ b/api/views.py @@ -338,6 +338,13 @@ class HostMacIpView(generics.ListAPIView): serializer_class = serializers.HostMacIpSerializer +# DNS views + +class DNSZonesView(generics.ListAPIView): + queryset = machines.Extension.objects.all() + serializer_class = serializers.DNSZonesSerializer + + # Subclass the standard rest_framework.auth_token.views.ObtainAuthToken # in order to renew the lease of the token and add expiration time class ObtainExpiringAuthToken(ObtainAuthToken): diff --git a/machines/models.py b/machines/models.py index 82d6e21f..817e9d5a 100644 --- a/machines/models.py +++ b/machines/models.py @@ -562,6 +562,15 @@ class Extension(RevMixin, AclMixin, models.Model): entry += "@ IN AAAA " + str(self.origin_v6) return entry + def get_associated_a_records(self): + return Interface.objects.filter(type__ip_type__extension=self).filter(ipv4__isnull=False) + + def get_associated_aaaa_records(self): + return Interface.objects.filter(type__ip_type__extension=self) + + def get_associated_cname_records(self): + return Domain.objects.filter(extension=self).filter(cname__isnull=False) + @staticmethod def can_use_all(user_request, *_args, **_kwargs): """Superdroit qui permet d'utiliser toutes les extensions sans From 197475409c23dd6d3795ecf538bf655f8f7a3d6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Sun, 10 Jun 2018 00:50:57 +0000 Subject: [PATCH 25/49] DNS Zone endpoint is now a viewset --- api/serializers.py | 7 +++++-- api/urls.py | 3 ++- api/views.py | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/api/serializers.py b/api/serializers.py index 44dfc0bc..608e077d 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -561,7 +561,7 @@ class CNAMERecordSerializer(serializers.ModelSerializer): fields = ('alias', 'hostname') -class DNSZonesSerializer(serializers.ModelSerializer): +class DNSZonesSerializer(NamespacedHMSerializer): soa = SOARecordSerializer() ns_records = NSRecordSerializer(many=True, source='ns_set') originv4 = OriginV4RecordSerializer(source='origin') @@ -577,4 +577,7 @@ class DNSZonesSerializer(serializers.ModelSerializer): model = machines.Extension fields = ('name', 'soa', 'ns_records', 'originv4', 'originv6', 'mx_records', 'txt_records', 'srv_records', 'a_records', - 'aaaa_records', 'cname_records') + 'aaaa_records', 'cname_records', 'api_url') + extra_kwargs = { + 'api_url': {'view_name': 'dnszone-detail'} + } diff --git a/api/urls.py b/api/urls.py index 07f83afb..8138facb 100644 --- a/api/urls.py +++ b/api/urls.py @@ -86,11 +86,12 @@ router.register(r'users/listrights', views.ListRightViewSet) router.register(r'users/shells', views.ShellViewSet, base_name='shell') router.register(r'users/bans', views.BanViewSet) router.register(r'users/whitelists', views.WhitelistViewSet) +# DNS +router.register(r'dns/zones', views.DNSZonesViewSet, base_name='dnszone') urlpatterns = [ url(r'^', include(router.urls)), url(r'^dhcp/hostmacip', views.HostMacIpView.as_view()), - url(r'^dns/zones', views.DNSZonesView.as_view()), url(r'^services/regen', views.ServiceRegenView.as_view()), url(r'^token-auth', views.ObtainExpiringAuthToken.as_view()) ] diff --git a/api/views.py b/api/views.py index 1530fbb3..36061deb 100644 --- a/api/views.py +++ b/api/views.py @@ -340,7 +340,7 @@ class HostMacIpView(generics.ListAPIView): # DNS views -class DNSZonesView(generics.ListAPIView): +class DNSZonesViewSet(viewsets.ReadOnlyModelViewSet): queryset = machines.Extension.objects.all() serializer_class = serializers.DNSZonesSerializer From 761fad578a2b7865ad68d78ceda4a58a1afaaf70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Sun, 10 Jun 2018 13:41:31 +0000 Subject: [PATCH 26/49] DNS view is a generic view and service regen view is a viewset --- CHANGELOG.md | 10 ++++++++++ api/serializers.py | 14 +++++--------- api/urls.py | 7 ++++--- api/views.py | 6 +++--- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b65a4ae..b41b96eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,3 +43,13 @@ Refactored install_re2o.sh script. install_re2o.sh help ``` * The installation templates (LDIF files and `re2o/settings_locale.example.py`) have been changed to use `example.net` instead of `example.org` (more neutral and generic) + + + +## MR XXX: Cleanup and refactor API + +Activate HTTP Authorization passthrough in by adding the following in /etc/apache2/site-available/re2o.conf (example in install_utils/apache2/re2o.conf): +``` + WSGIPassAuthorization On +``` + diff --git a/api/serializers.py b/api/serializers.py index 608e077d..647f9d26 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -214,8 +214,6 @@ class ServiceSerializer(NamespacedHMSerializer): class ServiceLinkSerializer(NamespacedHMSerializer): - need_regen = serializers.BooleanField() - class Meta: model = machines.Service_link fields = ('service', 'server', 'last_regen', 'asked_regen', @@ -466,12 +464,13 @@ class WhitelistSerializer(NamespacedHMSerializer): class ServiceRegenSerializer(NamespacedHMSerializer): hostname = serializers.CharField(source='server.domain.name', read_only=True) service_name = serializers.CharField(source='service.service_type', read_only=True) + need_regen = serializers.BooleanField() class Meta: model = machines.Service_link fields = ('hostname', 'service_name', 'need_regen', 'api_url') extra_kwargs = { - 'api_url': {'view_name': 'servicelink-detail'} + 'api_url': {'view_name': 'serviceregen-detail'} } @@ -545,7 +544,7 @@ class ARecordSerializer(serializers.ModelSerializer): class AAAARecordSerializer(serializers.ModelSerializer): hostname = serializers.CharField(source='domain.name', read_only=True) - ipv6 = serializers.CharField(read_only=True) + ipv6 = Ipv6ListSerializer(many=True, read_only=True) class Meta: model = machines.Interface @@ -561,7 +560,7 @@ class CNAMERecordSerializer(serializers.ModelSerializer): fields = ('alias', 'hostname') -class DNSZonesSerializer(NamespacedHMSerializer): +class DNSZonesSerializer(serializers.ModelSerializer): soa = SOARecordSerializer() ns_records = NSRecordSerializer(many=True, source='ns_set') originv4 = OriginV4RecordSerializer(source='origin') @@ -577,7 +576,4 @@ class DNSZonesSerializer(NamespacedHMSerializer): model = machines.Extension fields = ('name', 'soa', 'ns_records', 'originv4', 'originv6', 'mx_records', 'txt_records', 'srv_records', 'a_records', - 'aaaa_records', 'cname_records', 'api_url') - extra_kwargs = { - 'api_url': {'view_name': 'dnszone-detail'} - } + 'aaaa_records', 'cname_records') diff --git a/api/urls.py b/api/urls.py index 8138facb..57ce1e12 100644 --- a/api/urls.py +++ b/api/urls.py @@ -86,12 +86,13 @@ router.register(r'users/listrights', views.ListRightViewSet) router.register(r'users/shells', views.ShellViewSet, base_name='shell') router.register(r'users/bans', views.BanViewSet) router.register(r'users/whitelists', views.WhitelistViewSet) -# DNS -router.register(r'dns/zones', views.DNSZonesViewSet, base_name='dnszone') +# SERVICES REGEN +router.register(r'services/regen', views.ServiceRegenViewSet, base_name='serviceregen') + urlpatterns = [ url(r'^', include(router.urls)), url(r'^dhcp/hostmacip', views.HostMacIpView.as_view()), - url(r'^services/regen', views.ServiceRegenView.as_view()), + url(r'^dns/zones', views.DNSZonesView.as_view()), url(r'^token-auth', views.ObtainExpiringAuthToken.as_view()) ] diff --git a/api/views.py b/api/views.py index 36061deb..b290d578 100644 --- a/api/views.py +++ b/api/views.py @@ -160,7 +160,7 @@ class ServiceViewSet(viewsets.ReadOnlyModelViewSet): serializer_class = serializers.ServiceSerializer -class ServiceLinkViewSet(viewsets.ModelViewSet): +class ServiceLinkViewSet(viewsets.ReadOnlyModelViewSet): queryset = machines.Service_link.objects.all() serializer_class = serializers.ServiceLinkSerializer @@ -316,7 +316,7 @@ class WhitelistViewSet(viewsets.ReadOnlyModelViewSet): # Services views -class ServiceRegenView(generics.ListAPIView): +class ServiceRegenViewSet(viewsets.ModelViewSet): serializer_class = serializers.ServiceRegenSerializer def get_queryset(self): @@ -340,7 +340,7 @@ class HostMacIpView(generics.ListAPIView): # DNS views -class DNSZonesViewSet(viewsets.ReadOnlyModelViewSet): +class DNSZonesView(generics.ListAPIView): queryset = machines.Extension.objects.all() serializer_class = serializers.DNSZonesSerializer From 0356947e4a2f79ec1c3fccf670124b00911ff684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Sun, 10 Jun 2018 15:12:42 +0000 Subject: [PATCH 27/49] Add endpoints for mailing --- api/serializers.py | 15 +++++++++++++++ api/urls.py | 2 ++ api/views.py | 25 +++++++++++++++++++++++-- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/api/serializers.py b/api/serializers.py index 647f9d26..1a1f970e 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -577,3 +577,18 @@ class DNSZonesSerializer(serializers.ModelSerializer): fields = ('name', 'soa', 'ns_records', 'originv4', 'originv6', 'mx_records', 'txt_records', 'srv_records', 'a_records', 'aaaa_records', 'cname_records') + + +# Mailing + + +class MailingMemberSerializer(UserSerializer): + class Meta(UserSerializer.Meta): + fields = ('name', 'pseudo', 'email') + +class MailingSerializer(ClubSerializer): + members = MailingMemberSerializer(many=True) + admins = MailingMemberSerializer(source='administrators', many=True) + + class Meta(ClubSerializer.Meta): + fields = ('name', 'members', 'admins') diff --git a/api/urls.py b/api/urls.py index 57ce1e12..1d244de8 100644 --- a/api/urls.py +++ b/api/urls.py @@ -94,5 +94,7 @@ urlpatterns = [ url(r'^', include(router.urls)), url(r'^dhcp/hostmacip', views.HostMacIpView.as_view()), url(r'^dns/zones', views.DNSZonesView.as_view()), + url(r'^mailing/standard', views.StandardMailingView.as_view()), + url(r'^mailing/club', views.ClubMailingView.as_view()), url(r'^token-auth', views.ObtainExpiringAuthToken.as_view()) ] diff --git a/api/views.py b/api/views.py index b290d578..fce0bc23 100644 --- a/api/views.py +++ b/api/views.py @@ -31,7 +31,7 @@ from django.conf import settings from rest_framework.authtoken.views import ObtainAuthToken from rest_framework.authtoken.models import Token from rest_framework.response import Response -from rest_framework import viewsets, generics +from rest_framework import viewsets, generics, views import cotisations.models as cotisations import machines.models as machines @@ -39,9 +39,10 @@ import preferences.models as preferences import topologie.models as topologie import users.models as users -from re2o.utils import all_active_interfaces +from re2o.utils import all_active_interfaces, all_has_access from . import serializers +from .pagination import PageSizedPagination # COTISATIONS APP @@ -345,6 +346,26 @@ class DNSZonesView(generics.ListAPIView): serializer_class = serializers.DNSZonesSerializer +# Mailing views + + +class StandardMailingView(views.APIView): + pagination_class = PageSizedPagination + get_queryset = lambda self: all_has_access() + + def get(self, request, format=None): + adherents_data = serializers.MailingMemberSerializer(self.get_queryset(), many=True).data + data = [{'name': 'adherents', 'members': adherents_data}] + paginator = self.pagination_class() + paginator.paginate_queryset(data, request) + return paginator.get_paginated_response(data) + + +class ClubMailingView(generics.ListAPIView): + queryset = users.Club.objects.all() + serializer_class = serializers.MailingSerializer + + # Subclass the standard rest_framework.auth_token.views.ObtainAuthToken # in order to renew the lease of the token and add expiration time class ObtainExpiringAuthToken(ObtainAuthToken): From ca0744a38c29b580c60813ee212e7b688d529ef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Wed, 13 Jun 2018 22:39:37 +0000 Subject: [PATCH 28/49] Add customizable ACL-based permission --- api/permissions.py | 79 +++++++++++++++++++++++++++++++++++----------- api/settings.py | 2 +- api/views.py | 6 ++-- 3 files changed, 66 insertions(+), 21 deletions(-) diff --git a/api/permissions.py b/api/permissions.py index 66480af6..e04abdaf 100644 --- a/api/permissions.py +++ b/api/permissions.py @@ -3,14 +3,69 @@ from re2o.acl import can_create, can_edit, can_delete, can_view_all from . import acl -def can_see_api(_): +def can_see_api(*_, **__): return lambda user: acl.can_view(user) -class DefaultACLPermission(permissions.BasePermission): +def _get_param_in_view(view, param_name): + assert hasattr(view, 'get_'+param_name) \ + or getattr(view, param_name, None) is not None, ( + 'cannot apply {} on a view that does not set ' + '`.{}` or have a `.get_{}()` method.' + ).format(self.__class__.__name__, param_name, param_name) + + if hasattr(view, 'get_'+param_name): + param = getattr(view, 'get_'+param_name)() + assert param is not None, ( + '{}.get_{}() returned None' + ).format(view.__class__.__name__, param_name) + return param + return getattr(view, param_name) + + +class ACLPermission(permissions.BasePermission): + """ + Permission subclass for views that requires a specific model-based + permission or don't define a queryset + """ + + def get_required_permissions(self, method, view): + """ + Given a list of models and an HTTP method, return the list + of acl functions that the user is required to verify. + """ + perms_map = _get_param_in_view(view, 'perms_map') + + if method not in perms_map: + raise exceptions.MethodNotAllowed(method) + + return [can_see_api()] + list(perms_map[method]) + + def has_permission(self, request, view): + # Workaround to ensure ACLPermissions are not applied + # to the root view when using DefaultRouter. + if getattr(view, '_ignore_model_permissions', False): + return True + + if not request.user or not request.user.is_authenticated: + return False + + perms = self.get_required_permissions(request.method, view) + + return all(perm(request.user)[0] for perm in perms) + + def has_object_permission(self, request, view, obj): + # Should never be called here but documentation + # requires to implement this function + return False + + +class AutodetectACLPermission(permissions.BasePermission): """ Permission subclass in charge of checking the ACL to determine - if a user can access the models + if a user can access the models. Autodetect which ACL are required + based on a queryset. Requires `.queryset` or `.get_queryset()` + to be defined in the view. """ perms_map = { 'GET': [can_see_api, lambda model: model.can_view_all], @@ -46,29 +101,17 @@ class DefaultACLPermission(permissions.BasePermission): Given an object and an HTTP method, return the list of acl functions that the user is required to verify. """ - if method not in self.perms_map: + if method not in self.perms_obj_map: raise exceptions.MethodNotAllowed(method) - return [perm(obj) for perm in self.perms_map[method]] + return [perm(obj) for perm in self.perms_obj_map[method]] def _queryset(self, view): """ Return the queryset associated with view and raise an error is there is none. """ - assert hasattr(view, 'get_queryset') \ - or getattr(view, 'queryset', None) is not None, ( - 'Cannot apply {} on a view that does not set ' - '`.queryset` or have a `.get_queryset()` method.' - ).format(self.__class__.__name__) - - if hasattr(view, 'get_queryset'): - queryset = view.get_queryset() - assert queryset is not None, ( - '{}.get_queryset() returned None'.format(view.__class__.__name__) - ) - return queryset - return view.queryset + return _get_param_in_view(view, 'queryset') def has_permission(self, request, view): # Workaround to ensure ACLPermissions are not applied diff --git a/api/settings.py b/api/settings.py index c1ec4786..cd19594e 100644 --- a/api/settings.py +++ b/api/settings.py @@ -33,7 +33,7 @@ REST_FRAMEWORK = { 'rest_framework.authentication.SessionAuthentication', ), 'DEFAULT_PERMISSION_CLASSES': ( - 'api.permissions.DefaultACLPermission', + 'api.permissions.AutodetectACLPermission', ), 'DEFAULT_PAGINATION_CLASS': 'api.pagination.PageSizedPagination', 'PAGE_SIZE': 100 diff --git a/api/views.py b/api/views.py index fce0bc23..99ee3e44 100644 --- a/api/views.py +++ b/api/views.py @@ -43,6 +43,7 @@ from re2o.utils import all_active_interfaces, all_has_access from . import serializers from .pagination import PageSizedPagination +from .permissions import ACLPermission # COTISATIONS APP @@ -351,10 +352,11 @@ class DNSZonesView(generics.ListAPIView): class StandardMailingView(views.APIView): pagination_class = PageSizedPagination - get_queryset = lambda self: all_has_access() + permission_classes = (ACLPermission, ) + perms_map = {'GET' : [users.User.can_view_all]} def get(self, request, format=None): - adherents_data = serializers.MailingMemberSerializer(self.get_queryset(), many=True).data + adherents_data = serializers.MailingMemberSerializer(all_has_access(), many=True).data data = [{'name': 'adherents', 'members': adherents_data}] paginator = self.pagination_class() paginator.paginate_queryset(data, request) From 3a0dda0009e11030ba5181b4acc9bc00c73a7ae7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Sat, 16 Jun 2018 18:35:08 +0000 Subject: [PATCH 29/49] Add preferences API endpoints --- api/serializers.py | 118 ++++++++++++++++++++++----------------------- api/urls.py | 22 ++++++--- api/views.py | 106 +++++++++++++++++++++++++--------------- 3 files changed, 140 insertions(+), 106 deletions(-) diff --git a/api/serializers.py b/api/serializers.py index 1a1f970e..9f4b89ed 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -239,66 +239,64 @@ class OuverturePortSerializer(NamespacedHMSerializer): # PREFERENCES APP -# class OptionalUserSerializer(NamespacedHMSerializer): -# tel_mandatory = serializers.BooleanField(source='is_tel_mandatory') -# -# class Meta: -# model = preferences.OptionalUser -# fields = ('tel_mandatory', 'user_solde', 'solde_negatif', 'max_solde', -# 'min_online_payement', 'gpg_fingerprint', -# 'all_can_create_club', 'self_adhesion', 'shell_default', -# 'api_url') -# -# -# class OptionalMachineSerializer(NamespacedHMSerializer): -# class Meta: -# model = preferences.OptionalMachine -# fields = ('password_machine', 'max_lambdauser_interfaces', -# 'max_lambdauser_aliases', 'ipv6_mode', 'create_machine', -# 'ipv6', 'api_url') -# -# -# class OptionalTopologieSerializer(NamespacedHMSerializer): -# class Meta: -# model = preferences.OptionalTopologie -# fields = ('radius_general_policy', 'vlan_decision_ok', -# 'vlan_decision_no', 'api_url') -# -# -# class GeneralOptionSerializer(NamespacedHMSerializer): -# class Meta: -# model = preferences.GeneralOption -# fields = ('general_message', 'search_display_page', -# 'pagination_number', 'pagination_large_number', -# 'req_expire_hrs', 'site_name', 'email_from', 'GTU_sum_up', -# 'GTU', 'api_url') -# -# -# class ServiceOptionSerializer(NamespacedHMSerializer): -# class Meta: -# model = preferences.ServiceOption -# fields = ('name', 'url', 'description', 'image', 'api_url') -# -# -# class AssoOptionSerializer(NamespacedHMSerializer): -# class Meta: -# model = preferences.AssoOption -# fields = ('name', 'siret', 'adresse1', 'adresse2', 'contact', -# 'telephone', 'pseudo', 'utilisateur_asso', 'payement', -# 'payement_id', 'payement_pass', 'description', 'api_url') -# -# -# class HomeOptionSerializer(NamespacedHMSerializer): -# class Meta: -# model = preferences.HomeOption -# fields = ('facebook_url', 'twitter_url', 'twitter_account_name', -# 'api_url') -# -# -# class MailMessageOptionSerializer(NamespacedHMSerializer): -# class Meta: -# model = preferences.MailMessageOption -# fields = ('welcome_mail_fr', 'welcome_mail_en', 'api_url') +class OptionalUserSerializer(NamespacedHMSerializer): + tel_mandatory = serializers.BooleanField(source='is_tel_mandatory') + + class Meta: + model = preferences.OptionalUser + fields = ('tel_mandatory', 'user_solde', 'solde_negatif', 'max_solde', + 'min_online_payment', 'gpg_fingerprint', + 'all_can_create_club', 'self_adhesion', 'shell_default') + + +class OptionalMachineSerializer(NamespacedHMSerializer): + class Meta: + model = preferences.OptionalMachine + fields = ('password_machine', 'max_lambdauser_interfaces', + 'max_lambdauser_aliases', 'ipv6_mode', 'create_machine', + 'ipv6') + + +class OptionalTopologieSerializer(NamespacedHMSerializer): + class Meta: + model = preferences.OptionalTopologie + fields = ('radius_general_policy', 'vlan_decision_ok', + 'vlan_decision_nok') + + +class GeneralOptionSerializer(NamespacedHMSerializer): + class Meta: + model = preferences.GeneralOption + fields = ('general_message', 'search_display_page', + 'pagination_number', 'pagination_large_number', + 'req_expire_hrs', 'site_name', 'email_from', 'GTU_sum_up', + 'GTU') + + +class ServiceSerializer(NamespacedHMSerializer): + class Meta: + model = preferences.Service + fields = ('name', 'url', 'description', 'image', 'api_url') + + +class AssoOptionSerializer(NamespacedHMSerializer): + class Meta: + model = preferences.AssoOption + fields = ('name', 'siret', 'adresse1', 'adresse2', 'contact', + 'telephone', 'pseudo', 'utilisateur_asso', 'payment', + 'payment_id', 'payment_pass', 'description') + + +class HomeOptionSerializer(NamespacedHMSerializer): + class Meta: + model = preferences.HomeOption + fields = ('facebook_url', 'twitter_url', 'twitter_account_name') + + +class MailMessageOptionSerializer(NamespacedHMSerializer): + class Meta: + model = preferences.MailMessageOption + fields = ('welcome_mail_fr', 'welcome_mail_en') diff --git a/api/urls.py b/api/urls.py index 1d244de8..dd3783dc 100644 --- a/api/urls.py +++ b/api/urls.py @@ -58,14 +58,7 @@ router.register(r'machines/servicelinks', views.ServiceLinkViewSet, base_name='s router.register(r'machines/ouvertureportlists', views.OuverturePortListViewSet) router.register(r'machines/ouvertureports', views.OuverturePortViewSet) # PREFERENCES APP -#router.register(r'preferences/optionaluser', views.OptionalUserSerializer) -#router.register(r'preferences/optionalmachine', views.OptionalMachineSerializer) -#router.register(r'preferences/optionaltopologie', views.OptionalTopologieSerializer) -#router.register(r'preferences/generaloption', views.GeneralOptionSerializer) -#router.register(r'preferences/serviceoption', views.ServiceOptionSerializer) -#router.register(r'preferences/assooption', views.AssoOptionSerializer) -#router.register(r'preferences/homeoption', views.HomeOptionSerializer) -#router.register(r'preferences/mailmessageoption', views.MailMessageOptionSerializer) +router.register(r'preferences/service', views.ServiceViewSet), # TOPOLOGIE APP router.register(r'topologie/stack', views.StackViewSet) router.register(r'topologie/acesspoint', views.AccessPointViewSet) @@ -91,10 +84,23 @@ router.register(r'services/regen', views.ServiceRegenViewSet, base_name='service urlpatterns = [ + # VIEWSETS url(r'^', include(router.urls)), + # PREFERENCES APP + url(r'^preferences/optionaluser', views.OptionalUserView.as_view()), + url(r'^preferences/optionalmachine', views.OptionalMachineView.as_view()), + url(r'^preferences/optionaltopologie', views.OptionalTopologieView.as_view()), + url(r'^preferences/generaloption', views.GeneralOptionView.as_view()), + url(r'^preferences/assooption', views.AssoOptionView.as_view()), + url(r'^preferences/homeoption', views.HomeOptionView.as_view()), + url(r'^preferences/mailmessageoption', views.MailMessageOptionView.as_view()), + # DHCP url(r'^dhcp/hostmacip', views.HostMacIpView.as_view()), + # DNS url(r'^dns/zones', views.DNSZonesView.as_view()), + # MAILING url(r'^mailing/standard', views.StandardMailingView.as_view()), url(r'^mailing/club', views.ClubMailingView.as_view()), + # TOKEN-AUTH url(r'^token-auth', views.ObtainExpiringAuthToken.as_view()) ] diff --git a/api/views.py b/api/views.py index 99ee3e44..7d4aaffc 100644 --- a/api/views.py +++ b/api/views.py @@ -178,45 +178,75 @@ class OuverturePortViewSet(viewsets.ReadOnlyModelViewSet): # PREFERENCES APP +# Those views differ a bit because there is only one object +# to display, so we don't bother with the listing part -# class OptionalUserViewSet(viewsets.ReadOnlyModelViewSet): -# queryset = preferences.OptionalUser.objects.all() -# serializer_class = serializers.OptionalUserSerializer -# -# -# class OptionalMachineViewSet(viewsets.ReadOnlyModelViewSet): -# queryset = preferences.OptionalMachine.objects.all() -# serializer_class = serializers.OptionalMachineSerializer -# -# -# class OptionalTopologieViewSet(viewsets.ReadOnlyModelViewSet): -# queryset = preferences.OptionalTopologie.objects.all() -# serializer_class = serializers.OptionalTopologieSerializer -# -# -# class GeneralOptionViewSet(viewsets.ReadOnlyModelViewSet): -# queryset = preferences.GeneralOption.objects.all() -# serializer_class = serializers.GeneralOptionSerializer -# -# -# class ServiceOptionViewSet(viewsets.ReadOnlyModelViewSet): -# queryset = preferences.ServiceOption.objects.all() -# serializer_class = serializers.ServiceOptionSerializer -# -# -# class AssoOptionViewSet(viewsets.ReadOnlyModelViewSet): -# queryset = preferences.AssoOption.objects.all() -# serializer_class = serializers.AssoOptionSerializer -# -# -# class HomeOptionViewSet(viewsets.ReadOnlyModelViewSet): -# queryset = preferences.HomeOption.objects.all() -# serializer_class = serializers.HomeOptionSerializer -# -# -# class MailMessageOptionViewSet(viewsets.ReadOnlyModelViewSet): -# queryset = preferences.MailMessageOption.objects.all() -# serializer_class = serializers.MailMessageOptionSerializer +class OptionalUserView(generics.RetrieveAPIView): + permission_classes = (ACLPermission, ) + perms_map = {'GET' : [preferences.OptionalUser.can_view_all]} + serializer_class = serializers.OptionalUserSerializer + + def get_object(self): + return preferences.OptionalUser.objects.first() + + +class OptionalMachineView(generics.RetrieveAPIView): + permission_classes = (ACLPermission, ) + perms_map = {'GET' : [preferences.OptionalMachine.can_view_all]} + serializer_class = serializers.OptionalMachineSerializer + + def get_object(self): + return preferences.OptionalMachine.objects.first() + + +class OptionalTopologieView(generics.RetrieveAPIView): + permission_classes = (ACLPermission, ) + perms_map = {'GET' : [preferences.OptionalTopologie.can_view_all]} + serializer_class = serializers.OptionalTopologieSerializer + + def get_object(self): + return preferences.OptionalTopologie.objects.first() + + +class GeneralOptionView(generics.RetrieveAPIView): + permission_classes = (ACLPermission, ) + perms_map = {'GET' : [preferences.GeneralOption.can_view_all]} + serializer_class = serializers.GeneralOptionSerializer + + def get_object(self): + return preferences.GeneralOption.objects.first() + + +class ServiceViewSet(viewsets.ReadOnlyModelViewSet): + queryset = preferences.Service.objects.all() + serializer_class = serializers.ServiceSerializer + + +class AssoOptionView(generics.RetrieveAPIView): + permission_classes = (ACLPermission, ) + perms_map = {'GET' : [preferences.AssoOption.can_view_all]} + serializer_class = serializers.AssoOptionSerializer + + def get_object(self): + return preferences.AssoOption.objects.first() + + +class HomeOptionView(generics.RetrieveAPIView): + permission_classes = (ACLPermission, ) + perms_map = {'GET' : [preferences.HomeOption.can_view_all]} + serializer_class = serializers.HomeOptionSerializer + + def get_object(self): + return preferences.HomeOption.objects.first() + + +class MailMessageOptionView(generics.RetrieveAPIView): + permission_classes = (ACLPermission, ) + perms_map = {'GET' : [preferences.MailMessageOption.can_view_all]} + serializer_class = serializers.MailMessageOptionSerializer + + def get_object(self): + return preferences.MailMessageOption.objects.first() # TOPOLOGIE APP From 374dd8da1ecd06239e69d473363277bab0d2401e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Sat, 16 Jun 2018 19:20:13 +0000 Subject: [PATCH 30/49] Add a router that can register views --- api/routers.py | 123 +++++++++++++++++++++++++++++++++++++++++++++++ api/urls.py | 128 ++++++++++++++++++++++++------------------------- 2 files changed, 186 insertions(+), 65 deletions(-) create mode 100644 api/routers.py diff --git a/api/routers.py b/api/routers.py new file mode 100644 index 00000000..cea69690 --- /dev/null +++ b/api/routers.py @@ -0,0 +1,123 @@ +# Re2o est un logiciel d'administration développé initiallement au rezometz. Il +# se veut agnostique au réseau considéré, de manière à être installable en +# quelques clics. +# +# Copyright © 2018 Mael Kervella +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +"""api.routers + +Definition of the custom routers to generate the URLs of the API +""" + +from collections import OrderedDict +from django.conf.urls import url, include +from django.core.urlresolvers import NoReverseMatch +from rest_framework import views +from rest_framework.routers import DefaultRouter +from rest_framework.response import Response +from rest_framework.reverse import reverse +from rest_framework.schemas import SchemaGenerator +from rest_framework.settings import api_settings + +class AllViewsRouter(DefaultRouter): + def __init__(self, *args, **kwargs): + self.view_registry = [] + super(AllViewsRouter, self).__init__(*args, **kwargs) + + def register_viewset(self, *args, **kwargs): + """ + Register a viewset in the router + Alias of `register` for convenience + """ + return self.register(*args, **kwargs) + + def register_view(self, pattern, view, name=None): + """ + Register a view in the router + """ + if name is None: + name = self.get_default_name(pattern) + self.view_registry.append((pattern, view, name)) + + def get_default_name(self, pattern): + return pattern.split('/')[-1] + + def get_api_root_view(self, schema_urls=None): + """ + Return a view to use as the API root. + """ + api_root_dict = OrderedDict() + list_name = self.routes[0].name + for prefix, viewset, basename in self.registry: + api_root_dict[prefix] = list_name.format(basename=basename) + for pattern, view, name in self.view_registry: + api_root_dict[pattern] = name + + view_renderers = list(api_settings.DEFAULT_RENDERER_CLASSES) + schema_media_types = [] + + if schema_urls and self.schema_title: + view_renderers += list(self.schema_renderers) + schema_generator = SchemaGenerator( + title=self.schema_title, + patterns=schema_urls + ) + schema_media_types = [ + renderer.media_type + for renderer in self.schema_renderers + ] + + class APIRoot(views.APIView): + _ignore_model_permissions = True + renderer_classes = view_renderers + + def get(self, request, *args, **kwargs): + if request.accepted_renderer.media_type in schema_media_types: + # Return a schema response. + schema = schema_generator.get_schema(request) + if schema is None: + raise exceptions.PermissionDenied() + return Response(schema) + + # Return a plain {"name": "hyperlink"} response. + ret = OrderedDict() + namespace = request.resolver_match.namespace + for key, url_name in api_root_dict.items(): + if namespace: + url_name = namespace + ':' + url_name + try: + ret[key] = reverse( + url_name, + args=args, + kwargs=kwargs, + request=request, + format=kwargs.get('format', None) + ) + except NoReverseMatch: + # Don't bail out if eg. no list routes exist, only detail routes. + continue + + return Response(ret) + + return APIRoot.as_view() + + def get_urls(self): + urls = super(AllViewsRouter, self).get_urls() + + for pattern, view, name in self.view_registry: + urls.append(url(pattern, view.as_view(), name=name)) + + return urls diff --git a/api/urls.py b/api/urls.py index dd3783dc..edf399c8 100644 --- a/api/urls.py +++ b/api/urls.py @@ -25,82 +25,80 @@ Urls de l'api, pointant vers les fonctions de views from __future__ import unicode_literals from django.conf.urls import url, include -from rest_framework.routers import DefaultRouter +from .routers import AllViewsRouter from . import views -router = DefaultRouter() +router = AllViewsRouter() # COTISATIONS APP -router.register(r'cotisations/factures', views.FactureViewSet) -router.register(r'cotisations/ventes', views.VenteViewSet) -router.register(r'cotisations/articles', views.ArticleViewSet) -router.register(r'cotisations/banques', views.BanqueViewSet) -router.register(r'cotisations/paiements', views.PaiementViewSet) -router.register(r'cotisations/cotisations', views.CotisationViewSet) +router.register_viewset(r'cotisations/factures', views.FactureViewSet) +router.register_viewset(r'cotisations/ventes', views.VenteViewSet) +router.register_viewset(r'cotisations/articles', views.ArticleViewSet) +router.register_viewset(r'cotisations/banques', views.BanqueViewSet) +router.register_viewset(r'cotisations/paiements', views.PaiementViewSet) +router.register_viewset(r'cotisations/cotisations', views.CotisationViewSet) # MACHINES APP -router.register(r'machines/machines', views.MachineViewSet) -router.register(r'machines/machinetypes', views.MachineTypeViewSet) -router.register(r'machines/iptypes', views.IpTypeViewSet) -router.register(r'machines/vlans', views.VlanViewSet) -router.register(r'machines/nas', views.NasViewSet) -router.register(r'machines/soa', views.SOAViewSet) -router.register(r'machines/extensions', views.ExtensionViewSet) -router.register(r'machines/mx', views.MxViewSet) -router.register(r'machines/ns', views.NsViewSet) -router.register(r'machines/txt', views.TxtViewSet) -router.register(r'machines/srv', views.SrvViewSet) -router.register(r'machines/interfaces', views.InterfaceViewSet) -router.register(r'machines/ipv6lists', views.Ipv6ListViewSet) -router.register(r'machines/domains', views.DomainViewSet) -router.register(r'machines/iplists', views.IpListViewSet) -router.register(r'machines/services', views.ServiceViewSet) -router.register(r'machines/servicelinks', views.ServiceLinkViewSet, base_name='servicelink') -router.register(r'machines/ouvertureportlists', views.OuverturePortListViewSet) -router.register(r'machines/ouvertureports', views.OuverturePortViewSet) +router.register_viewset(r'machines/machines', views.MachineViewSet) +router.register_viewset(r'machines/machinetypes', views.MachineTypeViewSet) +router.register_viewset(r'machines/iptypes', views.IpTypeViewSet) +router.register_viewset(r'machines/vlans', views.VlanViewSet) +router.register_viewset(r'machines/nas', views.NasViewSet) +router.register_viewset(r'machines/soa', views.SOAViewSet) +router.register_viewset(r'machines/extensions', views.ExtensionViewSet) +router.register_viewset(r'machines/mx', views.MxViewSet) +router.register_viewset(r'machines/ns', views.NsViewSet) +router.register_viewset(r'machines/txt', views.TxtViewSet) +router.register_viewset(r'machines/srv', views.SrvViewSet) +router.register_viewset(r'machines/interfaces', views.InterfaceViewSet) +router.register_viewset(r'machines/ipv6lists', views.Ipv6ListViewSet) +router.register_viewset(r'machines/domains', views.DomainViewSet) +router.register_viewset(r'machines/iplists', views.IpListViewSet) +router.register_viewset(r'machines/services', views.ServiceViewSet) +router.register_viewset(r'machines/servicelinks', views.ServiceLinkViewSet, base_name='servicelink') +router.register_viewset(r'machines/ouvertureportlists', views.OuverturePortListViewSet) +router.register_viewset(r'machines/ouvertureports', views.OuverturePortViewSet) # PREFERENCES APP -router.register(r'preferences/service', views.ServiceViewSet), +router.register_viewset(r'preferences/service', views.ServiceViewSet), +router.register_view(r'preferences/optionaluser', views.OptionalUserView), +router.register_view(r'preferences/optionalmachine', views.OptionalMachineView), +router.register_view(r'preferences/optionaltopologie', views.OptionalTopologieView), +router.register_view(r'preferences/generaloption', views.GeneralOptionView), +router.register_view(r'preferences/assooption', views.AssoOptionView), +router.register_view(r'preferences/homeoption', views.HomeOptionView), +router.register_view(r'preferences/mailmessageoption', views.MailMessageOptionView), # TOPOLOGIE APP -router.register(r'topologie/stack', views.StackViewSet) -router.register(r'topologie/acesspoint', views.AccessPointViewSet) -router.register(r'topologie/switch', views.SwitchViewSet) -router.register(r'topologie/modelswitch', views.ModelSwitchViewSet) -router.register(r'topologie/constructorswitch', views.ConstructorSwitchViewSet) -router.register(r'topologie/switchbay', views.SwitchBayViewSet) -router.register(r'topologie/building', views.BuildingViewSet) -router.register(r'topologie/switchport', views.SwitchPortViewSet, base_name='switchport') -router.register(r'topologie/room', views.RoomViewSet) +router.register_viewset(r'topologie/stack', views.StackViewSet) +router.register_viewset(r'topologie/acesspoint', views.AccessPointViewSet) +router.register_viewset(r'topologie/switch', views.SwitchViewSet) +router.register_viewset(r'topologie/modelswitch', views.ModelSwitchViewSet) +router.register_viewset(r'topologie/constructorswitch', views.ConstructorSwitchViewSet) +router.register_viewset(r'topologie/switchbay', views.SwitchBayViewSet) +router.register_viewset(r'topologie/building', views.BuildingViewSet) +router.register_viewset(r'topologie/switchport', views.SwitchPortViewSet, base_name='switchport') +router.register_viewset(r'topologie/room', views.RoomViewSet) # USERS APP -router.register(r'users/users', views.UserViewSet) -router.register(r'users/clubs', views.ClubViewSet) -router.register(r'users/adherents', views.AdherentViewSet) -router.register(r'users/serviceusers', views.ServiceUserViewSet) -router.register(r'users/schools', views.SchoolViewSet) -router.register(r'users/listrights', views.ListRightViewSet) -router.register(r'users/shells', views.ShellViewSet, base_name='shell') -router.register(r'users/bans', views.BanViewSet) -router.register(r'users/whitelists', views.WhitelistViewSet) +router.register_viewset(r'users/users', views.UserViewSet) +router.register_viewset(r'users/clubs', views.ClubViewSet) +router.register_viewset(r'users/adherents', views.AdherentViewSet) +router.register_viewset(r'users/serviceusers', views.ServiceUserViewSet) +router.register_viewset(r'users/schools', views.SchoolViewSet) +router.register_viewset(r'users/listrights', views.ListRightViewSet) +router.register_viewset(r'users/shells', views.ShellViewSet, base_name='shell') +router.register_viewset(r'users/bans', views.BanViewSet) +router.register_viewset(r'users/whitelists', views.WhitelistViewSet) # SERVICES REGEN -router.register(r'services/regen', views.ServiceRegenViewSet, base_name='serviceregen') +router.register_viewset(r'services/regen', views.ServiceRegenViewSet, base_name='serviceregen') +# DHCP +router.register_view(r'dhcp/hostmacip', views.HostMacIpView), +# DNS +router.register_view(r'dns/zones', views.DNSZonesView), +# MAILING +router.register_view(r'mailing/standard', views.StandardMailingView), +router.register_view(r'mailing/club', views.ClubMailingView), +# TOKEN-AUTH +router.register_view(r'token-auth', views.ObtainExpiringAuthToken) urlpatterns = [ - # VIEWSETS url(r'^', include(router.urls)), - # PREFERENCES APP - url(r'^preferences/optionaluser', views.OptionalUserView.as_view()), - url(r'^preferences/optionalmachine', views.OptionalMachineView.as_view()), - url(r'^preferences/optionaltopologie', views.OptionalTopologieView.as_view()), - url(r'^preferences/generaloption', views.GeneralOptionView.as_view()), - url(r'^preferences/assooption', views.AssoOptionView.as_view()), - url(r'^preferences/homeoption', views.HomeOptionView.as_view()), - url(r'^preferences/mailmessageoption', views.MailMessageOptionView.as_view()), - # DHCP - url(r'^dhcp/hostmacip', views.HostMacIpView.as_view()), - # DNS - url(r'^dns/zones', views.DNSZonesView.as_view()), - # MAILING - url(r'^mailing/standard', views.StandardMailingView.as_view()), - url(r'^mailing/club', views.ClubMailingView.as_view()), - # TOKEN-AUTH - url(r'^token-auth', views.ObtainExpiringAuthToken.as_view()) ] From ecc5ed0b22d59a554b7ccbdf1dd05275d79d9c80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Sun, 17 Jun 2018 01:06:58 +0000 Subject: [PATCH 31/49] Docstrings, docstrings everywhere --- api/acl.py | 52 ++++++------ api/authentication.py | 39 +++++++-- api/pagination.py | 46 ++++++++++- api/permissions.py | 183 +++++++++++++++++++++++++++++++++++------- api/routers.py | 54 ++++++++++--- api/serializers.py | 179 +++++++++++++++++++++++++++++++++++++---- api/settings.py | 10 +-- api/tests.py | 133 ++++++++++++++++++++---------- api/urls.py | 29 ++++--- api/views.py | 156 +++++++++++++++++++++++++++++++---- 10 files changed, 716 insertions(+), 165 deletions(-) diff --git a/api/acl.py b/api/acl.py index 0c7faae7..8c39aed0 100644 --- a/api/acl.py +++ b/api/acl.py @@ -1,9 +1,8 @@ -# -*- mode: python; coding: utf-8 -*- # Re2o est un logiciel d'administration développé initiallement au rezometz. Il # se veut agnostique au réseau considéré, de manière à être installable en # quelques clics. # -# Copyright © 2018 Maël Kervella +# Copyright © 2018 Maël Kervella # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -19,34 +18,41 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -"""api.acl +"""Defines the ACL for the whole API. -Here are defined some functions to check acl on the application. +Importing this module, creates the 'can view api' permission if not already +done. """ - from django.conf import settings from django.contrib.contenttypes.models import ContentType from django.contrib.auth.models import Permission +from django.utils.translation import ugettext_lazy as _ -# Creates the 'use_api' permission if not created -# The 'use_api' is a fake permission in the sense -# it is not associated with an existing model and -# this ensure the permission is created every tun -api_content_type, created = ContentType.objects.get_or_create( - app_label=settings.API_CONTENT_TYPE_APP_LABEL, - model=settings.API_CONTENT_TYPE_MODEL -) -if created: - api_content_type.save() -api_permission, created = Permission.objects.get_or_create( - name=settings.API_PERMISSION_NAME, - content_type=api_content_type, - codename=settings.API_PERMISSION_CODENAME -) -if created: - api_permission.save() +def _create_api_permission(): + """Creates the 'use_api' permission if not created. + + The 'use_api' is a fake permission in the sense it is not associated with an + existing model and this ensure the permission is created every time this file + is imported. + """ + api_content_type, created = ContentType.objects.get_or_create( + app_label=settings.API_CONTENT_TYPE_APP_LABEL, + model=settings.API_CONTENT_TYPE_MODEL + ) + if created: + api_content_type.save() + api_permission, created = Permission.objects.get_or_create( + name=settings.API_PERMISSION_NAME, + content_type=api_content_type, + codename=settings.API_PERMISSION_CODENAME + ) + if created: + api_permission.save() + + +_create_api_permission() def can_view(user): @@ -64,4 +70,4 @@ def can_view(user): 'codename': settings.API_PERMISSION_CODENAME } can = user.has_perm('%(app_label)s.%(codename)s' % kwargs) - return can, None if can else "Vous ne pouvez pas voir cette application." + return can, None if can else _("You cannot see this application.") diff --git a/api/authentication.py b/api/authentication.py index 4dc5a6f3..469c51f1 100644 --- a/api/authentication.py +++ b/api/authentication.py @@ -1,20 +1,43 @@ +# Re2o est un logiciel d'administration développé initiallement au rezometz. Il +# se veut agnostique au réseau considéré, de manière à être installable en +# quelques clics. +# +# Copyright © 2018 Maël Kervella +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +"""Defines the authentication classes used in the API to authenticate a user. +""" + import datetime + from django.conf import settings from django.utils.translation import ugettext_lazy as _ from rest_framework.authentication import TokenAuthentication from rest_framework import exceptions class ExpiringTokenAuthentication(TokenAuthentication): + """Authenticate a user if the provided token is valid and not expired. + """ def authenticate_credentials(self, key): - model = self.get_model() - try: - token = model.objects.select_related('user').get(key=key) - except model.DoesNotExist: - raise exceptions.AuthenticationFailed(_('Invalid token.')) - - if not token.user.is_active: - raise exceptions.AuthenticationFailed(_('User inactive or deleted.')) + """See base class. Add the verification the token is not expired. + """ + base = super(ExpiringTokenAuthentication, self) + user, token = base.authenticate_credentials(key) + # Check that the genration time of the token is not too old token_duration = datetime.timedelta( seconds=settings.API_TOKEN_DURATION ) diff --git a/api/pagination.py b/api/pagination.py index 2fc0aaf7..20dcad6e 100644 --- a/api/pagination.py +++ b/api/pagination.py @@ -1,15 +1,57 @@ +# Re2o est un logiciel d'administration développé initiallement au rezometz. Il +# se veut agnostique au réseau considéré, de manière à être installable en +# quelques clics. +# +# Copyright © 2018 Maël Kervella +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +"""Defines the pagination classes used in the API to paginate the results. +""" + from rest_framework import pagination class PageSizedPagination(pagination.PageNumberPagination): - """ - Pagination subclass to all to control the page size + """Provide the possibility to control the page size by using the + 'page_size' parameter. The value 'all' can be used for this parameter + to retrieve all the results in a single page. + + Attributes: + page_size_query_param: The string to look for in the parameters of + a query to get the page_size requested. + all_pages_strings: A set of strings that can be used in the query to + request all results in a single page. + max_page_size: The maximum number of results a page can output no + matter what is requested. """ page_size_query_param = 'page_size' all_pages_strings = ('all',) max_page_size = 10000 def get_page_size(self, request): + """Retrieve the size of the page according to the parameters of the + request. + + Args: + request: the request of the user + + Returns: + A integer between 0 and `max_page_size` that represent the size + of the page to use. + """ try: page_size_str = request.query_params[self.page_size_query_param] if page_size_str in self.all_pages_strings: diff --git a/api/permissions.py b/api/permissions.py index e04abdaf..53f06620 100644 --- a/api/permissions.py +++ b/api/permissions.py @@ -1,13 +1,61 @@ +# Re2o est un logiciel d'administration développé initiallement au rezometz. Il +# se veut agnostique au réseau considéré, de manière à être installable en +# quelques clics. +# +# Copyright © 2018 Maël Kervella +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +"""Defines the permission classes used in the API. +""" + from rest_framework import permissions, exceptions + from re2o.acl import can_create, can_edit, can_delete, can_view_all from . import acl + def can_see_api(*_, **__): + """Check if a user can view the API. + + Returns: + A function that takes a user as an argument and returns + an ACL tuple that assert this user can see the API. + """ return lambda user: acl.can_view(user) def _get_param_in_view(view, param_name): + """Utility function to retrieve an attribute in a view passed in argument. + + Uses the result of `{view}.get_{param_name}()` if existing else uses the + value of `{view}.{param_name}` directly. + + Args: + view: The view where to look into. + param_name: The name of the attribute to look for. + + Returns: + The result of the getter function if found else the value of the + attribute itself. + + Raises: + AssertionError: None of the getter function or the attribute are + defined in the view. + """ assert hasattr(view, 'get_'+param_name) \ or getattr(view, param_name, None) is not None, ( 'cannot apply {} on a view that does not set ' @@ -24,15 +72,30 @@ def _get_param_in_view(view, param_name): class ACLPermission(permissions.BasePermission): - """ - Permission subclass for views that requires a specific model-based - permission or don't define a queryset + """A permission class used to check the ACL to validate the permissions + of a user. + + The view must define a `.get_perms_map()` or a `.perms_map` attribute. + See the wiki for the syntax of this attribute. """ def get_required_permissions(self, method, view): - """ - Given a list of models and an HTTP method, return the list - of acl functions that the user is required to verify. + """Build the list of permissions required for the request to be + accepted. + + Args: + method: The HTTP method name used for the request. + view: The view which is responding to the request. + + Returns: + The list of ACL functions to apply to a user in order to check + if he has the right permissions. + + Raises: + AssertionError: None of `.get_perms_map()` or `.perms_map` are + defined in the view. + rest_framework.exception.MethodNotAllowed: The requested method + is not allowed for this view. """ perms_map = _get_param_in_view(view, 'perms_map') @@ -42,6 +105,22 @@ class ACLPermission(permissions.BasePermission): return [can_see_api()] + list(perms_map[method]) def has_permission(self, request, view): + """Check that the user has the permissions to perform the request. + + Args: + request: The request performed. + view: The view which is responding to the request. + + Returns: + A boolean indicating if the user has the permission to + perform the request. + + Raises: + AssertionError: None of `.get_perms_map()` or `.perms_map` are + defined in the view. + rest_framework.exception.MethodNotAllowed: The requested method + is not allowed for this view. + """ # Workaround to ensure ACLPermissions are not applied # to the root view when using DefaultRouter. if getattr(view, '_ignore_model_permissions', False): @@ -54,19 +133,20 @@ class ACLPermission(permissions.BasePermission): return all(perm(request.user)[0] for perm in perms) - def has_object_permission(self, request, view, obj): - # Should never be called here but documentation - # requires to implement this function - return False - class AutodetectACLPermission(permissions.BasePermission): + """A permission class used to autodetect the ACL needed to validate the + permissions of a user based on the queryset of the view. + + The view must define a `.get_queryset()` or a `.queryset` attribute. + + Attributes: + perms_map: The mapping of each valid HTTP method to the required + model-based ACL permissions. + perms_obj_map: The mapping of each valid HTTP method to the required + object-based ACL permissions. """ - Permission subclass in charge of checking the ACL to determine - if a user can access the models. Autodetect which ACL are required - based on a queryset. Requires `.queryset` or `.get_queryset()` - to be defined in the view. - """ + perms_map = { 'GET': [can_see_api, lambda model: model.can_view_all], 'OPTIONS': [can_see_api, lambda model: model.can_view_all], @@ -87,9 +167,20 @@ class AutodetectACLPermission(permissions.BasePermission): } def get_required_permissions(self, method, model): - """ - Given a model and an HTTP method, return the list of acl - functions that the user is required to verify. + """Build the list of model-based permissions required for the + request to be accepted. + + Args: + method: The HTTP method name used for the request. + view: The view which is responding to the request. + + Returns: + The list of ACL functions to apply to a user in order to check + if he has the right permissions. + + Raises: + rest_framework.exception.MethodNotAllowed: The requested method + is not allowed for this view. """ if method not in self.perms_map: raise exceptions.MethodNotAllowed(method) @@ -97,9 +188,20 @@ class AutodetectACLPermission(permissions.BasePermission): return [perm(model) for perm in self.perms_map[method]] def get_required_object_permissions(self, method, obj): - """ - Given an object and an HTTP method, return the list of acl - functions that the user is required to verify. + """Build the list of object-based permissions required for the + request to be accepted. + + Args: + method: The HTTP method name used for the request. + view: The view which is responding to the request. + + Returns: + The list of ACL functions to apply to a user in order to check + if he has the right permissions. + + Raises: + rest_framework.exception.MethodNotAllowed: The requested method + is not allowed for this view. """ if method not in self.perms_obj_map: raise exceptions.MethodNotAllowed(method) @@ -107,13 +209,26 @@ class AutodetectACLPermission(permissions.BasePermission): return [perm(obj) for perm in self.perms_obj_map[method]] def _queryset(self, view): - """ - Return the queryset associated with view and raise an error - is there is none. - """ return _get_param_in_view(view, 'queryset') def has_permission(self, request, view): + """Check that the user has the model-based permissions to perform + the request. + + Args: + request: The request performed. + view: The view which is responding to the request. + + Returns: + A boolean indicating if the user has the permission to + perform the request. + + Raises: + AssertionError: None of `.get_queryset()` or `.queryset` are + defined in the view. + rest_framework.exception.MethodNotAllowed: The requested method + is not allowed for this view. + """ # Workaround to ensure ACLPermissions are not applied # to the root view when using DefaultRouter. if getattr(view, '_ignore_model_permissions', False): @@ -128,8 +243,22 @@ class AutodetectACLPermission(permissions.BasePermission): return all(perm(request.user)[0] for perm in perms) def has_object_permission(self, request, view, obj): + """Check that the user has the object-based permissions to perform + the request. + + Args: + request: The request performed. + view: The view which is responding to the request. + + Returns: + A boolean indicating if the user has the permission to + perform the request. + + Raises: + rest_framework.exception.MethodNotAllowed: The requested method + is not allowed for this view. + """ # authentication checks have already executed via has_permission - queryset = self._queryset(view) user = request.user perms = self.get_required_object_permissions(request.method, obj) diff --git a/api/routers.py b/api/routers.py index cea69690..fcfb5077 100644 --- a/api/routers.py +++ b/api/routers.py @@ -2,7 +2,7 @@ # se veut agnostique au réseau considéré, de manière à être installable en # quelques clics. # -# Copyright © 2018 Mael Kervella +# Copyright © 2018 Mael Kervella # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -17,12 +17,12 @@ # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -"""api.routers -Definition of the custom routers to generate the URLs of the API +"""Defines the custom routers to generate the URLs of the API. """ from collections import OrderedDict + from django.conf.urls import url, include from django.core.urlresolvers import NoReverseMatch from rest_framework import views @@ -32,32 +32,60 @@ from rest_framework.reverse import reverse from rest_framework.schemas import SchemaGenerator from rest_framework.settings import api_settings + class AllViewsRouter(DefaultRouter): + """A router that can register both viewsets and views and generates + a full API root page with all the generated URLs. + """ + def __init__(self, *args, **kwargs): self.view_registry = [] super(AllViewsRouter, self).__init__(*args, **kwargs) def register_viewset(self, *args, **kwargs): - """ - Register a viewset in the router - Alias of `register` for convenience + """Register a viewset in the router. Alias of `register` for + convenience. + + See `register` in the base class for details. """ return self.register(*args, **kwargs) def register_view(self, pattern, view, name=None): - """ - Register a view in the router + """Register a view in the router. + + Args: + pattern: The URL pattern to use for this view. + view: The class-based view to register. + name: An optional name for the route generated. Defaults is + based on the pattern last section (delimited by '/'). """ if name is None: name = self.get_default_name(pattern) self.view_registry.append((pattern, view, name)) def get_default_name(self, pattern): + """Returns the name to use for the route if none was specified. + + Args: + pattern: The pattern for this route. + + Returns: + The name to use for this route. + """ return pattern.split('/')[-1] def get_api_root_view(self, schema_urls=None): - """ - Return a view to use as the API root. + """Create a class-based view to use as the API root. + + Highly inspired by the base class. See details on the implementation + in the base class. The only difference is that registered view URLs + are added after the registered viewset URLs on this root API page. + + Args: + schema_urls: A schema to use for the URLs. + + Returns: + The view to use to display the root API page. """ api_root_dict = OrderedDict() list_name = self.routes[0].name @@ -115,6 +143,12 @@ class AllViewsRouter(DefaultRouter): return APIRoot.as_view() def get_urls(self): + """Builds the list of URLs to register. + + Returns: + A list of the URLs generated based on the viewsets registered + followed by the URLs generated based on the views registered. + """ urls = super(AllViewsRouter, self).get_urls() for pattern, view, name in self.view_registry: diff --git a/api/serializers.py b/api/serializers.py index 9f4b89ed..a1e73091 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -2,7 +2,7 @@ # se veut agnostique au réseau considéré, de manière à être installable en # quelques clics. # -# Copyright © 2018 Mael Kervella +# Copyright © 2018 Maël Kervella # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -18,8 +18,7 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -""" -Serializers for the API app +"""Defines the serializers of the API """ from rest_framework import serializers @@ -31,12 +30,15 @@ import topologie.models as topologie import users.models as users +# The namespace used for the API. It must match the namespace used in the +# urlpatterns to include the API URLs. API_NAMESPACE = 'api' class NamespacedHRField(serializers.HyperlinkedRelatedField): - """ A HyperlinkedRelatedField subclass to automatically prefix - view names with a namespace """ + """A `rest_framework.serializers.HyperlinkedRelatedField` subclass to + automatically prefix view names with the API namespace. + """ def __init__(self, view_name=None, **kwargs): if view_name is not None: view_name = '%s:%s' % (API_NAMESPACE, view_name) @@ -44,8 +46,9 @@ class NamespacedHRField(serializers.HyperlinkedRelatedField): class NamespacedHIField(serializers.HyperlinkedIdentityField): - """ A HyperlinkedIdentityField subclass to automatically prefix - view names with a namespace """ + """A `rest_framework.serializers.HyperlinkedIdentityField` subclass to + automatically prefix view names with teh API namespace. + """ def __init__(self, view_name=None, **kwargs): if view_name is not None: view_name = '%s:%s' % (API_NAMESPACE, view_name) @@ -53,16 +56,19 @@ class NamespacedHIField(serializers.HyperlinkedIdentityField): class NamespacedHMSerializer(serializers.HyperlinkedModelSerializer): - """ A HyperlinkedModelSerializer subclass to use `NamespacedHRField` as - field and automatically prefix view names with a namespace """ + """A `rest_framework.serializers.HyperlinkedModelSerializer` subclass to + automatically prefix view names with the API namespace. + """ serializer_related_field = NamespacedHRField serializer_url_field = NamespacedHIField -# COTISATIONS APP +# COTISATIONS class FactureSerializer(NamespacedHMSerializer): + """Serialize `cotisations.models.Facture` objects. + """ class Meta: model = cotisations.Facture fields = ('user', 'paiement', 'banque', 'cheque', 'date', 'valid', @@ -70,6 +76,8 @@ class FactureSerializer(NamespacedHMSerializer): class VenteSerializer(NamespacedHMSerializer): + """Serialize `cotisations.models.Vente` objects. + """ class Meta: model = cotisations.Vente fields = ('facture', 'number', 'name', 'prix', 'duration', @@ -77,6 +85,8 @@ class VenteSerializer(NamespacedHMSerializer): class ArticleSerializer(NamespacedHMSerializer): + """Serialize `cotisations.models.Article` objects. + """ class Meta: model = cotisations.Article fields = ('name', 'prix', 'duration', 'type_user', @@ -84,40 +94,52 @@ class ArticleSerializer(NamespacedHMSerializer): class BanqueSerializer(NamespacedHMSerializer): + """Serialize `cotisations.models.Banque` objects. + """ class Meta: model = cotisations.Banque fields = ('name', 'api_url') class PaiementSerializer(NamespacedHMSerializer): + """Serialize `cotisations.models.Paiement` objects. + """ class Meta: model = cotisations.Paiement fields = ('moyen', 'type_paiement', 'api_url') class CotisationSerializer(NamespacedHMSerializer): + """Serialize `cotisations.models.Cotisation` objects. + """ class Meta: model = cotisations.Cotisation fields = ('vente', 'type_cotisation', 'date_start', 'date_end', 'api_url') -# MACHINES APP +# MACHINES class MachineSerializer(NamespacedHMSerializer): + """Serialize `machines.models.Machine` objects. + """ class Meta: model = machines.Machine fields = ('user', 'name', 'active', 'api_url') class MachineTypeSerializer(NamespacedHMSerializer): + """Serialize `machines.models.MachineType` objects. + """ class Meta: model = machines.MachineType fields = ('type', 'ip_type', 'api_url') class IpTypeSerializer(NamespacedHMSerializer): + """Serialize `machines.models.IpType` objects. + """ class Meta: model = machines.IpType fields = ('type', 'extension', 'need_infra', 'domaine_ip_start', @@ -126,12 +148,16 @@ class IpTypeSerializer(NamespacedHMSerializer): class VlanSerializer(NamespacedHMSerializer): + """Serialize `machines.models.Vlan` objects. + """ class Meta: model = machines.Vlan fields = ('vlan_id', 'name', 'comment', 'api_url') class NasSerializer(NamespacedHMSerializer): + """Serialize `machines.models.Nas` objects. + """ class Meta: model = machines.Nas fields = ('name', 'nas_type', 'machine_type', 'port_access_mode', @@ -139,6 +165,8 @@ class NasSerializer(NamespacedHMSerializer): class SOASerializer(NamespacedHMSerializer): + """Serialize `machines.models.SOA` objects. + """ class Meta: model = machines.SOA fields = ('name', 'mail', 'refresh', 'retry', 'expire', 'ttl', @@ -146,6 +174,8 @@ class SOASerializer(NamespacedHMSerializer): class ExtensionSerializer(NamespacedHMSerializer): + """Serialize `machines.models.Extension` objects. + """ class Meta: model = machines.Extension fields = ('name', 'need_infra', 'origin', 'origin_v6', 'soa', @@ -153,24 +183,32 @@ class ExtensionSerializer(NamespacedHMSerializer): class MxSerializer(NamespacedHMSerializer): + """Serialize `machines.models.Mx` objects. + """ class Meta: model = machines.Mx fields = ('zone', 'priority', 'name', 'api_url') class NsSerializer(NamespacedHMSerializer): + """Serialize `machines.models.Ns` objects. + """ class Meta: model = machines.Ns fields = ('zone', 'ns', 'api_url') class TxtSerializer(NamespacedHMSerializer): + """Serialize `machines.models.Txt` objects. + """ class Meta: model = machines.Txt fields = ('zone', 'field1', 'field2', 'api_url') class SrvSerializer(NamespacedHMSerializer): + """Serialize `machines.models.Srv` objects. + """ class Meta: model = machines.Srv fields = ('service', 'protocole', 'extension', 'ttl', 'priority', @@ -178,6 +216,8 @@ class SrvSerializer(NamespacedHMSerializer): class InterfaceSerializer(NamespacedHMSerializer): + """Serialize `machines.models.Interface` objects. + """ mac_address = serializers.CharField() active = serializers.BooleanField(source='is_active') @@ -188,12 +228,16 @@ class InterfaceSerializer(NamespacedHMSerializer): class Ipv6ListSerializer(NamespacedHMSerializer): + """Serialize `machines.models.Ipv6List` objects. + """ class Meta: model = machines.Ipv6List fields = ('ipv6', 'interface', 'slaac_ip', 'api_url') class DomainSerializer(NamespacedHMSerializer): + """Serialize `machines.models.Domain` objects. + """ class Meta: model = machines.Domain fields = ('interface_parent', 'name', 'extension', 'cname', @@ -201,12 +245,16 @@ class DomainSerializer(NamespacedHMSerializer): class IpListSerializer(NamespacedHMSerializer): + """Serialize `machines.models.IpList` objects. + """ class Meta: model = machines.IpList fields = ('ipv4', 'ip_type', 'need_infra', 'api_url') class ServiceSerializer(NamespacedHMSerializer): + """Serialize `machines.models.Service` objects. + """ class Meta: model = machines.Service fields = ('service_type', 'min_time_regen', 'regular_time_regen', @@ -214,6 +262,8 @@ class ServiceSerializer(NamespacedHMSerializer): class ServiceLinkSerializer(NamespacedHMSerializer): + """Serialize `machines.models.Service_link` objects. + """ class Meta: model = machines.Service_link fields = ('service', 'server', 'last_regen', 'asked_regen', @@ -224,6 +274,8 @@ class ServiceLinkSerializer(NamespacedHMSerializer): class OuverturePortListSerializer(NamespacedHMSerializer): + """Serialize `machines.models.OuverturePortList` objects. + """ class Meta: model = machines.OuverturePortList fields = ('name', 'tcp_ports_in', 'udp_ports_in', 'tcp_ports_out', @@ -231,15 +283,19 @@ class OuverturePortListSerializer(NamespacedHMSerializer): class OuverturePortSerializer(NamespacedHMSerializer): + """Serialize `machines.models.OuverturePort` objects. + """ class Meta: model = machines.OuverturePort fields = ('begin', 'end', 'port_list', 'protocole', 'io', 'api_url') -# PREFERENCES APP +# PREFERENCES class OptionalUserSerializer(NamespacedHMSerializer): + """Serialize `preferences.models.OptionalUser` objects. + """ tel_mandatory = serializers.BooleanField(source='is_tel_mandatory') class Meta: @@ -250,6 +306,8 @@ class OptionalUserSerializer(NamespacedHMSerializer): class OptionalMachineSerializer(NamespacedHMSerializer): + """Serialize `preferences.models.OptionalMachine` objects. + """ class Meta: model = preferences.OptionalMachine fields = ('password_machine', 'max_lambdauser_interfaces', @@ -258,6 +316,8 @@ class OptionalMachineSerializer(NamespacedHMSerializer): class OptionalTopologieSerializer(NamespacedHMSerializer): + """Serialize `preferences.models.OptionalTopologie` objects. + """ class Meta: model = preferences.OptionalTopologie fields = ('radius_general_policy', 'vlan_decision_ok', @@ -265,6 +325,8 @@ class OptionalTopologieSerializer(NamespacedHMSerializer): class GeneralOptionSerializer(NamespacedHMSerializer): + """Serialize `preferences.models.GeneralOption` objects. + """ class Meta: model = preferences.GeneralOption fields = ('general_message', 'search_display_page', @@ -274,12 +336,16 @@ class GeneralOptionSerializer(NamespacedHMSerializer): class ServiceSerializer(NamespacedHMSerializer): + """Serialize `preferences.models.Service` objects. + """ class Meta: model = preferences.Service fields = ('name', 'url', 'description', 'image', 'api_url') class AssoOptionSerializer(NamespacedHMSerializer): + """Serialize `preferences.models.AssoOption` objects. + """ class Meta: model = preferences.AssoOption fields = ('name', 'siret', 'adresse1', 'adresse2', 'contact', @@ -288,22 +354,28 @@ class AssoOptionSerializer(NamespacedHMSerializer): class HomeOptionSerializer(NamespacedHMSerializer): + """Serialize `preferences.models.HomeOption` objects. + """ class Meta: model = preferences.HomeOption fields = ('facebook_url', 'twitter_url', 'twitter_account_name') class MailMessageOptionSerializer(NamespacedHMSerializer): + """Serialize `preferences.models.MailMessageOption` objects. + """ class Meta: model = preferences.MailMessageOption fields = ('welcome_mail_fr', 'welcome_mail_en') -# TOPOLOGIE APP +# TOPOLOGIE class StackSerializer(NamespacedHMSerializer): + """Serialize `topologie.models.Stack` objects + """ class Meta: model = topologie.Stack fields = ('name', 'stack_id', 'details', 'member_id_min', @@ -311,12 +383,16 @@ class StackSerializer(NamespacedHMSerializer): class AccessPointSerializer(NamespacedHMSerializer): + """Serialize `topologie.models.AccessPoint` objects + """ class Meta: model = topologie.AccessPoint fields = ('user', 'name', 'active', 'location', 'api_url') class SwitchSerializer(NamespacedHMSerializer): + """Serialize `topologie.models.Switch` objects + """ port_amount = serializers.IntegerField(source='number') class Meta: model = topologie.Switch @@ -325,30 +401,40 @@ class SwitchSerializer(NamespacedHMSerializer): class ModelSwitchSerializer(NamespacedHMSerializer): + """Serialize `topologie.models.ModelSwitch` objects + """ class Meta: model = topologie.ModelSwitch fields = ('reference', 'constructor', 'api_url') class ConstructorSwitchSerializer(NamespacedHMSerializer): + """Serialize `topologie.models.ConstructorSwitch` objects + """ class Meta: model = topologie.ConstructorSwitch fields = ('name', 'api_url') class SwitchBaySerializer(NamespacedHMSerializer): + """Serialize `topologie.models.SwitchBay` objects + """ class Meta: model = topologie.SwitchBay fields = ('name', 'building', 'info', 'api_url') class BuildingSerializer(NamespacedHMSerializer): + """Serialize `topologie.models.Building` objects + """ class Meta: model = topologie.Building fields = ('name', 'api_url') class SwitchPortSerializer(NamespacedHMSerializer): + """Serialize `topologie.models.Port` objects + """ class Meta: model = topologie.Port fields = ('switch', 'port', 'room', 'machine_interface', 'related', @@ -360,15 +446,19 @@ class SwitchPortSerializer(NamespacedHMSerializer): class RoomSerializer(NamespacedHMSerializer): + """Serialize `topologie.models.Room` objects + """ class Meta: model = topologie.Room fields = ('name', 'details', 'api_url') -# USERS APP +# USERS class UserSerializer(NamespacedHMSerializer): + """Serialize `users.models.User` objects. + """ access = serializers.BooleanField(source='has_access') uid = serializers.IntegerField(source='uid_number') @@ -383,6 +473,8 @@ class UserSerializer(NamespacedHMSerializer): class ClubSerializer(NamespacedHMSerializer): + """Serialize `users.models.Club` objects. + """ name = serializers.CharField(source='surname') access = serializers.BooleanField(source='has_access') uid = serializers.IntegerField(source='uid_number') @@ -399,6 +491,8 @@ class ClubSerializer(NamespacedHMSerializer): class AdherentSerializer(NamespacedHMSerializer): + """Serialize `users.models.Adherent` objects. + """ access = serializers.BooleanField(source='has_access') uid = serializers.IntegerField(source='uid_number') @@ -413,24 +507,32 @@ class AdherentSerializer(NamespacedHMSerializer): class ServiceUserSerializer(NamespacedHMSerializer): + """Serialize `users.models.ServiceUser` objects. + """ class Meta: model = users.ServiceUser fields = ('pseudo', 'access_group', 'comment', 'api_url') class SchoolSerializer(NamespacedHMSerializer): + """Serialize `users.models.School` objects. + """ class Meta: model = users.School fields = ('name', 'api_url') class ListRightSerializer(NamespacedHMSerializer): + """Serialize `users.models.ListRight` objects. + """ class Meta: model = users.ListRight fields = ('unix_name', 'gid', 'critical', 'details', 'api_url') class ShellSerializer(NamespacedHMSerializer): + """Serialize `users.models.ListShell` objects. + """ class Meta: model = users.ListShell fields = ('shell', 'api_url') @@ -440,6 +542,8 @@ class ShellSerializer(NamespacedHMSerializer): class BanSerializer(NamespacedHMSerializer): + """Serialize `users.models.Ban` objects. + """ active = serializers.BooleanField(source='is_active') class Meta: @@ -449,6 +553,8 @@ class BanSerializer(NamespacedHMSerializer): class WhitelistSerializer(NamespacedHMSerializer): + """Serialize `users.models.Whitelist` objects. + """ active = serializers.BooleanField(source='is_active') class Meta: @@ -456,10 +562,12 @@ class WhitelistSerializer(NamespacedHMSerializer): fields = ('user', 'raison', 'date_start', 'date_end', 'active', 'api_url') -# Services +# SERVICE REGEN class ServiceRegenSerializer(NamespacedHMSerializer): + """Serialize the data about the services to regen. + """ hostname = serializers.CharField(source='server.domain.name', read_only=True) service_name = serializers.CharField(source='service.service_type', read_only=True) need_regen = serializers.BooleanField() @@ -476,6 +584,9 @@ class ServiceRegenSerializer(NamespacedHMSerializer): class HostMacIpSerializer(serializers.ModelSerializer): + """Serialize the data about the hostname-ipv4-mac address association + to build the DHCP lease files. + """ hostname = serializers.CharField(source='domain.name', read_only=True) extension = serializers.CharField(source='domain.extension.name', read_only=True) mac_address = serializers.CharField(read_only=True) @@ -490,22 +601,34 @@ class HostMacIpSerializer(serializers.ModelSerializer): class SOARecordSerializer(SOASerializer): + """Serialize `machines.models.SOA` objects with the data needed to + generate a SOA DNS record. + """ class Meta: model = machines.SOA fields = ('name', 'mail', 'refresh', 'retry', 'expire', 'ttl') class OriginV4RecordSerializer(IpListSerializer): + """Serialize `machines.models.IpList` objects with the data needed to + generate an IPv4 Origin DNS record. + """ class Meta(IpListSerializer.Meta): fields = ('ipv4',) class OriginV6RecordSerializer(Ipv6ListSerializer): + """Serialize `machines.models.Ipv6List` objects with the data needed to + generate an IPv6 Origin DNS record. + """ class Meta(Ipv6ListSerializer.Meta): fields = ('ipv6',) class NSRecordSerializer(NsSerializer): + """Serialize `machines.models.Ns` objects with the data needed to + generate a NS DNS record. + """ target = serializers.CharField(source='ns.name', read_only=True) class Meta(NsSerializer.Meta): @@ -513,6 +636,9 @@ class NSRecordSerializer(NsSerializer): class MXRecordSerializer(MxSerializer): + """Serialize `machines.models.Mx` objects with the data needed to + generate a MX DNS record. + """ target = serializers.CharField(source='name.name', read_only=True) class Meta(MxSerializer.Meta): @@ -520,11 +646,17 @@ class MXRecordSerializer(MxSerializer): class TXTRecordSerializer(TxtSerializer): + """Serialize `machines.models.Txt` objects with the data needed to + generate a TXT DNS record. + """ class Meta(TxtSerializer.Meta): fields = ('field1', 'field2') class SRVRecordSerializer(SrvSerializer): + """Serialize `machines.models.Srv` objects with the data needed to + generate a SRV DNS record. + """ target = serializers.CharField(source='target.name', read_only=True) class Meta(SrvSerializer.Meta): @@ -532,6 +664,9 @@ class SRVRecordSerializer(SrvSerializer): class ARecordSerializer(serializers.ModelSerializer): + """Serialize `machines.models.Interface` objects with the data needed to + generate a A DNS record. + """ hostname = serializers.CharField(source='domain.name', read_only=True) ipv4 = serializers.CharField(source='ipv4.ipv4', read_only=True) @@ -541,6 +676,9 @@ class ARecordSerializer(serializers.ModelSerializer): class AAAARecordSerializer(serializers.ModelSerializer): + """Serialize `machines.models.Interface` objects with the data needed to + generate a AAAA DNS record. + """ hostname = serializers.CharField(source='domain.name', read_only=True) ipv6 = Ipv6ListSerializer(many=True, read_only=True) @@ -550,6 +688,9 @@ class AAAARecordSerializer(serializers.ModelSerializer): class CNAMERecordSerializer(serializers.ModelSerializer): + """Serialize `machines.models.Domain` objects with the data needed to + generate a CNAME DNS record. + """ alias = serializers.CharField(source='cname.name', read_only=True) hostname = serializers.CharField(source='name', read_only=True) @@ -559,6 +700,8 @@ class CNAMERecordSerializer(serializers.ModelSerializer): class DNSZonesSerializer(serializers.ModelSerializer): + """Serialize the data about DNS Zones. + """ soa = SOARecordSerializer() ns_records = NSRecordSerializer(many=True, source='ns_set') originv4 = OriginV4RecordSerializer(source='origin') @@ -577,14 +720,18 @@ class DNSZonesSerializer(serializers.ModelSerializer): 'aaaa_records', 'cname_records') -# Mailing +# MAILING class MailingMemberSerializer(UserSerializer): + """Serialize the data about a mailing member. + """ class Meta(UserSerializer.Meta): fields = ('name', 'pseudo', 'email') class MailingSerializer(ClubSerializer): + """Serialize the data about a mailing. + """ members = MailingMemberSerializer(many=True) admins = MailingMemberSerializer(source='administrators', many=True) diff --git a/api/settings.py b/api/settings.py index cd19594e..f8171638 100644 --- a/api/settings.py +++ b/api/settings.py @@ -1,11 +1,8 @@ -# -*- mode: python; coding: utf-8 -*- # Re2o est un logiciel d'administration développé initiallement au rezometz. Il # se veut agnostique au réseau considéré, de manière à être installable en # quelques clics. # -# Copyright © 2017 Gabriel Détraz -# Copyright © 2017 Goulven Kermarec -# Copyright © 2017 Augustin Lemesle +# Copyright © 2018 Maël Kervella # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -21,8 +18,7 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -"""api.settings -Django settings specific to the API. +"""Settings specific to the API. """ # RestFramework config for API @@ -49,4 +45,6 @@ API_PERMISSION_CODENAME = 'use_api' API_APPS = ( 'rest_framework.authtoken', ) + +# The expiration time for an authentication token API_TOKEN_DURATION = 86400 # 24 hours diff --git a/api/tests.py b/api/tests.py index aa4747eb..24545864 100644 --- a/api/tests.py +++ b/api/tests.py @@ -2,9 +2,7 @@ # se veut agnostique au réseau considéré, de manière à être installable en # quelques clics. # -# Copyright © 2017 Gabriel Détraz -# Copyright © 2017 Goulven Kermarec -# Copyright © 2017 Augustin Lemesle +# Copyright © 2018 Maël Kervella # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -19,8 +17,7 @@ # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -"""api.tests -The tests for the API module. +"""Defines the test suite for the API """ import json @@ -34,13 +31,25 @@ import users.models as users class APIEndpointsTestCase(APITestCase): - # URLs that don't require to be authenticated + """Test case to test that all endpoints are reachable with respects to + authentication and permission checks. + + Attributes: + no_auth_endpoints: A list of endpoints that should be reachable + without authentication. + auth_no_perm_endpoints: A list of endpoints that should be reachable + when being authenticated but without permissions. + auth_perm_endpoints: A list of endpoints that should be reachable + when being authenticated and having the correct permissions. + stduser: A standard user with no permission used for the tests and + initialized at the beggining of this test case. + superuser: A superuser (with all permissions) used for the tests and + initialized at the beggining of this test case. + """ no_auth_endpoints = [ '/api/' ] - # URLs that require to be authenticated and have no special permissions auth_no_perm_endpoints = [] - # URLs that require to be authenticated and have special permissions auth_perm_endpoints = [ '/api/cotisations/articles/', # '/api/cotisations/articles//', @@ -160,49 +169,62 @@ class APIEndpointsTestCase(APITestCase): cls.superuser.delete() super().tearDownClass() - def check_responses_code(self, urls, expected_code, formats=[None], + def check_responses_code(self, urls, expected_code, formats=None, assert_more=None): - """ - Utility function to test if a list of urls answer an expected code + """Utility function to test if a list of urls answer an expected code. - :param urls: (list) The list of urls to test - :param expected_code: (int) The HTTP return code expected - :param formats: (list) The list of formats to use for the request - (Default: [None]) - :param assert_more: (func) A function to assert more specific data - in the same test. It is evaluated with the responsem object, the - url and the format used. + Args: + urls: The list of urls to test + expected_code: The HTTP return code expected + formats: The list of formats to use for the request. Default is to + only test `None` format. + assert_more: An optional function to assert more specific data in + the same test. The response object, the url and the format + used are passed as arguments. + + Raises: + AssertionError: The response got did not have the expected status + code. + Any exception raised in the evalutation of `assert_more`. """ + if formats is None: + formats = [None] for url in urls: for format in formats: with self.subTest(url=url, format=format): response = self.client.get(url, format=format) assert response.status_code == expected_code - if assert_more: + if assert_more is not None: assert_more(response, url, format) def test_no_auth_endpoints_with_no_auth(self): - """ - Test that every endpoint that does not require to be authenticated, - returns a Ok (200) response when not authenticated. + """Tests that every endpoint that does not require to be + authenticated, returns a Ok (200) response when not authenticated. + + Raises: + AssertionError: An endpoint did not have a 200 status code. """ urls = [endpoint.replace('', '1') for endpoint in self.no_auth_endpoints] self.check_responses_code(urls, codes.ok) def test_auth_endpoints_with_no_auth(self): - """ - Test that every endpoint that does require to be authenticated, + """Tests that every endpoint that does require to be authenticated, returns a Unauthorized (401) response when not authenticated. + + Raises: + AssertionError: An endpoint did not have a 401 status code. """ urls = [endpoint.replace('', '1') for endpoint in \ self.auth_no_perm_endpoints + self.auth_perm_endpoints] self.check_responses_code(urls, codes.unauthorized) def test_no_auth_endpoints_with_auth(self): - """ - Test that every endpoint that does not require to be authenticated, - returns a Ok (200) response when authenticated. + """Tests that every endpoint that does not require to be + authenticated, returns a Ok (200) response when authenticated. + + Raises: + AssertionError: An endpoint did not have a 200 status code. """ self.client.force_authenticate(user=self.stduser) urls = [endpoint.replace('', '1') @@ -210,10 +232,12 @@ class APIEndpointsTestCase(APITestCase): self.check_responses_code(urls, codes.ok) def test_auth_no_perm_endpoints_with_auth_and_no_perm(self): - """ - Test that every endpoint that does require to be authenticated and - no special permissions, returns a Ok (200) response when - authenticated but without permissions. + """Tests that every endpoint that does require to be authenticated and + no special permissions, returns a Ok (200) response when authenticated + but without permissions. + + Raises: + AssertionError: An endpoint did not have a 200 status code. """ self.client.force_authenticate(user=self.stduser) urls = [endpoint.replace('', '1') @@ -221,10 +245,12 @@ class APIEndpointsTestCase(APITestCase): self.check_responses_code(urls, codes.ok) def test_auth_perm_endpoints_with_auth_and_no_perm(self): - """ - Test that every endpoint that does require to be authenticated and + """Tests that every endpoint that does require to be authenticated and special permissions, returns a Forbidden (403) response when authenticated but without permissions. + + Raises: + AssertionError: An endpoint did not have a 403 status code. """ self.client.force_authenticate(user=self.stduser) urls = [endpoint.replace('', '1') @@ -232,9 +258,11 @@ class APIEndpointsTestCase(APITestCase): self.check_responses_code(urls, codes.forbidden) def test_auth_endpoints_with_auth_and_perm(self): - """ - Test that every endpoint that does require to be authenticated, - returns a Ok (200) response when authenticated with all permissions + """Tests that every endpoint that does require to be authenticated, + returns a Ok (200) response when authenticated with all permissions. + + Raises: + AssertionError: An endpoint did not have a 200 status code. """ self.client.force_authenticate(user=self.superuser) urls = [endpoint.replace('', '1') for endpoint \ @@ -242,10 +270,12 @@ class APIEndpointsTestCase(APITestCase): self.check_responses_code(urls, codes.ok) def test_endpoints_not_found(self): - """ - Test that every endpoint that uses a primary key parameter, + """Tests that every endpoint that uses a primary key parameter, returns a Not Found (404) response when queried with non-existing - primary key + primary key. + + Raises: + AssertionError: An endpoint did not have a 404 status code. """ self.client.force_authenticate(user=self.superuser) # Select only the URLs with '' and replace it with '42' @@ -255,9 +285,12 @@ class APIEndpointsTestCase(APITestCase): self.check_responses_code(urls, codes.not_found) def test_formats(self): - """ - Test that every endpoint returns a Ok (200) response when using - different formats. Also checks that 'json' format returns a valid json + """Tests that every endpoint returns a Ok (200) response when using + different formats. Also checks that 'json' format returns a valid + JSON object. + + Raises: + AssertionError: An endpoint did not have a 200 status code. """ self.client.force_authenticate(user=self.superuser) @@ -275,6 +308,14 @@ class APIEndpointsTestCase(APITestCase): assert_more=assert_more) class APIPaginationTestCase(APITestCase): + """Test case to check that the pagination is used on all endpoints that + should use it. + + Attributes: + endpoints: A list of endpoints that should use the pagination. + superuser: A superuser used in the tests to access the endpoints. + """ + endpoints = [ '/api/cotisations/articles/', '/api/cotisations/banques/', @@ -338,8 +379,12 @@ class APIPaginationTestCase(APITestCase): super().tearDownClass() def test_pagination(self): - """ - Test that every endpoint is using the pagination correctly + """Tests that every endpoint is using the pagination correctly. + + Raises: + AssertionError: An endpoint did not have one the following keyword + in the JSOn response: 'count', 'next', 'previous', 'results' + or more that 100 results were returned. """ self.client.force_authenticate(self.superuser) for url in self.endpoints: diff --git a/api/urls.py b/api/urls.py index edf399c8..9353975f 100644 --- a/api/urls.py +++ b/api/urls.py @@ -2,7 +2,7 @@ # se veut agnostique au réseau considéré, de manière à être installable en # quelques clics. # -# Copyright © 2018 Mael Kervella +# Copyright © 2018 Maël Kervella # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -17,27 +17,30 @@ # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -"""api.urls -Urls de l'api, pointant vers les fonctions de views +"""Defines the URLs of the API + +A custom router is used to register all the routes. That allows to register +all the URL patterns from the viewsets as a standard router but, the views +can also be register. That way a complete API root page presenting all URLs +can be generated automatically. """ -from __future__ import unicode_literals - from django.conf.urls import url, include -from .routers import AllViewsRouter from . import views +from .routers import AllViewsRouter + router = AllViewsRouter() -# COTISATIONS APP +# COTISATIONS router.register_viewset(r'cotisations/factures', views.FactureViewSet) router.register_viewset(r'cotisations/ventes', views.VenteViewSet) router.register_viewset(r'cotisations/articles', views.ArticleViewSet) router.register_viewset(r'cotisations/banques', views.BanqueViewSet) router.register_viewset(r'cotisations/paiements', views.PaiementViewSet) router.register_viewset(r'cotisations/cotisations', views.CotisationViewSet) -# MACHINES APP +# MACHINES router.register_viewset(r'machines/machines', views.MachineViewSet) router.register_viewset(r'machines/machinetypes', views.MachineTypeViewSet) router.register_viewset(r'machines/iptypes', views.IpTypeViewSet) @@ -57,7 +60,7 @@ router.register_viewset(r'machines/services', views.ServiceViewSet) router.register_viewset(r'machines/servicelinks', views.ServiceLinkViewSet, base_name='servicelink') router.register_viewset(r'machines/ouvertureportlists', views.OuverturePortListViewSet) router.register_viewset(r'machines/ouvertureports', views.OuverturePortViewSet) -# PREFERENCES APP +# PREFERENCES router.register_viewset(r'preferences/service', views.ServiceViewSet), router.register_view(r'preferences/optionaluser', views.OptionalUserView), router.register_view(r'preferences/optionalmachine', views.OptionalMachineView), @@ -66,7 +69,7 @@ router.register_view(r'preferences/generaloption', views.GeneralOptionView), router.register_view(r'preferences/assooption', views.AssoOptionView), router.register_view(r'preferences/homeoption', views.HomeOptionView), router.register_view(r'preferences/mailmessageoption', views.MailMessageOptionView), -# TOPOLOGIE APP +# TOPOLOGIE router.register_viewset(r'topologie/stack', views.StackViewSet) router.register_viewset(r'topologie/acesspoint', views.AccessPointViewSet) router.register_viewset(r'topologie/switch', views.SwitchViewSet) @@ -76,7 +79,7 @@ router.register_viewset(r'topologie/switchbay', views.SwitchBayViewSet) router.register_viewset(r'topologie/building', views.BuildingViewSet) router.register_viewset(r'topologie/switchport', views.SwitchPortViewSet, base_name='switchport') router.register_viewset(r'topologie/room', views.RoomViewSet) -# USERS APP +# USERS router.register_viewset(r'users/users', views.UserViewSet) router.register_viewset(r'users/clubs', views.ClubViewSet) router.register_viewset(r'users/adherents', views.AdherentViewSet) @@ -86,7 +89,7 @@ router.register_viewset(r'users/listrights', views.ListRightViewSet) router.register_viewset(r'users/shells', views.ShellViewSet, base_name='shell') router.register_viewset(r'users/bans', views.BanViewSet) router.register_viewset(r'users/whitelists', views.WhitelistViewSet) -# SERVICES REGEN +# SERVICE REGEN router.register_viewset(r'services/regen', views.ServiceRegenViewSet, base_name='serviceregen') # DHCP router.register_view(r'dhcp/hostmacip', views.HostMacIpView), @@ -95,7 +98,7 @@ router.register_view(r'dns/zones', views.DNSZonesView), # MAILING router.register_view(r'mailing/standard', views.StandardMailingView), router.register_view(r'mailing/club', views.ClubMailingView), -# TOKEN-AUTH +# TOKEN AUTHENTICATION router.register_view(r'token-auth', views.ObtainExpiringAuthToken) diff --git a/api/views.py b/api/views.py index 7d4aaffc..9ee6ea75 100644 --- a/api/views.py +++ b/api/views.py @@ -18,16 +18,16 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -"""api.views +"""Defines the views of the API -The views for the API app. They should all return JSON data and not fallback on -HTML pages such as the login and index pages for a better integration. +All views inherits the `rest_framework.views.APIview` to respect the +REST API requirements such as dealing with HTTP status code, format of +the response (JSON or other), the CSRF exempting, ... """ import datetime from django.conf import settings - from rest_framework.authtoken.views import ObtainAuthToken from rest_framework.authtoken.models import Token from rest_framework.response import Response @@ -38,7 +38,6 @@ import machines.models as machines import preferences.models as preferences import topologie.models as topologie import users.models as users - from re2o.utils import all_active_interfaces, all_has_access from . import serializers @@ -46,142 +45,195 @@ from .pagination import PageSizedPagination from .permissions import ACLPermission -# COTISATIONS APP +# COTISATIONS class FactureViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `cotisations.models.Facture` objects. + """ queryset = cotisations.Facture.objects.all() serializer_class = serializers.FactureSerializer class VenteViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `cotisations.models.Vente` objects. + """ queryset = cotisations.Vente.objects.all() serializer_class = serializers.VenteSerializer class ArticleViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `cotisations.models.Article` objects. + """ queryset = cotisations.Article.objects.all() serializer_class = serializers.ArticleSerializer class BanqueViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `cotisations.models.Banque` objects. + """ queryset = cotisations.Banque.objects.all() serializer_class = serializers.BanqueSerializer class PaiementViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `cotisations.models.Paiement` objects. + """ queryset = cotisations.Paiement.objects.all() serializer_class = serializers.PaiementSerializer class CotisationViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `cotisations.models.Cotisation` objects. + """ queryset = cotisations.Cotisation.objects.all() serializer_class = serializers.CotisationSerializer -# MACHINES APP +# MACHINES class MachineViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `machines.models.Machine` objects. + """ queryset = machines.Machine.objects.all() serializer_class = serializers.MachineSerializer class MachineTypeViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `machines.models.MachineType` objects. + """ queryset = machines.MachineType.objects.all() serializer_class = serializers.MachineTypeSerializer class IpTypeViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `machines.models.IpType` objects. + """ queryset = machines.IpType.objects.all() serializer_class = serializers.IpTypeSerializer class VlanViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `machines.models.Vlan` objects. + """ queryset = machines.Vlan.objects.all() serializer_class = serializers.VlanSerializer class NasViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `machines.models.Nas` objects. + """ queryset = machines.Nas.objects.all() serializer_class = serializers.NasSerializer class SOAViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `machines.models.SOA` objects. + """ queryset = machines.SOA.objects.all() serializer_class = serializers.SOASerializer class ExtensionViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `machines.models.Extension` objects. + """ queryset = machines.Extension.objects.all() serializer_class = serializers.ExtensionSerializer class MxViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `machines.models.Mx` objects. + """ queryset = machines.Mx.objects.all() serializer_class = serializers.MxSerializer class NsViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `machines.models.Ns` objects. + """ queryset = machines.Ns.objects.all() serializer_class = serializers.NsSerializer class TxtViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `machines.models.Txt` objects. + """ queryset = machines.Txt.objects.all() serializer_class = serializers.TxtSerializer class SrvViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `machines.models.Srv` objects. + """ queryset = machines.Srv.objects.all() serializer_class = serializers.SrvSerializer class InterfaceViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `machines.models.Interface` objects. + """ queryset = machines.Interface.objects.all() serializer_class = serializers.InterfaceSerializer class Ipv6ListViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `machines.models.Ipv6List` objects. + """ queryset = machines.Ipv6List.objects.all() serializer_class = serializers.Ipv6ListSerializer class DomainViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `machines.models.Domain` objects. + """ queryset = machines.Domain.objects.all() serializer_class = serializers.DomainSerializer class IpListViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `machines.models.IpList` objects. + """ queryset = machines.IpList.objects.all() serializer_class = serializers.IpListSerializer class ServiceViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `machines.models.Service` objects. + """ queryset = machines.Service.objects.all() serializer_class = serializers.ServiceSerializer class ServiceLinkViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `machines.models.Service_link` objects. + """ queryset = machines.Service_link.objects.all() serializer_class = serializers.ServiceLinkSerializer class OuverturePortListViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `machines.models.OuverturePortList` + objects. + """ queryset = machines.OuverturePortList.objects.all() serializer_class = serializers.OuverturePortListSerializer class OuverturePortViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `machines.models.OuverturePort` objects. + """ queryset = machines.OuverturePort.objects.all() serializer_class = serializers.OuverturePortSerializer -# PREFERENCES APP +# PREFERENCES # Those views differ a bit because there is only one object # to display, so we don't bother with the listing part class OptionalUserView(generics.RetrieveAPIView): + """Exposes details of `preferences.models.` settings. + """ permission_classes = (ACLPermission, ) perms_map = {'GET' : [preferences.OptionalUser.can_view_all]} serializer_class = serializers.OptionalUserSerializer @@ -191,6 +243,8 @@ class OptionalUserView(generics.RetrieveAPIView): class OptionalMachineView(generics.RetrieveAPIView): + """Exposes details of `preferences.models.OptionalMachine` settings. + """ permission_classes = (ACLPermission, ) perms_map = {'GET' : [preferences.OptionalMachine.can_view_all]} serializer_class = serializers.OptionalMachineSerializer @@ -200,6 +254,8 @@ class OptionalMachineView(generics.RetrieveAPIView): class OptionalTopologieView(generics.RetrieveAPIView): + """Exposes details of `preferences.models.OptionalTopologie` settings. + """ permission_classes = (ACLPermission, ) perms_map = {'GET' : [preferences.OptionalTopologie.can_view_all]} serializer_class = serializers.OptionalTopologieSerializer @@ -209,6 +265,8 @@ class OptionalTopologieView(generics.RetrieveAPIView): class GeneralOptionView(generics.RetrieveAPIView): + """Exposes details of `preferences.models.GeneralOption` settings. + """ permission_classes = (ACLPermission, ) perms_map = {'GET' : [preferences.GeneralOption.can_view_all]} serializer_class = serializers.GeneralOptionSerializer @@ -218,11 +276,15 @@ class GeneralOptionView(generics.RetrieveAPIView): class ServiceViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `preferences.models.Service` objects. + """ queryset = preferences.Service.objects.all() serializer_class = serializers.ServiceSerializer class AssoOptionView(generics.RetrieveAPIView): + """Exposes details of `preferences.models.AssoOption` settings. + """ permission_classes = (ACLPermission, ) perms_map = {'GET' : [preferences.AssoOption.can_view_all]} serializer_class = serializers.AssoOptionSerializer @@ -232,6 +294,8 @@ class AssoOptionView(generics.RetrieveAPIView): class HomeOptionView(generics.RetrieveAPIView): + """Exposes details of `preferences.models.HomeOption` settings. + """ permission_classes = (ACLPermission, ) perms_map = {'GET' : [preferences.HomeOption.can_view_all]} serializer_class = serializers.HomeOptionSerializer @@ -241,6 +305,8 @@ class HomeOptionView(generics.RetrieveAPIView): class MailMessageOptionView(generics.RetrieveAPIView): + """Exposes details of `preferences.models.MailMessageOption` settings. + """ permission_classes = (ACLPermission, ) perms_map = {'GET' : [preferences.MailMessageOption.can_view_all]} serializer_class = serializers.MailMessageOptionSerializer @@ -249,106 +315,145 @@ class MailMessageOptionView(generics.RetrieveAPIView): return preferences.MailMessageOption.objects.first() -# TOPOLOGIE APP +# TOPOLOGIE class StackViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `topologie.models.Stack` objects. + """ queryset = topologie.Stack.objects.all() serializer_class = serializers.StackSerializer class AccessPointViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `topologie.models.AccessPoint` objects. + """ queryset = topologie.AccessPoint.objects.all() serializer_class = serializers.AccessPointSerializer class SwitchViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `topologie.models.Switch` objects. + """ queryset = topologie.Switch.objects.all() serializer_class = serializers.SwitchSerializer class ModelSwitchViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `topologie.models.ModelSwitch` objects. + """ queryset = topologie.ModelSwitch.objects.all() serializer_class = serializers.ModelSwitchSerializer class ConstructorSwitchViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `topologie.models.ConstructorSwitch` + objects. + """ queryset = topologie.ConstructorSwitch.objects.all() serializer_class = serializers.ConstructorSwitchSerializer class SwitchBayViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `topologie.models.SwitchBay` objects. + """ queryset = topologie.SwitchBay.objects.all() serializer_class = serializers.SwitchBaySerializer class BuildingViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `topologie.models.Building` objects. + """ queryset = topologie.Building.objects.all() serializer_class = serializers.BuildingSerializer class SwitchPortViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `topologie.models.Port` objects. + """ queryset = topologie.Port.objects.all() serializer_class = serializers.SwitchPortSerializer class RoomViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `topologie.models.Room` objects. + """ queryset = topologie.Room.objects.all() serializer_class = serializers.RoomSerializer -# USER APP +# USER class UserViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `users.models.Users` objects. + """ queryset = users.User.objects.all() serializer_class = serializers.UserSerializer class ClubViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `users.models.Club` objects. + """ queryset = users.Club.objects.all() serializer_class = serializers.ClubSerializer class AdherentViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `users.models.Adherent` objects. + """ queryset = users.Adherent.objects.all() serializer_class = serializers.AdherentSerializer class ServiceUserViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `users.models.ServiceUser` objects. + """ queryset = users.ServiceUser.objects.all() serializer_class = serializers.ServiceUserSerializer class SchoolViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `users.models.School` objects. + """ queryset = users.School.objects.all() serializer_class = serializers.SchoolSerializer class ListRightViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `users.models.ListRight` objects. + """ queryset = users.ListRight.objects.all() serializer_class = serializers.ListRightSerializer class ShellViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `users.models.ListShell` objects. + """ queryset = users.ListShell.objects.all() serializer_class = serializers.ShellSerializer class BanViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `users.models.Ban` objects. + """ queryset = users.Ban.objects.all() serializer_class = serializers.BanSerializer class WhitelistViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `users.models.Whitelist` objects. + """ queryset = users.Whitelist.objects.all() serializer_class = serializers.WhitelistSerializer -# Services views +# SERVICE REGEN class ServiceRegenViewSet(viewsets.ModelViewSet): + """Exposes list and details of the services to regen + """ serializer_class = serializers.ServiceRegenSerializer def get_queryset(self): @@ -363,24 +468,33 @@ class ServiceRegenViewSet(viewsets.ModelViewSet): return queryset -# DHCP views +# DHCP class HostMacIpView(generics.ListAPIView): + """Exposes the associations between hostname, mac address and IPv4 in + order to build the DHCP lease files. + """ queryset = all_active_interfaces() serializer_class = serializers.HostMacIpSerializer -# DNS views +# DNS class DNSZonesView(generics.ListAPIView): + """Exposes the detailed information about each extension (hostnames, + IPs, DNS records, etc.) in order to build the DNS zone files. + """ queryset = machines.Extension.objects.all() serializer_class = serializers.DNSZonesSerializer -# Mailing views +# MAILING class StandardMailingView(views.APIView): + """Exposes list and details of standard mailings (name and members) in + order to building the corresponding mailing lists. + """ pagination_class = PageSizedPagination permission_classes = (ACLPermission, ) perms_map = {'GET' : [users.User.can_view_all]} @@ -394,13 +508,23 @@ class StandardMailingView(views.APIView): class ClubMailingView(generics.ListAPIView): + """Exposes list and details of club mailings (name, members and admins) in + order to build the corresponding mailing lists. + """ queryset = users.Club.objects.all() serializer_class = serializers.MailingSerializer -# Subclass the standard rest_framework.auth_token.views.ObtainAuthToken -# in order to renew the lease of the token and add expiration time +# TOKEN AUTHENTICATION + + class ObtainExpiringAuthToken(ObtainAuthToken): + """Exposes a view to obtain a authentication token. + + This view as the same behavior as the + `rest_framework.auth_token.views.ObtainAuthToken` view except that the + expiration time is send along with the token as an addtional information. + """ def post(self, request, *args, **kwargs): serializer = self.serializer_class(data=request.data) serializer.is_valid(raise_exception=True) From 4c1af06780abd0ba3c1f41c768cec759f6a40cff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Sun, 17 Jun 2018 01:16:19 +0000 Subject: [PATCH 32/49] Edit changelog --- CHANGELOG.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b41b96eb..1ff8ead5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,7 +38,7 @@ mkdir -p media/images ## MR 163: Fix install re2o Refactored install_re2o.sh script. -* There are more tools available with it but some fucntion have changed, report to [the dedicated wiki page](for more informations) or run: +* There are more tools available with it but some function have changed, report to [the dedicated wiki page](https://gitlab.federez.net/federez/re2o/wikis/User%20Documentation/Setup%20script)for more informations or run: ``` install_re2o.sh help ``` @@ -46,10 +46,19 @@ install_re2o.sh help -## MR XXX: Cleanup and refactor API +## MR 172: Refactor API -Activate HTTP Authorization passthrough in by adding the following in /etc/apache2/site-available/re2o.conf (example in install_utils/apache2/re2o.conf): +Creates a new (nearly) REST API to expose all models of Re2o. See [the dedicated wiki page](https://gitlab.federez.net/federez/re2o/wikis/API/Raw-Usage) for more details on how to use it. +* Activate HTTP Authorization passthrough in by adding the following in `/etc/apache2/site-available/re2o.conf` (example in `install_utils/apache2/re2o.conf`): ``` WSGIPassAuthorization On ``` +* Activate the API if you want to use it by adding `'api'` to the optional apps in `re2o/settings_local.py`: +``` +OPTIONAL_APPS = ( + ... + 'api', + ... +) +``` From 3a129a5d6e3e86c7d9a0c5b55dd8257aaafabca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Sun, 17 Jun 2018 02:00:15 +0000 Subject: [PATCH 33/49] Add missing endpoints in tests --- api/tests.py | 20 ++++++++++++++++++++ api/urls.py | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/api/tests.py b/api/tests.py index 24545864..89ab7bdd 100644 --- a/api/tests.py +++ b/api/tests.py @@ -101,6 +101,15 @@ class APIEndpointsTestCase(APITestCase): # '/api/machines/txt//', '/api/machines/vlans/', # '/api/machines/vlans//', + '/api/preferences/optionaluser/', + '/api/preferences/optionalmachine/', + '/api/preferences/optionaltopologie/', + '/api/preferences/generaloption/', + '/api/preferences/service/', +# '/api/preferences/service//', + '/api/preferences/assooption/', + '/api/preferences/homeoption/', + '/api/preferences/mailmessageoption/', '/api/topologie/acesspoint/', # '/api/topologie/acesspoint//', '/api/topologie/building/', @@ -137,6 +146,11 @@ class APIEndpointsTestCase(APITestCase): # '/api/users/users//', '/api/users/whitelists/', # '/api/users/whitelists//', + '/api/dns/zones/', + '/api/dhcp/hostmacip/', + '/api/mailing/standard', + '/api/mailing/club', + '/api/services/regen/', ] stduser = None @@ -342,6 +356,7 @@ class APIPaginationTestCase(APITestCase): '/api/machines/srv/', '/api/machines/txt/', '/api/machines/vlans/', + '/api/preferences/service/', '/api/topologie/acesspoint/', '/api/topologie/building/', '/api/topologie/constructorswitch/', @@ -360,6 +375,11 @@ class APIPaginationTestCase(APITestCase): '/api/users/shells/', '/api/users/users/', '/api/users/whitelists/', + '/api/dns/zones/', + '/api/dhcp/hostmacip/', + '/api/mailing/standard', + '/api/mailing/club', + '/api/services/regen/', ] superuser = None diff --git a/api/urls.py b/api/urls.py index 9353975f..c835429f 100644 --- a/api/urls.py +++ b/api/urls.py @@ -61,11 +61,11 @@ router.register_viewset(r'machines/servicelinks', views.ServiceLinkViewSet, base router.register_viewset(r'machines/ouvertureportlists', views.OuverturePortListViewSet) router.register_viewset(r'machines/ouvertureports', views.OuverturePortViewSet) # PREFERENCES -router.register_viewset(r'preferences/service', views.ServiceViewSet), router.register_view(r'preferences/optionaluser', views.OptionalUserView), router.register_view(r'preferences/optionalmachine', views.OptionalMachineView), router.register_view(r'preferences/optionaltopologie', views.OptionalTopologieView), router.register_view(r'preferences/generaloption', views.GeneralOptionView), +router.register_viewset(r'preferences/service', views.ServiceViewSet), router.register_view(r'preferences/assooption', views.AssoOptionView), router.register_view(r'preferences/homeoption', views.HomeOptionView), router.register_view(r'preferences/mailmessageoption', views.MailMessageOptionView), From 1951ab467d6e2892de0cf5543fc1aabfccdd3287 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Wed, 20 Jun 2018 11:44:43 +0000 Subject: [PATCH 34/49] Remove plural from urls --- api/tests.py | 168 +++++++++++++++++++++++++-------------------------- api/urls.py | 56 ++++++++--------- 2 files changed, 112 insertions(+), 112 deletions(-) diff --git a/api/tests.py b/api/tests.py index 89ab7bdd..5c4122bd 100644 --- a/api/tests.py +++ b/api/tests.py @@ -51,56 +51,56 @@ class APIEndpointsTestCase(APITestCase): ] auth_no_perm_endpoints = [] auth_perm_endpoints = [ - '/api/cotisations/articles/', -# '/api/cotisations/articles//', - '/api/cotisations/banques/', -# '/api/cotisations/banques//', - '/api/cotisations/cotisations/', -# '/api/cotisations/cotisations//', - '/api/cotisations/factures/', -# '/api/cotisations/factures//', - '/api/cotisations/paiements/', -# '/api/cotisations/paiements//', - '/api/cotisations/ventes/', -# '/api/cotisations/ventes//', - '/api/machines/domains/', -# '/api/machines/domains//', - '/api/machines/extensions/', -# '/api/machines/extensions//', - '/api/machines/interfaces/', -# '/api/machines/interfaces//', - '/api/machines/iplists/', -# '/api/machines/iplists//', - '/api/machines/iptypes/', -# '/api/machines/iptypes//', - '/api/machines/ipv6lists/', -# '/api/machines/ipv6lists//', - '/api/machines/machines/', -# '/api/machines/machines//', - '/api/machines/machinetypes/', -# '/api/machines/machinetypes//', + '/api/cotisations/article/', +# '/api/cotisations/article//', + '/api/cotisations/banque/', +# '/api/cotisations/banque//', + '/api/cotisations/cotisation/', +# '/api/cotisations/cotisation//', + '/api/cotisations/facture/', +# '/api/cotisations/facture//', + '/api/cotisations/paiement/', +# '/api/cotisations/paiement//', + '/api/cotisations/vente/', +# '/api/cotisations/vente//', + '/api/machines/domain/', +# '/api/machines/domain//', + '/api/machines/extension/', +# '/api/machines/extension//', + '/api/machines/interface/', +# '/api/machines/interface//', + '/api/machines/iplist/', +# '/api/machines/iplist//', + '/api/machines/iptype/', +# '/api/machines/iptype//', + '/api/machines/ipv6list/', +# '/api/machines/ipv6list//', + '/api/machines/machine/', +# '/api/machines/machine//', + '/api/machines/machinetype/', +# '/api/machines/machinetype//', '/api/machines/mx/', # '/api/machines/mx//', '/api/machines/nas/', # '/api/machines/nas//', '/api/machines/ns/', # '/api/machines/ns//', - '/api/machines/ouvertureportlists/', -# '/api/machines/ouvertureportlists//', - '/api/machines/ouvertureports/', -# '/api/machines/ouvertureports//', - '/api/machines/servicelinks/', -# '/api/machines/servicelinks//', - '/api/machines/services/', -# '/api/machines/services//', + '/api/machines/ouvertureportlist/', +# '/api/machines/ouvertureportlist//', + '/api/machines/ouvertureport/', +# '/api/machines/ouvertureport//', + '/api/machines/servicelink/', +# '/api/machines/servicelink//', + '/api/machines/service/', +# '/api/machines/service//', '/api/machines/soa/', # '/api/machines/soa//', '/api/machines/srv/', # '/api/machines/srv//', '/api/machines/txt/', # '/api/machines/txt//', - '/api/machines/vlans/', -# '/api/machines/vlans//', + '/api/machines/vlan/', +# '/api/machines/vlan//', '/api/preferences/optionaluser/', '/api/preferences/optionalmachine/', '/api/preferences/optionaltopologie/', @@ -128,24 +128,24 @@ class APIEndpointsTestCase(APITestCase): # '/api/topologie/switchbay//', '/api/topologie/switchport/', # '/api/topologie/switchport//', - '/api/users/adherents/', -# '/api/users/adherents//', - '/api/users/bans/', -# '/api/users/bans//', - '/api/users/clubs/', -# '/api/users/clubs//', - '/api/users/listrights/', -# '/api/users/listrights//', - '/api/users/schools/', -# '/api/users/schools//', - '/api/users/serviceusers/', -# '/api/users/serviceusers//', - '/api/users/shells/', -# '/api/users/shells//', - '/api/users/users/', -# '/api/users/users//', - '/api/users/whitelists/', -# '/api/users/whitelists//', + '/api/users/adherent/', +# '/api/users/adherent//', + '/api/users/ban/', +# '/api/users/ban//', + '/api/users/club/', +# '/api/users/club//', + '/api/users/listright/', +# '/api/users/listright//', + '/api/users/school/', +# '/api/users/school//', + '/api/users/serviceuser/', +# '/api/users/serviceuser//', + '/api/users/shell/', +# '/api/users/shell//', + '/api/users/user/', +# '/api/users/user//', + '/api/users/whitelist/', +# '/api/users/whitelist//', '/api/dns/zones/', '/api/dhcp/hostmacip/', '/api/mailing/standard', @@ -331,31 +331,31 @@ class APIPaginationTestCase(APITestCase): """ endpoints = [ - '/api/cotisations/articles/', - '/api/cotisations/banques/', - '/api/cotisations/cotisations/', - '/api/cotisations/factures/', - '/api/cotisations/paiements/', - '/api/cotisations/ventes/', - '/api/machines/domains/', - '/api/machines/extensions/', - '/api/machines/interfaces/', - '/api/machines/iplists/', - '/api/machines/iptypes/', - '/api/machines/ipv6lists/', - '/api/machines/machines/', - '/api/machines/machinetypes/', + '/api/cotisations/article/', + '/api/cotisations/banque/', + '/api/cotisations/cotisation/', + '/api/cotisations/facture/', + '/api/cotisations/paiement/', + '/api/cotisations/vente/', + '/api/machines/domain/', + '/api/machines/extension/', + '/api/machines/interface/', + '/api/machines/iplist/', + '/api/machines/iptype/', + '/api/machines/ipv6list/', + '/api/machines/machine/', + '/api/machines/machinetype/', '/api/machines/mx/', '/api/machines/nas/', '/api/machines/ns/', - '/api/machines/ouvertureportlists/', - '/api/machines/ouvertureports/', - '/api/machines/servicelinks/', - '/api/machines/services/', + '/api/machines/ouvertureportlist/', + '/api/machines/ouvertureport/', + '/api/machines/servicelink/', + '/api/machines/service/', '/api/machines/soa/', '/api/machines/srv/', '/api/machines/txt/', - '/api/machines/vlans/', + '/api/machines/vlan/', '/api/preferences/service/', '/api/topologie/acesspoint/', '/api/topologie/building/', @@ -366,15 +366,15 @@ class APIPaginationTestCase(APITestCase): '/api/topologie/switch/', '/api/topologie/switchbay/', '/api/topologie/switchport/', - '/api/users/adherents/', - '/api/users/bans/', - '/api/users/clubs/', - '/api/users/listrights/', - '/api/users/schools/', - '/api/users/serviceusers/', - '/api/users/shells/', - '/api/users/users/', - '/api/users/whitelists/', + '/api/users/adherent/', + '/api/users/ban/', + '/api/users/club/', + '/api/users/listright/', + '/api/users/school/', + '/api/users/serviceuser/', + '/api/users/shell/', + '/api/users/user/', + '/api/users/whitelist/', '/api/dns/zones/', '/api/dhcp/hostmacip/', '/api/mailing/standard', diff --git a/api/urls.py b/api/urls.py index c835429f..9d6b5f5e 100644 --- a/api/urls.py +++ b/api/urls.py @@ -34,32 +34,32 @@ from .routers import AllViewsRouter router = AllViewsRouter() # COTISATIONS -router.register_viewset(r'cotisations/factures', views.FactureViewSet) -router.register_viewset(r'cotisations/ventes', views.VenteViewSet) -router.register_viewset(r'cotisations/articles', views.ArticleViewSet) -router.register_viewset(r'cotisations/banques', views.BanqueViewSet) -router.register_viewset(r'cotisations/paiements', views.PaiementViewSet) -router.register_viewset(r'cotisations/cotisations', views.CotisationViewSet) +router.register_viewset(r'cotisations/facture', views.FactureViewSet) +router.register_viewset(r'cotisations/vente', views.VenteViewSet) +router.register_viewset(r'cotisations/article', views.ArticleViewSet) +router.register_viewset(r'cotisations/banque', views.BanqueViewSet) +router.register_viewset(r'cotisations/paiement', views.PaiementViewSet) +router.register_viewset(r'cotisations/cotisation', views.CotisationViewSet) # MACHINES -router.register_viewset(r'machines/machines', views.MachineViewSet) -router.register_viewset(r'machines/machinetypes', views.MachineTypeViewSet) -router.register_viewset(r'machines/iptypes', views.IpTypeViewSet) -router.register_viewset(r'machines/vlans', views.VlanViewSet) +router.register_viewset(r'machines/machine', views.MachineViewSet) +router.register_viewset(r'machines/machinetype', views.MachineTypeViewSet) +router.register_viewset(r'machines/iptype', views.IpTypeViewSet) +router.register_viewset(r'machines/vlan', views.VlanViewSet) router.register_viewset(r'machines/nas', views.NasViewSet) router.register_viewset(r'machines/soa', views.SOAViewSet) -router.register_viewset(r'machines/extensions', views.ExtensionViewSet) +router.register_viewset(r'machines/extension', views.ExtensionViewSet) router.register_viewset(r'machines/mx', views.MxViewSet) router.register_viewset(r'machines/ns', views.NsViewSet) router.register_viewset(r'machines/txt', views.TxtViewSet) router.register_viewset(r'machines/srv', views.SrvViewSet) -router.register_viewset(r'machines/interfaces', views.InterfaceViewSet) -router.register_viewset(r'machines/ipv6lists', views.Ipv6ListViewSet) -router.register_viewset(r'machines/domains', views.DomainViewSet) -router.register_viewset(r'machines/iplists', views.IpListViewSet) -router.register_viewset(r'machines/services', views.ServiceViewSet) -router.register_viewset(r'machines/servicelinks', views.ServiceLinkViewSet, base_name='servicelink') -router.register_viewset(r'machines/ouvertureportlists', views.OuverturePortListViewSet) -router.register_viewset(r'machines/ouvertureports', views.OuverturePortViewSet) +router.register_viewset(r'machines/interface', views.InterfaceViewSet) +router.register_viewset(r'machines/ipv6list', views.Ipv6ListViewSet) +router.register_viewset(r'machines/domain', views.DomainViewSet) +router.register_viewset(r'machines/iplist', views.IpListViewSet) +router.register_viewset(r'machines/service', views.ServiceViewSet) +router.register_viewset(r'machines/servicelink', views.ServiceLinkViewSet, base_name='servicelink') +router.register_viewset(r'machines/ouvertureportlist', views.OuverturePortListViewSet) +router.register_viewset(r'machines/ouvertureport', views.OuverturePortViewSet) # PREFERENCES router.register_view(r'preferences/optionaluser', views.OptionalUserView), router.register_view(r'preferences/optionalmachine', views.OptionalMachineView), @@ -80,15 +80,15 @@ router.register_viewset(r'topologie/building', views.BuildingViewSet) router.register_viewset(r'topologie/switchport', views.SwitchPortViewSet, base_name='switchport') router.register_viewset(r'topologie/room', views.RoomViewSet) # USERS -router.register_viewset(r'users/users', views.UserViewSet) -router.register_viewset(r'users/clubs', views.ClubViewSet) -router.register_viewset(r'users/adherents', views.AdherentViewSet) -router.register_viewset(r'users/serviceusers', views.ServiceUserViewSet) -router.register_viewset(r'users/schools', views.SchoolViewSet) -router.register_viewset(r'users/listrights', views.ListRightViewSet) -router.register_viewset(r'users/shells', views.ShellViewSet, base_name='shell') -router.register_viewset(r'users/bans', views.BanViewSet) -router.register_viewset(r'users/whitelists', views.WhitelistViewSet) +router.register_viewset(r'users/user', views.UserViewSet) +router.register_viewset(r'users/club', views.ClubViewSet) +router.register_viewset(r'users/adherent', views.AdherentViewSet) +router.register_viewset(r'users/serviceuser', views.ServiceUserViewSet) +router.register_viewset(r'users/school', views.SchoolViewSet) +router.register_viewset(r'users/listright', views.ListRightViewSet) +router.register_viewset(r'users/shell', views.ShellViewSet, base_name='shell') +router.register_viewset(r'users/ban', views.BanViewSet) +router.register_viewset(r'users/whitelist', views.WhitelistViewSet) # SERVICE REGEN router.register_viewset(r'services/regen', views.ServiceRegenViewSet, base_name='serviceregen') # DHCP From 6d5a9dc3140e675dd8659cc47a8f397ccd56e540 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Wed, 20 Jun 2018 12:13:23 +0000 Subject: [PATCH 35/49] Add missing topologie/server endpoint --- api/serializers.py | 8 ++++++++ api/tests.py | 3 +++ api/urls.py | 1 + api/views.py | 7 +++++++ 4 files changed, 19 insertions(+) diff --git a/api/serializers.py b/api/serializers.py index a1e73091..26abc1c3 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -400,6 +400,14 @@ class SwitchSerializer(NamespacedHMSerializer): 'stack_member_id', 'model', 'switchbay', 'api_url') +class ServerSerializer(NamespacedHMSerializer): + """Serialize `topologie.models.Server` objects + """ + class Meta: + model = topologie.Server + fields = ('user', 'name', 'active', 'api_url') + + class ModelSwitchSerializer(NamespacedHMSerializer): """Serialize `topologie.models.ModelSwitch` objects """ diff --git a/api/tests.py b/api/tests.py index 5c4122bd..3120676a 100644 --- a/api/tests.py +++ b/api/tests.py @@ -120,6 +120,8 @@ class APIEndpointsTestCase(APITestCase): # '/api/topologie/modelswitch//', '/api/topologie/room/', # '/api/topologie/room//', + '/api/topologie/server/', +# '/api/topologie/server//', '/api/topologie/stack/', # '/api/topologie/stack//', '/api/topologie/switch/', @@ -362,6 +364,7 @@ class APIPaginationTestCase(APITestCase): '/api/topologie/constructorswitch/', '/api/topologie/modelswitch/', '/api/topologie/room/', + '/api/topologie/server/', '/api/topologie/stack/', '/api/topologie/switch/', '/api/topologie/switchbay/', diff --git a/api/urls.py b/api/urls.py index 9d6b5f5e..a04d6fbe 100644 --- a/api/urls.py +++ b/api/urls.py @@ -73,6 +73,7 @@ router.register_view(r'preferences/mailmessageoption', views.MailMessageOptionVi router.register_viewset(r'topologie/stack', views.StackViewSet) router.register_viewset(r'topologie/acesspoint', views.AccessPointViewSet) router.register_viewset(r'topologie/switch', views.SwitchViewSet) +router.register_viewset(r'topologie/server', views.ServerViewSet) router.register_viewset(r'topologie/modelswitch', views.ModelSwitchViewSet) router.register_viewset(r'topologie/constructorswitch', views.ConstructorSwitchViewSet) router.register_viewset(r'topologie/switchbay', views.SwitchBayViewSet) diff --git a/api/views.py b/api/views.py index 9ee6ea75..7532aece 100644 --- a/api/views.py +++ b/api/views.py @@ -339,6 +339,13 @@ class SwitchViewSet(viewsets.ReadOnlyModelViewSet): serializer_class = serializers.SwitchSerializer +class ServerViewSet(viewsets.ReadOnlyModelViewSet): + """Exposes list and details of `topologie.models.Server` objects. + """ + queryset = topologie.Server.objects.all() + serializer_class = serializers.ServerSerializer + + class ModelSwitchViewSet(viewsets.ReadOnlyModelViewSet): """Exposes list and details of `topologie.models.ModelSwitch` objects. """ From f41fcc843f81cf44814f815f601f5a7b5e4449fb Mon Sep 17 00:00:00 2001 From: Gabriel Detraz Date: Tue, 19 Jun 2018 15:41:15 +0200 Subject: [PATCH 36/49] Add test LDAP --- test_utils/ldap/schema/radius.schema | 564 +++++++++++++++++++++++ test_utils/ldap/schema/samba.schema | 644 +++++++++++++++++++++++++++ users/tests.py | 119 ++++- 3 files changed, 1325 insertions(+), 2 deletions(-) create mode 100644 test_utils/ldap/schema/radius.schema create mode 100644 test_utils/ldap/schema/samba.schema diff --git a/test_utils/ldap/schema/radius.schema b/test_utils/ldap/schema/radius.schema new file mode 100644 index 00000000..cee7502a --- /dev/null +++ b/test_utils/ldap/schema/radius.schema @@ -0,0 +1,564 @@ +# This is a LDAPv3 schema for RADIUS attributes. +# Tested on OpenLDAP 2.0.7 +# Posted by Javier Fernandez-Sanguino Pena +# LDAP v3 version by Jochen Friedrich +# Updates by Adrian Pavlykevych +############## + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.1 + NAME 'radiusArapFeatures' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.2 + NAME 'radiusArapSecurity' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.3 + NAME 'radiusArapZoneAccess' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.44 + NAME 'radiusAuthType' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.4 + NAME 'radiusCallbackId' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.5 + NAME 'radiusCallbackNumber' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.6 + NAME 'radiusCalledStationId' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.7 + NAME 'radiusCallingStationId' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.8 + NAME 'radiusClass' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.45 + NAME 'radiusClientIPAddress' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.9 + NAME 'radiusFilterId' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.10 + NAME 'radiusFramedAppleTalkLink' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.11 + NAME 'radiusFramedAppleTalkNetwork' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.12 + NAME 'radiusFramedAppleTalkZone' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.13 + NAME 'radiusFramedCompression' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.14 + NAME 'radiusFramedIPAddress' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.15 + NAME 'radiusFramedIPNetmask' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.16 + NAME 'radiusFramedIPXNetwork' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.17 + NAME 'radiusFramedMTU' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.18 + NAME 'radiusFramedProtocol' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.19 + NAME 'radiusFramedRoute' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.20 + NAME 'radiusFramedRouting' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.46 + NAME 'radiusGroupName' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.47 + NAME 'radiusHint' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.48 + NAME 'radiusHuntgroupName' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.21 + NAME 'radiusIdleTimeout' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.22 + NAME 'radiusLoginIPHost' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.23 + NAME 'radiusLoginLATGroup' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.24 + NAME 'radiusLoginLATNode' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.25 + NAME 'radiusLoginLATPort' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.26 + NAME 'radiusLoginLATService' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.27 + NAME 'radiusLoginService' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.28 + NAME 'radiusLoginTCPPort' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.29 + NAME 'radiusPasswordRetry' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.30 + NAME 'radiusPortLimit' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.49 + NAME 'radiusProfileDn' + DESC '' + EQUALITY distinguishedNameMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.31 + NAME 'radiusPrompt' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.50 + NAME 'radiusProxyToRealm' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.51 + NAME 'radiusReplicateToRealm' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.52 + NAME 'radiusRealm' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.32 + NAME 'radiusServiceType' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.33 + NAME 'radiusSessionTimeout' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.34 + NAME 'radiusTerminationAction' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.35 + NAME 'radiusTunnelAssignmentId' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.36 + NAME 'radiusTunnelMediumType' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.37 + NAME 'radiusTunnelPassword' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.38 + NAME 'radiusTunnelPreference' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.39 + NAME 'radiusTunnelPrivateGroupId' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.40 + NAME 'radiusTunnelServerEndpoint' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.41 + NAME 'radiusTunnelType' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.42 + NAME 'radiusVSA' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.43 + NAME 'radiusTunnelClientEndpoint' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + ) + + +#need to change asn1.id +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.53 + NAME 'radiusSimultaneousUse' + DESC '' + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.54 + NAME 'radiusLoginTime' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.55 + NAME 'radiusUserCategory' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.56 + NAME 'radiusStripUserName' + DESC '' + SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.57 + NAME 'dialupAccess' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.58 + NAME 'radiusExpiration' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.59 + NAME 'radiusCheckItem' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + ) + +attributetype + ( 1.3.6.1.4.1.3317.4.3.1.60 + NAME 'radiusReplyItem' + DESC '' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + ) + + +objectclass + ( 1.3.6.1.4.1.3317.4.3.2.1 + NAME 'radiusprofile' + SUP top AUXILIARY + DESC '' + MUST cn + MAY ( radiusArapFeatures $ radiusArapSecurity $ radiusArapZoneAccess $ + radiusAuthType $ radiusCallbackId $ radiusCallbackNumber $ + radiusCalledStationId $ radiusCallingStationId $ radiusClass $ + radiusClientIPAddress $ radiusFilterId $ radiusFramedAppleTalkLink $ + radiusFramedAppleTalkNetwork $ radiusFramedAppleTalkZone $ + radiusFramedCompression $ radiusFramedIPAddress $ + radiusFramedIPNetmask $ radiusFramedIPXNetwork $ + radiusFramedMTU $ radiusFramedProtocol $ + radiusCheckItem $ radiusReplyItem $ + radiusFramedRoute $ radiusFramedRouting $ radiusIdleTimeout $ + radiusGroupName $ radiusHint $ radiusHuntgroupName $ + radiusLoginIPHost $ radiusLoginLATGroup $ radiusLoginLATNode $ + radiusLoginLATPort $ radiusLoginLATService $ radiusLoginService $ + radiusLoginTCPPort $ radiusLoginTime $ radiusPasswordRetry $ + radiusPortLimit $ radiusPrompt $ radiusProxyToRealm $ + radiusRealm $ radiusReplicateToRealm $ radiusServiceType $ + radiusSessionTimeout $ radiusStripUserName $ + radiusTerminationAction $ radiusTunnelClientEndpoint $ radiusProfileDn $ + radiusSimultaneousUse $ radiusTunnelAssignmentId $ + radiusTunnelMediumType $ radiusTunnelPassword $ radiusTunnelPreference $ + radiusTunnelPrivateGroupId $ radiusTunnelServerEndpoint $ + radiusTunnelType $ radiusUserCategory $ radiusVSA $ + radiusExpiration $ dialupAccess ) + ) diff --git a/test_utils/ldap/schema/samba.schema b/test_utils/ldap/schema/samba.schema new file mode 100644 index 00000000..08173119 --- /dev/null +++ b/test_utils/ldap/schema/samba.schema @@ -0,0 +1,644 @@ +## +## schema file for OpenLDAP 2.x +## Schema for storing Samba user accounts and group maps in LDAP +## OIDs are owned by the Samba Team +## +## Prerequisite schemas - uid (cosine.schema) +## - displayName (inetorgperson.schema) +## - gidNumber (nis.schema) +## +## 1.3.6.1.4.1.7165.2.1.x - attributetypes +## 1.3.6.1.4.1.7165.2.2.x - objectclasses +## +## Printer support +## 1.3.6.1.4.1.7165.2.3.1.x - attributetypes +## 1.3.6.1.4.1.7165.2.3.2.x - objectclasses +## +## Samba4 +## 1.3.6.1.4.1.7165.4.1.x - attributetypes +## 1.3.6.1.4.1.7165.4.2.x - objectclasses +## 1.3.6.1.4.1.7165.4.3.x - LDB/LDAP Controls +## 1.3.6.1.4.1.7165.4.4.x - LDB/LDAP Extended Operations +## 1.3.6.1.4.1.7165.4.255.x - mapped OIDs due to conflicts between AD and standards-track +## +## External projects +## 1.3.6.1.4.1.7165.655.x +## 1.3.6.1.4.1.7165.655.1.x - GSS-NTLMSSP +## +## ----- READ THIS WHEN ADDING A NEW ATTRIBUTE OR OBJECT CLASS ------ +## +## Run the 'get_next_oid' bash script in this directory to find the +## next available OID for attribute type and object classes. +## +## $ ./get_next_oid +## attributetype ( 1.3.6.1.4.1.7165.2.1.XX NAME .... +## objectclass ( 1.3.6.1.4.1.7165.2.2.XX NAME .... +## +## Also ensure that new entries adhere to the declaration style +## used throughout this file +## +## ( 1.3.6.1.4.1.7165.2.XX.XX NAME .... +## ^ ^ ^ +## +## The spaces are required for the get_next_oid script (and for +## readability). +## +## ------------------------------------------------------------------ + +# objectIdentifier SambaRoot 1.3.6.1.4.1.7165 +# objectIdentifier Samba3 SambaRoot:2 +# objectIdentifier Samba3Attrib Samba3:1 +# objectIdentifier Samba3ObjectClass Samba3:2 +# objectIdentifier Samba4 SambaRoot:4 + +######################################################################## +## HISTORICAL ## +######################################################################## + +## +## Password hashes +## +#attributetype ( 1.3.6.1.4.1.7165.2.1.1 NAME 'lmPassword' +# DESC 'LanManager Passwd' +# EQUALITY caseIgnoreIA5Match +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.2 NAME 'ntPassword' +# DESC 'NT Passwd' +# EQUALITY caseIgnoreIA5Match +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} SINGLE-VALUE ) + +## +## Account flags in string format ([UWDX ]) +## +#attributetype ( 1.3.6.1.4.1.7165.2.1.4 NAME 'acctFlags' +# DESC 'Account Flags' +# EQUALITY caseIgnoreIA5Match +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{16} SINGLE-VALUE ) + +## +## Password timestamps & policies +## +#attributetype ( 1.3.6.1.4.1.7165.2.1.3 NAME 'pwdLastSet' +# DESC 'NT pwdLastSet' +# EQUALITY integerMatch +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.5 NAME 'logonTime' +# DESC 'NT logonTime' +# EQUALITY integerMatch +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.6 NAME 'logoffTime' +# DESC 'NT logoffTime' +# EQUALITY integerMatch +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.7 NAME 'kickoffTime' +# DESC 'NT kickoffTime' +# EQUALITY integerMatch +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.8 NAME 'pwdCanChange' +# DESC 'NT pwdCanChange' +# EQUALITY integerMatch +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.9 NAME 'pwdMustChange' +# DESC 'NT pwdMustChange' +# EQUALITY integerMatch +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +## +## string settings +## +#attributetype ( 1.3.6.1.4.1.7165.2.1.10 NAME 'homeDrive' +# DESC 'NT homeDrive' +# EQUALITY caseIgnoreIA5Match +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{4} SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.11 NAME 'scriptPath' +# DESC 'NT scriptPath' +# EQUALITY caseIgnoreIA5Match +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{255} SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.12 NAME 'profilePath' +# DESC 'NT profilePath' +# EQUALITY caseIgnoreIA5Match +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{255} SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.13 NAME 'userWorkstations' +# DESC 'userWorkstations' +# EQUALITY caseIgnoreIA5Match +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{255} SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.17 NAME 'smbHome' +# DESC 'smbHome' +# EQUALITY caseIgnoreIA5Match +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.18 NAME 'domain' +# DESC 'Windows NT domain to which the user belongs' +# EQUALITY caseIgnoreIA5Match +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} ) + +## +## user and group RID +## +#attributetype ( 1.3.6.1.4.1.7165.2.1.14 NAME 'rid' +# DESC 'NT rid' +# EQUALITY integerMatch +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.15 NAME 'primaryGroupID' +# DESC 'NT Group RID' +# EQUALITY integerMatch +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +## +## The smbPasswordEntry objectclass has been depreciated in favor of the +## sambaAccount objectclass +## +#objectclass ( 1.3.6.1.4.1.7165.2.2.1 NAME 'smbPasswordEntry' SUP top AUXILIARY +# DESC 'Samba smbpasswd entry' +# MUST ( uid $ uidNumber ) +# MAY ( lmPassword $ ntPassword $ pwdLastSet $ acctFlags )) + +#objectclass ( 1.3.6.1.4.1.7165.2.2.2 NAME 'sambaAccount' SUP top STRUCTURAL +# DESC 'Samba Account' +# MUST ( uid $ rid ) +# MAY ( cn $ lmPassword $ ntPassword $ pwdLastSet $ logonTime $ +# logoffTime $ kickoffTime $ pwdCanChange $ pwdMustChange $ acctFlags $ +# displayName $ smbHome $ homeDrive $ scriptPath $ profilePath $ +# description $ userWorkstations $ primaryGroupID $ domain )) + +#objectclass ( 1.3.6.1.4.1.7165.2.2.3 NAME 'sambaAccount' SUP top AUXILIARY +# DESC 'Samba Auxiliary Account' +# MUST ( uid $ rid ) +# MAY ( cn $ lmPassword $ ntPassword $ pwdLastSet $ logonTime $ +# logoffTime $ kickoffTime $ pwdCanChange $ pwdMustChange $ acctFlags $ +# displayName $ smbHome $ homeDrive $ scriptPath $ profilePath $ +# description $ userWorkstations $ primaryGroupID $ domain )) + +######################################################################## +## END OF HISTORICAL ## +######################################################################## + +####################################################################### +## Attributes used by Samba 3.0 schema ## +####################################################################### + +## +## Password hashes +## +attributetype ( 1.3.6.1.4.1.7165.2.1.24 NAME 'sambaLMPassword' + DESC 'LanManager Password' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.25 NAME 'sambaNTPassword' + DESC 'MD4 hash of the unicode password' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} SINGLE-VALUE ) + +## +## Account flags in string format ([UWDX ]) +## +attributetype ( 1.3.6.1.4.1.7165.2.1.26 NAME 'sambaAcctFlags' + DESC 'Account Flags' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{16} SINGLE-VALUE ) + +## +## Password timestamps & policies +## +attributetype ( 1.3.6.1.4.1.7165.2.1.27 NAME 'sambaPwdLastSet' + DESC 'Timestamp of the last password update' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.28 NAME 'sambaPwdCanChange' + DESC 'Timestamp of when the user is allowed to update the password' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.29 NAME 'sambaPwdMustChange' + DESC 'Timestamp of when the password will expire' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.30 NAME 'sambaLogonTime' + DESC 'Timestamp of last logon' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.31 NAME 'sambaLogoffTime' + DESC 'Timestamp of last logoff' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.32 NAME 'sambaKickoffTime' + DESC 'Timestamp of when the user will be logged off automatically' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.48 NAME 'sambaBadPasswordCount' + DESC 'Bad password attempt count' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.49 NAME 'sambaBadPasswordTime' + DESC 'Time of the last bad password attempt' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.55 NAME 'sambaLogonHours' + DESC 'Logon Hours' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{42} SINGLE-VALUE ) + +## +## string settings +## +attributetype ( 1.3.6.1.4.1.7165.2.1.33 NAME 'sambaHomeDrive' + DESC 'Driver letter of home directory mapping' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{4} SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.34 NAME 'sambaLogonScript' + DESC 'Logon script path' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{255} SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.35 NAME 'sambaProfilePath' + DESC 'Roaming profile path' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{255} SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.36 NAME 'sambaUserWorkstations' + DESC 'List of user workstations the user is allowed to logon to' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{255} SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.37 NAME 'sambaHomePath' + DESC 'Home directory UNC path' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.38 NAME 'sambaDomainName' + DESC 'Windows NT domain to which the user belongs' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.47 NAME 'sambaMungedDial' + DESC 'Base64 encoded user parameter string' + EQUALITY caseExactMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1050} ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.54 NAME 'sambaPasswordHistory' + DESC 'Concatenated MD5 hashes of the salted NT passwords used on this account' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} ) + +## +## SID, of any type +## + +attributetype ( 1.3.6.1.4.1.7165.2.1.20 NAME 'sambaSID' + DESC 'Security ID' + EQUALITY caseIgnoreIA5Match + SUBSTR caseExactIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64} SINGLE-VALUE ) + +## +## Primary group SID, compatible with ntSid +## + +attributetype ( 1.3.6.1.4.1.7165.2.1.23 NAME 'sambaPrimaryGroupSID' + DESC 'Primary Group Security ID' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64} SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.51 NAME 'sambaSIDList' + DESC 'Security ID List' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64} ) + +## +## group mapping attributes +## +attributetype ( 1.3.6.1.4.1.7165.2.1.19 NAME 'sambaGroupType' + DESC 'NT Group Type' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +## +## Store info on the domain +## + +attributetype ( 1.3.6.1.4.1.7165.2.1.21 NAME 'sambaNextUserRid' + DESC 'Next NT rid to give our for users' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.22 NAME 'sambaNextGroupRid' + DESC 'Next NT rid to give out for groups' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.39 NAME 'sambaNextRid' + DESC 'Next NT rid to give out for anything' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.40 NAME 'sambaAlgorithmicRidBase' + DESC 'Base at which the samba RID generation algorithm should operate' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.41 NAME 'sambaShareName' + DESC 'Share Name' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.42 NAME 'sambaOptionName' + DESC 'Option Name' + EQUALITY caseIgnoreMatch + SUBSTR caseIgnoreSubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.43 NAME 'sambaBoolOption' + DESC 'A boolean option' + EQUALITY booleanMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.44 NAME 'sambaIntegerOption' + DESC 'An integer option' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.45 NAME 'sambaStringOption' + DESC 'A string option' + EQUALITY caseExactIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.46 NAME 'sambaStringListOption' + DESC 'A string list option' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) + + +##attributetype ( 1.3.6.1.4.1.7165.2.1.50 NAME 'sambaPrivName' +## SUP name ) + +##attributetype ( 1.3.6.1.4.1.7165.2.1.52 NAME 'sambaPrivilegeList' +## DESC 'Privileges List' +## EQUALITY caseIgnoreIA5Match +## SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64} ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.53 NAME 'sambaTrustFlags' + DESC 'Trust Password Flags' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +# "min password length" +attributetype ( 1.3.6.1.4.1.7165.2.1.58 NAME 'sambaMinPwdLength' + DESC 'Minimal password length (default: 5)' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +# "password history" +attributetype ( 1.3.6.1.4.1.7165.2.1.59 NAME 'sambaPwdHistoryLength' + DESC 'Length of Password History Entries (default: 0 => off)' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +# "user must logon to change password" +attributetype ( 1.3.6.1.4.1.7165.2.1.60 NAME 'sambaLogonToChgPwd' + DESC 'Force Users to logon for password change (default: 0 => off, 2 => on)' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +# "maximum password age" +attributetype ( 1.3.6.1.4.1.7165.2.1.61 NAME 'sambaMaxPwdAge' + DESC 'Maximum password age, in seconds (default: -1 => never expire passwords)' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +# "minimum password age" +attributetype ( 1.3.6.1.4.1.7165.2.1.62 NAME 'sambaMinPwdAge' + DESC 'Minimum password age, in seconds (default: 0 => allow immediate password change)' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +# "lockout duration" +attributetype ( 1.3.6.1.4.1.7165.2.1.63 NAME 'sambaLockoutDuration' + DESC 'Lockout duration in minutes (default: 30, -1 => forever)' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +# "reset count minutes" +attributetype ( 1.3.6.1.4.1.7165.2.1.64 NAME 'sambaLockoutObservationWindow' + DESC 'Reset time after lockout in minutes (default: 30)' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +# "bad lockout attempt" +attributetype ( 1.3.6.1.4.1.7165.2.1.65 NAME 'sambaLockoutThreshold' + DESC 'Lockout users after bad logon attempts (default: 0 => off)' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +# "disconnect time" +attributetype ( 1.3.6.1.4.1.7165.2.1.66 NAME 'sambaForceLogoff' + DESC 'Disconnect Users outside logon hours (default: -1 => off, 0 => on)' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +# "refuse machine password change" +attributetype ( 1.3.6.1.4.1.7165.2.1.67 NAME 'sambaRefuseMachinePwdChange' + DESC 'Allow Machine Password changes (default: 0 => off)' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +# +attributetype ( 1.3.6.1.4.1.7165.2.1.68 NAME 'sambaClearTextPassword' + DESC 'Clear text password (used for trusted domain passwords)' + EQUALITY octetStringMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 ) + +# +attributetype ( 1.3.6.1.4.1.7165.2.1.69 NAME 'sambaPreviousClearTextPassword' + DESC 'Previous clear text password (used for trusted domain passwords)' + EQUALITY octetStringMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.70 NAME 'sambaTrustType' + DESC 'Type of trust' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.71 NAME 'sambaTrustAttributes' + DESC 'Trust attributes for a trusted domain' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.72 NAME 'sambaTrustDirection' + DESC 'Direction of a trust' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.73 NAME 'sambaTrustPartner' + DESC 'Fully qualified name of the domain with which a trust exists' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.74 NAME 'sambaFlatName' + DESC 'NetBIOS name of a domain' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.75 NAME 'sambaTrustAuthOutgoing' + DESC 'Authentication information for the outgoing portion of a trust' + EQUALITY caseExactMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1050} ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.76 NAME 'sambaTrustAuthIncoming' + DESC 'Authentication information for the incoming portion of a trust' + EQUALITY caseExactMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1050} ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.77 NAME 'sambaSecurityIdentifier' + DESC 'SID of a trusted domain' + EQUALITY caseIgnoreIA5Match SUBSTR caseExactIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64} SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.78 NAME 'sambaTrustForestTrustInfo' + DESC 'Forest trust information for a trusted domain object' + EQUALITY caseExactMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1050} ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.79 NAME 'sambaTrustPosixOffset' + DESC 'POSIX offset of a trust' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.80 NAME 'sambaSupportedEncryptionTypes' + DESC 'Supported encryption types of a trust' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +####################################################################### +## objectClasses used by Samba 3.0 schema ## +####################################################################### + +## The X.500 data model (and therefore LDAPv3) says that each entry can +## only have one structural objectclass. OpenLDAP 2.0 does not enforce +## this currently but will in v2.1 + +## +## added new objectclass (and OID) for 3.0 to help us deal with backwards +## compatibility with 2.2 installations (e.g. ldapsam_compat) --jerry +## +objectclass ( 1.3.6.1.4.1.7165.2.2.6 NAME 'sambaSamAccount' SUP top AUXILIARY + DESC 'Samba 3.0 Auxilary SAM Account' + MUST ( uid $ sambaSID ) + MAY ( cn $ sambaLMPassword $ sambaNTPassword $ sambaPwdLastSet $ + sambaLogonTime $ sambaLogoffTime $ sambaKickoffTime $ + sambaPwdCanChange $ sambaPwdMustChange $ sambaAcctFlags $ + displayName $ sambaHomePath $ sambaHomeDrive $ sambaLogonScript $ + sambaProfilePath $ description $ sambaUserWorkstations $ + sambaPrimaryGroupSID $ sambaDomainName $ sambaMungedDial $ + sambaBadPasswordCount $ sambaBadPasswordTime $ + sambaPasswordHistory $ sambaLogonHours)) + +## +## Group mapping info +## +objectclass ( 1.3.6.1.4.1.7165.2.2.4 NAME 'sambaGroupMapping' SUP top AUXILIARY + DESC 'Samba Group Mapping' + MUST ( gidNumber $ sambaSID $ sambaGroupType ) + MAY ( displayName $ description $ sambaSIDList )) + +## +## Trust password for trust relationships (any kind) +## +objectclass ( 1.3.6.1.4.1.7165.2.2.14 NAME 'sambaTrustPassword' SUP top STRUCTURAL + DESC 'Samba Trust Password' + MUST ( sambaDomainName $ sambaNTPassword $ sambaTrustFlags ) + MAY ( sambaSID $ sambaPwdLastSet )) + +## +## Trust password for trusted domains +## (to be stored beneath the trusting sambaDomain object in the DIT) +## +objectclass ( 1.3.6.1.4.1.7165.2.2.15 NAME 'sambaTrustedDomainPassword' SUP top STRUCTURAL + DESC 'Samba Trusted Domain Password' + MUST ( sambaDomainName $ sambaSID $ + sambaClearTextPassword $ sambaPwdLastSet ) + MAY ( sambaPreviousClearTextPassword )) + +## +## Whole-of-domain info +## +objectclass ( 1.3.6.1.4.1.7165.2.2.5 NAME 'sambaDomain' SUP top STRUCTURAL + DESC 'Samba Domain Information' + MUST ( sambaDomainName $ + sambaSID ) + MAY ( sambaNextRid $ sambaNextGroupRid $ sambaNextUserRid $ + sambaAlgorithmicRidBase $ + sambaMinPwdLength $ sambaPwdHistoryLength $ sambaLogonToChgPwd $ + sambaMaxPwdAge $ sambaMinPwdAge $ + sambaLockoutDuration $ sambaLockoutObservationWindow $ sambaLockoutThreshold $ + sambaForceLogoff $ sambaRefuseMachinePwdChange )) + +## +## used for idmap_ldap module +## +objectclass ( 1.3.6.1.4.1.7165.2.2.7 NAME 'sambaUnixIdPool' SUP top AUXILIARY + DESC 'Pool for allocating UNIX uids/gids' + MUST ( uidNumber $ gidNumber ) ) + + +objectclass ( 1.3.6.1.4.1.7165.2.2.8 NAME 'sambaIdmapEntry' SUP top AUXILIARY + DESC 'Mapping from a SID to an ID' + MUST ( sambaSID ) + MAY ( uidNumber $ gidNumber ) ) + +objectclass ( 1.3.6.1.4.1.7165.2.2.9 NAME 'sambaSidEntry' SUP top STRUCTURAL + DESC 'Structural Class for a SID' + MUST ( sambaSID ) ) + +objectclass ( 1.3.6.1.4.1.7165.2.2.10 NAME 'sambaConfig' SUP top AUXILIARY + DESC 'Samba Configuration Section' + MAY ( description ) ) + +objectclass ( 1.3.6.1.4.1.7165.2.2.11 NAME 'sambaShare' SUP top STRUCTURAL + DESC 'Samba Share Section' + MUST ( sambaShareName ) + MAY ( description ) ) + +objectclass ( 1.3.6.1.4.1.7165.2.2.12 NAME 'sambaConfigOption' SUP top STRUCTURAL + DESC 'Samba Configuration Option' + MUST ( sambaOptionName ) + MAY ( sambaBoolOption $ sambaIntegerOption $ sambaStringOption $ + sambaStringListoption $ description ) ) + + +## retired during privilege rewrite +##objectclass ( 1.3.6.1.4.1.7165.2.2.13 NAME 'sambaPrivilege' SUP top AUXILIARY +## DESC 'Samba Privilege' +## MUST ( sambaSID ) +## MAY ( sambaPrivilegeList ) ) + +## +## used for IPA_ldapsam +## +objectclass ( 1.3.6.1.4.1.7165.2.2.16 NAME 'sambaTrustedDomain' SUP top STRUCTURAL + DESC 'Samba Trusted Domain Object' + MUST ( cn ) + MAY ( sambaTrustType $ sambaTrustAttributes $ sambaTrustDirection $ + sambaTrustPartner $ sambaFlatName $ sambaTrustAuthOutgoing $ + sambaTrustAuthIncoming $ sambaSecurityIdentifier $ + sambaTrustForestTrustInfo $ sambaTrustPosixOffset $ + sambaSupportedEncryptionTypes) ) diff --git a/users/tests.py b/users/tests.py index 85a8e9f1..a7214cbb 100644 --- a/users/tests.py +++ b/users/tests.py @@ -23,6 +23,121 @@ The tests for the Users module. """ -# from django.test import TestCase +from django.test import TestCase +from django.conf import settings +from .models import School, ListShell, LdapUserGroup, ListRight + +import volatildap + +# Réglages bidon pour volatildap +LdapUserGroup.base_dn='ou=groups,dc=example,dc=org' + + +groups = ('ou=groups,dc=example,dc=org', { + 'objectClass': ['top', 'organizationalUnit'], 'ou': ['groups']}) +people = ('ou=people,dc=example,dc=org', { + 'objectClass': ['top', 'organizationalUnit'], 'ou': ['groups']}) +contacts = ('ou=contacts,ou=groups,dc=example,dc=org', { + 'objectClass': ['top', 'organizationalUnit'], 'ou': ['groups']}) +foogroup = ('cn=foogroup,ou=groups,dc=example,dc=org', { + 'objectClass': ['posixGroup'], 'memberUid': ['foouser', 'baruser'], + 'gidNumber': ['1000'], 'cn': ['foogroup']}) +bargroup = ('cn=bargroup,ou=groups,dc=example,dc=org', { + 'objectClass': ['posixGroup'], 'memberUid': ['zoouser', 'baruser'], + 'gidNumber': ['1001'], 'cn': ['bargroup']}) +wizgroup = ('cn=wizgroup,ou=groups,dc=example,dc=org', { + 'objectClass': ['posixGroup'], 'memberUid': ['wizuser', 'baruser'], + 'gidNumber': ['1002'], 'cn': ['wizgroup']}) +foouser = ('uid=foouser,ou=people,dc=example,dc=org', { + 'cn': [b'F\xc3\xb4o Us\xc3\xa9r'], + 'objectClass': ['posixAccount', 'shadowAccount', 'inetOrgPerson'], + 'loginShell': ['/bin/bash'], + 'jpegPhoto': [ + b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00\xff' + b'\xfe\x00\x1cCreated with GIMP on a Mac\xff\xdb\x00C\x00\x05\x03\x04' + b'\x04\x04\x03\x05\x04\x04\x04\x05\x05\x05\x06\x07\x0c\x08\x07\x07\x07' + b'\x07\x0f\x0b\x0b\t\x0c\x11\x0f\x12\x12\x11\x0f\x11\x11\x13\x16\x1c' + b'\x17\x13\x14\x1a\x15\x11\x11\x18!\x18\x1a\x1d\x1d\x1f\x1f\x1f\x13' + b'\x17"$"\x1e$\x1c\x1e\x1f\x1e\xff\xdb\x00C\x01\x05\x05\x05\x07\x06\x07' + b'\x0e\x08\x08\x0e\x1e\x14\x11\x14\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e' + b'\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e' + b'\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e' + b'\x1e\x1e\x1e\x1e\x1e\x1e\x1e\xff\xc0\x00\x11\x08\x00\x08\x00\x08\x03' + b'\x01"\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x15\x00\x01\x01\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xff\xc4\x00' + b'\x19\x10\x00\x03\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + b'\x00\x00\x01\x02\x06\x11A\xff\xc4\x00\x14\x01\x01\x00\x00\x00\x00\x00' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xc4\x00\x14\x11\x01' + b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff' + b'\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\x00\x9d\xf29wU5Q\xd6' + b'\xfd\x00\x01\xff\xd9'], + 'uidNumber': ['2000'], 'gidNumber': ['1000'], 'sn': [b'Us\xc3\xa9r'], + 'homeDirectory': ['/home/foouser'], 'givenName': [b'F\xc3\xb4o'], + 'uid': ['foouser']}) + +class LdapTestCase(TestCase): + directory = {} + + @classmethod + def setUpClass(cls): + super(LdapTestCase, cls).setUpClass() + cls.ldap_server = volatildap.LdapServer( + initial_data=cls.directory, + schemas=['core.schema', 'cosine.schema', 'inetorgperson.schema', 'nis.schema'], + ) + settings.DATABASES['ldap']['USER'] = cls.ldap_server.rootdn + settings.DATABASES['ldap']['PASSWORD'] = cls.ldap_server.rootpw + settings.DATABASES['ldap']['NAME'] = cls.ldap_server.uri + + @classmethod + def tearDownClass(cls): + cls.ldap_server.stop() + super(LdapTestCase, cls).tearDownClass() + + def setUp(self): + super(LdapTestCase, self).setUp() + self.ldap_server.start() + + +class SchoolTestCase(TestCase): + def setUp(self): + School.objects.create(name="ENS Paris-Saclay") + School.objects.create(name="Supelec") + + def test_school_are_created(self): + pass + +class ListShellTestCase(TestCase): + def setUp(self): + ListShell.objects.create(shell="/bin/zsh") + ListShell.objects.create(shell="/bin/bash") + + def test_shell_are_created(self): + pass + +class GroupTestCase(LdapTestCase): + directory = dict([groups, foogroup, bargroup, wizgroup, people, foouser]) + + def test_create_ldapgroup(self): + mygroup = LdapUserGroup() + mygroup.name='re2o' + mygroup.gid=1010 + mygroup.members=['someuser', 'foouser'] + mygroup.save() + + # check ldap group was created + new = LdapUserGroup.objects.get(name='re2o') + self.assertEqual(new.name, 're2o') + self.assertEqual(new.gid, 1010) + self.assertEqual(new.members, ['someuser', 'foouser']) + + def test_create_re2ogroup(self): + ListRight.objects.create(gid='1011', unix_name='admins', details='test') + + #check re2o + lr = ListRight.objects.get(gid=1011) + self.asserEqual(lr.gid, 1011) + self.asserEqual(lr.details, 'test') + + -# Create your tests here. From 3f4dd43fa9a1d87c0f130f862cfa83c82222fd6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Thu, 21 Jun 2018 14:19:08 +0000 Subject: [PATCH 37/49] Fix ldap testing --- CHANGELOG.md | 4 + pip_requirements.txt | 2 + test_utils/__init__.py | 0 test_utils/runner.py | 164 +++++++++++++++++++++++++++++++++++++++++ users/tests.py | 152 ++++++++++++-------------------------- 5 files changed, 218 insertions(+), 104 deletions(-) create mode 100644 test_utils/__init__.py create mode 100644 test_utils/runner.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ff8ead5..7d505130 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,10 @@ install_re2o.sh help ## MR 172: Refactor API Creates a new (nearly) REST API to expose all models of Re2o. See [the dedicated wiki page](https://gitlab.federez.net/federez/re2o/wikis/API/Raw-Usage) for more details on how to use it. +* For testing purpose, add `volatildap` package: +``` +pip3 install volatildap +``` * Activate HTTP Authorization passthrough in by adding the following in `/etc/apache2/site-available/re2o.conf` (example in `install_utils/apache2/re2o.conf`): ``` WSGIPassAuthorization On diff --git a/pip_requirements.txt b/pip_requirements.txt index 0960c796..b40fa8c5 100644 --- a/pip_requirements.txt +++ b/pip_requirements.txt @@ -1,3 +1,5 @@ django-bootstrap3 django-ldapdb==0.9.0 django-macaddress +# For testing purpose +volatildap diff --git a/test_utils/__init__.py b/test_utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/test_utils/runner.py b/test_utils/runner.py new file mode 100644 index 00000000..b715762f --- /dev/null +++ b/test_utils/runner.py @@ -0,0 +1,164 @@ +# Re2o est un logiciel d'administration développé initiallement au rezometz. Il +# se veut agnostique au réseau considéré, de manière à être installable en +# quelques clics. +# +# Copyright © 2017 Gabriel Détraz +# Copyright © 2017 Goulven Kermarec +# Copyright © 2017 Augustin Lemesle +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +"""Defines the custom runners for Re2o. +""" + +import volatildap +import os.path + +from django.test.runner import DiscoverRunner +from django.conf import settings + +from users.models import LdapUser, LdapUserGroup, LdapServiceUser, LdapServiceUserGroup + +# The path of this file +__here = os.path.dirname(os.path.realpath(__file__)) +# The absolute path where to find the schemas for the LDAP +schema_path = os.path.abspath(os.path.join(__here, 'ldap', 'schema')) +# The absolute path of the "radius.schema" file +radius_schema_path = os.path.join(schema_path, 'radius.schema') +# The absolute path of the "samba.schema" file +samba_schema_path = os.path.join(schema_path, 'samba.schema') + +# The suffix for the LDAP +suffix = 'dc=example,dc=net' +# The admin CN of the LDAP +rootdn = 'cn=admin,'+suffix + +# Defines all ldap_entry mandatory for Re2o under a key-value list format +# that can be used directly by volatildap. For more on how to generate this +# data, see https://gitlab.federez.net/re2o/scripts/blob/master/print_ldap_entries.py +ldapentry_Utilisateurs = ('cn=Utilisateurs,'+suffix, { + 'cn': ['Utilisateurs'], + 'sambaSID': ['500'], + 'uid': ['Users'], + 'objectClass': ['posixGroup', 'top', 'sambaSamAccount', 'radiusprofile'], + 'gidNumber': ['500'], +}) +ldapentry_groups = ('ou=groups,'+suffix, { + 'ou': ['groups'], + 'objectClass': ['organizationalUnit'], + 'description': ["Groupes d'utilisateurs"], +}) +ldapentry_services = ('ou=services,ou=groups,'+suffix, { + 'ou': ['services'], + 'objectClass': ['organizationalUnit'], + 'description': ['Groupes de comptes techniques'], +}) +ldapentry_service_users = ('ou=service-users,'+suffix, { + 'ou': ['service-users'], + 'objectClass': ['organizationalUnit'], + 'description': ["Utilisateurs techniques de l'annuaire"], +}) +ldapentry_freeradius = ('cn=freeradius,ou=service-users,'+suffix, { + 'cn': ['freeradius'], + 'objectClass': ['applicationProcess', 'simpleSecurityObject'], + 'userPassword': ['FILL_IT'], +}) +ldapentry_nssauth = ('cn=nssauth,ou=service-users,'+suffix, { + 'cn': ['nssauth'], + 'objectClass': ['applicationProcess', 'simpleSecurityObject'], + 'userPassword': ['FILL_IT'], +}) +ldapentry_auth = ('cn=auth,ou=services,ou=groups,'+suffix, { + 'cn': ['auth'], + 'objectClass': ['groupOfNames'], + 'member': ['cn=nssauth,ou=service-users,'+suffix], +}) +ldapentry_posix = ('ou=posix,ou=groups,'+suffix, { + 'ou': ['posix'], + 'objectClass': ['organizationalUnit'], + 'description': ['Groupes de comptes POSIX'], +}) +ldapentry_wifi = ('cn=wifi,ou=service-users,'+suffix, { + 'cn': ['wifi'], + 'objectClass': ['applicationProcess', 'simpleSecurityObject'], + 'userPassword': ['FILL_IT'], +}) +ldapentry_usermgmt = ('cn=usermgmt,ou=services,ou=groups,'+suffix, { + 'cn': ['usermgmt'], + 'objectClass': ['groupOfNames'], + 'member': ['cn=wifi,ou=service-users,'+suffix], +}) +ldapentry_replica = ('cn=replica,ou=service-users,'+suffix, { + 'cn': ['replica'], + 'objectClass': ['applicationProcess', 'simpleSecurityObject'], + 'userPassword': ['FILL_IT'], +}) +ldapentry_readonly = ('cn=readonly,ou=services,ou=groups,'+suffix, { + 'cn': ['readonly'], + 'objectClass': ['groupOfNames'], + 'member': ['cn=replica,ou=service-users,'+suffix, 'cn=freeradius,ou=service-users,'+suffix], +}) +ldapbasic = dict([ldapentry_Utilisateurs, ldapentry_groups, + ldapentry_services, ldapentry_service_users, + ldapentry_freeradius, ldapentry_nssauth, ldapentry_auth, + ldapentry_posix, ldapentry_wifi, ldapentry_usermgmt, + ldapentry_replica, ldapentry_readonly]) + + +class DiscoverLdapRunner(DiscoverRunner): + """Discovers all the tests in the project + + This is a simple subclass of the default test runner + `django.test.runner.DiscoverRunner` that creates a test LDAP + right after the test databases are setup and destroys it right + before the test databases are setup. + It also ensure re2o's settings are using this new LDAP. + """ + + # The `volatildap.LdapServer` instance initiated with the minimal + # structure required by Re2o + ldap_server = volatildap.LdapServer( + suffix=suffix, + rootdn=rootdn, + initial_data=ldapbasic, + schemas=['core.schema', 'cosine.schema', 'inetorgperson.schema', + 'nis.schema', radius_schema_path, samba_schema_path] + ) + + def __init__(self, *args, **kwargs): + settings.DATABASES['ldap']['USER'] = self.ldap_server.rootdn + settings.DATABASES['ldap']['PASSWORD'] = self.ldap_server.rootpw + settings.DATABASES['ldap']['NAME'] = self.ldap_server.uri + settings.LDAP['base_user_dn'] = ldapentry_Utilisateurs[0] + settings.LDAP['base_userservice_dn'] = ldapentry_service_users[0] + settings.LDAP['base_usergroup_dn'] = ldapentry_posix[0] + settings.LDAP['base_userservicegroup_dn'] = ldapentry_services[0] + settings.LDAP['user_gid'] = ldapentry_Utilisateurs[1].get('gidNumber', ["500"])[0] + LdapUser.base_dn = settings.LDAP['base_user_dn'] + LdapUserGroup.base_dn = settings.LDAP['base_usergroup_dn'] + LdapServiceUser.base_dn = settings.LDAP['base_userservice_dn'] + LdapServiceUserGroup.base_dn = settings.LDAP['base_userservicegroup_dn'] + super(DiscoverLdapRunner, self).__init__(*args, **kwargs) + + + def setup_databases(self, *args, **kwargs): + ret = super(DiscoverLdapRunner, self).setup_databases(*args, **kwargs) + self.ldap_server.start() + return ret + + def teardown_databases(self, *args, **kwargs): + self.ldap_server.stop() + super(DiscoverLdapRunner, self).teardown_databases(*args, **kwargs) + diff --git a/users/tests.py b/users/tests.py index a7214cbb..6b2bfb41 100644 --- a/users/tests.py +++ b/users/tests.py @@ -23,121 +23,65 @@ The tests for the Users module. """ +import os.path + from django.test import TestCase from django.conf import settings -from .models import School, ListShell, LdapUserGroup, ListRight +from . import models import volatildap -# Réglages bidon pour volatildap -LdapUserGroup.base_dn='ou=groups,dc=example,dc=org' - - -groups = ('ou=groups,dc=example,dc=org', { - 'objectClass': ['top', 'organizationalUnit'], 'ou': ['groups']}) -people = ('ou=people,dc=example,dc=org', { - 'objectClass': ['top', 'organizationalUnit'], 'ou': ['groups']}) -contacts = ('ou=contacts,ou=groups,dc=example,dc=org', { - 'objectClass': ['top', 'organizationalUnit'], 'ou': ['groups']}) -foogroup = ('cn=foogroup,ou=groups,dc=example,dc=org', { - 'objectClass': ['posixGroup'], 'memberUid': ['foouser', 'baruser'], - 'gidNumber': ['1000'], 'cn': ['foogroup']}) -bargroup = ('cn=bargroup,ou=groups,dc=example,dc=org', { - 'objectClass': ['posixGroup'], 'memberUid': ['zoouser', 'baruser'], - 'gidNumber': ['1001'], 'cn': ['bargroup']}) -wizgroup = ('cn=wizgroup,ou=groups,dc=example,dc=org', { - 'objectClass': ['posixGroup'], 'memberUid': ['wizuser', 'baruser'], - 'gidNumber': ['1002'], 'cn': ['wizgroup']}) -foouser = ('uid=foouser,ou=people,dc=example,dc=org', { - 'cn': [b'F\xc3\xb4o Us\xc3\xa9r'], - 'objectClass': ['posixAccount', 'shadowAccount', 'inetOrgPerson'], - 'loginShell': ['/bin/bash'], - 'jpegPhoto': [ - b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00\xff' - b'\xfe\x00\x1cCreated with GIMP on a Mac\xff\xdb\x00C\x00\x05\x03\x04' - b'\x04\x04\x03\x05\x04\x04\x04\x05\x05\x05\x06\x07\x0c\x08\x07\x07\x07' - b'\x07\x0f\x0b\x0b\t\x0c\x11\x0f\x12\x12\x11\x0f\x11\x11\x13\x16\x1c' - b'\x17\x13\x14\x1a\x15\x11\x11\x18!\x18\x1a\x1d\x1d\x1f\x1f\x1f\x13' - b'\x17"$"\x1e$\x1c\x1e\x1f\x1e\xff\xdb\x00C\x01\x05\x05\x05\x07\x06\x07' - b'\x0e\x08\x08\x0e\x1e\x14\x11\x14\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e' - b'\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e' - b'\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e' - b'\x1e\x1e\x1e\x1e\x1e\x1e\x1e\xff\xc0\x00\x11\x08\x00\x08\x00\x08\x03' - b'\x01"\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x15\x00\x01\x01\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xff\xc4\x00' - b'\x19\x10\x00\x03\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' - b'\x00\x00\x01\x02\x06\x11A\xff\xc4\x00\x14\x01\x01\x00\x00\x00\x00\x00' - b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xc4\x00\x14\x11\x01' - b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff' - b'\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\x00\x9d\xf29wU5Q\xd6' - b'\xfd\x00\x01\xff\xd9'], - 'uidNumber': ['2000'], 'gidNumber': ['1000'], 'sn': [b'Us\xc3\xa9r'], - 'homeDirectory': ['/home/foouser'], 'givenName': [b'F\xc3\xb4o'], - 'uid': ['foouser']}) - -class LdapTestCase(TestCase): - directory = {} - - @classmethod - def setUpClass(cls): - super(LdapTestCase, cls).setUpClass() - cls.ldap_server = volatildap.LdapServer( - initial_data=cls.directory, - schemas=['core.schema', 'cosine.schema', 'inetorgperson.schema', 'nis.schema'], - ) - settings.DATABASES['ldap']['USER'] = cls.ldap_server.rootdn - settings.DATABASES['ldap']['PASSWORD'] = cls.ldap_server.rootpw - settings.DATABASES['ldap']['NAME'] = cls.ldap_server.uri - - @classmethod - def tearDownClass(cls): - cls.ldap_server.stop() - super(LdapTestCase, cls).tearDownClass() - - def setUp(self): - super(LdapTestCase, self).setUp() - self.ldap_server.start() - class SchoolTestCase(TestCase): - def setUp(self): - School.objects.create(name="ENS Paris-Saclay") - School.objects.create(name="Supelec") - def test_school_are_created(self): - pass + s = models.School.objects.create(name="My awesome school") + self.assertEqual(s.name, "My awesome school") + class ListShellTestCase(TestCase): - def setUp(self): - ListShell.objects.create(shell="/bin/zsh") - ListShell.objects.create(shell="/bin/bash") - def test_shell_are_created(self): - pass - -class GroupTestCase(LdapTestCase): - directory = dict([groups, foogroup, bargroup, wizgroup, people, foouser]) - - def test_create_ldapgroup(self): - mygroup = LdapUserGroup() - mygroup.name='re2o' - mygroup.gid=1010 - mygroup.members=['someuser', 'foouser'] - mygroup.save() - - # check ldap group was created - new = LdapUserGroup.objects.get(name='re2o') - self.assertEqual(new.name, 're2o') - self.assertEqual(new.gid, 1010) - self.assertEqual(new.members, ['someuser', 'foouser']) - - def test_create_re2ogroup(self): - ListRight.objects.create(gid='1011', unix_name='admins', details='test') - - #check re2o - lr = ListRight.objects.get(gid=1011) - self.asserEqual(lr.gid, 1011) - self.asserEqual(lr.details, 'test') + s = models.ListShell.objects.create(shell="/bin/zsh") + self.assertEqual(s.shell, "/bin/zsh") +class LdapUserTestCase(TestCase): + def test_create_ldap_user(self): + g = models.LdapUser.objects.create( + gid="500", + name="users_test_ldapuser", + uid="users_test_ldapuser", + uidNumber="21001", + sn="users_test_ldapuser", + login_shell="/bin/false", + mail="user@example.net", + given_name="users_test_ldapuser", + home_directory="/home/moamoak", + display_name="users_test_ldapuser", + dialupAccess="False", + sambaSID="21001", + user_password="{SSHA}aBcDeFgHiJkLmNoPqRsTuVwXyZ012345", + sambat_nt_password="0123456789ABCDEF0123456789ABCDEF", + macs=[], + shadowexpire="0" + ) + self.assertEqual(g.name, 'users_test_ldapuser') + + +class LdapUserGroupTestCase(TestCase): + def test_create_ldap_user_group(self): + g = models.LdapUserGroup.objects.create( + gid="501", + members=[], + name="users_test_ldapusergroup" + ) + self.assertEqual(g.name, 'users_test_ldapusergroup') + + +class LdapServiceUserTestCase(TestCase): + def test_create_ldap_service_user(self): + g = models.LdapServiceUser.objects.create( + name="users_test_ldapserviceuser", + user_password="{SSHA}AbCdEfGhIjKlMnOpQrStUvWxYz987654" + ) + self.assertEqual(g.name, 'users_test_ldapserviceuser') From 6c33559f00fde3a7a0c6188e8232453dece5c96a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Fri, 22 Jun 2018 00:48:45 +0000 Subject: [PATCH 38/49] Add tests for details of instances of every models --- api/serializers.py | 20 +- api/tests.py | 517 ++++++++++++++++++++++++++++++++++++------- api/urls.py | 2 +- api/views.py | 4 +- test_utils/runner.py | 2 + 5 files changed, 453 insertions(+), 92 deletions(-) diff --git a/api/serializers.py b/api/serializers.py index 26abc1c3..92f54427 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -276,6 +276,11 @@ class ServiceLinkSerializer(NamespacedHMSerializer): class OuverturePortListSerializer(NamespacedHMSerializer): """Serialize `machines.models.OuverturePortList` objects. """ + tcp_ports_in = NamespacedHRField(view_name='ouvertureport-detail', many=True, read_only=True) + udp_ports_in = NamespacedHRField(view_name='ouvertureport-detail', many=True, read_only=True) + tcp_ports_out = NamespacedHRField(view_name='ouvertureport-detail', many=True, read_only=True) + udp_ports_out = NamespacedHRField(view_name='ouvertureport-detail', many=True, read_only=True) + class Meta: model = machines.OuverturePortList fields = ('name', 'tcp_ports_in', 'udp_ports_in', 'tcp_ports_out', @@ -335,12 +340,15 @@ class GeneralOptionSerializer(NamespacedHMSerializer): 'GTU') -class ServiceSerializer(NamespacedHMSerializer): +class HomeServiceSerializer(NamespacedHMSerializer): """Serialize `preferences.models.Service` objects. """ class Meta: model = preferences.Service fields = ('name', 'url', 'description', 'image', 'api_url') + extra_kwargs = { + 'api_url': {'view_name': 'homeservice-detail'} + } class AssoOptionSerializer(NamespacedHMSerializer): @@ -625,14 +633,6 @@ class OriginV4RecordSerializer(IpListSerializer): fields = ('ipv4',) -class OriginV6RecordSerializer(Ipv6ListSerializer): - """Serialize `machines.models.Ipv6List` objects with the data needed to - generate an IPv6 Origin DNS record. - """ - class Meta(Ipv6ListSerializer.Meta): - fields = ('ipv6',) - - class NSRecordSerializer(NsSerializer): """Serialize `machines.models.Ns` objects with the data needed to generate a NS DNS record. @@ -713,7 +713,7 @@ class DNSZonesSerializer(serializers.ModelSerializer): soa = SOARecordSerializer() ns_records = NSRecordSerializer(many=True, source='ns_set') originv4 = OriginV4RecordSerializer(source='origin') - originv6 = OriginV6RecordSerializer(source='origin_v6') + originv6 = serializers.CharField(source='origin_v6') mx_records = MXRecordSerializer(many=True, source='mx_set') txt_records = TXTRecordSerializer(many=True, source='txt_set') srv_records = SRVRecordSerializer(many=True, source='srv_set') diff --git a/api/tests.py b/api/tests.py index 3120676a..322a3cfb 100644 --- a/api/tests.py +++ b/api/tests.py @@ -21,12 +21,14 @@ """ import json +import datetime from rest_framework.test import APITestCase from requests import codes -#import cotisations.models as cotisations -#import machines.models as machines -#import topologie.models as topologie +import cotisations.models as cotisations +import machines.models as machines +import preferences.models as preferences +import topologie.models as topologie import users.models as users @@ -52,114 +54,180 @@ class APIEndpointsTestCase(APITestCase): auth_no_perm_endpoints = [] auth_perm_endpoints = [ '/api/cotisations/article/', -# '/api/cotisations/article//', + '/api/cotisations/article/1/', '/api/cotisations/banque/', -# '/api/cotisations/banque//', + '/api/cotisations/banque/1/', '/api/cotisations/cotisation/', -# '/api/cotisations/cotisation//', +# '/api/cotisations/cotisation/1/', '/api/cotisations/facture/', -# '/api/cotisations/facture//', + '/api/cotisations/facture/1/', '/api/cotisations/paiement/', -# '/api/cotisations/paiement//', + '/api/cotisations/paiement/1/', '/api/cotisations/vente/', -# '/api/cotisations/vente//', + '/api/cotisations/vente/1/', '/api/machines/domain/', -# '/api/machines/domain//', + '/api/machines/domain/1/', '/api/machines/extension/', -# '/api/machines/extension//', + '/api/machines/extension/1/', '/api/machines/interface/', -# '/api/machines/interface//', + '/api/machines/interface/1/', '/api/machines/iplist/', -# '/api/machines/iplist//', + '/api/machines/iplist/1/', '/api/machines/iptype/', -# '/api/machines/iptype//', + '/api/machines/iptype/1/', '/api/machines/ipv6list/', -# '/api/machines/ipv6list//', + '/api/machines/ipv6list/1/', '/api/machines/machine/', -# '/api/machines/machine//', + '/api/machines/machine/1/', '/api/machines/machinetype/', -# '/api/machines/machinetype//', + '/api/machines/machinetype/1/', '/api/machines/mx/', -# '/api/machines/mx//', + '/api/machines/mx/1/', '/api/machines/nas/', -# '/api/machines/nas//', + '/api/machines/nas/1/', '/api/machines/ns/', -# '/api/machines/ns//', + '/api/machines/ns/1/', '/api/machines/ouvertureportlist/', -# '/api/machines/ouvertureportlist//', + '/api/machines/ouvertureportlist/1/', '/api/machines/ouvertureport/', -# '/api/machines/ouvertureport//', + '/api/machines/ouvertureport/1/', '/api/machines/servicelink/', -# '/api/machines/servicelink//', + '/api/machines/servicelink/1/', '/api/machines/service/', -# '/api/machines/service//', + '/api/machines/service/1/', '/api/machines/soa/', -# '/api/machines/soa//', + '/api/machines/soa/1/', '/api/machines/srv/', -# '/api/machines/srv//', + '/api/machines/srv/1/', '/api/machines/txt/', -# '/api/machines/txt//', + '/api/machines/txt/1/', '/api/machines/vlan/', -# '/api/machines/vlan//', + '/api/machines/vlan/1/', '/api/preferences/optionaluser/', '/api/preferences/optionalmachine/', '/api/preferences/optionaltopologie/', '/api/preferences/generaloption/', '/api/preferences/service/', -# '/api/preferences/service//', + '/api/preferences/service/1/', '/api/preferences/assooption/', '/api/preferences/homeoption/', '/api/preferences/mailmessageoption/', '/api/topologie/acesspoint/', -# '/api/topologie/acesspoint//', + # 2nd machine to be create (machines_machine_1, topologie_accesspoint_1) + '/api/topologie/acesspoint/2/', '/api/topologie/building/', -# '/api/topologie/building//', + '/api/topologie/building/1/', '/api/topologie/constructorswitch/', -# '/api/topologie/constructorswitch//', + '/api/topologie/constructorswitch/1/', '/api/topologie/modelswitch/', -# '/api/topologie/modelswitch//', + '/api/topologie/modelswitch/1/', '/api/topologie/room/', -# '/api/topologie/room//', + '/api/topologie/room/1/', '/api/topologie/server/', -# '/api/topologie/server//', + # 3rd machine to be create (machines_machine_1, topologie_accesspoint_1, + # topologie_server_1) + '/api/topologie/server/3/', '/api/topologie/stack/', -# '/api/topologie/stack//', + '/api/topologie/stack/1/', '/api/topologie/switch/', -# '/api/topologie/switch//', + # 4th machine to be create (machines_machine_1, topologie_accesspoint_1, + # topologie_server_1, topologie_switch_1) + '/api/topologie/switch/4/', '/api/topologie/switchbay/', -# '/api/topologie/switchbay//', + '/api/topologie/switchbay/1/', '/api/topologie/switchport/', -# '/api/topologie/switchport//', + '/api/topologie/switchport/1/', + '/api/topologie/switchport/2/', + '/api/topologie/switchport/3/', '/api/users/adherent/', -# '/api/users/adherent//', + # 3rd user to be create (stduser, superuser, users_adherent_1) + '/api/users/adherent/3/', '/api/users/ban/', -# '/api/users/ban//', + '/api/users/ban/1/', '/api/users/club/', -# '/api/users/club//', + # 4th user to be create (stduser, superuser, users_adherent_1, + # users_club_1) + '/api/users/club/4/', '/api/users/listright/', -# '/api/users/listright//', +# TODO: Merge !145 +# '/api/users/listright/1/', '/api/users/school/', -# '/api/users/school//', + '/api/users/school/1/', '/api/users/serviceuser/', -# '/api/users/serviceuser//', + '/api/users/serviceuser/1/', '/api/users/shell/', -# '/api/users/shell//', + '/api/users/shell/1/', '/api/users/user/', -# '/api/users/user//', + '/api/users/user/1/', '/api/users/whitelist/', -# '/api/users/whitelist//', + '/api/users/whitelist/1/', '/api/dns/zones/', '/api/dhcp/hostmacip/', '/api/mailing/standard', '/api/mailing/club', '/api/services/regen/', ] + not_found_endpoints = [ + '/api/cotisations/article/4242/', + '/api/cotisations/banque/4242/', + '/api/cotisations/cotisation/4242/', + '/api/cotisations/facture/4242/', + '/api/cotisations/paiement/4242/', + '/api/cotisations/vente/4242/', + '/api/machines/domain/4242/', + '/api/machines/extension/4242/', + '/api/machines/interface/4242/', + '/api/machines/iplist/4242/', + '/api/machines/iptype/4242/', + '/api/machines/ipv6list/4242/', + '/api/machines/machine/4242/', + '/api/machines/machinetype/4242/', + '/api/machines/mx/4242/', + '/api/machines/nas/4242/', + '/api/machines/ns/4242/', + '/api/machines/ouvertureportlist/4242/', + '/api/machines/ouvertureport/4242/', + '/api/machines/servicelink/4242/', + '/api/machines/service/4242/', + '/api/machines/soa/4242/', + '/api/machines/srv/4242/', + '/api/machines/txt/4242/', + '/api/machines/vlan/4242/', + '/api/preferences/service/4242/', + '/api/topologie/acesspoint/4242/', + '/api/topologie/building/4242/', + '/api/topologie/constructorswitch/4242/', + '/api/topologie/modelswitch/4242/', + '/api/topologie/room/4242/', + '/api/topologie/server/4242/', + '/api/topologie/stack/4242/', + '/api/topologie/switch/4242/', + '/api/topologie/switchbay/4242/', + '/api/topologie/switchport/4242/', + '/api/users/adherent/4242/', + '/api/users/ban/4242/', + '/api/users/club/4242/', + '/api/users/listright/4242/', + '/api/users/school/4242/', + '/api/users/serviceuser/4242/', + '/api/users/shell/4242/', + '/api/users/user/4242/', + '/api/users/whitelist/4242/', + ] stduser = None superuser = None @classmethod def setUpTestData(cls): + # Be aware that every object created here is never actually committed + # to the database. TestCase uses rollbacks after each test to cancel all + # modifications and recreates the data defined here before each test. + # For more details, see + # https://docs.djangoproject.com/en/1.10/topics/testing/tools/#testcase + + super(APIEndpointsTestCase, cls).setUpClass() + # A user with no rights cls.stduser = users.User.objects.create_user( "apistduser", @@ -175,15 +243,311 @@ class APIEndpointsTestCase(APITestCase): "apisuperuser" ) - # TODO : - # Create 1 object of every model so there is an exisiting object - # when quering for pk=1 - - @classmethod - def tearDownClass(cls): - cls.stduser.delete() - cls.superuser.delete() - super().tearDownClass() + # Creates 1 instance for each object so the "details" endpoints + # can be tested too. Objects need to be created in the right order. + # Dependencies (relatedFields, ...) are highlighted by a comment at + # the end of the concerned line (# Dep ). + cls.users_school_1 = users.School.objects.create( + name="users_school_1" + ) + cls.users_school_1.save() + cls.users_listshell_1 = users.ListShell.objects.create( + shell="users_listshell_1" + ) + cls.users_adherent_1 = users.Adherent.objects.create( + password="password", + last_login=datetime.datetime.now(datetime.timezone.utc), + surname="users_adherent_1", + pseudo="usersadherent1", + email="users_adherent_1@example.net", + school=cls.users_school_1, # Dep users.School + shell=cls.users_listshell_1, # Dep users.ListShell + comment="users Adherent 1 comment", + pwd_ntlm="", + state=users.User.STATES[0][0], + registered=datetime.datetime.now(datetime.timezone.utc), + telephone="0123456789", + uid_number=21102, + rezo_rez_uid=21102 + ) + cls.users_user_1 = cls.users_adherent_1 + cls.cotisations_article_1 = cotisations.Article.objects.create( + name="cotisations_article_1", + prix=10, + duration=1, + type_user=cotisations.Article.USER_TYPES[0][0], + type_cotisation=cotisations.Article.COTISATION_TYPE[0][0] + ) + cls.cotisations_banque_1 = cotisations.Banque.objects.create( + name="cotisations_banque_1" + ) + cls.cotisations_paiement_1 = cotisations.Paiement.objects.create( + moyen="cotisations_paiement_1", + type_paiement=cotisations.Paiement.PAYMENT_TYPES[0][0] + ) + cls.cotisations_facture_1 = cotisations.Facture.objects.create( + user=cls.users_user_1, # Dep users.User + paiement=cls.cotisations_paiement_1, # Dep cotisations.Paiement + banque=cls.cotisations_banque_1, # Dep cotisations.Banque + cheque="1234567890", + date=datetime.datetime.now(datetime.timezone.utc), + valid=True, + control=False + ) + cls.cotisations_vente_1 = cotisations.Vente.objects.create( + facture=cls.cotisations_facture_1, # Dep cotisations.Facture + number=2, + name="cotisations_vente_1", + prix=10, + duration=1, + type_cotisation=cotisations.Vente.COTISATION_TYPE[0][0] + ) +# Creation of this cotisation seems to revalidate the Vente object which of +# course already exists. +# FIXME +# cls.cotisations_cotisation_1 = cotisations.Cotisation.objects.create( +# vente=cls.cotisations_vente_1, # Dep cotisations.Vente +# type_cotisation=cotisations.Cotisation.COTISATION_TYPE[0][0], +# date_start=datetime.datetime.now(datetime.timezone.utc), +# date_end=datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(days=1) +# ) + cls.machines_machine_1 = machines.Machine.objects.create( + user=cls.users_user_1, # Dep users.User + name="machines_machine_1", + active=True + ) + cls.machines_ouvertureportlist_1 = machines.OuverturePortList.objects.create( + name="machines_ouvertureportlist_1" + ) + cls.machines_soa_1 = machines.SOA.objects.create( + name="machines_soa_1", + mail="postmaster@example.net", + refresh=86400, + retry=7200, + expire=3600000, + ttl=172800 + ) + cls.machines_extension_1 = machines.Extension.objects.create( + name="machines_extension_1", + need_infra=False, + # Do not set origin because of circular dependency + origin_v6="2001:db8:1234::", + soa=cls.machines_soa_1 # Dep machines.SOA + ) + cls.machines_vlan_1 = machines.Vlan.objects.create( + vlan_id=0, + name="machines_vlan_1", + comment="machines Vlan 1" + ) + cls.machines_iptype_1 = machines.IpType.objects.create( + type="machines_iptype_1", + extension=cls.machines_extension_1, # Dep machines.Extension + need_infra=False, + domaine_ip_start="10.0.0.1", + domaine_ip_stop="10.0.0.255", + prefix_v6="2001:db8:1234::", + vlan=cls.machines_vlan_1, # Dep machines.Vlan + ouverture_ports=cls.machines_ouvertureportlist_1 # Dep machines.OuverturePortList + ) + # All IPs in the IpType range are autocreated so we can't create + # new ones and thus we only retrieve it if needed in the test + cls.machines_iplist_1 = machines.IpList.objects.get( + ipv4="10.0.0.1", + ip_type=cls.machines_iptype_1, # Dep machines.IpType + ) + cls.machines_machinetype_1 = machines.MachineType.objects.create( + type="machines_machinetype_1", + ip_type=cls.machines_iptype_1, # Dep machines.IpType + ) + cls.machines_interface_1 = machines.Interface.objects.create( + ipv4=cls.machines_iplist_1, # Dep machines.IpList + mac_address="00:00:00:00:00:00", + machine=cls.machines_machine_1, # Dep machines.Machine + type=cls.machines_machinetype_1, # Dep machines.MachineType + details="machines Interface 1", + #port_lists=[cls.machines_ouvertureportlist_1] # Dep machines.OuverturePortList + ) + cls.machines_domain_1 = machines.Domain.objects.create( + interface_parent=cls.machines_interface_1, # Dep machines.Interface + name="machinesdomain", + extension=cls.machines_extension_1 # Dep machines.Extension + # Do no define cname for circular dependency + ) + cls.machines_mx_1 = machines.Mx.objects.create( + zone=cls.machines_extension_1, # Dep machines.Extension + priority=10, + name=cls.machines_domain_1 # Dep machines.Domain + ) + cls.machines_ns_1 = machines.Ns.objects.create( + zone=cls.machines_extension_1, # Dep machines.Extension + ns=cls.machines_domain_1 # Dep machines.Domain + ) + cls.machines_txt_1 = machines.Txt.objects.create( + zone=cls.machines_extension_1, # Dep machines.Extension + field1="machines_txt_1", + field2="machies Txt 1" + ) + cls.machines_srv_1 = machines.Srv.objects.create( + service="machines_srv_1", + protocole=machines.Srv.TCP, + extension=cls.machines_extension_1, # Dep machines.Extension + ttl=172800, + priority=0, + port=1, + target=cls.machines_domain_1, # Dep machines.Domain + ) + cls.machines_ipv6list_1 = machines.Ipv6List.objects.create( + ipv6="2001:db8:1234::", + interface=cls.machines_interface_1, # Dep machines.Interface + slaac_ip=False + ) + cls.machines_service_1 = machines.Service.objects.create( + service_type="machines_service_1", + min_time_regen=datetime.timedelta(minutes=1), + regular_time_regen=datetime.timedelta(hours=1) + # Do not define service_link because circular dependency + ) + cls.machines_servicelink_1 = machines.Service_link.objects.create( + service=cls.machines_service_1, # Dep machines.Service + server=cls.machines_interface_1, # Dep machines.Interface + last_regen=datetime.datetime.now(datetime.timezone.utc), + asked_regen=False + ) + cls.machines_ouvertureport_1 = machines.OuverturePort.objects.create( + begin=1, + end=2, + port_list=cls.machines_ouvertureportlist_1, # Dep machines.OuverturePortList + protocole=machines.OuverturePort.TCP, + io=machines.OuverturePort.OUT + ) + cls.machines_nas_1 = machines.Nas.objects.create( + name="machines_nas_1", + nas_type=cls.machines_machinetype_1, # Dep machines.MachineType + machine_type=cls.machines_machinetype_1, # Dep machines.MachineType + port_access_mode=machines.Nas.AUTH[0][0], + autocapture_mac=False + ) + cls.preferences_service_1 = preferences.Service.objects.create( + name="preferences_service_1", + url="https://example.net", + description="preferences Service 1", + image="/media/logo/none.png" + ) + cls.topologie_stack_1 = topologie.Stack.objects.create( + name="topologie_stack_1", + stack_id="1", + details="topologie Stack 1", + member_id_min=1, + member_id_max=10 + ) + cls.topologie_accespoint_1 = topologie.AccessPoint.objects.create( + user=cls.users_user_1, # Dep users.User + name="machines_machine_1", + active=True, + location="topologie AccessPoint 1" + ) + cls.topologie_server_1 = topologie.Server.objects.create( + user=cls.users_user_1, # Dep users.User + name="machines_machine_1", + active=True + ) + cls.topologie_building_1 = topologie.Building.objects.create( + name="topologie_building_1" + ) + cls.topologie_switchbay_1 = topologie.SwitchBay.objects.create( + name="topologie_switchbay_1", + building=cls.topologie_building_1, # Dep topologie.Building + info="topologie SwitchBay 1" + ) + cls.topologie_constructorswitch_1 = topologie.ConstructorSwitch.objects.create( + name="topologie_constructorswitch_1" + ) + cls.topologie_modelswitch_1 = topologie.ModelSwitch.objects.create( + reference="topologie_modelswitch_1", + constructor=cls.topologie_constructorswitch_1 # Dep topologie.ConstructorSwitch + ) + cls.topologie_switch_1 = topologie.Switch.objects.create( + user=cls.users_user_1, # Dep users.User + name="machines_machine_1", + active=True, + number=10, + stack=cls.topologie_stack_1, # Dep topologie.Stack + stack_member_id=1, + model=cls.topologie_modelswitch_1, # Dep topologie.ModelSwitch + switchbay=cls.topologie_switchbay_1 # Dep topologie.SwitchBay + ) + cls.topologie_room_1 = topologie.Room.objects.create( + name="topologie_romm_1", + details="topologie Room 1" + ) + cls.topologie_port_1 = topologie.Port.objects.create( + switch=cls.topologie_switch_1, # Dep topologie.Switch + port=1, + room=cls.topologie_room_1, # Dep topologie.Room + radius=topologie.Port.STATES[0][0], + vlan_force=cls.machines_vlan_1, # Dep machines.Vlan + details="topologie_switch_1" + ) + cls.topologie_port_2 = topologie.Port.objects.create( + switch=cls.topologie_switch_1, # Dep topologie.Switch + port=2, + machine_interface=cls.machines_interface_1, # Dep machines.Interface + radius=topologie.Port.STATES[0][0], + vlan_force=cls.machines_vlan_1, # Dep machines.Vlan + details="topologie_switch_1" + ) + cls.topologie_port_3 = topologie.Port.objects.create( + switch=cls.topologie_switch_1, # Dep topologie.Switch + port=3, + room=cls.topologie_room_1, # Dep topologie.Room + radius=topologie.Port.STATES[0][0], + # Do not defines related because circular dependency # Dep machines.Vlan + details="topologie_switch_1" + ) + cls.users_ban_1 = users.Ban.objects.create( + user=cls.users_user_1, # Dep users.User + raison="users Ban 1", + date_start=datetime.datetime.now(datetime.timezone.utc), + date_end=datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(days=1), + state=users.Ban.STATES[0][0] + ) + cls.users_club_1 = users.Club.objects.create( + password="password", + last_login=datetime.datetime.now(datetime.timezone.utc), + surname="users_club_1", + pseudo="usersclub1", + email="users_club_1@example.net", + school=cls.users_school_1, # Dep users.School + shell=cls.users_listshell_1, # Dep users.ListShell + comment="users Club 1 comment", + pwd_ntlm="", + state=users.User.STATES[0][0], + registered=datetime.datetime.now(datetime.timezone.utc), + telephone="0123456789", + uid_number=21103, + rezo_rez_uid=21103 + ) +# Need merge of MR145 to work +# TODO: Merge !145 +# cls.users_listright_1 = users.ListRight.objects.create( +# unix_name="userslistright", +# gid=601, +# critical=False, +# details="userslistright" +# ) + cls.users_serviceuser_1 = users.ServiceUser.objects.create( + password="password", + last_login=datetime.datetime.now(datetime.timezone.utc), + pseudo="usersserviceuser1", + access_group=users.ServiceUser.ACCESS[0][0], + comment="users ServiceUser 1" + ) + cls.users_whitelist_1 = users.Whitelist.objects.create( + user=cls.users_user_1, + raison="users Whitelist 1", + date_start=datetime.datetime.now(datetime.timezone.utc), + date_end=datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(days=1) + ) def check_responses_code(self, urls, expected_code, formats=None, assert_more=None): @@ -220,8 +584,7 @@ class APIEndpointsTestCase(APITestCase): Raises: AssertionError: An endpoint did not have a 200 status code. """ - urls = [endpoint.replace('', '1') - for endpoint in self.no_auth_endpoints] + urls = self.no_auth_endpoints self.check_responses_code(urls, codes.ok) def test_auth_endpoints_with_no_auth(self): @@ -231,8 +594,7 @@ class APIEndpointsTestCase(APITestCase): Raises: AssertionError: An endpoint did not have a 401 status code. """ - urls = [endpoint.replace('', '1') for endpoint in \ - self.auth_no_perm_endpoints + self.auth_perm_endpoints] + urls = self.auth_no_perm_endpoints + self.auth_perm_endpoints self.check_responses_code(urls, codes.unauthorized) def test_no_auth_endpoints_with_auth(self): @@ -243,8 +605,7 @@ class APIEndpointsTestCase(APITestCase): AssertionError: An endpoint did not have a 200 status code. """ self.client.force_authenticate(user=self.stduser) - urls = [endpoint.replace('', '1') - for endpoint in self.no_auth_endpoints] + urls = self.no_auth_endpoints self.check_responses_code(urls, codes.ok) def test_auth_no_perm_endpoints_with_auth_and_no_perm(self): @@ -256,8 +617,7 @@ class APIEndpointsTestCase(APITestCase): AssertionError: An endpoint did not have a 200 status code. """ self.client.force_authenticate(user=self.stduser) - urls = [endpoint.replace('', '1') - for endpoint in self.auth_no_perm_endpoints] + urls = self.auth_no_perm_endpoints self.check_responses_code(urls, codes.ok) def test_auth_perm_endpoints_with_auth_and_no_perm(self): @@ -269,8 +629,7 @@ class APIEndpointsTestCase(APITestCase): AssertionError: An endpoint did not have a 403 status code. """ self.client.force_authenticate(user=self.stduser) - urls = [endpoint.replace('', '1') - for endpoint in self.auth_perm_endpoints] + urls = self.auth_perm_endpoints self.check_responses_code(urls, codes.forbidden) def test_auth_endpoints_with_auth_and_perm(self): @@ -281,8 +640,7 @@ class APIEndpointsTestCase(APITestCase): AssertionError: An endpoint did not have a 200 status code. """ self.client.force_authenticate(user=self.superuser) - urls = [endpoint.replace('', '1') for endpoint \ - in self.auth_no_perm_endpoints + self.auth_perm_endpoints] + urls = self.auth_no_perm_endpoints + self.auth_perm_endpoints self.check_responses_code(urls, codes.ok) def test_endpoints_not_found(self): @@ -295,9 +653,7 @@ class APIEndpointsTestCase(APITestCase): """ self.client.force_authenticate(user=self.superuser) # Select only the URLs with '' and replace it with '42' - urls = [endpoint.replace('', '42') for endpoint in \ - self.no_auth_endpoints + self.auth_no_perm_endpoints + \ - self.auth_perm_endpoints if '' in endpoint] + urls = self.not_found_endpoints self.check_responses_code(urls, codes.not_found) def test_formats(self): @@ -310,9 +666,8 @@ class APIEndpointsTestCase(APITestCase): """ self.client.force_authenticate(user=self.superuser) - urls = [endpoint.replace('', '1') for endpoint in \ - self.no_auth_endpoints + self.auth_no_perm_endpoints + \ - self.auth_perm_endpoints] + urls = self.no_auth_endpoints + self.auth_no_perm_endpoints + \ + self.auth_perm_endpoints def assert_more(response, url, format): """Assert the response is valid json when format is json""" @@ -389,11 +744,15 @@ class APIPaginationTestCase(APITestCase): @classmethod def setUpTestData(cls): # A user with all the rights + # We need to use a different username than for the first + # test case because TestCase is using rollbacks which don't + # trigger the ldap_sync() thus the LDAP still have data about + # the old users. cls.superuser = users.User.objects.create_superuser( - "apisuperuser", - "apisuperuser", - "apisuperuser@example.net", - "apisuperuser" + "apisuperuser2", + "apisuperuser2", + "apisuperuser2@example.net", + "apisuperuser2" ) @classmethod diff --git a/api/urls.py b/api/urls.py index a04d6fbe..942435dd 100644 --- a/api/urls.py +++ b/api/urls.py @@ -65,7 +65,7 @@ router.register_view(r'preferences/optionaluser', views.OptionalUserView), router.register_view(r'preferences/optionalmachine', views.OptionalMachineView), router.register_view(r'preferences/optionaltopologie', views.OptionalTopologieView), router.register_view(r'preferences/generaloption', views.GeneralOptionView), -router.register_viewset(r'preferences/service', views.ServiceViewSet), +router.register_viewset(r'preferences/service', views.HomeServiceViewSet, base_name='homeservice'), router.register_view(r'preferences/assooption', views.AssoOptionView), router.register_view(r'preferences/homeoption', views.HomeOptionView), router.register_view(r'preferences/mailmessageoption', views.MailMessageOptionView), diff --git a/api/views.py b/api/views.py index 7532aece..d5245f2f 100644 --- a/api/views.py +++ b/api/views.py @@ -275,11 +275,11 @@ class GeneralOptionView(generics.RetrieveAPIView): return preferences.GeneralOption.objects.first() -class ServiceViewSet(viewsets.ReadOnlyModelViewSet): +class HomeServiceViewSet(viewsets.ReadOnlyModelViewSet): """Exposes list and details of `preferences.models.Service` objects. """ queryset = preferences.Service.objects.all() - serializer_class = serializers.ServiceSerializer + serializer_class = serializers.HomeServiceSerializer class AssoOptionView(generics.RetrieveAPIView): diff --git a/test_utils/runner.py b/test_utils/runner.py index b715762f..54ddd82f 100644 --- a/test_utils/runner.py +++ b/test_utils/runner.py @@ -155,10 +155,12 @@ class DiscoverLdapRunner(DiscoverRunner): def setup_databases(self, *args, **kwargs): ret = super(DiscoverLdapRunner, self).setup_databases(*args, **kwargs) + print("Creating test LDAP with volatildap...") self.ldap_server.start() return ret def teardown_databases(self, *args, **kwargs): self.ldap_server.stop() + print("Destroying test LDAP...") super(DiscoverLdapRunner, self).teardown_databases(*args, **kwargs) From fb78ec7a7726ca2dfafad5ace7178cc4367b12e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Fri, 22 Jun 2018 01:29:19 +0000 Subject: [PATCH 39/49] Fix testing of cotisations.Cotisation objects --- api/tests.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/api/tests.py b/api/tests.py index 322a3cfb..ef05cec2 100644 --- a/api/tests.py +++ b/api/tests.py @@ -58,7 +58,7 @@ class APIEndpointsTestCase(APITestCase): '/api/cotisations/banque/', '/api/cotisations/banque/1/', '/api/cotisations/cotisation/', -# '/api/cotisations/cotisation/1/', + '/api/cotisations/cotisation/1/', '/api/cotisations/facture/', '/api/cotisations/facture/1/', '/api/cotisations/paiement/', @@ -302,15 +302,12 @@ class APIEndpointsTestCase(APITestCase): duration=1, type_cotisation=cotisations.Vente.COTISATION_TYPE[0][0] ) -# Creation of this cotisation seems to revalidate the Vente object which of -# course already exists. -# FIXME -# cls.cotisations_cotisation_1 = cotisations.Cotisation.objects.create( -# vente=cls.cotisations_vente_1, # Dep cotisations.Vente -# type_cotisation=cotisations.Cotisation.COTISATION_TYPE[0][0], -# date_start=datetime.datetime.now(datetime.timezone.utc), -# date_end=datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(days=1) -# ) + # A cotisation is automatically created by the Vente object and + # trying to create another cotisation associated with this vente + # will fail so we simply retrieve it so it can be used in the tests + cls.cotisations_cotisation_1 = cotisations.Cotisation.objects.get( + vente=cls.cotisations_vente_1, # Dep cotisations.Vente + ) cls.machines_machine_1 = machines.Machine.objects.create( user=cls.users_user_1, # Dep users.User name="machines_machine_1", @@ -350,7 +347,7 @@ class APIEndpointsTestCase(APITestCase): ouverture_ports=cls.machines_ouvertureportlist_1 # Dep machines.OuverturePortList ) # All IPs in the IpType range are autocreated so we can't create - # new ones and thus we only retrieve it if needed in the test + # new ones and thus we only retrieve it if needed in the tests cls.machines_iplist_1 = machines.IpList.objects.get( ipv4="10.0.0.1", ip_type=cls.machines_iptype_1, # Dep machines.IpType From cb1073985f1610d2c41e58e6719b65da93c1e871 Mon Sep 17 00:00:00 2001 From: Gwenael Le Hir Date: Fri, 22 Jun 2018 16:44:23 +0000 Subject: [PATCH 40/49] Add Re2o logo --- static/images/logo_re2o.ai | 3618 ++++++++++++++++++++++++++++ static/images/logo_re2o.pdf | 3597 +++++++++++++++++++++++++++ static/images/logo_re2o.svg | 120 + static/images/logo_re2o_navbar.svg | 133 + 4 files changed, 7468 insertions(+) create mode 100755 static/images/logo_re2o.ai create mode 100755 static/images/logo_re2o.pdf create mode 100755 static/images/logo_re2o.svg create mode 100755 static/images/logo_re2o_navbar.svg diff --git a/static/images/logo_re2o.ai b/static/images/logo_re2o.ai new file mode 100755 index 00000000..36dd8859 --- /dev/null +++ b/static/images/logo_re2o.ai @@ -0,0 +1,3618 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[6 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + logo Re2o + + + 2018-06-22T15:34:40+02:00 + 2018-06-22T15:34:40+02:00 + 2018-06-22T15:34:40+02:00 + Adobe Illustrator CC 22.0 (Windows) + + + + 256 + 236 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA7AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYqt lljijaWVgkaDk7saAAdycjOYiCSaATGJkaHNiGqfmJbxOY9Og9em3rSVVT8lG5/DOY1ftNGJrFHi 8zy+X9ju9P2LIi8hryCVL+Yuth6tFbsv8vFx9x5ZrR7Tai9xD5H9bmHsXDXOX2fqT/RvPen3siwX afVJ22Viaxk/621PpzdaH2hxZSIzHBL7Pm63VdkTxi4+ofayfOhdS7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXnnnzXpLi8OmQtS3tyPWp+3J139l/XnD +0PaBnk8GP0x5+Z/Z9703ZGkEY+Ifqly937WJ5zTuXYq7FXoXkLXpLqB9OuW5S268oGPUx9OP+xz t/Z3tE5InFM+qPL3fsea7X0ggfEjyPP3stzpnSvP/wA5de80aBoVpqmhXptQtx6N2vpxSclkUlG/ eo9OJSm3jmHrMk4AGJp6P2a0mn1GaWPNHi9Njcjl7iO/7Hjv/K6PzL/6vH/Tta/9Us1/5zL3/c9r /oZ0H+p/7Kf/ABTv+V0fmX/1eP8Ap2tf+qWP5zL3/cv+hnQf6n/sp/8AFO/5XR+Zf/V4/wCna1/6 pY/nMvf9y/6GdB/qf+yn/wAU7/ldH5l/9Xj/AKdrX/qlj+cy9/3L/oZ0H+p/7Kf/ABTv+V0fmX/1 eP8Ap2tf+qWP5zL3/cv+hnQf6n/sp/8AFO/5XR+Zf/V4/wCna1/6pY/nMvf9y/6GdB/qf+yn/wAU 7/ldH5l/9Xj/AKdrX/qlj+cy9/3L/oZ0H+p/7Kf/ABTv+V0fmX/1eP8Ap2tf+qWP5zL3/cv+hnQf 6n/sp/8AFO/5XR+Zf/V4/wCna1/6pY/nMvf9y/6GdB/qf+yn/wAU7/ldH5l/9Xj/AKdrX/qlj+cy 9/3L/oZ0H+p/7Kf/ABSdeXfz8812d0g1oR6nZk0loiQzAeKGMKn0FfuycNdMHfcODrPZLTzifCuE vfY+3f7XvukatYavplvqVhJ6tpdIJIn6bdCCOxB2I8c20JiQscnzvUaeeHIccxUoovJtLsVdirsV dirsVdirsVdirsVdirsVdirxa8kaW8nkc1Z5HZj7liTnk+eRlkkT1Je8xxAiAO5Rypm7FXYqnfky Vo/Mlpx6OXVh4goc2/YUzHVwrrf3FwO043gl+Or1TPRnj2DfnXCj/lvqjN1ia3dPmbiNf1McxdaL xl3/ALMSI10PPi/3JfMOaR9WdirsVdirsVdirsVdirsVdirsVfQv/OPN1PL5QvIHblHb3rCIeAeN GI+XKp+nNr2efSR5vm/thjA1MSOZhv8AMvUs2DyTsVdirsVdirsVdirsVdirsVdirsVdiryPzJpz 2Gs3MBFEZzJEfFHNR93TPMu1NMcOolHpdj3F7XRZhkxRPz96WZr3KdirsVZJ5Ighjvp9Wu5FgsdN ieSa4kIVEqpBLMdgAnIk9s6L2b0xnn8TpAfadvut1HbGYRxcPWX6HpSsrKGUgqRUEbgg53by7CPz kstWv/JUthpdpLeXF1PCrRQqXIRG9QsQO1UGYetBMKAvd3/s3lx49UJ5JCMYxPP5fpeB/wDKufPf /Vhvf+RLZqvCn/NPyL6H/LOj/wBVh83f8q589/8AVhvf+RLY+FP+afkV/lnR/wCqw+bv+Vc+e/8A qw3v/IlsfCn/ADT8iv8ALOj/ANVh83f8q589/wDVhvf+RLY+FP8Amn5Ff5Z0f+qw+bv+Vc+e/wDq w3v/ACJbHwp/zT8iv8s6P/VYfN3/ACrnz3/1Yb3/AJEtj4U/5p+RX+WdH/qsPm7/AJVz57/6sN7/ AMiWx8Kf80/Ir/LOj/1WHzULvyL5ztIjLcaJepEN2f0JCoA7kgGn04DikNyD8mzH2rpZmo5IX/WC RkEGh65Bz3Yq7FX0B/zjr/yjGp/8xv8AzKTNp2fyL517Zf4xD+p+kvV82Lx7sVdirsVdirsVdirs VdirsVdirsVdiqT+ZfLkGs2oFRHdxV9GU9N/2Wp2P4Zq+1OzI6qHdMcj+g+TnaHWnBLvieYeZ6jp OoadKYryFozWit1Vv9Vhsc4DVaPLglWSNfd83q8OohlFxNoTMVuTTRvLep6rIBDGUg/auHBCAe38 x9hmx0PZebUH0io/zjy/a4mp1uPCNzv3PNfz5/NjSINIf8v/AClOJ4C3+5zUozUOyneBGGzVIHMg 024+OehaPRw0+MQh/ae95PUZ5Zp8UlD8gvz9bRWt/Knmu4J0YkR6bqUhqbUnYRSk/wC6f5W/Y/1f s5TQQ+q1ZWUMpBUioI3BBxQ3irsVdirsVdirsVdirsVeQfnn5BsJNKfzRYQrDeWzKNQCAASxuQod gP21Yjfw69M1utwADjHxe09le1pjJ+XmbjL6fI93uLwfNY+guxV9Af8AOOv/ACjGp/8AMb/zKTNp 2fyL517Zf4xD+p+kvV82Lx7sVdirsVdirsVdirsVdirsVdirsVdirsVadEdSrqGU9VYVH44JRBFF IJG4Qy6RpSvzWygV/wCYRID99Mxxo8INiEb/AKobTqchFcUvmWIfnD5M8x+a/J0+n+XtVl06+Sri 3RhHFdLTeCVwOSg9t+P823TJaXwvqGn32nX09hfwPbXls5iuLeUFXR1NCrA4skPir338gvz9bRWt /Knmu4J0YkR6bqUhqbUnYRSk/wC6f5W/Y/1fsqCH1WrKyhlIKkVBG4IOKG8VdirsVdirsVdirsVY v+aH/kv9c/5hm/WMxtZ/dH8dXbdhf45j/rPlDNG+vuxV9Af846/8oxqf/Mb/AMykzadn8i+de2X+ MQ/qfpL1fNi8e7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqtkkjijaSRgkaAs7HYAAVJOAmhaYxJNDmo WGpadqEAnsLqK7hPSSF1kXf3UnBGcZcjbZlwTxmpxMT5ikTkmpaJYzIYw4MigFkqOQB6EjBYuk8J q+jyr87/AMkLHzzYtqmlqlt5ptkpFKaKl0ijaGY/zfyP26HboUPjXUNPvtOvp7C/ge2vLZzFcW8o KujqaFWBxZIfFXvv5Bfn62itb+VPNdwToxIj03UpDU2pOwilJ/3T/K37H+r9lQQ+qJbm3hhM0sqR wgVMrsFWnjyO2CUgBZTGBkaAspRJ528oRuUbWbPkOtJkI+8EjMc6zEP4g5g7N1JF+HL5JjY6tpeo LzsLyG7UdTDIslPnxJy2GWMvpILjZcGTH9cTH3ikVljU7FXYq7FWL/mh/wCS/wBc/wCYZv1jMbWf 3R/HV23YX+OY/wCs+UM0b6+7FX0B/wA46/8AKMan/wAxv/MpM2nZ/IvnXtl/jEP6n6S9XzYvHuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KoLXP+OLqH/MNN/wAmzleb6Je4t+l/vY/1h9744hnngkEkEjRS Do6EqfvGc8+2SgJCiLCMbX9dZAjaldFBWimaQgV67csNtI0mG74I/IPV/wDnHFma/wBeZiWZo7cs x3JJaTc5n9n/AFH3PIe2YqGL3y/Q9xzavAvKPzv/ACQsfPNi2qaWqW3mm2SkUpoqXSKNoZj/ADfy P26Hboq+ObnSNUttUfSbi1lj1OOX6u9mykSiXlx4ceta4snvflbyJoP5b2cF9rNvFq3nuZVljs5a PbaaGFV5KCVkm/V2p1bXa3XjF6Y7y+53XZXY8tT6penH9/u/Wt1nzBrOtXJuNTu5Ll61UMfgX2RB 8K/QM57LmlM3I29vp9JjwxqEQEvytyF8FxPbzLNbyPDMhqkkbFWB8QRQjCCQbDGUBIURYeoeRvze uY5otP8AMcnqwOQseonZkPb1afaX/K6+Nc2+k7TIPDk3He8v2n7PxIM8Io/zf1fqewKyuoZSGVhV WG4IPQjN8Dbx5FN4odirF/zQ/wDJf65/zDN+sZjaz+6P46u27C/xzH/WfKGaN9fdir6A/wCcdf8A lGNT/wCY3/mUmbTs/kXzr2y/xiH9T9Jer5sXj3Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FUFrn/ABxd Q/5hpv8Ak2crzfRL3Fv0v97H+sPvfGuc8+3OxV7L/wA43/73a7/xit/+JSZsOz/qPueI9tPoxe+X 6HuWbV4F2KsC8/8Alvydp9/H+YN1Yo/mDSozHZSdFlmccITKv7ZirVT1A+Qpj6rP4WMyc3s/SHUZ ow6Hn7nht3dXF3cy3VzIZbiZi8sjblmY1JOclKRJs830uEIwiIxFAKWBm7FXYq7FXtH5Meapb2xm 0K6fnNYqJLQnqYK8Sv8AsGIp7H2zf9lagyBgenL3PFe0ehEJDLHlLn7/ANr0zNu8y7FWL/mh/wCS /wBc/wCYZv1jMbWf3R/HV23YX+OY/wCs+UM0b6+7FX0B/wA46/8AKMan/wAxv/MpM2nZ/IvnXtl/ jEP6n6S9XzYvHuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KoLXP+OLqH/MNN/wAmzleb6Je4t+l/vY/1 h9741znn252KvZf+cb/97td/4xW//EpM2HZ/1H3PEe2n0YvfL9D3LNq8C7FXlv573kiafpNmCfTn lllYdiYVVR/ydOabtiRqI971PsvjBnOXcAPn/Y8dzRPZOxV2KuxV2Ksq/K+9e188aaVrxmZ4XA7i RCB9zUOZmgnw5ouq7bxieln5b/IvorOqfOXYqxf80P8AyX+uf8wzfrGY2s/uj+Ortuwv8cx/1nyh mjfX3Yq+gP8AnHX/AJRjU/8AmN/5lJm07P5F869sv8Yh/U/SXq+bF492KuxV2KuxV2KuxV2KuxV2 KuxV2KuxVBa5/wAcXUP+Yab/AJNnK830S9xb9L/ex/rD73xrnPPtzsVey/8AON/+92u/8Yrf/iUm bDs/6j7niPbT6MXvl+h7lm1eBdiry7897N30/Sb0A8IJZYmPasyqw/5NZpu2I7RPv/H2PU+y+QCc 494B+X9rxzNE9k7FXYq7FXYqyr8r7J7rzxpoWvGFnmcjsI0JH3tQZmaCHFmi6rtvIIaWfnt8y+is 6p85dirF/wA0P/Jf65/zDN+sZjaz+6P46u27C/xzH/WfKGaN9fdir6A/5x1/5RjU/wDmN/5lJm07 P5F869sv8Yh/U/SXq+bF492KuxV2KuxV2KuxV2KuxV2KuxV2KuxVBa5/xxdQ/wCYab/k2crzfRL3 Fv0v97H+sPvfGuc8+3OxV7L/AM43/wC92u/8Yrf/AIlJmw7P+o+54j20+jF75foe5ZtXgXYqk/m7 y/Hr/l+70xiFklXlA5/ZlQ8kP37H2zH1WDxcZi5mg1Z0+aM+g5+580XdrcWl1La3MZiuIGMcsbbF WU0IzkpRINHm+mY5icRKJsFSwM3Yq7FXYq9E8j6z5Z8hwWOreaLkWVx5kl+qabzH2IFHJp5O6xs/ Acug2PTcb/srTmIMz15e54r2i1wnMYo8o8/f+x7erKyhlIKkVBG4IObd5lvFWL/mh/5L/XP+YZv1 jMbWf3R/HV23YX+OY/6z5QzRvr7sVfQH/OOv/KMan/zG/wDMpM2nZ/IvnXtl/jEP6n6S9XzYvHux V2KuxV2KuxV2KuxV2KuxV2KuxV2KoLXP+OLqH/MNN/ybOV5vol7i36X+9j/WH3vjXOefbnYq9l/5 xv8A97td/wCMVv8A8SkzYdn/AFH3PEe2n0YvfL9D3LNq8C7FXYqwn8wPy2tfMa/XbNlttXQU9Qj4 JgOiyU7js3+Y12t0Ay+qO0vvd32V2xLTemXqx/d7v1PEdZ8vazotwYNTtJLd60VmHwN7o4+FvoOc /lwzxmpCnt9Pq8WYXCQKX5U5Kpb21xczLBbRPNM5okUal2J9lFScIBJoMZzjEXI0GQXdn5d8j2aa z55lUTkc9P8ALcbBrq5cbr6iivpx16k/2Hb6Tswk8WTYdzy/afb8QDDDuf536v1vB/PXnjWvOevy 6xqrKGIEdrax7RQQL9iKMeA/E75vQHkHrn5Bfn62itb+VPNdwToxIj03UpDU2pOwilJ/3T/K37H+ r9koIfVasrKGUgqRUEbgg4oYx+aH/kv9c/5hm/WMxtZ/dH8dXbdhf45j/rPmK18s+ZLsA2ulXlwG +yYreVwdq7cVOaWMTLkLfVcmuwQ+qcB75BTvNB12yUteaddWyrXkZoZIwKda8lGAxI5sserwz+mc Ze4gvcv+cdf+UY1P/mN/5lJmz7P5F4L2y/xiH9T9Jer5sXj3Yq7FXYq7FXYq7FXYq7FXYq7FXYq7 FUFrn/HF1D/mGm/5NnK830S9xb9L/ex/rD73xrnPPtzsVey/843/AO92u/8AGK3/AOJSZsOz/qPu eI9tPoxe+X6HuWbV4F2KuxV2KrJoIZ42imjWWNvtI4DKfmDglEEUWUZGJsGilEnkryhI5d9Gs+R6 0hRfwAGY50eI/wAIcuPaWoArxJfMpjZaXplgpWxtIbVT1WCNIwf+BAy6GOMfpADj5M88n1yMvebe Y/nf+SNl56sW1TS1S2802qUilNFS6RRtDKf5v5H7dDt0m1PjXUNPvtOvp7C/ge2vLZzFcW8oKujq aFWBxZIfFXvv5Bfn62itb+VPNdwToxIj03UpDU2pOwilJ/3T/K37H+r9lQQ+qxwdARRkahB6gjqD igFvFXddjiqjbWNla+p9Vt44PVbnL6SKnJqU5NxAqaDIxgI8hTZPLOdcRJrvVsk1uxV2KuxV2Kux V2KuxV2KuxV2KuxV2KoLXP8Aji6h/wAw03/Js5Xm+iXuLfpf72P9Yfe+Nc559udir2X/AJxv/wB7 td/4xW//ABKTNh2f9R9zxHtp9GL3y/Q9yzavAuxV2KuxV2KuxV2KuxV5R+d/5IWPnmxbVNLVLbzT bJSKU0VLpFG0Mx/m/kft0O3RV8a6hp99p19PYX8D215bOYri3lBV0dTQqwOLJD4q+nv+cXPPvnW9 iby3e2FxqPl+1UraavT4bQgVEDu5HNCPsBasvSnH7KgvoG51bTLVitxdwxOP2HdQ33E1zGy6zDj2 nOMT5kNsNPkn9MSfguttR0+6/wB5rmKY9SI3ViPmAcli1OLJ9Eoy9xBRkwTh9USPgiMvanYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYqgtc/44uof8w03/ACbOV5vol7i36X+9j/WH3vjXOefbnYqzT8p/ OcPlbzOJrw0069T6vdsN+AJBWSg3PEjf2Jy/TZvDnZ5Oj9oOzDq9PUfribHn5fF9PWt1bXdvHc2s qT28o5RTRsGRge4I2Ob2MgRYfKcmOUJGMhRHRVwsHYq7FXYq7FXYq7FXYq8o/O/8kLHzzYtqmlql t5ptkpFKaKl0ijaGY/zfyP26Hboq+dfyo/KDU/NnnWfSdXil0/T9GbnrzOCjpxagg3+y8nE79gCe 2Amtyy58n0hfa5bWVnHonluFNN0W0HpwpbjhyA6nbcA/ee+cN2r27PLIwxHhh39T+x6bQ9lxgOKY uX3JD1znHbto7IwZCVZTVWBoQfY4RIg2OakXzZr5U85zGZLDU35hyFhuW+0GPRXPevjnWdj9uyMh izG75S/X+t0PaHZgozxj3j9TOc7B552KuxV2KuxV2KuxV2KuxV2KuxV2KuxVBa5/xxdQ/wCYab/k 2crzfRL3Fv0v97H+sPvfGuc8+3OxV2Ko/TvMGvaahTTtSurJG3ZbeeSIE+4RlyUZmPI04+bR4cpu cIy94B+9Gf4486/9TBqX/SZP/wA15Pxp/wA4/Np/kvS/6lj/ANJH9Tv8cedf+pg1L/pMn/5rx8af 84/Nf5L0v+pY/wDSR/U7/HHnX/qYNS/6TJ/+a8fGn/OPzX+S9L/qWP8A0kf1O/xx51/6mDUv+kyf /mvHxp/zj81/kvS/6lj/ANJH9Tv8cedf+pg1L/pMn/5rx8af84/Nf5L0v+pY/wDSR/U7/HHnX/qY NS/6TJ/+a8fGn/OPzX+S9L/qWP8A0kf1O/xx51/6mDUv+kyf/mvHxp/zj81/kvS/6lj/ANJH9T0L 8j9a8zav5wkW/wBWvbu1trSSVoZ7iaSMsWSNaqzFSfjJGZWjnKWTcl5v2p02DDphwQhGUpAWIgHq f0Pes2z54xfztJb6fpdxJbxJFd6m6RXEyKFd1RTu5G7UUcd+2aL2h1Jx6ehzma+HX9TtOycInms/ w7vOM8/erdirsVdir1vyxqDX+h2txIeUvHhIT1LIeNT86Vz0zsrUnNp4yPPkfhs8Zr8Ix5pRHL9a aZsXDdirsVdirsVdirsVdirsVdirsVdiqG1SCSfTLuCMVklhkRB/lMhAyGQXEgdzbgkI5Ik8gQ+M nR0dkdSrqSGUihBGxBBznX3AEEWGsVdirsVdirsVdirsVdirsVdir1X/AJx2njXzZqEJNHksWZOl DwljqPn8WZug/vPh+p5H2xiTpoHun+gvoLNw+cMR/MeJ2021lAqqTEN7clNP1ZzPtRAnDE90v0O6 7EkPEkPJ59nEPSuxV2KuxV6h5FhePy7CW29R3dflyp/DPQ/Z+BjpY31JP2vJdrSBznypP83TrXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXkX5jfki+rahNrHl2SOG6uGL3VlKSqO53Z42APEseoO1d65rd RoiTxR+T2fY3tQMMBizgmI5SHd3F54/5LfmUrEDSAwHRhc21D98oOYv5PL3fc9IPabQ/6p/sZf8A Erf+VL/mX/1Z/wDp5tf+quP5PL3fcn/RNoP9U/2M/wDiXf8AKl/zL/6s/wD082v/AFVx/J5e77l/ 0TaD/VP9jP8A4l3/ACpf8y/+rP8A9PNr/wBVcfyeXu+5f9E2g/1T/Yz/AOJd/wAqX/Mv/qz/APTz a/8AVXH8nl7vuX/RNoP9U/2M/wDiXf8AKl/zL/6s/wD082v/AFVx/J5e77l/0TaD/VP9jP8A4l3/ ACpf8y/+rP8A9PNr/wBVcfyeXu+5f9E2g/1T/Yz/AOJd/wAqX/Mv/qz/APTza/8AVXH8nl7vuX/R NoP9U/2M/wDiXf8AKl/zL/6s/wD082v/AFVx/J5e77l/0TaD/VP9jP8A4l3/ACpf8y/+rP8A9PNr /wBVcfyeXu+5f9E2g/1T/Yz/AOJZT+Wf5efmF5d842Wo3elenY/HFdv69s1I5FIrRZSxo1DsMuwa fJCYNfc6ntztjRanSyhGdz2I9MuY+D3nNs+eoPWNNi1LTprOQ0Eg+Fv5WG6n78xdbpRnxSxnr97f ps5xZBMdHkd7ZXNldSW1yhSaM0YfxHiDnmWowTxTMJipB7TFljkiJR5FQylsdiqO0bSLrVb1LaAb HeWTsid2OZmh0U9RkEI/E9wcfU6mOGHFL+167bW8Vtbx28I4xRKEQeyimem4sUccRGPICni8kzOR keZVMsYOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KpdrG gabq0QW6j/eKKRzJs6/I+Hscwdb2di1IqY36HqHK02syYT6Tt3dGJXP5b3gY/VbuN17eqGQ/8Lzz mcvsvkB9Ewfft+t3OPtuH8UT8PwFSz/LaYuDeXihB1WEEk/7JqU+7J4PZeV/vJ7eX7f1McvbYr0R +bL9M0mw0y39CziEa9XbqzHxY986fS6PHgjw4xX6fe6XPqJ5ZXIovMpodirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVU7i5t7aFpriVIYUpykkYKoqaCrGg6nFVO01HT7zn9 Tuobn06c/RkWTjWtK8SaVpiqIxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux Vjn5heSbPzr5WufL15cSWsNy0TmeEKWBikEg2bbfjTFXxj5h/LiLTPzbHkKG/Z4pdQtLGPUHiHJV vPTIZowwDFBN/MOVO1cWT13/AKE1/wC/v/7l3/Z1ii2N+ZtG/Nj8jb+x1Cx1xtR0GZ/QiBMhtmKg kQzWzsyoWQErwbxo2KvpvyL5tsvN3lPTvMNovpx30XJ4SamOVSUljJ78XUivfrihPcVdirsVYt+Z vnm38keTb7X5IxPNCFjtLcmgknkPFFJH7I+03sDir528kfln52/Oh5vNXmzXpoNK9Z47ZQDIWZft LbxFhHDGpNK03NdupxSiPzC/5x31XyHo7ebPKOuXE0ml0lulP7i4jjB3likjIrx25LTpvXtitvWv +cfvzOvPPPlKUaowfW9JdYL2VQF9VHUmKYgdGbiwbtUVHhih6hirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdir5B88f+tV23/bc0f9Vtil9fYoeIf85Ya/pVt5Cg0WSVW1O/u4pb e3BBcRQ8i8pHZa/DXxPzxSGRf8446Rf6Z+U2lLexmKS7ea7ijbYiKaQmM/7JaMPY4oVPzo/OWx/L zTYYoIVvfMF8paytHJEaIpoZpuJB412ABqx7ihOKvLrGz/5yu8z2S65FqB0+C5HO2tGaC1YxndSs QSqg1oPUPI99qHFKa/lp+fPm6184r5J/MmBYdQklFvHfFEhkSd6emkqx0iZJK/C6AdR1BqFXrf5j flzovn7RYNH1i4ure1guVu1azeNHMiI8YDGSOUcaSHtihMfJvlPTPKXluy8vaW0j2ViHETzlWkb1 JGkYuUVFJLOei4qkn5y+YLDQ/wAsvMNzeMtLmzmsreNv92TXUZiRad/tVPsDiryz/nD7Q7yDR/MO tSqVtb6a3traooGNsJGkYeI/fgV8a4pLOvzr/Oe0/L3Tobe0iS88xXylrO2kr6ccYJHrS8aEryFA oI5eO2KHmOm2v/OVvmqzTW4tROnW10OdrA7W9rWJviUrEqFgu+xf4iPvxSjPJn5+ed/LXmtfKf5q W/pszLGdRKRxywlz8Dv6P7mWI7Dmnzq2Kvo8EEVG4OKHYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq+LvzfsdSv/APnIe9sdLuPqmp3eoafBY3XN4/SnkhgWKTmgLrxcg8lFR2xSGe/8qS/5 yR/6n7/ubap/1SxW3nOueVPMX5bedLHUvzA0mPzLZzNyWV7iWSKf06DaU8W5pseEq0I7UxV9keWt e0vX9AsdZ0puen3sSy2+3EgdCpHYqQVI8Rih8c/m15oT/leuoapqVt+krPSb6KMWBf01kis+I9Lk Veisynl8J6nFIeif9Dlf9+h/3Mf+zXFaeS/mv+Z6efPMtpr9vpf6GurWBIG4T+uztG7OknMRw0K8 qdMU0+6LGV5rK3mf7ckaO1PFlBOLFZqWpWGmWFxqGoTpa2VqhluLiQ0VEUVJJxV8p69qnmT8/PzC i0rSRJaeVNMYsJHHwxRE0a4lHQyyUoiV/wCNjil9SeXfL+l+XtEs9F0qL0bCxjEUKVqaDcsx7sx3 J8cUPlbzFEnm/wD5yiGn6gPVs49RjtvRP2fRso+TJv2YxsT8zino+ugABQbAYofPH/OYOh2raNoO uhALuK4exeQdWjkQyqp/1WjanzOKQ9U/JrV7jV/yu8uX1y5kna0WGSRtyxt2MNSe5Pp74oZnirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdir5B88f+tV23/bc0f9Vtil9fYoeO/wDOVVvFL+Vh keMM8F/bvG5G6kh0JH0NTFQi/wDnGGR3/KPT1ZiwjubpVBPQesWoPpauKl4x+YDS+Rf+cj0129Sl hJfQ6isgBAa3nAWZhtuUPMfMYpfXVtc291bxXNtIs1vMiyQyoQysjCqspHUEYoWzXtnBNBBNPHFN dMUtondVaVlUuyxqTViFUsQO2Kr5poYIXmmdYoYlLySOQqqqipZidgAOpxV8tfmD5z8xfnP5yh8k +TuS+XLeTnPcmojl4GjXU5G4iT/da9z7kUUvoTyB5B0LyR5eh0bSY9hR7u6YD1bialGkc/qHQDbF CT+Xfzm8ra/57v8AyXZW96uqac9xHNcSxxC3JtH9OTgyys5+LpVBirwHz4zeRP8AnJOLXb5CunT3 kOoLKARW3uF9OZh48GL/AHYpfW8E8M8Mc8DrLDKoeKRCGVlYVVlI6gjFD5w/5y98z2bxaJ5Xhf1L xJGv7qNTXgvExQhh4tyc/wC3ikPZ/wAqNBudB/Lny/pV0np3MFojTx91klJldT7qz0OKGV4q7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWO/mBpvm/UvK91Z+Ub+LTNclaP0LyckIqBwZBURzEEp UCi4q+fLv/nGz86LzzCPMVz5g0qXW1ljuFvzPc+oJYePpvta0qvBafLFNvdfyw0X8wdI0Ke188at Bq+om4Z7a4gJYLAUWiMzRQEnmGPQ/PFCYefvJtj5y8p3/l68cwx3ij051HIxyxsHjcCorRlFRXcb Yq83/Jj8pvzM8h63JDf63aXPlRlmP6PgeVmMz8QkvCSFVQ0Tfi/34pLMvzS/KjQPzC0hLW+Y2mo2 3I2GpxqGeIt1VlJXmjU3Wo9iMUPHLH8n/wDnIzyxEdM8u+ZIm0tSWhWO5ZUUEnYRzRnge5C7e+KU 98mfkB54l81WXmvz35okudQspVuLaG2mkmkDAhwrTShVjUNUNGiFSNgaYq9I/N/yhr/m/wAj3Wg6 HdxWd5dSRc5J5JIo2iVqujGJZGIbw40xQ8N0b/nGz87tE9X9C+aLPTPXp631O/v7fnx6cvTgWtK9 8U2mX/Kkv+ckf+p+/wC5tqn/AFSxW07/ACd/Inzx5P8APj+ZNe1GxvUlgnSZoJriWd5ZiGLsZYY6 1IJJLVxUvQvzT/KjQfzC0hLW9Y2mo2tTp+pRqGeIt1VlJXnG1N1qPYjFDx6z/KL/AJyQ8tw/ovQP Mkb6VGSbcR3TBVUkgAJNHWPbcqvw+5xSyL8t/wDnG2ew15fM/nvUl1vV0k9eO2VpJozMDUSTzTAP Kw2NKAV7sMVt7tih2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV/9k= + + + + uuid:7dd61376-8c6f-450a-9f69-c8a57574fb6a + xmp.did:4c59e44d-b8fe-434e-932a-e9576b892027 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + xmp.iid:2fe69120-97d9-2a4d-a769-0a8b78a1c96b + xmp.did:2fe69120-97d9-2a4d-a769-0a8b78a1c96b + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:3ada2a4e-e16a-6442-b91d-4d4951a1ab85 + 2018-06-22T15:33:35+02:00 + Adobe Illustrator CC 22.0 (Windows) + / + + + saved + xmp.iid:4c59e44d-b8fe-434e-932a-e9576b892027 + 2018-06-22T15:34:37+02:00 + Adobe Illustrator CC 22.0 (Windows) + / + + + + Print + Document + False + False + 1 + + 297.000000 + 210.000000 + Millimeters + + + + + RobotoSlab-Regular + Roboto Slab + Regular + TrueType + Version 1.100263; 2013; ttfautohint (v0.94.20-1c74) -l 8 -r 12 -G 200 -x 14 -w "" -W + False + RobotoSlab-Regular.ttf + + + + + + Cyan + Magenta + Yellow + Black + + + + + + Groupe de nuances par défaut + 0 + + + + Blanc + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + Noir + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + Rouge CMJN + CMYK + PROCESS + 0.000000 + 100.000000 + 100.000000 + 0.000000 + + + Jaune CMJN + CMYK + PROCESS + 0.000000 + 0.000000 + 100.000000 + 0.000000 + + + Vert CMJN + CMYK + PROCESS + 100.000000 + 0.000000 + 100.000000 + 0.000000 + + + Cyan CMJN + CMYK + PROCESS + 100.000000 + 0.000000 + 0.000000 + 0.000000 + + + Bleu CMJN + CMYK + PROCESS + 100.000000 + 100.000000 + 0.000000 + 0.000000 + + + Magenta CMJN + CMYK + PROCESS + 0.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=15 M=100 J=90 N=10 + CMYK + PROCESS + 15.000000 + 100.000000 + 90.000000 + 10.000000 + + + C=0 M=90 J=85 N=0 + CMYK + PROCESS + 0.000000 + 90.000000 + 85.000000 + 0.000000 + + + C=0 M=80 J=95 N=0 + CMYK + PROCESS + 0.000000 + 80.000000 + 95.000000 + 0.000000 + + + C=0 M=50 J=100 N=0 + CMYK + PROCESS + 0.000000 + 50.000000 + 100.000000 + 0.000000 + + + C=0 M=35 J=85 N=0 + CMYK + PROCESS + 0.000000 + 35.000000 + 85.000000 + 0.000000 + + + C=5 M=0 J=90 N=0 + CMYK + PROCESS + 5.000000 + 0.000000 + 90.000000 + 0.000000 + + + C=20 M=0 J=100 N=0 + CMYK + PROCESS + 20.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=50 M=0 J=100 N=0 + CMYK + PROCESS + 50.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=75 M=0 J=100 N=0 + CMYK + PROCESS + 75.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=85 M=10 J=100 N=10 + CMYK + PROCESS + 85.000000 + 10.000000 + 100.000000 + 10.000000 + + + C=90 M=30 J=95 N=30 + CMYK + PROCESS + 90.000000 + 30.000000 + 95.000000 + 30.000000 + + + C=75 M=0 J=75 N=0 + CMYK + PROCESS + 75.000000 + 0.000000 + 75.000000 + 0.000000 + + + C=80 M=10 J=45 N=0 + CMYK + PROCESS + 80.000000 + 10.000000 + 45.000000 + 0.000000 + + + C=70 M=15 J=0 N=0 + CMYK + PROCESS + 70.000000 + 15.000000 + 0.000000 + 0.000000 + + + C=85 M=50 J=0 N=0 + CMYK + PROCESS + 85.000000 + 50.000000 + 0.000000 + 0.000000 + + + C=100 M=95 J=5 N=0 + CMYK + PROCESS + 100.000000 + 95.000000 + 5.000000 + 0.000000 + + + C=100 M=100 J=25 N=25 + CMYK + PROCESS + 100.000000 + 100.000000 + 25.000000 + 25.000000 + + + C=75 M=100 J=0 N=0 + CMYK + PROCESS + 75.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=50 M=100 J=0 N=0 + CMYK + PROCESS + 50.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=35 M=100 J=35 N=10 + CMYK + PROCESS + 35.000000 + 100.000000 + 35.000000 + 10.000000 + + + C=10 M=100 J=50 N=0 + CMYK + PROCESS + 10.000000 + 100.000000 + 50.000000 + 0.000000 + + + C=0 M=95 J=20 N=0 + CMYK + PROCESS + 0.000000 + 95.000000 + 20.000000 + 0.000000 + + + C=25 M=25 J=40 N=0 + CMYK + PROCESS + 25.000000 + 25.000000 + 40.000000 + 0.000000 + + + C=40 M=45 J=50 N=5 + CMYK + PROCESS + 40.000000 + 45.000000 + 50.000000 + 5.000000 + + + C=50 M=50 J=60 N=25 + CMYK + PROCESS + 50.000000 + 50.000000 + 60.000000 + 25.000000 + + + C=55 M=60 J=65 N=40 + CMYK + PROCESS + 55.000000 + 60.000000 + 65.000000 + 40.000000 + + + C=25 M=40 J=65 N=0 + CMYK + PROCESS + 25.000000 + 40.000000 + 65.000000 + 0.000000 + + + C=30 M=50 J=75 N=10 + CMYK + PROCESS + 30.000000 + 50.000000 + 75.000000 + 10.000000 + + + C=35 M=60 J=80 N=25 + CMYK + PROCESS + 35.000000 + 60.000000 + 80.000000 + 25.000000 + + + C=40 M=65 J=90 N=35 + CMYK + PROCESS + 40.000000 + 65.000000 + 90.000000 + 35.000000 + + + C=40 M=70 J=100 N=50 + CMYK + PROCESS + 40.000000 + 70.000000 + 100.000000 + 50.000000 + + + C=50 M=70 J=80 N=70 + CMYK + PROCESS + 50.000000 + 70.000000 + 80.000000 + 70.000000 + + + + + + Gris + 1 + + + + C=0 M=0 J=0 N=100 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + C=0 M=0 J=0 N=90 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 89.999400 + + + C=0 M=0 J=0 N=80 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 79.998800 + + + C=0 M=0 J=0 N=70 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 69.999700 + + + C=0 M=0 J=0 N=60 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 59.999100 + + + C=0 M=0 J=0 N=50 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 50.000000 + + + C=0 M=0 J=0 N=40 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 39.999400 + + + C=0 M=0 J=0 N=30 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 29.998800 + + + C=0 M=0 J=0 N=20 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 19.999700 + + + C=0 M=0 J=0 N=10 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 9.999100 + + + C=0 M=0 J=0 N=5 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 4.998800 + + + + + + Couleurs vives + 1 + + + + C=0 M=100 J=100 N=0 + CMYK + PROCESS + 0.000000 + 100.000000 + 100.000000 + 0.000000 + + + C=0 M=75 J=100 N=0 + CMYK + PROCESS + 0.000000 + 75.000000 + 100.000000 + 0.000000 + + + C=0 M=10 J=95 N=0 + CMYK + PROCESS + 0.000000 + 10.000000 + 95.000000 + 0.000000 + + + C=85 M=10 J=100 N=0 + CMYK + PROCESS + 85.000000 + 10.000000 + 100.000000 + 0.000000 + + + C=100 M=90 J=0 N=0 + CMYK + PROCESS + 100.000000 + 90.000000 + 0.000000 + 0.000000 + + + C=60 M=90 J=0 N=0 + CMYK + PROCESS + 60.000000 + 90.000000 + 0.003100 + 0.003100 + + + + + + + Adobe PDF library 15.00 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 12 0 R/TrimBox[0.0 0.0 841.89 595.276]/Type/Page>> endobj 9 0 obj <>stream +HWˎD+z @r%>` (TuAnW:|{sݫoy"Us>ܾm?_1 λݷo׌ebMJmӶG~x1-qq; R5QD>Q #I>diRZJ1WL߰quFAg%!sHdD;\.3}>եAJt)X$x}ꯡNw~URT$e*|:']cR ,GX 2'5fݾFi!>ޙg0^a'RQH@"$\ԘӐ + UIZTfe%XW7aطP)ݰs킏kB`OۇDUU|W @,p2B5g|6&D, >Nˮ$Q\(n$xHf (5 KP5%!w O|i.<*0qS/4K٨ZNs1?/J=4TgARI~] O(dJ2!d+cr +X-ɪd :,D`qejs=*#=wCjesY?VMkm:M`5Zss +[&#M2]7c#3 [r$R2ұ 卆d9)5SP 3Z}fͮ ,9U)XħyQG +NBb֥vH:wתGwp}i Px(EJ:CZQڀ`![ȕ(m!M5"ɊJ/ h"\FW%vş1>stream +8;Z]!0b/gi$q54S[To+Im(EL"VCZ9Cm-E/EOqQ9<;Un"=q@;HA#U+m! +0P`i_OJ3e?^#lDNYs=n,X4N/8VB4-6/r3&uY5!B2Ak>.*123%^StO,K5Xf3dOXVF! +(.)OlnJnBgqunRE;)_]NAa9[YMshOp:aE:dCE]+[L:+bUC.j=pY"Jh.W~> +endstream endobj 13 0 obj [/Indexed/DeviceRGB 255 14 0 R] endobj 14 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 6 0 obj <> endobj 15 0 obj [/View/Design] endobj 16 0 obj <>>> endobj 5 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <>stream +Hytǿ7! !{ Y IBaOkTfLv %RAō=V*C[N[sPDZI["v;}|g{7yM5S^Ԟ3zow.m(.Xh]N }[PS1iO-޽q MUO9ħi;qk{29n^鼦׀_꽋WC?2xkfRP Kcy A/W5ӦmBۛ!= .f_"X%vݰdrwN@N2yqv5v"C'_?_/PUD QF7H@OBo$}uv.IHF +Ritd` 2l ` P C##(>1(D-vsNTO0@ =E+˱6VZ&2xQGNǘ&Zt,RUSS-:SsԀ4R#].BdbfapwmtpwnN\ +Eų[Apݕe:r /EEɔJ4fR -崍ZG(+4=k>CHDB$BIlm">w䨜S&dB3ŔyfYgL G#I1ε΋獾0+rZn+ʶXyVU`5Z˭׬׭.+rR\R7hwoӝ.sW%{LW p={nآ!{HO1*U=}񦞇;ys]?7s}J>ݴTT-n6uKԶ5޺uQkCk}55#tv{:s4>R?*}5_JX;:TV^uZſ߻޻Rf5QXNQ;9C4_WrXJHeW+VɲVie)ʪ$zUM,NR.t\'zt\3\\U؄gkgluz_mz󸁟6x%⵼D)q[x7异W?[x;]6[!A oJ`J|%?J$~%#' =qPzK"I/&.7i&Ih I?HNISe ?IdI 2DCa>_e8 Mrw\$y22Jhd A8/x2C +ɐLL8)TH3ń0P4@e@TZTJ\ʢllBB\!4Q \*פVfh#<)h$(ch41lDf4D(OLw.7=L"Y(e4Ӳ +itI@6z&)Ϟ3&x!۷iI.zӨ A=Mx;p>hy$paC* *i>SXRJl.|EE.XO˵k +VͰB˗mWjkB˴DzڵSXx}HxPT\ qqLWPTsus9v؆8unڤ !|{<+v5FitZ붴inR S7ҦIS5! +_'nLچs#aD>_RTPi蛳r h1 >3h.(ՉT7&08ٛ /E?*V`XHPICW`D:S!NAźRQ;g^ #[ )+chv:(݋&)o ̬]AUhJUHRh pTES3T3)=TDɢZUT%Չyׇ +[_jfZȖX>IH~G17A$ +K`]ma&7?OpIbq >/Yn)Ži{ +"JBo2F"TTԮ/C@PM5d$Yd$+$]fAmf$=ft3[Hr +*=oLMr&9}7I&YId4[XДeۭTu;,߯n3Ŀ*qz2oPh0t??`-v4=l }D;lsaT&L n *Y\Adۯ81Lzi&7s^ݸC*KMQLpm=zZm(AEW@W)Gs]ӽ:*]'a6]M?l(Jo˭q6.C#6N GaByS} E(:m}M^7cͶZ`z̈}*<;}W!=45d8ZoA#_Am2њ(k&`ozҏNu;uRr1P Mh im1`C 1Q@176鰎ߚ6po>px$(,;(K1x-\3 +9*B K`*8b(,MVO=QI},](@A #7G[8,#!8JXE=!8@/qZt XGC AI,DOC`#q|TMe~j>M6jEm8Hy=@=h#boQj$K4[mDm6"vSLRwQl#2`j{8*@5tt2+-5>x/p^i5&e=ƴzge[5Q_MnW<4O~KG/\N=vlbNx{oer%5al^^@ҙb̪S$Zd6޼` ^~*XJYA`ߨNwA 9,rU=QSBA=._Kky}Ksy++{7x"y2wydvG~չSVq{47zxZ<]=-_ՂmڻgeՓ/_xK :vD8qnGbQ_#*`1+).gu&swݽr/xQ^~X_?>w987ы6@q}1|Uh3;8@< wc:ο i;p I~s{+C@~ZeR`)<}6{ ?$o7yd3C +[8 +b/48^E,t " _b 8ҋpϑmockg-ӮIG;lԆavp߁˵vحuv6I'+Wa+7`\s][]xq +_'U\Eu={Gb"&@BNnB 7UHaĂH^SaQqc[; 3mGˌő +T +{nz?rwsv9>SBYQh5(UQhpk!bZYz_g0>qN?hwٻ3v9>h4ɦ睷,ǸǼ;F+ +s 7_F=auh4^E8oYϭo1:m'u18\sHMwƠD`5:0f~u܂N5 j34M2uوu(ҭ㨵 ^壎d}}} KoN9谧141g1&vaj=81͵bs xs1ƫ} 9\g +>]?P㻿e,D=6[o7bz4מ"{(yP̵;8vV8^FaA-CigU8y`hwE#r:GC2,AmSc60'sB1X݌Lk/\G#sv2'}4:oc}ߒoܟ]BcuOx1kO1ZZ +,6-k%j51 jwTYG3Ru9*a1..'Qq,mE_eb/4>@.,.d\ #y&><|BPg|}|oאJ F_?HH=Oǘ\I>$^wm56k Zm?#.&.lA5\ ?6ضx|!,[xx3X +Q{ԓRoVWTTC-Mc&FwO2wWy:-~ӵqw']C{xMMԁRW)_5zziH-M]KeɜxL֐RG(NdOL"u"{/ܗ|W-\ZDUh ]{E4>NSm8{)\T="Ps?&jk#9'Yۣ5NhrZp+x :!?\%GLj]}pf-]`R|1gz6PJ9؃ I"(N#G{=&D|-cUh%ǵˉƹ}%W[0`y4zH{6ϰp<-1{ fl_W nh E9KɅ7Z*yacKsJgd|=2uqM$\0ID`p ꒫#ɫ uLij:%F˚ =H%n$fSt]a꜐@| +7=|uT>3>yN~3:ُӞ8uĵfW\F\}Ww]}Ww\0u9KΦ< +%w[_Pݲ0x[=o;lm#' 42xoo[`|o+KY蒎HG$\m[6ԇ'de--*w:ZFIB;>`"˰ +endstream endobj 11 0 obj <> endobj 10 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 17.0 +%%AI8_CreatorVersion: 22.0.1 +%%For: (Gwena\753l LE HIR) () +%%Title: (logo Re2o.pdf) +%%CreationDate: 6/22/2018 3:34 PM +%%Canvassize: 16383 +%%BoundingBox: 263 -429 551 -164 +%%HiResBoundingBox: 263.856947902714 -428.016690471995 550.412066012963 -164.258911847263 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%AI5_FileFormat 13.0 +%AI12_BuildNumber: 249 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%CMYKProcessColor: 1 1 1 1 ([Repérage]) +%AI3_Cropmarks: 0 -595.2755905512 841.8897637795 0 +%AI3_TemplateBox: 421.5 -298.5 421.5 -298.5 +%AI3_TileBox: -0.000003364156328 -595.275582140836 841.919979546001 0.044425183384192 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 1 +%AI9_ColorModel: 2 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI17_Begin_Content_if_version_gt:17 1 +%AI9_OpenToView: -60 16 1.46 1420 902 18 0 0 116 123 0 0 0 1 1 0 1 1 0 0 +%AI17_Alternate_Content +%AI9_OpenToView: -60 16 1.46 1420 902 18 0 0 116 123 0 0 0 1 1 0 1 1 0 0 +%AI17_End_Versioned_Content +%AI5_OpenViewLayers: 7 +%%PageOrigin:115 -694 +%AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MO +%%EndComments + +endstream endobj 21 0 obj <>stream +%%BoundingBox: 263 -429 551 -164 +%%HiResBoundingBox: 263.856947902714 -428.016690471995 550.412066012963 -164.258911847263 +%AI7_Thumbnail: 128 120 8 +%%BeginData: 11839 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C45FDA2FFCAC9C8C9C8C9CAFD78FFC8C7C0C1C0C1C0C1C2CFFD74FFCA +%C0C19EC1C0C19EC1C0C19EC9FD72FFCFC1C1C0C7C0C1C0C7C0C1C0C7C1C9 +%FD70FFCF9EC1C0C19EC1C0C19EC1C0C19EC1C0C9FD08FF93B593B593B593 +%B593B593B593B593B593B593B593B593B593B593B593B593B593B593B593 +%B593B593B593BBA0FD3AFFC2C1C0C7C0C1C0C7C0C1C0C7C0C1C0C1C1FD08 +%FFC28CB5B0B58CB5B0B58CB5B0B58CB5B0B58CB5B0B58CB5B0B58CB5B0B5 +%8CB5B0B58CB5B0B58CB5B0B58CB5B0B5BBFD38FFC9C1C0C19EC1C0C19EC1 +%C0C19EC1C0C19EC1C9FD07FFC3B58CB58CB58CB58CB58CB58CB58CB58CB5 +%8CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB599FD +%37FFC9C1C1C0C7C0C1C0C7C0C1C0C7C0C1C0C7C1C8FD07FFCA8DB5B5B58D +%B5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5 +%B58DB5B5B58DB5B5B58DB5C9FD36FFC1C1C0C19EC1C0C19EC1C0C19EC1C0 +%C19EC1C0FD07FFCAB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58C +%B58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CC2FD36FFC8C0 +%C7C0C1C0C7C0C1C0C7C0C1C0C7C0C1C0C7CFFD07FFB5B58CB5B5B58CB5B5 +%B58CB5B5B58CB5B5B58CB5B5B58CB5B5B58CB5B5B58CB5B5B58CB5B5B58C +%B5B5B58CB5B5B5BCFD36FFC1C19EC1C0C19EC1C0C19EC1C0C19EC1C0C19E +%CFFD06FFCAB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB5 +%8CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CC2FD36FFC8C0C7C0C1 +%C0C7C0C1C0C7C0C1C0C7C0C1C0C7CFFD07FFB5B58DB5B5B58DB5B5B58DB5 +%B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B5 +%8DB5B5B5BCFD36FFC8C19EC1C0C19EC1C0C19EC1C0C19EC1C0C1C1FD07FF +%C9B58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB5 +%8CB58CB58CB58CB58CB58CB58CB58CB58CC2FD36FFCFC0C1C0C7C0C1C0C7 +%C0C1C0C7C0C1C0C7C0C9FD07FFC98CB5B0B58CB5B0B58CB5B0B58CB5B0B5 +%8CB5B0B58CB5B0B58CB5B0B58CB5B0B58CB5B5B58CB5B5B58CB5B5B58CB5 +%BCFD37FFC7C0C19EC1C0C19EC1C0C19EC1C0C19EC1CAFFA8FD05FFC3BC99 +%C29AC299C29AC299C29AC299C29AC299C29AC299C29AC299C29AC299C299 +%B58CB58CB58CB58CB58CB58CB58CC2FD37FFCAC1C0C7C0C1C0C7C0C1C0C7 +%C0C1C0C1C9FF527DFD27FFC9B5B58DB5B5B58DB5B5B58DB5C2FD38FFC9C1 +%9EC1C0C19EC1C0C19EC1C0C1C2FF7D27F87DFD27FFCA8CB58CB58CB58CB5 +%8CB58CC2FD39FFC9C1C0C1C0C1C0C7C0C1C0C1C8FFA8272727F87DFD27FF +%C9B0B58CB5B5B58CB5B5B5BCFD3AFFC9C89EC1C0C19EC1C0C1C9FFA827F8 +%27F827F87DFD26FFCAB58CB58CB58CB58CB58CC2FD3CFFCFC9C8C1C8C8CF +%FFFF7D27202727272027277DFD26FFBBB58DB5B5B58DB5B5B5BCFD44FF52 +%27F827F827F827F827F87DFD25FFBC8CB58CB58CB58CB58CC2FD45FFFD04 +%27F8272727F827277DFD24FFBBB5B5B58CB5B5B58CB5BCFD46FF2727F827 +%F827F827F827F87DFD23FFBC8CB58CB58CB58CB58CC2FD47FF2727202727 +%272027272720A8FD22FFBBB5B5B58DB5B5B58DB5C2FD48FF2727F827F827 +%F827F827F87DFD21FFBC8CB58CB58CB58CB58CC2FD49FF2727F8272727F8 +%272727F8A8FD20FFBBB58CB5B5B58CB5B5B5BCFD3AFFCAFD0FFF2727F827 +%F827F827F827F87DFD04FFCACAA7CACAFD16FFBC8CB58CB58CB58CB58CC2 +%FD39FFC9B5BBC3C3CACACAC9C3BCFD07FFFD042720272727202752FFCAC9 +%BBBB93BB93BB99C3CAFD13FFBBB58DB5B5B58DB5B5B5BCFD39FFCA8CB58C +%B58CB58CB58CB5CAFD06FFA82727F827F827F8277DFFA0BB92B592BB92BB +%92B592BB99CAFD11FFBC8CB58CB58CB58CB58CC2FD39FFC9B5B0B58CB5B0 +%B58CB5B5CFFD07FFAFFD0427F827A8CA99B593BB92BB93BB92BB93BB92BB +%99C9FD10FFBBB5B5B58CB5B5B58CB5BCFD39FFC98CB58CB58CB58CB58CB5 +%CAFD08FFA8F827F8277DCA92B592BB92BB92BB92BB92BB92BB92BB92C3FD +%0FFFBC8CB58CB58CB58CB58CC2FD39FFC9B5B5B58DB5B5B58DB5B5CFFD0A +%FF27277DFFBBBB93BB93BB93BB93BB93BB93BB93BBBBBB93CAFD0EFFBBB5 +%B5B58DB5B5B58DB5C2FD39FFC98CB58CB58CB58CB58CB5CAFD0AFFA852FF +%99B592BB92BB92BB92BB92BB92BB92BB92BB92B592CFFD0DFFBC8CB58CB5 +%8CB58CB58CC2FD39FFC9B58CB5B5B58CB5B5B58CCFFD0CFFC3B592BB93BB +%92BB93BB92BB93BB92BB93BB92BB93B599FD0DFFBBB58CB5B5B58CB5B5B5 +%BCFD39FFCA8CB58CB58CB58CB58CB5A7FD0BFFCABB92BB92BB92BB92BB92 +%BB92BB92BB92BB92BB92BB92B5A7FD0CFFBC8CB58CB58CB58CB58CC2FD39 +%FFC9B58DB5B5B58DB5B5B593CFFD0BFFCA93BB93BB93BB93BB93BB93BB93 +%BB93BB93BB93BB93BB93C3FD0CFFBBB58DB5B5B58DB5B5B5BCFD39FFCA8C +%B58CB58CB58CB58CB5CAFD0BFF9AB592BB92BB92BB92BB92BB92BB92BB92 +%BB92BB92BB92B599FD0CFFBC8CB58CB58CB58CB58CC2FD39FFC9B5B0B58C +%B5B5B58CB5B5CFFD0BFFBC92BB93BB92BB93BB92BB93BB92BB93BB92BB93 +%BB92BB93BBCAFD0BFFBBB5B5B58CB5B5B58CB5BCFD39FFC98CB58CB58CB5 +%8CB58CB5CAFD0BFF93B592BB92BB92BB92BB92BB92BB92BB92BB92BB92BB +%92BB92CAFD0BFFBC8CB58CB58CB58CB58CC2FD39FFC9B5B5B58DB5B5B58D +%B5B5CFFD0BFFBB93BB93BB93BB93BB93BB93BB93BB93BB93BB93BB93BB93 +%BBC9FD0BFFBBB5B5B58DB5B5B58DB5C2FD39FFC98CB58CB58CB58CB58CB5 +%CAFD0BFF93BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92C9 +%FD0BFFBC8CB58CB58CB58CB58CC2FD39FFC9B58CB5B5B58CB5B5B58CCFFD +%0BFFBC93BB92BB93BB92BB93BB92BB93BB92BB93BB92BB93BB92BBCAFD0B +%FFBBB58CB5B5B58CB5B5B5BCFD39FFCA8CB58CB58CB58CB58CB5A7FD0BFF +%99B592BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92B592FD0CFFBC8C +%B58CB58CB58CB58CC2FD39FFC9B58DB5B5B58DB5B5B593CFFD0BFFC993BB +%93BB93BB93BB93BB93BB93BB93BB93BB93BB93BB93C2FD0CFFBBB58DB5B5 +%B58DB5B5B5BCFD39FFCA8CB58CB58CB58CB58CB5CAFD0BFFCABB92BB92BB +%92BB92BB92BB92BB92BB92BB92BB92BB92B5A1FD0CFFBC8CB58CB58CB58C +%B58CC2FD39FFC9B5B0B58CB5B5B58CB5B5CFFD0CFFA0BB93BB92BB93BB92 +%BB93BB92BB93BB92BB93BB92BBBBFD0DFFBBB5B5B58CB5B5B58CB5BCFD39 +%FFC98CB58CB58CB58CB58CB5CAFD0CFFCF92B592BB92BB92BB92BB92BB92 +%BB92BB92BB92BB92C97DA8FD0BFFBC8CB58CB58CB58CB58CC2FD39FFC9B5 +%B5B58DB5B5B58DB5B5CFFD0DFFC993BB93BB93BB93BB93BB93BB93BB93BB +%93BB93C3A82727FD0BFFBBB5B5B58DB5B5B58DB5C2FD39FFC98CB58CB58C +%B58CB58CB5CAFD0EFFC392B592BB92BB92BB92BB92BB92BB92BB92C2FF52 +%F82727FD0AFFBC8CB58CB58CB58CB58CC2FD39FFC9B58CB5B5B58CB5B5B5 +%8CCFFD0FFFC993B592BB93BB92BB93BB92BB93BB92C2FF52F8FD0427FD09 +%FFBBB58CB5B5B58CB5B5B5BCFD39FFCA8CB58CB58CB58CB58CB5A7FD10FF +%CA99B592BB92BB92BB92B592B592C3A852F827F827F82727FD08FFBC8CB5 +%8CB58CB58CB58CC2FD39FFC9B58DB5B5B58DB5B5B593CFFD12FFC3C2BBBB +%93BB93B593C2C2FF7D52272720272727202727FD07FFBCBCC2C9C9C9C2C2 +%BBB5BCFD39FFCA8CB58CB58CB58CB58CB5CAFD14FFCFC3C3A0C3C3CAFFFF +%FF7DF827F827F827F827F82727FD0FFFCACAFD39FFC9B5B0B58CB5B5B58C +%B5B5CFFD1FFF7DF8272727F8272727F82727FD49FFC98CB58CB58CB58CB5 +%8CB5CAFD20FF7DF827F827F827F827F82727FD48FFC9B5B5B58DB5B5B58D +%B5B5CFFD21FF7D27272027272720FD0427FD47FFC98CB58CB58CB58CB58C +%B5CAFD22FF7DF827F827F827F827F82727FD46FFC9B58CB5B5B58CB5B5B5 +%8CCFFD23FF7D2727F8272727F827272728FD45FFCA8CB58CB58CB58CB58C +%B5A8FD24FF7DF827F827F827F827F82727FD44FFC9B58DB5B5B58DB5B5B5 +%93CFFD25FF7D2027272720FD0427A8FFFFC9C9C8C9C9CFFD3CFFCA8CB58C +%B58CB58CB58CB5C3FD26FF7DF827F827F82752FFCAC9C1C19EC1C0C19EC8 +%C9FD3AFFC9B5B0B58CB5B5B58CB5B0C2FD27FF7DF827272752FFCAC7C0C1 +%C0C1C0C7C0C1C0C1C8FD39FFC98CB58CB58CB58CB58CB58CC9FD27FF7DF8 +%2727FFC9C1C0C19EC1C0C19EC1C0C19EC1C2FD38FFC9B5B5B58DB5B5B58D +%FD04B5CAFD27FF7D27A8CFC7C1C1C0C7C0C1C0C7C0C1C0C7C0C1C9FD37FF +%C98CB58CB58CB58CB58CB58CB58CBCC2C3A0C3C2C3A0C3C2C3A0C3C2C3A0 +%C3C2C3A0C3C2C3A0C3C2C3A0C3C2C3A0C3C3FD06FFA8FFC89EC1C0C19EC1 +%C0C19EC1C0C19EC1C0C1CAFD36FFC9B58CB5B5B58CB5B5B58CB5B5B58CB5 +%B0B58CB5B0B58CB5B0B58CB5B0B58CB5B0B58CB5B0B58CB5B0B58CB5B0B5 +%8CBCFD08FFC0C1C0C7C0C1C0C7C0C1C0C7C0C1C0C7C0C9FD36FFCA8CB58C +%B58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58C +%B58CB58CB58CB58CB58CB58CB59AFD07FFC8C1C0C19EC1C0C19EC1C0C19E +%C1C0C19EC1C1FD36FFC9B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5 +%B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DC9FD07FF +%C9C1C1C0C7C0C1C0C7C0C1C0C7C0C1C0C7C0C1CAFD35FFCA8CB58CB58CB5 +%8CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB5 +%8CB58CB58CB58CB58CB5A1FD07FFC1C1C0C19EC1C0C19EC1C0C19EC1C0C1 +%9EC1C0CAFD35FFC9B5B0B58CB5B5B58CB5B5B58CB5B5B58CB5B5B58CB5B5 +%B58CB5B5B58CB5B5B58CB5B5B58CB5B5B58CB5B5B58CB5B0C9FD07FFC8C0 +%C7C0C1C0C7C0C1C0C7C0C1C0C7C0C1C0C1CAFD35FFC98CB58CB58CB58CB5 +%8CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB5 +%8CB58CB58CB58CB5C2FD07FFC2C19EC1C0C19EC1C0C19EC1C0C19EC1C0C1 +%9ECFFD35FFCFB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58D +%B5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5C3FD07FFC9C0C7C0 +%C1C0C7C0C1C0C7C0C1C0C7C0C1C0C7FD37FF9AB58CB58CB58CB58CB58CB5 +%8CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB5 +%8CB58CB599FD07FFCAC19EC1C0C19EC1C0C19EC1C0C19EC1C0C1C2FD38FF +%BBB5B0B58CB5B5B58CB5B5B58CB5B5B58CB5B5B58CB5B5B58CB5B5B58CB5 +%B5B58CB5B5B58CB5B5B58CB5B5B58CBBFD08FFC8C1C0C7C0C1C0C7C0C1C0 +%C7C0C1C0C1C0CFFD39FF9AB58CB58CB58CB58CB58CB58CB58CB58CB58CB5 +%8CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CCAFD07FFCF +%C0C19EC1C0C19EC1C0C19EC1C0C19EC8FD3CFFCAC9CAC9CAC9CAC9CAC9CA +%C9CAC9CAC9CAC9CAC9CAC9CAC9CAC9CAC9CAC9CAC9CAC9CAC9CAC9CAC9CA +%C9CACAFD08FFCFC0C7C1C1C0C7C0C1C0C7C0C1C0C8FD72FFC99EC1C0C19E +%C1C0C19EC1C0C8CFFD73FFCFC2C1C0C1C0C1C0C1C1CEFD77FFC9C9C2C19F +%C8C9FDFCFFFDFCFFFDC7FFA87D527D527D527D527D7DA8A8FD16FFA85252 +%275252A8FD56FFA9F8272727F8272727F8272752A8FD14FF7D2727F82727 +%27F8A8FD56FFA87D27F852FD047D5227F8277DFD12FF7DF82752A8A8A827 +%27F8A8FD57FF27277DFD05FFA8522052FD12FF20277DFD05FF272752FD56 +%FFA827F87DFD06FF7D27F8A8FD10FF7D27F8FD06FF7DF827A8FD56FF2727 +%7DFD06FFA82727A8FD06FFA85252527DA8FD04FF7D2752FD06FF7D27F8FD +%06FFA85252527DA8FD4AFFA827F87DFD06FF7D27F8A8FD04FFA852F827F8 +%27F8277DFFFFFFA8FFA8FD06FF7DF827A8FFFFFFA852F827F827F82752FD +%4AFF27277DFD06FF7D2752FD05FF5227277DA8A8522027A8FD0BFF272752 +%FD04FF5227277DA8A87D20277DFD48FFA827F87DFFFFA8FFA87DF8277DFD +%04FF7DF827A8FD04FF52F852FD0AFF5227F8A8FFFFFF7DF827A8FD04FF7D +%F827A8FD48FF2727274CFD052728A8FD05FF27277DFD05FF7D2727FD09FF +%A827F87DFD04FF272752FD06FF27F87DFD47FFA827F827F827F827F82727 +%7DFD04FF7D27F853FD067DF827A8FD07FFA827F852FD04FF8427F8A8FD06 +%FF522727FD48FF27277DFFA8FFA8FF522720A8FFFFFFA827272027272720 +%27272720FD07FFAF522752FD05FFA82727A8FD06FF7D2052FD47FFA827F8 +%7DFD06FF522727FFFFFF7D27F852527D527D527D527DA8FD06FF52F827A8 +%FD05FF7D27F8A8FD06FF532727FD48FF27277DFD06FFA82727A8FFFFA8F8 +%27A8FD0EFF522727A8FD06FFA8F827A8FD06FF7D2752FD47FFA827F87DFD +%06FF7D27F8A8FFFFA827F87DFD0DFF7DF827A8FD07FFA827F8A8FD06FF27 +%2752FD48FF27277DFD06FFA82727A8FFFFFF272752FD0CFF7D2027A8FD04 +%FFA8277DFFFF272752FD05FFA827277EFD47FFA827F87DFD06FF7D27F8A8 +%FFFFFF7DF8277DFD04FFA952FD04FF84F8277DFD05FF522752FFFF7DF827 +%7DFD04FF52F827A8FD46FF7D7D2727527DA8FD05FF272728A8FFFFFF7DF8 +%27527D7D7D272753FFFFA8F82727522752525228272759FFFFFF7DF82752 +%7D5352272784FD46FFA827F827F827F87DFD05FF7DF82727FD04FF7DF827 +%F827F82752A8FFFF7D27F827F827F827F827F82752FD04FF7DF827F827F8 +%527DFD48FFA8A9FD05A8FD07FFA8FD07FF7D7D7DA8A8FD05FFA8A9A8A8A8 +%AFA8A8A8AFA8FD07FF7D7D7DA8FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFC +%FFFDFCFFFDC2FFFF +%%EndData + +endstream endobj 22 0 obj <>stream +\3ዝӜ·Ќ~. }C<7hgi3)6OC˪.^=IP^? N]&h\ܞOٰJV5褐? UiGSo?Moݬ6J7'%{@k5^fjhQYEY/55;nd枋pQMm#" [udm١fTJӦ W8hZ57E̠\08g چ0f^vrE(hyF%!(?){wvl7㲒8U& C2aӀH\ى%v@{!n*hO*FՁNQՃ!T9bF(YR5, dz'(ye%V`sOzqvRb&W8̸v^R4'곗<* A҈K*JgC?Gu&%%7] .NƝ%#Q/tvmmChbb=I\LG7:d7F?Ů}Cgu U<ڴ7%|4/=>+tFH 4WhnI,:HvjTRijPdO;OkɃ>xôW?( I6DzfzMm$ +I)&ű!+v֝ŞH`]?9D{PٗZ&lţ;,(j߬i*HԎ_cbFrٔj%2_Wa@޶[!4Ā jam5k+ƩO{ 6'>hѮ'^HڪK]r ZT(u'q(!=!(}iM'Pk-g L.T]Q7QX?="+$*JPنY`dĞu/*%]78ᬂܫ!mӍ*[4ƮZ+6b_``}ˑJ^G$Wm^(28]ix3(hҲj +B澛\k +`.aݭaV_6FyX; !9N=ېsEO(;&?)ixRޭPف ֌9iJ,X1SEbyN6bhO>#lyU#xZ1M~H/&r_ S_]j^qqa *4$UzBwN|LgS;뺇pNW?Ig܂i/ ++ ::k8K`AEś)im6 sVbE*/ >PxH' +d91"xbf>8H|K[efr_W]mzHS:Nbwv\C99$r̞QT}М覩SW 1e]s0pg @e9fqDQz4|]_(ć>}+:1p :J0iӁ.>SP?fY 0&wC^4K|IHO,XPb!R`cW4(jM9U2X̊Qmm6aG fՅL9(bIab v'=?b' :^xaFZhیc&p䆝Xln0NhCȌs`f|Q cO,P~rI+h#5-K:RTmEcQǹSmƗ1ic.h١yQ]wJvG yݱ1K/ +.7%##G[KӽE.)U~{b!, 1jX ~aѷL䚝P3=[(j rLDG3亚wAcD)~ z9݅ֆ'N] Ʀi&J:N}>\޵3Q#GuhӽoT:jCg71FE=&oܢO)a$9K|_tY}x[sVEʸ,~{JUM?ZJ=8Dʣ{A pZ9wSٗK JT .YoW]Qr;:_xߝԽـ=37HȡV%\{dˀ )FHܖ꓎}K\:QU/^2 b UiY8 7kӊOrd5lkÖԈ9 @9h7O^TKXVӪ6Lu.wJB'^#&9D&>Lտri{~:`ȝ6}NxEw5ȴq)Rjxd'^Yxm>߃/[RC><{w'VMȻƗjhWd8.z,M;mg)w#1}`ӿLXxYl9Lq3m$Vv=/Ț. +jΒZ;,dصA5>m~dWe92vVIvbb>nx[ 炿5[}yEOvRv\掟/D%dM7X6WGC;s,9^U-xNEȚ聿p*o.4YRf{yWU5 Y醹9&]tk+6|A,_ffVh2 pY2nAT٪=򗌔5L%~d[d9:JZOF44;:S}7ՅI"cUq+f=yo +L҂Z4`sf1֋퀦ic\U׿ȫN+z>lZHUnSV/\Y1j6-1{ޖrh쩞Ƹ*D]uܘ\3ӕ -,y%|Ʉ|}sX'Y+T84Mw*+O]Rhz|#* wbrOQ߼dg.k40ɱ)qs-uۧw{^:tʁ/ȡ N~>Ї鹏i g+^^pr;#>'6E#zEVXHW!BY :]r?A;ƏAyك@уgwO98FU3ԗ<-q}\֏qR`[.dц>o3t285+muVE {a6nxړAB޳%54uQ i)lс_bdXMA3.Џn6oh$z\\rDϿ&21ڧS=ujg/OC~ 0^vH+Ps꒣uB#m&هBՖc8xi:@z?jN8c#&lyRVfFqk\$ 4MG! $oۅ^[9My"6͝aMuFLs (H*X̌dnRaz2jD_Pq,֣C^\:z}OGzБ!+(6ɅG)S8% QKW-{.:ݲjd.鉅KVirKSG.TY}/wQKYhպ4cV+7k^@~:#-z7 r31s&V`ͣmrkNRŪ WlCeL+#VM=7xՉΟ1 t~yN0Ѫ7,m/ +p1u}Dҫ-c,ʗ WhRb%,뉹KZESC:lxݜ.}<}m^~k,;# (頃=geSdtxe€{`ҷG(m9j6ܽQb-τ9}HJްf orhTL*񎋅־s'<|ڜZrC:x<"HĚ^20*feĔE 9wz6*#'O ҋW"攆R@[0SVXV5&kqGkPwftttgA!e.:xŀ瀼2bKVMM'*d%/%)m@Q_\gmelrt̰ + qT7EۖM3pBl˺CLGGin&UmZLY-&@-5F>z$D\bBt̪ARF"u1#oV0eG4jb9asE`"Ҥw5etdj@<-Տǻ^bVY47\z_s7IՁWҬU?7I w&iXՓ/3-eo]}vMC? l9 elŪ_<\wКv&E=.#hb}"Hأ^%9A;fo^{FYΞa2xMCI_栂VC+F&n:[ fլ)esF6tƞwtz[%nҨ -0_eA#tNÉ޽OutiM;yh-?:@8%gV\,Q~}L[q fR +6RXl7m}ck>QۢѸoM:D芋T ~ˉSG3W=f[g;fZ}?mhȈP'y z!l%6%Ahl;&iS!vCm:g]-Af`5*K fRKYMvGQ65h^Cы| UDru+O +cOvFʬ^"nBE-[4 1L>aV \e'pknvZϞ&n寺Z١amut2p{L8'Z &.$rJ#KzFpgA8mx֎n÷#U38qQ9j|5 he S )eO03Ō^ګͶR rfR4bGgϿMQQ\Y?W\ݲEg"D/څK93(T 5Z4`l4ЖZ "헰i8?wwQ~p$6xGT+Nua.˛S`Ct I $HhuT qJXl-l,1W{y;ajYPɄQзB/l޶ 8.acG۟tlMscV\~gNܝW=4ļR"M&19ʼhq>cE\Pk7t̊]ք O=hP5yRj6,$R_ 9XqcFl"\swy-[cE>g%/(⢍X47}8<:>.~t;; fNS@A͘68BPYo&k+`mYU3f +`T˕WO온؃ i`/1ʤ^䗳r<vO% +ϵ֥_0>q{‹FvݔJT헷T8{()g D\ld֯IvBCkڡ 5g܂5J8sv4"E ޸^+0N܆A Ndz?Fy o{ל!rV9LoP\ + QsLl𲥍6)'jlZhkl[w1A;qr=S$:0Ρoa|Ɋ\w.ZN-˫n,ڻkNxhwKգ3t&-h6~͝ަDKφK A+>h! G=^X]3wrGcZA쑭=igMySɪ,46&Ū ζwg[:`SzFƨ7IAlb΄ka_ML*ekwR(I/&%.spggRaLX3%q.t&gnt0e`%'a@Z"a—9Qx* 6Y_}o,QWD3ҧ&eXx*O|%JZ;BvBSjv]Gĺ2%.;:N1եe]j~͜Hۜ^_uHU #?I]7G{t36ޤp*G@uN8;ᬏsIso:il%̭4^83,bL8Kزi=84,XG[N>jb6(W.Ctqym4{1FtJT1 y= m) .ܢtU]lKG[耠`AߊZ]c>qPڬ`2W5ԯe4MYd"ti53miCyze:*֞5rNM eR'׃ )I"xYTUvAvzR,ԕ<!Fe){'%'fF7`.0:rM# +(h^/l;9;anM_@nfMTw4 \,+T^{.XrAxy;9a !P덮q^LMc['+|fL%=̼i\.l +o'}7',=O~=E8/Ee3ҟ&m Xdawqa_AM4B,/v*>%%͡"%=~},OhYV]]/&~zؕagy$ɻawnP]v3&O.+ {8w[U \3wq.oP]r"oOc(aoyT8=)Mawa)cIOOg*Jfvma / [:Y:p:"q">ԜV= :)sl72~mJFQvs֬uY$c6fp9P5US\ChDެi4+9q"kaO«? +x=(qByhADm(k|R.${t OoQ?]e'okÞ%WYNf9Q]au|yTZm:e{ ھRLG@ {u`γ/߁O\Wvֳ{ a^ԇ?"y"*[z"|J{k w!6;6$33=rB\H+^[b6|[=.}c" a4}\:lXx0vOSQ^P"T;E*uH-r)kzʴֶ2xM oLީF_/ϥfw,y$c.%~Lީ ey]/v&" zk2}`,%RJЕޯѩI/<=vWaw^F?] 0q*R2FUL +WT6!VW2~EkUB72@.<;,@p*LkLd:"NTy7AzGNF;E&mαB,CԪ.N ]'8'R 4H;hA`mN 6:mviyK L31xSnooYEa=PsÂ1caW5]rԋDaX|T1|rUE[gC^yJz+X5ލz&FEm/. z$KH؍Uax8-:QP$># (3*l};IL-}رeT O +k%j[)WFBOGŽ%O&_HjDzړ}'dj2ZG!C$2*[EȞRXʗpAI̊;i̻Y%05 +̴}D0M<*FV9PVwsu9#!/ 1 +iP F♊0uNmߍ茶GQ~ث8?a7( +PQۢLiYӃuBVl0wдZC[CHGjɢ8s>;za]);}E3S_ 㑩qE-or` S2i bՠ'Ww9Jb[o0Oj[Ʌ?&a/foՀ{qtNk%Ѿ7>(bDǫkIW2/EWDYfZFY8* +E*nbh>w0Oޥ5/X{^bbÎYҖ i AzHʋݚNs1ĒHL#,AV ċ%;zBK\0Q6]"ҁ #t踵e[jvau?GOжG)E>N6u22s|>S ed7*΃ ?nXoiUn4hǖm-?21NT ӺR[8fB剄ӜADLK]&~C2LQ9oTGѾH'ə +ȻTcT-DhNPhz՝Ka׀V,Ք ®4Z; LPk)lG9XVU_6ϳW5%3ɤL&w5{ot#kbo(,AM{>AuQ<}[jk?4o5,sӃ\T&N&zK{G>vf!}CŽc*DƞjBĵŦww9Aݍݙfq]^~c' `?t + xʼnX=dЙa2 6Y\}8g"kd|V5?cZػ1)5[iv 'nPWT>iZ5W+;%υ^odlcaY&㼹3K/^cqKdT5U U[FG:%}3@hm:َ(;:\qFUS7685u5Imfd*d%ȧG&>fZZJTS8|yG󞳫je5XCc)^/gݵJ9Bft#8󞬛-XWf;ZQSDh dP[d/0/X'g:Y@[SGݕ`7D>̢nD+V~H5ϗ(oKkGsjeat#vmÇY)CrVdڑYqGª8Է?Yf81Y =wz a!h 5nC` &s9dlp,E)~[Ũt+#}] R#vtAX΄`CRYԱzWfP nL?3VÌ'-p]x7:Oc# qhd`ZZ4=o]թu7xZ۝vM סmkyYSΖē%9O-#Ʈ#Ʃ M4M5N28C&[ &`7GĨu!7k&ݧ ghl聞q+(\2d#-">hm:B-ٚ %,#CQQz⊴ DFy드l|߰uաd,Uorxdx>r3dZ&QEٯoj/459z\(P|w^pl.wd<i~M-xcu.t{`7 O;Y&W\sS:Y +=X |˼ RiSAٛD[g\&RbLS7^YeHمBnֻ![htW-( yꛣk ),o.n+9q nmHkZ}{@Cy.JSZg΂[ʗ+tv{Gi#-#퉨=H{k& ʖ/-xul\n,~hʾ?]-'zU<_HͰ Ӹ'UjRm"t{Gۓhzd`Wh]/än"BzOvqo\rZ ⵡt""RbR] +[uNJ[c,w&yfkդm!CSؘ%GH߹%AsR:#严dY0\6]s/8Gdk? 9P|sx$/tJ@-yM:yl.{VSKTjY'1)>%:|c(Ԟ3΢()ib,%˭-bbV@@YR/'_4׭z`M BkGS*( :!'f%))ǧڤm!2&Lwq̂a=s:rWDH@]ӄd4&#ŤXFa}ģ`/LԙYu8O:\[`{^mǰY~ O% !GU̕zKF^,4zD2DvJp8&ή֚[\WQՔ-2^ Q9&س[׵+†B^؃st氩_?]?oEE}7.~C=foQ9|j<|[[K]7/}7uM㖛~7Avbs5mSO)D=It B=Rzc;R؞~GӐtМJG-Q#XTzf qk**ͼڇ<O|b?>ZhK1_;U2\RzBLfΓ5Ŧȳ># HY +|[ zi̿az +K4\AYzo&#̀cl’׎i|s>xc=i}=^zOMiY0Z3^9Pzgj_U*EMB쒪C XM)@j͡L鲠#p1Xc)9qP*:d{2@I,w M}E/U;C/]Sc bw"bޑ h9=!߫A&ڥ8=G)%~-2}uBF8_y5,ꇢXO_[wR_{Ÿ,!'MnF3*oUpH11K\ʎ ).ů$W(Z6bRhBwCG說PU` &HN-uwfg ~: ./%]P&]04d_:ǧ:BDK5_h51%gnvQ2Ol[U'v4iJWvQ\c?X +^_ =qw0w&x^J˻_sM/ tCZ=EKzJ1N!l7YGZlΞZWeEG/{MLjZ!N4M#%#{S/OQ_~#(]c g}/$F'JAME}e%?ۻUk [F%FoX6#Pw-^>geBE]44VIR}E9qKÈAB7 a@͖OOymd쌟V/Du7ꈥ;_k[ +OВN >`]4Tɮ)B[B/pN)82Rzr[#)jMs2ϜB em)bw~3 ov: }a1Wq7Fvf!%B;Bn /7;gkrwp91R*o.W|gCD:f(]@PgRW/5[*,<\x_pSQ%Ugj@6>=|ѝ6VКwmr%*%78 +P8* x cI:g$>!%gS3.6M" xΥ@է +xֆ@0QO~6ڇyDsoKc{]Mc⯶`01[@AzH8?Yث,}WMekt񚴛>@W S'JJoR 2Rߗ項vӅƼk=[nk};l˭?룾]jMxi|??">R6^>kڛdO02IE|(˟#~߃@ǂǑbvE!>f{C(41 Ͱ ƲG5 ſ,t,qN^$T[y&KKqoҔۂ rK-՟f4 g_W卤`&"ҧE'Ő2db 賩ͧ#$h\}f$WV@ۣY4TBmGN82?bդ9  +fv!뽕Mèg6!15LJoOvDؘЧK;BL6 .fur֖!kuSƯ_w!n19DHI+iz' 5; -1RwS)9)?c=2N,/RpNS*7 ȅnΪ[qR ~b=9~^|}j?OFXN7G&}`D9`3Xb/Wtw#۫_K9a|;`_aߘ>Y.{{z5ޚ $ѳH ͩ?.%^ɹjl:%$m?u<4rsw]K^;K֊U)OH{\G);xgorJ(>ψ&~JRuo󂢧:+.=IJkcļK{,z?FCs[J᳀:]x܇Mty| ULBĒ`MWs/ǫ#LÈp 3ٗEV?=[!>"^9fٶkYWWZ mnB0ƞ{9Rq0']_[%8Ƌu^̼rZ|]BBK?&RmݱqZn#.,^}Q >m2?M,ƧurW+0g]7t%\Nc#<@9ZUYלk{"nu1Tu)dhٰ} 9+؟0N{y0GH=RJ3"cĕʛF@t.F11.cGc%po"|[ ˭a}Tp+kG!+>;E/rƮG7}s|gٙD]?ӴU=Yxuv!{BlkW`#DG`/+;~rIIɇZF$4to v=U}izOs DR@^kqM]zϢՂk˯+K~J9Bu + p3lTE{_ c~p.my頳LQK4@;W D/d?sU-L)N=<0>om7_ss. ZȑTݟ}k1FG]`As :)8{w8,b5^9.О}}& ;횲B\"w'jLfw핖o MW>=p+jGj5'Ѓ ^/vAӾs9npX*;3^ZgXu!>HHҷ@GK'>%o$"H/5YEG2^OocO? E_X!+ן8J| +;c%-e\kQ-etL\4k\WӁ&kg=W4[I؀/?6>ݷ ASL_FxUé!/>`bqoإ1t|}O=YxfT8fH Z+Zs~c~]Ⱦsf j`R^rKMc-C_x>PH!ȼSxH=Xmm1«z4LLM:EU::h:R*SQ'LF+8[gSw+#7z o6\`M2Vk&] +\{뽨g!Jw޵Ihe J۔r{ƥC-qѶjg]=zDsC[ @_!O`ޘ#HfRRå%"Jim.u _6:!aK /va>hO ž/jrZPE>V1@^9xV`V%򟹶('绤$ rn*4^[(fw&/W*Z iU"R$!>PKlAzgHپ9vcWr@訵\GRU6#!&2ڤu)>/{"d_ʹpTMsSlSxaĜN^tB4Zp8p<0å.Գ"xMX:Rzw_6#x'ϵAޣ\Cgz$ƤF +˟Y )F0ٚ|2};K2j;ү-(uPT(Z`|恎I>1Ylm"7SSFtcmysaOF䁆V~p{Rb02$|㙫vـ-8RAPt|e4c?VVt2V5I?ZbWwZ1=x4e4>ա"j}[*_t" z ]3gd[C9ިZ[ Q5Zwdopk [#O'^=5qqYRKO<^2vI1Rc|9}(`{S{p/*O>կ!bZGI+=01. )%G&Zs~E!')9v91cO2Ÿ+jr/vX'+ m忍S%j|_%"$Jn9??T=80Cywov1ly: +oȽWSKt$d;Ŷ+)XGV@E6pGLϴ5*vM.#Ky^r< ++uj)!hW4 vGM!VhI',OńUCoxoʼoUېzq+Ʊqï"U?Oܟ$Ș)Idk&9ǭRw#咑sCK1 7\OC?9>@_!!2xc`deP7mS59>5UWG)J0Ybnp"?&Oo(Aq%oGEt9z'9TzOW;Ӎ.VXݘKkOD_5u[lEK͵dd@x$|gz6)eW r))'Ɔ] -wTԗMVCǩ̒In1/ޙg.q㏍ -_vZG\CM.ڑP2M<; +tTiv&aI<\۸ )ֽ<6 :-|;IFOD/Kw&J{dc-8gp>8$G+]YwxԢ\KYvƠ׺vFi:bn1IJz/bK/3oK +\颀#nƬWGYi1zuhG2~MʹC=P-Sh5ۭE\kͺ܉|tMrxQLUkܗ=iFTit$1f{;I̴N2RM6duL" WMO}h[k=%"4ܝ񲨕δw2yW}JW +sOAȸ_ 7Z + +oڧ {SeON1:":+6\6C]/SzoCѪH<|?_~8]WBjjByܥD$Z% *l?ޙF'=;N?Pp{+})%ݟ)mSxRWX#C1LZZsID^FlW*C]R|މ ,E܍I|l&E˱~- tDɯ;]ml6d_Nb +EMсG'x%JWԸ7WO{VM`<\aNWS{X}ݭ"V\pd5\Ŀ̣76zhWWNW[?7u=ޫ$ex:9]8GF8S1+Ak_V?ۦ+ow+^,*3DD}Nxc#£$fm@mTD:e5Ż<]޾e!2LCXh˺Җ~. 9-!#KZtvڅ5?ijwƴMlӸd m0 Ԫf:t%ZeA7oL +pP~Ϋ?7DL! 4:/ӻfQ2bxZэaR7Äe)vPKvh9;S=11% /'˟o|Lk}a$Fj*HogX-aK +yʻm|7`m*@fئa +A+=eO|wWF8LG]ҵ-w_ǐٚ#]p.2!5ur&2gjxCC#! Ͻ +lZ@ź5YYPs׵u/Lz}MdvΓ2,{b>jsclCJL>԰1n1)Gp}}y@E<4qVMK1bOF*9Ntb7eV=NSK=; + +.5)Y.>Q!Zj:Bts [Sw&qlv}z86ARģO0 :n.\CXr0%'qm]@sC|(c/UvVיF1Q+=gYϵsTl$8!le^ddHx%s?f.@85KOtPɓ`smW|h<Ey@MQyѣb"࡫=7V;eTP/W#tyUO}6sofgm,ңxX&~MM[[>ڧ5|.y5l98yrWs&?Bi[*+ ol|'Usq16 -kOB^.>ǏF#HhUI^WF ogzɾܗrQ՞pU_!9fj{SD]g!ZSկw*5fF\BSܨ.q-$qHnN_4E Wic`3t"+ȭѪ'{bʽ=y78YdWRbE;]kY|d,y8{p٥lye39@XUG&r_Jp*9RW˄8dU~1@,L><ǩgM=;ܵg+E@/dP7brƸEVlՔJ">CV>g]UGߩe>pp5\Yi BaiϾY%WڍHdeoboWi*%g-G :qΦ,ѐN%9X x]c4t,*3 {Gfy"h,4 LbVR]Aߧ cw>~֓*,D!~}g3mnIl*ag .U"XSGCd26GPlrf}WC uds8] >2 +2NSR-Llcb= aKEp96MJt9EnML˰ 2pӑ g01;gJ~Em?-CeM3в!9] y9TE{9z;E|:*: ;ղ`S 1+' g?vL8ň%=OHuZ:xV/l2&Vzw*f.s^Mu.-zu:2!8eȷg “E* aay[ IDzS۟ƖC# r. E7,lo%'Gs3}H\Y昭I;3ֱk0S%O'UrzhMYp,h81*ti쩢9sEuT H聁K<.9(x=r-HM8P} +lMRa/}jcj]- ]rR$42^*tYդ܅ax Yzn葃:zCәWZ3"Fv:N͇,+*=_l֟mtHZi~URK:r_Gwj>9^0lkxLG|`6C@oh%64%Km}טּcm]p^6Jpnp +#7>.ۯڧj>7 +.acc-ťyNŞg֤XŤ9zi4Z&Fx(4, ^=2yhG諺Yq{6I 2@Gg. .;_ "* ԠgQU1ʎ0!u,m"}*WIъ;&_7,27no U=H_) JT[c3 ʯ+<Uo{P@ĺUso<.6`KK{m),l[p:t?Qm@]g:F6#-6߯|)5M:30_, ]\.Oe[\bS3!"rKI摿vK "ycy=[U)&ޥurB^PSuA,r0~LLSS_.PWEUz"qzﯕ/k'| +{RL{ +@7`,>[wEw|Jl[IL*)y<n66,P BJ@vx*9BOA<)#鸸/k Z=­#-yt_Nڗcȗ61GA= +~fy ٦ qTHcu_56)!٣fsIm{|mrlUK*%RHWw`W%wމ^66)sHVrL2~L8py`i bYW66Fg "! i%Zm-5vsU9(YeH7eMH9߃vs«Ca- ~p^7,x`E!TW1 +\5Q##i23BɮGKaqՠVJ>t`hP"Qy1ж+oIwYIQH#Jy"fd]N@9ZioࢆY3~|ߦ̀~g"<>kMoͿ$E_CLNDA!".8EeIwN^{CtVvAwrZzV Aڌއg\JI=bFd5QQ..uO$9kaifI%_w,xӸ+/'x@gB&eŰZ^Y&c5#?ԲEP[&WWǺ\*?[|]Jȸu9)i# +i шZ3qZF뷤b>h89ڕ7sb6AWܧښ564ߌc h)͊}Ms+AW&5{7M\ͼf. S +Ali ['v+9azjݴP5m dSս:ů}C><,prL(Cj=N%`-)j3'ϰ+^¦b~l5TL+jE NfVdѨp8.&1 V!ku䒈ALN{T)Ow@ͬ \٧fsX#z2L-oMRU><('sZ `o]6y1pYBI;mD='opjäv_nxĬS" [][:v]wu^KZu]X~vxkSXT +{}} +8, n`5/f!^NX)eSi W߯n18[ՁkM~O7b.1̼| s3n#nߩbcZIS%_-mtp:vW6B8n? j>-h48nM2^!=me5^+ +>teUG?ĝXA ̊څ0;GljghBSSx2w> ޘ;˂ ϫ~>(>A|}nD]"Ƹ 1fipp~k>Q@0+q7>}_гq=C1ɘ ic?81eIR6p1f$dɘQŔ3kAK8b FihOiZa.d_ MüsO?[}SC+ؗ“Zر<,p?:KyP׭ސۑ[QKd$..8|:emviKM*Lۙ;^0}rzنxɺ{/gp|PjJ=i_w+⦽w\ ) ذ|ecH +dsz~-!ocQ7*_ kc23Yƹy$mVr2nXl Y851cοl?{EZ6Ewj=fE Y聜S!vE):NΟ⓺^EҜ[@%۳r) uCÓ]'#jل]89a7#sN 32fncXGZ9!{YQ1!쐆[3pIw/sMtxnkT/$)~֨q-sU8W[b^lS +KM8$]˂ں/ںI˵[jfQ_fV|5z&ec6nyE82ή +޻U@;zfHg)k-u7#/N~Trj୷q&611 q! beKʿIZ]IW֋p1 v<ԕlʏi8K첸[}FΛQw*eUg=A(lLrBZ%u9?nvS庴qiL:oB^.y)6̸J6#xwgdf}۳Bv7)H5ɇf1+f*I¢Td2eu|45od '61kA5ʴ׵3.f[@\zΜb(c>?⛕g!G:O%j3lB-ERQv1+ kvmCUl8չ2u`gV&I;Ĕ|@! ( < R9?o J~ghq,e4ܚ 'Ml!\L-kcM|OkYf}ObttV.>;dq~&nU_?4*k3Gӄxgwjk(ҖVN |Į=2>vܓ+[c(b}x?.OYx) .8?ʧ_'O ̪AFޜ-y8n|M:]^UehMD yu-]ǵi;?M.ٚWռƈFAFQx?MnE1^GjX>ʯ\}%mz"0v',ҤMBOJ 16-X|A/^}M:9îa׬ +zrQfVx{! 'n%v +IqR~PG(Djv^j誚]1>i65GL7KC~WxH,>o;8b9Y KghMLK:~M9UadsXIܙw&5-mcٹw̤Ԫv5rifn&"L @%XiOg껍2\~jisOZOoN2nAFLENUz?j{q{3yԜz䄙ג ѱ*6XhdZБ.emSHNZ]]LCAEbtyČ/Iٙ Гr~ oM}qpEwϛ,Rq{qsy5kcW7'1M7 ̛NWeɿ0nuМW5̍קQ}zqmᆃkgqGߵA[$) nc[Ћ1zc$xPCދ9u5BpTw6c`yBS'6#6UڕaS׭ֿ q\RjymiiW&Hgaczbq`ܳW_uO+SwsooP/!,{ybYiDM)J!-+#ؽ1-u 4rYuՔ 5jc[3 +1Kc &f6%ne.N!N `൬t:NF%hg^2:zЇзmO[ߩ98l\ /&[7|7?L(-PGM2K¹t%R{N`i$8b0?~ʯioOn?1y6)ɢ~[#e}bE%' ʸ\6!>`u4쪭Q7Ju?n*?2{P=Iyڡ/Cf1';KY$diMS +Vn[X1Z9ik | +uK:Τ=ݑqhY[o_Lͩie !tF'i ʿ6+ZjI)fݪ߾ :OnBMS.!.iS#QWXü:@`ZZE$*[n5~aHT^U<9x?#\5$*Q+_^ x$WK{ e};̿5hk6i<-*1~L9aj kG}I++ /i^Kxo?+Sn*ݳ RSN>44rAW)$ .1=ma23+Vf0JfqIy$`$yxqGZn[KA96&MK KձO~5fk]0vfy_wX])'am򳎟S،#8A&\tݯB҃A?7o{B"|H/i:k:Q8a_襄M +reG]o6a'kM%V\G.^zYOW_~L( ̀$bQN2Zz+6G:'aloYQmI:(_ <\t^|$L3%㓣FN}D#hLYW(/Aw. 5+q'6~}m5^qP,ξ"OЋF);.osѶG +Ye12HSNhT ~ZH-̸ +.Lݏ[DZ$VFڏ.naUӏky)qU'2AP(p$eEgK:"a@8~5$cT V +7ͩn!6OoLP/%Rj*$x ]^Z}V*q)\:::+Vb-T% +mžS ѷb>xO_SKĢ%ү&\=qDk7zLz?jd?Y_Ҳf~qve-aoиWQK'z@Fj NgMB\oxmi3!m%Vu&ig/%签ֆ4Cʌ[ݙYJevkԂI=#!ix]Wme +F.LS +.etu\G){v_=.#}q:,C>_䴓\VX;RY%as+ޏٕ9q*͌F"Ziny$|ʢmTDyeGHUרlV0Nn_afFEnN{,ɸ$xհ1[ῳݸYDž٥c]~YS3ڷJSkhW'F 9eВN}T([|9궋 kAE5fD/jKY-1# t?&甋r.$ >E+ ULιdk“ϖ5}v ; ̬'paGzoeTC1LSɮ F;ν&ۺE_HۖoOZ'#&R޳#Bc}ҌK|oL=/xi\p~D\:X''Ni:6y4\{E]|M[mga!WuV̀ +;Oq,=+`C2Nה=zk(=<Pkfe\ǵWucM_; 'U%b/{Kd^"-mnDv[%b/{Kd^"-mnDv[%b/{Kd^"-mnDv[%b/{Kd^"-mnDv[%b/{Kd^"-mnDv[%b/{Kd^"-mnDv[%b/{;}/d +:XGTwDÏ:~ +xIa?;ӑc~&v2}W,a A~>о}QGO8z'rcNSG~?<ؾNuj#oGQoArFL'Ԃ4ίe7즴QW"jRQȬYymC Jp]0P䬘N3ZQZW֮OFY IoIiJAlRWI5]1_5dfmq֕1B^h/@8b"jIGʬο`TMac柣jR)`ԤK &iP0bZFYD(Y{?h8;UHm rqssVt!<.Oe̘VL)o%툦W|^ᏬjfigI-KI)2q|agW_]~Qmh3rJd])EI'J攨?mEm==p>] 1cRAIY]ˢ:^}Pþ3pfpGRzU*ndC.@`O7i% Bؔ€^WS +#F)IEqW^6ĨI@ +iTSLE % %rnj⸎r9i"&ZŎ^%asvn{H51PRv-TʓV! 3Q6ïljHf^um%w;YRzU! :(]A!;iӴ]Dx$lunN:xsZv5bS[I$Yeoǭ +NYȥa-psRQ> S&8fbk8rkQ*73kzrIȨFBzv8$ jGIBܪjĢ&,Έ\֐ +:ajۃX{{:_b:iD,L q#2cUM%ŝ#3O[|;Kjei+f w_nЋY[y}OU &ʕUC-2b1sBrv*&ZImMy\+vjC3ڤI؁@& g_UwV9-QKZ\xP? jńz%g\φϑAg.pf~EI=bRO.@kP8628nO5v x{g ȩj8 5&m5mƌݘj~c,&ꄎr%cZiK)Br$rnH/E +bU +P\ :z!{[~~4SNN̬6'KR6^{ʨL3.RYCX H7.$sb&Vmθ>f$_ޜĝĬSHie[Zy0I۳}w)}~}i1+TӁz)oF_Ib>6zAJ%}2QB"*$RHn)  QpZ&J>]}M6+y9GoojZySo:A+#%RuG,b 0iMI#?;48bV'Op_χD15jBG-̐/tbQ7sQs6ێm 7k i1k8aMΤE%$ 1HIys]k_EGycv>zQS6G~6Gݚ/ZO& +ؿ9N8DŴZ6/Vj6 ysnl''m sXxq+-itl2{dnI(8p(>mJ[zC:JihuY;>oʁ[IXEU^[%EHI7`7==K{dGXSS+#31[칓WxnAQ+6!ܙB@t4obD`vnV 莓#F5㴫z"" 樑Րq;fagƫP+ x H8{zv1=餖Oy䄝Tu +g_祒- !ngmJ3l`_i}ĥu kfɎtꄙ{~x5x\trZzyʨBm:֌0&c&.J 3-°3/j M$`{mi )Ne` }ɸ:@` կ^}M:ge^ +˖krf9/mWWq:q׶Fï<Ցo3]g #$č]O;Ҝ8[:CHLXMUؕIYX˜^u3;JPɮ3۠/VP15a2f)[X5#fTYĨW }1t +1+ԂO۞̬Dٞx(UVs>7rrBVŅ24UĪPV.aVvb&\J9mY]e)`#V1 9mqk{Qu'3'AfXQ#k>.)df,R.1 +2F%Ίy\HUXˡqҹSDE==)Oڋ~ |̨ι̼fpzw,)a5./maT7 n_C-ܘ7uʐQNO9qb`(1?ͫ$)JaPj*&G8H)I nkpnyFԹMa#Mr9l`nQm}oqD緬?'FNM3K"3sKo{ּ?4Ū\$uӠS1 S鈦᧨駈6nᷯkcБ)1& c⹥#}zǔQɋ5~5_l,zapۢ32vZxꐎ|yKK3D?@{Dz [r>1))Z,^$}v$L,275ċw$wfr,i9R5.솔C@ȸ܌[)C}Cc bP "laV%\δOL{%\Lw nU_)e +BnAѻ='%zj9L;尿7Dzy43'⠰בIsB Mg$̚zq(D#g\V/;{(鈏ٔ^ 98O\nIu40bt:0_ϭ{:@sJ%+[fNCTGQ +cfո՜,@݃Rkbv(d>VmNiU%̃700?bQѵ^fev*`|vy籨U6gDM +g_Xx[>Sb#4838n"DǗ^V}VClTǮs`}7':O,>o?h[-SKOKqIfixx&ⳚHVtC=vk;€@x Y;0\M?jHK+h( (hO4{FvęEuξ,'u%0ŷ nM0˲`J999=mbԒ^qp9ɴk!b'˹Q$V21C+A#Α W!X˻s>8-;膇2SN : "3/WGh#̬B)Ӟ'^O9c0 *Ưc6Ђgr+&6ƭ|<1e+h;UM,oEL֘ I{5lYxwv/as_kXQwb]\/lha5|su}0ҶW&YboNJ/їGZlM56L4k1@gk 5v p~q ze{ڮU,;*݊^ݶpi3 iyuW_c9EIؕq +)i3 +<>qdu;?9#u\Ji +l +I#b`Wc(jwRְӾǙEկS̎5-4aVe=1=5^Oyh1_r1<YA-JU`ZZS.1#bveG-W_Ρv?E8aVD8y镸bmD}p=vP|"EnGNCuՉ#WQN 8I/ ӊP-޴*/qǡ?- OuAmMP/R:N&"txD,L[S9xT>!5$4V5 ؗii!m9:?,j[U(`Rޘ8j3P%IBD"_w2bH/_%MRF;bBjWXu ^HYjʥI `\ة1cӑ=/f#$\,`nnlYw?<<מf<&>`2U/v6]x0G@˼3v^q[#&Zius^NG +'"n>~SUHQIUҪ~ב 64IFjN130E7 O+V_#r6h)#`C)F"kcV޶ L3J8e돃kADtvRTM8[#“|D'\eu۱EBK%\򫅇WskV)-aш)Twc棈["RHۑg26$TN ur&Nc kbv!z11RSj>0~N!nE& ; uIYi5O2TJfry`T"g*U@kK8|c+'-fͧ'RYؓ\ZۜLu +m 1 k >yx{1Ջ3򬫻'lקm൰Tv{8IFFpKlZFywSK"NOza;b TFܒ+i\NC?Wuc2]Ls[^Yd&eSVPsTŸӲhz{SO;IR҉o'G ǙŋGl<̚\a׶ǵA 0ŧu_mn):E("r\}[xI!5fY0b,xusjW;"qFY!a=5 z$l䵩oOs"6N 9lJa"g%o_n_S|x%nu-&%W|j&-솅[Ji>x7bd~1yFud(xYTݸQNGBB-<Jn^},_ .=Trx(R8빎aq)ecͫnZԂ/Ĵ-j% +:ba;|ɾAJ; yź2n?5ddV|Jf^@G +9z06)pWW¸) ƬBhK^)$M +n`F܅Twu} qn^ ;1EM{2s}2CRyg\2/M>1 +6쿓tL{e,wέx$\욖A -ש5'3uZ:$܄M·%l p }i\hUܕ vI;=-I71+Čbaٸsݺ3 ;:ȘQܳ!5luP4,($~lBB$舘[37B۳cO6_Sʷ=JiӸQ1rv??܇ٍA-rE T'&-FLvXxZC>,q]{_݆sHXǣ!5k +z +z |%VS3QDžu#CM~Mz|=ye/"J͈w M@54近?H{arpZ瞷A*n\K=Gxa=usZ#zIi͂Mq_9í,+!b&9-,b-Mtpu`ݒ1),{tN$!Þ] "ܖU1r4G Qe$/X[~ya~U7 7&7 OүflRv*GxWs>E`6oew&nkT,mVtPTn,מ9Ww7MBɍL,k@0ig,&'tlRVD+_&Mh4`_KX71uĦQv[&yu@/gͿ Ú]J=!G zl BL'"$b3#f%?fs{6 ǻ.0%{zVvRӮne<܆۰iԯeKc!8;BtQuvUo)aEm|\P˪I85!n0^^y7U < +E+NEKcGߕ|S =L׷|e`iG95 ݍz(13: %I8WLxz%=CS{On݂LZmCpe" ]D(L׊xUa1Kɛ:fpQʅuDwq31h$%4ʭ F!h jcuxz9hD#hy !5*ՂŷK*x?'a:: |7mW􄵂[r(hѨW4;vǟ}شQWcI hmݛQvg=ʘ]bםi #lAܜj<dw+i'L2Fz +g{^ܙ琷}|v +*[vi(mY|)ib5fܽXPkDY5h} E$KQe:eOeX֛Ogy4*@`tl _h%L4Ʉ,odKھ[BGI&K$G 9 槚pĄF7_iN|g$4Oٓs0XEK t$ȇK9`RX`&S-g+ k]PǽQj/({OL'E@`}gwC9~?ɀffw& Q-ֆ B܉=`ݝ@nO +}9wO?Q*xJwrxLˈ3CC!HKT\ı`~g2htC'U,euO„C`bKH%1Τ 'Z5-]yaŮ +x*:ҌCo&UPWvp|sFS@)  +LO)9@ߚĆN +XGL>!r(KHqf% Bh۞Z7[ *x`5f%P0kޫJt{ +F| 'kCp`M;1O}TʀNlڪh:de-Ϭ Ya6AzY >ۉu3X= h 7Tg};gϰ{S踅xZ5[>Z<єlNg9SۓOj"GRje CrlP˞uCLiA}cPQ~pf9;eY+?eeYִT+:V8L=?0Ou)>?s?L? q2cs$H'h86|[Ƙ5'ce`g5Al63 +!oS&boiR7}w ,4i,8P@名RJ쾂=ePQ& 1[;=ReAE' YTY:+挥aoO'^"c @H`C'KG;\V/58@ޟ9| cgz'`p&()6+s +^e01A':broMNфs,̞;FM8h2-k66S'gRTm12!j_ =R;RbRQiC5'(Ϝ 9S/a#R +t颟dcU tY{,)ifWؑbt)Kطo' o./D`&w-k`:8>RQ@pjT"g?\i.ǒb끜fC~up5G3yuG3M`Z.ͤ2E F" RzGA6aSmv.39ֲp`3yяʓ9!G>g|x|2,k&){:[q2Ux):UBeҿt ldLo["D4{ܬee4|'.r/Ea呂7am&X0t=\ lcBZ#] XMJ2#Cיƨ'+u)_N"ѱ28TdOէOUGJ!{(!?B9T/%:xgGiK1Oe%o\֞ʂ,I!`&ٔP7u9#eu'GJڬN9TKWH!DqojQI{lYS`[;MU(:x؋ mNwygVTlФ)QULu9<ܦ6kSZJ0Duvgdm;k}(ױ +;|ak~Lk +wU|pem2-Ysݗ +hq6$eM +>@%o20ɖT3Nږ#!/ ja1Oi?^BsUp3A|;d[η;v9P&dlOȝl构 %=]ӑ +oO:VO~N;LG%L,17)`lf)((HfE&D[ tmᡥiZ <|!L0FW˚ĂK=Pg]D!jijJ鬒m%=c[4lQ;OPBEl920#pC?)`gkҿ !E | C%d {Y@ò͠FoC'h IZ۲n+bw<9'DH9r2=k236ǨK.r @B#EncIAL\g|[LIrE|(CJܙw؟,g3BGY@ >ȃIr/-\ #zI8V3Ib64L>Q}k6MxU<1zOB:R=#P)8\`ݛ %kBkNxdrc_-:~aO#k\rVǂO=Rc +*<}(x]){sub gYd(#-s+ypjoEifmAli:)p+ Q +r)l,k^s>zp՞L?Ʋe hdnT:5HKC(iۓ] ZUʤ);U&@CISdQc`GUҶt!ټ\vuO-{2e!<&ݘeL Kv$GULw +s0I~0N\O B,90yȨIL1PJ6d ۗSqKHI?Z6@AN:bbtĮ bNp~',4|$y)mOޟ/ci'񡛃P]s;D!)8*c6ڙM9qg="qSam#6`FS>7z9Ǫ|NZ# | ЅXmE~\h@دWZ]f\-z Io[{ČsVjEE$yoթvB-IZΖZ-1[[K1 Lcn!\ƀa \ ~-hǥf엵vˡx,aJg67K;3/u'o/5BN,>xW);vVG8\4XH&nk(>N.KKM{ڍt:2Ou3B503GZ֔N~:mK5b #؀ŎTnѽRBF758C |Dj+tm˹K^jk{!>F)sÓ.d|(~8# Pn;_zv {=SuuʼnSc%u@{L4Zr7gk[%=L7 @k >#wF( {b.|߲WyY#UiÝ~lM #BiRHc.ݵ%ߠĢ.rũG;;`yrY } EV@W|Xv|ڎ0 0 ?6 OUf#[){򡄒54B +rž yidxqC(N׍䧥&,,?bw0S4_P4[_n$T!Zp.$M+#_葛ݴbSƻY4io[&/]qN3IOWh,5y.V(nb/-p1n/؇yԊF"zI-vtGC⋶~03rcOlɥ$֔=H^ԵO ^mG|1 0<ƀ0c=[KvBӖXץ;񾻃$/ՐwXX֧@! 2+$5iG |8?}-Oxzц^vz+ryA^ww27j:m37v+=x1Ht~Ԕ$?^Mx6#z.ZQ=鉡W2 ׺Q3uת꼈𛳵p+y1u+O{ԘfҜfؘFUt\sK]lЀtX)=Ԡo5@KʋB@}v0#(^=9ؕ6aR {*干(ឲ(8/~0f9b F7y +|c:F^q_Rtw:zk3vGik8{-teV,ـjjc rswU$Z>ҁ z k؀'G3#Mf%ZcgP@Vcnt:m)KxK ؂؈Ί5UwYh!zJSmx~˻_G2}U'<cp`}5d!㭢$ވ (?8'n>v\=}M $&5x;=,I [GɊ}~"_7d.s3OmyCggtOǝ81(A\)Jxa I~1 M4*C܆q+ +zxV,9}<̍)Ύ1 K0,}PG +}Xr-xH(4^ЍyEU]5Csos}]nΖCgR_Ictl3U^ף?lтfkujߪ'FznNXiC^lΰ_hLU=, :k*IND$ZS\RhH +{puNUCe]͎+-x3sߪm5CR{I#oʋ^0-n!~^StUk6 &rݯ/v! 9tpa3_j +K[:Ytlmf2@YbÌ謱k MHGUFh;VxGk33> I +,4Q35/ (TXVSZy7{[=[d?xW4?Rl6zN \hqjܗooV:s)STg䐻ЛC$Rm׻0~5_P|zqD<$j DWO$sQ;Cx&اZ|mme"pM-&Oc(Kߛ -n"BuKE~ {CBiW ;;"A SM {j)hi +nԌЈ,4bhD8ZZ'5rڎwmMAn!l3S,K{5Uf8WqϊxL +\E y]T<\fz^[Gj(z-O*^SB.5d^w q=AϨO/7#eC3n,7d|^jB}֔'?ՔBdSW>h*2> e7zɋMX'uyc]Eu;=J~‡s}eE3 +idzYAW`;,I)!=<ΝNbv?5r4GMߍb%Gd[N~Ry%v>ᅶ"U'E]E̛:tE-B#{>o:_ }؄vO{ {[ApK4K0R75' +!yu=chUQo5"W6Iۃ|z/;ikHZ[qN6[dsѓrWYF^kΞkG*KS<?ȄY7SßTF4?II=iI,桮,B-i Y~˟U0UXPIA#y^w30/U~̽4&ԧl%VǿEґi&\ 賌ü[FVm[3MFZ򴏿ud][Gex^)CˊOoYͥL~>ytm}3Z >XShD-nN?8t[N}/}1ZvJzɂ7\gWP_VZ1_@ nN@wWj˭_9=㗄 +|b Qux^fumI>.h$3 +D>ܮ׈0j25gFV)M>T%s Xنu@#]q5g5Kd=̰+mԈ;E-==%'7 ;lNtOe!VgF\l( x;\PG׆_/?]Yl:n[~ws^e|ҡ" T% [4gg2(Jn9;c,f6h`މt,yvus4 v=kLU||(X?JS6a\U57{Yk԰Tەf蛍δ۪2v +HfAmUShp$dO:Ev!lࢩLVD nw3.!Ja)aOfht:veI^=iqVJԗ^>4G/6">lv1ֺX r,70?v+F#tg-,'J Isg_FZmGOd_wF6a>†Z_D&N@;DߕǾXne)ːUXVj+uFO5 vFVƗWsKƨ n }xA%|-+C;e'2 I[IYW< Xq<( }is(R&НQBFi&< +ũO(~~ߵOWjN7&|VCك^lMx( +=Sn]5TFv]Ŀ]jIwO|#+xN +%)jq U- 촙6P^n~[PI!fF?30̃ρMYi\Uj'L}7Q9ہ?D=XM +w7#ILZi}EvM˪tZ;{2הq +\-j)HȗOkN^@f>vث.akiI}<&Ƚ6N'yr4ly(=^aLě'%\Sg37zHK8ץv;-4[5n/77k}9>^#(!& ~\@ޑqqB0'oQt/G*l~5e#|_o$wSC>%S[u\jBl3bfZH>C|j'[Yz|p:Zdo;h6q9R{bjf.`jxb끌_%l <|3b"7Ar'Q/v5NMi%ܡ{xoN Fy!fBwʇ!t85\$j ~G;-TA[=zb3c˃tтE!wepNZr'{؝n ss]8MIa~U?Eɾ=/y,O}O<0_tSOu1%Q副( ؍J;3V]،u YkcO2༷xAfU?,l ˝?] BCdA„Ԃq7B0ɟ>(~lyY9Uz5dVVzy䯭'xՙYk=Ĉ*;u9v1D _ 'x~akmLQVֱ>^4̅ʹcz1H8I )@}5L- Z;mu٦اGWf($*P9B4I + Ði祭1辚zbȽ1(J*'} }]B8;L o7i>Ky"ov0.|]"扦:a ЈuG=cG?A?K13ȗRKI'b~zGBKl+{?!G)ʢְVKN8+!ۍD]}ȗ2U}0y2o ,Ow^9Nե]ClM1KYC-y=(@-ٞy-彺4JZWMjjY~@~ml _+=䠕b)X?Fn*j%˃.zL#ydYށԁukF|oz7dk]ib)(dGHu=o$/J73(3rW{A OJhasEevGOAINUcq_:p1[#|D&M?M=I[Os^_ܗDZfz@o}k73BW E8"6]dAoW H[`8iel/m&sKUKdsm)u7EB];)@v8%zGc \NtR2`>@IW +q&RZjuA +.\+`, U?@*>짣6|ʛnƦt:-JvG^儨+П[1ΚF:@.u3+]P53Uo]9k".+l#&dn63f&FwdY$;Cg!e3+c^9\m ]zgw8$ݘL~NUgFN14E49G1;,QYܴ,׏蒲䷊0Bedfڄtl'lpkYPY!i<;VB3890*meQXu8ϊYgleMc"ao!Ue(az[^XȣyWeSt)WP(/,ߕfo rYY[=q~~&J>#jR껾B«^q+𰊐q='%"ܓqF0&wAFoH߼[Cm-E>(AF5CW0]-[WCvoD+j!94:Iy %ONX9TǏg^D(~žws+{3U[SUЕlZg7 -NZVTčd)ך۩Mxԣli1W<ϾwGg^ZYO07J cb)*PaNzxh͇eaތgaGh9p߼8'b\09%>r|ktR7?E^Nw/d8e1?t6uى7`ϧy|=>ͫg2=nVCu +uQ6B?&oz^dE-tR|ܮDHe+FL?L>&^:?sr؍ tVrd_okskW@^޾yr! nc Ipv8S*Ή{h'mJX0Y+Y ޔ.Ң.p#|x~r!$5$#Ϳ!~O!^>\pWg|/IK{iwrq/U e'}8&yNaBDە iSMdһRl-o1 vnA^ݸq~95ȣ+W!6@n^9w7{a bҧœ,t'rJ1q?M!.O@}<7nC.-N^xQәF]) 2+5ju=Dm?NVGq,Dh _4o`>{ 'yru!o_C^Ha)j+pouєKxV΄a/2RϥWAn>q #sث%Xԓ +qs  qL=/}((ө9&,& 2L{wx +0o܂=cg5z>~?$!.$-b}s"~'cȷpAm@e.䙽-WC^yM+Vo ؀Yg˃a6TیsQUڮ Уt݂zn`[ch['뇐 7 !nއ*?dzBo+^k̄vL3]UI,}mrr)W^g>;8@Cܿy݋A<@[@7+/gb>^im3vd"Rߒ +țb.b4X 6~+\P;[PVoq=ې~u!ѭ!nnSL5 +˲ׇ ut?y-kZH:n b{ +5>?/ +yjʟ;0vBl=${-H tq *ؒrkY\hQTO6M{K -[{GKܻݻA\|u5BQt{^H|(m* {T|41.ww%\#q-)bu}.R6ۘ,_+ʛ% 5 ú*9̷<}>sE(a%_KOLB + _:st͔:\ ky$0uRŨL"t΢"o 33k;ȋ;@.߁<~rW%}/ɎRհ9YL -$|^4Ps<y*7k;ۏg>:8tAH*UU6Fr˽AvW]`&G_ֵCmO9i4MC sq33l,e1%,f2$mO{}Ȼu>!ל֜ST/, r1<|{{7/|^փ@*Atu6l-=\g6$Wym>bEGlj&E/3y?{?koW7xQq<+ǶEu˨n 20b`4j*<|=E_Bc.UT~/+ TTGڭ<|^^CrGQ>uw)q'%aR+;iRf7N2F5d}S)u҇w\z7^[U~Ng9y ֵ|N1bv7I-^_ګ`\n,tc!_#*y}{կ2ޫ{{ +^>|V]a&1<σ8,hXM ]>4t>z/2Cp&?F AGM4p~7}Ʈ K ޓ;2غمZki foge:ɲ, @ls}mGs옔 tR2rGHo lu$S.E_< b>6MߝUYgZӃM9lf7K$ov>B/:%{Kl+$ ɻ9a3QRuw( ܛ%F:l]7ǻeұ,qoo&lI1[&+a3 +~О薱an)پA.ݙ?paJELmzGW/1ϗ;,TW}YSt=0-:۲ĩH>55h=>]W7810#5;E tdW1ma(` wz{1b` nѓmk\jF Ztw1d%M4]N^gk L]M[kS]V!M@+$:x!nv6Q'"~715z +O]¼>\a80D8~>UzWYzvyeX45 e+gkdtUpL?Rã96 XpRVǖC:Y9 Gds} f}Fʷ,2 Ti@%9lu +رM~wԳ֏I"I)$xm`_Hz[|3!L:O䪔XRѡۣ`@F1Ʊo<%q*0PM:XCfm*tjU]]ZsL-)#TCNP:l whAqYs;󄬣!!pvA{P+9ROn*yT8C0">4XPMyb_aևU)ب-z<Ѻ_Cg8E:6-efI~O:# +o,ud8e>9/e- gbc2!df}HȰ,svp5R.ȡF3Qѧ$5 tp`~:6QXCh:5R`A%)I!O]Qn,bJîubfW;GQ}=VEݥVE8ubmWFzGw#u, Ȍ])Pr(v56)jY@NZC14'"nK R!~12dB#rFljhJ듣;}%Ww'Gt^2"kIvȨ< B*|w\ڙW8O=S$ۑ5ylz6 THկ[3w[,f`wïcb#&.;"bSH)HeГŖ{oxQ\P61CS!5 ;װ[Cw<LnvcDUW嗠#jJ[XIq7↡Doq.!9\_%)d=f ++;WZڟ% +iUо({ɠr`'g­L7ܶ/B^7e +endstream endobj 23 0 obj <>stream +nxQw٤DO]^oJ.D7C<*谰QwFԐz ˶ ;&.7sA^ /59Q>ЃgerET30֑Gkm!I@>k0AiGΙ8uP +'!q|mƽ^} +z[X4_GDۨ gDm܀05!Ţp/))c`}wM]cv%>hFw{ +Y찁ؾVs;l4ŌI5v +Nls@l1|hWvTwpZTKlSd:4"6+/>Rx2=3u("DSԘL%ƗQ -4/j +&"Vzb Qty-CAOw{V\W*8" +!Y^%=na +:A4sf҈P!skṂW¦; +WIoFivK%MJ}o/c@ Jͱw"'7੎yس +^W[Urk2Z7g3eNxQ- 9V +\EHEj8\gϵ~g =~)$V8fאY*/Øqtp[=V0a^1 ]闓:Bj.E w t)0>9,/gε)t_H*ߚAr9o!Q#aZGtuj +SmgT# Vrq>ѧ :72TA?𞤿eqslkc2S#@N Hh𳭾o2׫rSQ OcKBLeLCl=5tkq+ M 7]suĖ}>WvlbY9<#%CwT6zUԈk:';LSBi8X'͝~ |bűMQ#cZDiD^$ҫbVJ= +TOʏ f] +1OMLҩ:֢w&K..~e\9B*6h&zݐ1Ĺё;y5L=Xm_{ ka}gw0NlǯablԠPXdǵ\zDåE \?^ iI-A5%n1Msv쑑%%bڥw;{> +A>?IN~ fKb͵ ފƚ8W ʫ'_VH5'N[ sEx ++IVʮn$w$6!C"F2-A$]Uc*2T}ƱmRX[A;P *9|woGZKTu0nP[D<&ݻά!% ꖐwb\8tM\"Թ-8@D$ 4ٯ𣺮S-Tȏ*Z<Ž5h}䑒dG{8u0ѿK*Óza۝םGƮ_W@I y٠@iqs|?SEMsmB҃Z%T;y +xV +]r8<(4p /'_gg`i+]'mM6ݏж`HF9%+s7HT_i{dmo_fҢ* 芩*B^zK[ŦqΪY!(9ķYvS+0G"jSP=pګ;u?GO3vBG[15l[Վd .5#f7j"Ip7_YАHP;"Fb0Q uq +\6(ykM`7r(lxAZXщ NxXǤ>1.AHG]Hpۣax[Z"B|ih {8tb`P7Iæ*e[\yPӶPwsk +Ƈ1n{qwnmsȑŦGW'i)s2>:zS}U__{oPվYh52Q!%Q뮍֤Ȉh!59 GDTRt/=ٛn~3!GAt D M9,ĖxĨ,*2M7X22_3 +ʳM5? 5+<{1DMjk }<1ro{لg<x8PvڸI*^ "('E +:쐔J ܨw,jw%B[p0~~^E:"&6 +:LDD4G(ve^9+Q3w?¢nj֐#-n{a_m{xހ&_]GgĪr|s cx2 5BiT[[(@|rTK/oC@5\cTn{`쪺?ZfDYs [fiQ#!Fe/]g[vhXcjy6wDmjLxPH ڟok1Q=bbRMT_h6M;NԺ+ӏ0}ᰲ3 +R]@Anl`sD{ƿ+cͷmuds +N'ʻHH})Grͳ9bQְ3{--UW."SY? n-"a"o?+7^ ʿw_߶EtA. "WZHMT]YD| "!,ƴuNߞhhmŻL)}qȣeti?w9͔ ^B2?lꭿ﮼^}iL5(:֓: +͔k-IԘ +XSsM.Ӳlݳ:hp¹_?EԴ֢?휑eF/ڔ { +>1JL2R~#@CZ&-4n*8g50cO-W!JRxE@v-D>P6]bdQH9q~ QB~2vb +&ԷNq`m7Լ˞Rs ,]C.16!at-kcjD&!Ȅ-dj=*"##w֠%Ds/"c +6/D𣈜xYSu-Bk`s7Suemc] H5d}X^@oUJ&ױL*=U0VSZcu?oU^ MB}nr4~Z˰S)᧾8U>e'p~?@)M>Q[AF ăswت38%b`=|fuFW%؊15 6$갊*!h;^wS{ywBǫ{8ŽJqraulnpw4/Pvhz/9:%"Cr񅡧Lk[3~g +Z| +#ZBsZ"ӵUs1S-ƛoYwJ63,U6Xl~@Eհ?h4+x޵Xs`RR#TsH ryP$ƉOgF+( Y93+N-}/- +.FU7?P^180P [|o~8@\A<d7ےJ.쎖\TwGtUY~zɝq#Pc^E5L*3}caNl\PLov!_;fꮹg[62} +")IPy_k~VN$W7!5Wa+zXAPۚ8↎RtjHߔ꓏#'6=pֽNu~d6\`i ?eZg̃/?Z'}~-dTK[#ľ*H YkzcCE"kxYCЩTs :aĞ{5\Xʩ QKQnΠ^!};ӑ=L+V(iWx}o[@qek}(澳qڗ9W Jzke"z#TdЉ݄&e}5\6jr㟶ɶL q>)ѵ@-쒛s +C_ۋGD@33a: GGTڀ"sr)%]}BГ+#-i`3߶n ]kȬ WSN,LX)h E!DmI'F&g* TK2O8] EڃY &)}\~kuσmoɺ2F!q{e\َT;Cq}srrv't&נsmrkJX?΄+!y;^BEnZD:$U]2BjtߵAh>UTHʟ] l?9aqxr&"8O% x52qvmDžTHp#uy>Oͷ?Hس#_pMDN!ga/ɦ1s1e +h _N)t_mʾ@"rbcO2<e@ǡ:Fխ̯u?ߤ0,ŔǍl1;3OOތXUt{Bm:4Źyɮ UtNi9p1o#gh0_?;ŴWXoK_1_}LN4(ks4ѿ""G4=o}Uaά 6>,譎gWv6]@|] v`%e/ #fo._pA61)h>`0 aks^@hiPLWG%f!bήc+Q⪂7w-u$!ҿЫR7%&$diw4Yuh:(qG=xp\0auTce_:T2`}T83ϟZ,wVxFqƶ-•&qJA-@/Z^'eheѼ`zl8XzpomvLOhxIJhMaP2 ML_\2xsUҰ0A%VNnk; Or퇛,(9:@0w"H5n +T*+jnM`?WIƞ ϷGn.9+oaEQ=`v96pqsŤ0rDeO֑U|blX;&~ |o|@Y/g Qx#Mu,BT"T4 Zhiyꬺ%уsJnMc=;8b8אs}/.0 Oq + GUޠ܋<1/y|A97*Js"&ƤwI5%٤74&7t> ~y80Q9בA+r+[ԮoH嗜7Q"XNiH퉒O |ã*,]*űܜ ``̳om;{jj{WqI;p8_=Πy&R铽 \7 }ԇ{Ȝ ohDw=ձt.3\D C%?Yi_n \:? +P$C/`j̸3 R1Q3qS(}k_M{kpf +ܯE j_C}Y&U9RJ7u﫺7)! duBa7L(i45$cc"J6. ZӈdqK[s\.)U@^`m@[ٜS_9qSI32pA%ٜܽlI U1pT$a^FV<ޑdۛG;^ߜ6| 2,/-3A[p'$KBow _"JZT_Czdb2V񳌙NL-| SP-ZfTn- +k@^(XuRShS@0E5c:ԱMJ5UQ2>>8w)Lc5I!u䖶'Vr+o|\}߫7؅tqahKwg*.tƃ86Y!ֱpq-|bRpVdwp`+=i;9a='fTlWh$bD.yK@g4\&j5q. Wpv<:Fo +/Mkw-HǾFT%չ2 0a ;ujLq̄\*j~zR2 +Md:LFzdVܳZvIH.24jW{IsOƋ>ѳ1=5a-wb NL^o}ThB 6pJYK+ydiD@+ܢ yM+ zɇevwf뚎[#=%qOxޅYpţ$tUtqͱO%z+Q)1HXxqϧ$Tĸbqd)MlEHG%#EBLOv'R \GBt +9r/'z:&-#7,[E:֏@^,s`q}Rrs~8lo xo1ۄݰ7Īv{E)汬o CY_t5"X{Νud|[LZzgO-$'Leܣ؝˘< &ãdSZZ'ڥaCjhd=:* d\vکousWl_؆+.MT_M@0 B> . #v"zO9U7>d]pۣb>'rb-3-pXDYt&8cAyka|Hjŭ^}*>mwLlCUU?/:̷+ ɕA"|bF[;G9+Rӷ +ɭ"RXWҞs:?R= tWBI砊Kh{}2.< +MA|1 +<6\G\mxsD(k; y:f/xD-WtN+*j{܀oa=KT_Km谨k(:e`-jNFoGZf僰BVUzkR='ga/3Ӗ49-<[*L4޲L7:JP{!33I/'mZJ0VPovx Wǵ}cA9#F-%i/o’Rӱmk-𜠞ˏ3n9 N n]J ^wf(Ur2rgZh_ǗZJ|ې(%aG\cpOt_Eؖi-$;2lW(tJmj򈩓cgTj~qTMNh&PHC[x}QCgﱾUa4hX+ +*pJyxױ b_D(3%Uc7O9_WhE?. sm ]was5w㨜GrIiE[zFAKAn3I>ZCȺ/E戡g8-{go̲oIUO?$>9 %\U\mKݞ(|-%?xw*HUNPqyg𹉺FtF݀Yӿzc""PJ`~D +ΌiN"8Xc\d"5Oo{yc~ͫ]M?r2&)LAa2=և]׬3>RWw+(zl;6-TcJLy@E8]lz.mw 8 mT t7C˪p}Yc츷LrB Zvy\ӘT?eU=̵@=A x>׆t]o"؄)JO g;=1ˠ(rt= +8/Ö!;|sn{56M^k[OAC2̽tCO5`g~!]`5ru/p"/Mlc-7fokoױ?@ils@;R/}!-ubD\u3OUk]7Gbz/kK.MSCwkw=^m;YÏp/]&_ܙlzj{ӞuV_ŇeڸVRAFU=**bf2?#xgⲏdmtUT.%J/S*^+Z+^|QȪΪzmHK <\"bpz"J~wHNEUFrSFkJPF+4۝RX6:YcoָZAZ*:sg +>G*r)qGmI3oy?x^ּvg%9ċ&؈XHNJS"#N׌[!Dlh@Ʀ7uepk-Ϸ\f^]`Jd4"e Kfzl.)z*O zk(ȵ "V.?u7a N]ט`L^ 3#Jx&۴]bQbF.!Bsn?w54xXfBZWq ϏZ#˟I*Uty{FoMpilwl+Hhɠ'eq3TBJ>ճANowB ^Q~}Zmsڵ/ o;V̂/mcMf [_鐐GPB;r/6R I?wbtLrBwoPf:[jR(%tceA<6Bn)M+-ל +达{r;uˈ@#'W!i -WheJ.}AuR뙎<30^ <ǹzUbBTF*Йw%`kC}Lewji,VD:g-~k7+T~{MI8Vi{Gu7k8Ŕ홎1GK7FČ 3+ rj%BJXGܑbǴ'DDhTrT"cߛaf:֐ŋ_ %W1ǯܙE$O,4‰=1 q)bƷ4;.|F{)YlNH`盟u]ٟn{"JRW{4~k|bTuqݹ_InޫbZ.`Ss96 +uHGi]r5 ylŹG]~2*O,c~5TtODGV_ _-g)kwph +7N͡:5\d)\ _@po0YkG3>H"K2ao[A9 I +1*;7 =Z&qis_Pв>5<< 4uV۳,cU׶G[F˯Nu<j66Ӱ~5sXـXLN2$.&0i,v{ [_yU.;=yXfDql 2<9l2&9}]ޱo-!΂_-C#JBM\Q^!0zhUqrs#E+nLĽG?&3k./S>x1h++VcXGrGAL +V/v#o #_6b^}d,>z8x]\:$]/b.Y.VލQ'[l5ߐ?s1-URC"boRika-b6mxgU/=B-]$DJ +h AU'%%6)΂o6_lYAf3mgo6uw-ww@H{ @݃N}r<IZ Hl|壶!&fܴ7nM@}f`? r?$xep#G^^ݐެzH +9䢻=uG%ÐO!h.5AqbٛG!x͆]諿=%dF+y*Q4Wǩ~JN0pF%׿|sffŦر@pU/[;: %քqijAtm@IQ5('({fgԿrQ^ᜁ\eu~S]ża`PNJ/,`kvL UU7)"x{F2Ί_ +.j,`窍peay;~S-xuQ`ybo"=Lv#<gDQ@|Ls{>N1XSḋ0f~׋aZU-kL&qU0ɿٰe>^ťAXgGuĢ3?!gCl}: 9!XϾc,i)97%ʲ'^hѧyB|oK\sQ궽l^KpW e2i +ૈ-gfCܶFmtUx)YxJd!9Ux}NmZR[:Ȼ Gk E ;xΞ!!۰VXg?rC7äMdдkozXNqfX_(aTqs^vAV=%p~]x{ +z?F%:)A?ӟ|gߞn{¯y~{~:;2/hoWܕ_l|)}",Y3FBeV} $(2Cmظ-iIOT^b13OQOIo36l_!v0bSꚦ#sYz_ymFdD6r?V?]dmNՑn20M[Wwm, ;2kGmâ6|ɊReՏ*'3~V1a B5lz}ğe^[mGrw6jCRHRvk^|Ϝр_{tTJTBVд.q̲E{AdQ]0 BGUu%9.VMBO~퇤6ދ3Wl7"rF(lƔzxwšg;~T'֯IuRݢb&W. V^Kl@,h! zDMѹg"{;.pϵsFrqs%ǟxķIy">CئXvܺF;-Ɖ~D΢jYzkyģkXnqD_Ԡ 7JKltw 3bw} O SOZW3S{tXk0uٳAKʫnAUt{3s Θ:EgüV\@:_#)aA=;.1X5~3ib o? AC_ ?,vV [;36hZ'il{Q]s‚1~ԞŔxADaf K0 k+*keyy}N4̼T饴mze! 1L#{Q[A|&ܨ[`˗y5*i^ > &zJ$E}z9}a"_ԠQ@VLm'qɭ =mɸ57qنȟUb|a:>Ѓ0bS6 侇c_"s~sRKNOlyG YK:pҦ1&qg%l!{V{H#=`qpge}U2kƂ/xՎ/fK38e0 7Dhg#`F nL9b| 1! +*UaGq:qǃ/[5ayWvr AcTĂHONj9EEmePO3JveX-%,snGUm׬U4}B[0$oz?fl>ꡁ6} N?wi[6FmiR݂b@9{?HZҏ{hMfE#b{ *̐-j{F jNy 0@x{KyXuׁfelH;M1|CbH><&k~8\ɼd"lĽګoDT,QR#GP)O`R^䖦1O9ŮJ8!d_=لNŌK<'FspAy;X@I>XԴՈ -1!icb;'%u+/O}oA%ɵjՈ˽eA/[vw[&RQnrGaK`s> LӨM{k|IN0j{?y'39HE:Rw]e,ePJ ; ?*-he/(6jS0)#S.SQSO ^l1){!*`a&uM8ח ̰Vi~c[?\ԁWXԴ:+t^ڌYDYw{JufA30|raT~nņt$)*o uQBOAKe\$%$1º6дpg;/GAO9-FdgG7wHܿiḰ𬛑kgݣAA/(5)JcF/CDG?q~ q~#FFٳWOIy/m'c^ Iq|O-{ĈK<33PPy}_gy=_&) t N9Ȳgs]~Z *۱*+o-/ i~pWrtck[*|r`gûlƷ0%f [~x醳)/TՃ7לxܗniV]f~A%6|薞{Z\E$cA _6ҷ=҃"_!lbEݾ4{гZtAّqrٲ4ܟm|r!7~"~Q_"4 =gT Ny5nnO߶wlȼA\Bx8)$^r龦?jړO)Mo䨓V# [~lu ڣ6Xβ\VAOם,Ȧ?|Ӽ:mmXU/ 50Ҍ0mg,:1%#$HKmu<װjùKzBt& z2~Q"ύ{ĵ瀿UeSj|漍XAVfüV;"~s; +nDڢfҼ7JCLqysr咓Z7z]Ɗ%tL*Qc҃νΪ;*m&dsӊo/*zp?'?ɛs }цΝ53ؒ;iBXý-W-}ƻk(^UYWVrEx#eq*ޮyQeަaiéW +lƸ"o-s:xƪ Ue=9f57YGլb LKfGUO*]223s uV?H-e6^%2?v7m]wWcG.1;.{H ?=YpE?xU@MHI* _;^aBEbmJ;Q 'G.uDE-;iyJ,>POYe]F|\я+;=SLU+*gь/Yt ++>qr@&rJYkD͘ Fbȥu O-&z =11 dOiy=okV1&1®ի~L =n]ASUhڂH *l}7qFp붇(<ڸZl;c>MsO|'xɌ/X4Pʖ X匒l@ǁ=w ܼ޺J]}{3LCQj~YiHpSF2ɐ\Q?DaC2A0dgܬ +zوHp!r#JȫP ?~؃{jǘ6[mLВi %1y*cDm,(t}&,.\. k}=g!BzV匕Zni?,UhG]v-؂9dV|Nk^Il|w׻69Ƅ 5ޝ !0!H鶣=}ӎ(Ysf]aw!L{77}baD%2n NЂV`"l|2KVl^;%dGq9ՂX: Pg4Z@q6Z#c7;.vǜ[@uJi˨VA %FvhWG’ 6#r]~ݐKW5";Jo: .>nZpV Z2+>fGI]s͠2Dirѹ6-7o)~hMkw2A~>o{߹b`B>'az;@.p=vn AuwGk?Q7F-Ь ?it=e5yo^w"OܛFj_ 7gQQߜK&R0&OSbNՇmRQ|vP;.o}5#s>{AtW51U;lbLzZFm +D?@r{G}}H;jƯx+ +l=@h]vbkepjLeKqq{@܈S5TϛMHeRdZsZHb8&k k>mwg{XqJ;6.xCMXΎn %&9jg-UWlkCdyH53(_ 4u"I!(ȩ[nH)5 +︺/5;EŅ3:`}ĦOao#&X)#6oRN"~=]w1ʪ 0{teXMtIR6Mi-6jE֞$#>yK>6j\\(ya.+PIJQ^AXbZn[S@Ý=:LXHKl ` .:]eWqis..zօ3>$Q'lZQeM% p;HoXA6ncCٟlMycͩ.֬м3+PNA +lI =&"s@9mWr7yacZb!Z(gL?i~I00{\.aa2ϴ>WC_wÜ.1-IM#, _pX9?Fz|n㼝Q'f85$A zNm><͆Y}*F% ~&}0.dG0QKCJF~Pk٠ߺn.hQQ0I.X֒Xd7 aK +ĐdXeY9cc aIZjY Jw.j1}ϟwӧLE{1-&+&>~#O.}Q3ajR5dَ+AobjVz^ܟG7%Iڸ+` *R6fIm*/|(hGiMMI&O+ekc[y0)4`h|(R^iI|~ӛPEc%/t7 r:()~P!mfru=ԨUʘT1194aJm<^澮lS7;"/추K&Zy d"U-]-Ά_Jm?]8W_G^Y{V%w]mG6roV̓VPnabe^9lk߃|FUzmZXYdwy??LKm=Εt@*F*+X^u~ЀV0>ؙcg:Ik\\w]&sR`v+Cpw YuY|%Kr'ej0gS;~xp;Ē$EnvC:B$49pA7?•hӺK uyr~}ܑ̋T7b?U9~Y/R*(fiyjRG-zCx'cKgk[pݿWz7bBb~Ts35kνϠy, +@mtD$ٟ_bSMc3zpo"”*8Td6k@opA]]υ'񿦧6Rx]ɬ:9f1( ~{=M4U&4·T?'d{=Ҙ|sVa̫$r̭sb2ixCD_v8yNT`9}F +ߪϤu}-$]*hf.)Oc~uFĨ簘#w_[=Jt.e9ҐkшeDi( +3~9s1ȋWu9t ]q^A~T_Pw5W)܋Ǟy$)45xw]/:{DR̅[U1Gjs}tP"zJciDYLj4,^)`MBpEݧl=vF+bnz D yZqAwObyy9z ֡ccbuG U?f7.mRޖUs6uȘK*q}/_%d&K'-kuŊVoy<<}p䷿b~푤ΉSASz%} r* DlzmI T.9S|xl*ӷ +Әk{+QH, As;ZR2 +tju?uTx* "ћby'r*?%䉎?JFQy ׈Y/>+; +Ū`+n=V8HGN~dO_|6w,9u,{qbYB+zBf{ 2#$YDQ˫eVHk |)0]??Oax +}~,#oAj3ZD/7׊rȕMx](J{Vm*LvJ}k͐咹I!U9%>85f +%qkX,S0QNV.gftG` peek RS}jI7c7&sьqNltz |P,ʥ2&߅"E7;h/KJzR2}OeI~ D,{ᅳN*$[ 7vtww%=DFNzic]?HBKC}T=Dreׯy-?Zq'!p[7Hԍpu[!&i+ƫR4K5K+ь`\}CG.^+yqMdio(DqC2v&Ĝ eN7j\䨉WQ^ }nD:ho U"e2_ϤH8(:$Ĕ9zeG^:Gk)<Ʌ.l5v:~L#Tzz7̥jb'}u Z:<Ԓ>_r׆>k+M]->broy[2-tqʛ-T{QE8Ku:pwn{T(Q*>m.ӻ1Lj[q薽NޔԷ4ңZ b@!0S#` ֈ.$So׳BnqHqLfX\k'2f >ƯxTݵ.kP3(2 ՚SW﫚TK[BȎWm3\Pg17tؤZplRJYLHrLBZ/J).5g2蔳"E}ZG qY#Q:!/VXi>bBENv!&JvY/v vm#&ZQHMY^c/~"-QKicǻq1o]ǭذQ +rMOS!`h_`[$=KPרL[N&Gݟ6(U]Acg-Y;źÙnpΨGZ}T "Ur\ت50 %c6V#IgES%tۇ> oԋQ٠U+?&֧Љ cqבlr|YPR!w9OJyQ=JjGl}4I6k f#{PoUQ9!>gu+ WwچvZߣ]ȔE=5g7#KFFEVSdУ-LqT<%DïUuuVФ :gֈ o6g{>Avܨm7`Z \ƕpa/B_loe aRꢷ~ɰ/cM7lZ KԠg9:ΈLk{HZ Is(۟O+`Y5"sσ,98> =ùCTֲhUM0Jt٬4&oy6&V!lT+nQ 5wb%{ES훅;ƒ!xg׈PTkx#9Q&{͍[pa+\"B):bhZw0غ%{{U@W`z6c_cا)WoSLᆽ|AS7̻:z%gik{+V} nFޟl1i+Bä"iƄPʞ n?);Z>ٔ/C USŋmoS5@ϛ=/vY&"*>&,ckzEk^526i 95[NTjOo,qɦvTȮUjmM\CSWm;^xj[6=&!PUp),h{{ 8uɟ7;2| "-SG c-ZbzHSW{` A߆Yˊsŷŷw6I$ڠ}eZ%^y \l {|dжɁWyI%L}CnZoXb'5wk>$Wyf)Sײ5UngߛI^MOuWTLo6LᾦGS6baǂ/sg[ YT5_ր_Du1Iˣ Y}+򏟍-G!^x6t9;N +h _VW_VUw?zN6' MUc1H-b-) m_8>t fqG/^̻:&)<%N}EIC߅ЉtoO? ͉^ipNrÎ[oK*KG̔3#܌EeW%m{"pGGź|Yۚf[iϳn{|N;3B)@@i)m ₻$Zk{|`B:c%灏fPr`konϭ=4^KB{8ud b,p.stV_U}4̯vL*}rR}@ՃW{~)vx_6Q~ulfh)61 5 >Ls{kC!쓃IBKC8LFOٕweV*.(F "`nzSK*FG :P -ܣf]~8NL0 "YFall@+x^9ALKJ*~`x` !hZW5V,hx\TS~X}1Jfa`9Y9<:zMu4"֥/HyzupݽZvRc=8oz= Ќ)b[A*Y=N^ӿ,Ջ}dF([]0`du~`t-▪V_.&.5˭O5<&¥썓b{wJ;,9}iLqrQ7jNh`TS=*Lhŝ՗?#F_nSqØQ\Z'rG0;k ;ijRQ [zQxWq9CL7KIIz?CsއI/η%I^_Ar8+?ւ+6j=)^wszORSFareMQ +ƹIGљKEɲ8eݔnLҟ+5dWb$on_\`l7ޖ\+<mH~#ʷ{jZ~@GxèG;}7-eO D~ē1A)FO/;UD aHm{sBso̿-( 5lPk%!coҰXDWF\(/55_V4l".)LL 4T΃sm*|皀aUm~&"G~%}Aο\_{8YP?o4d|Vh^*㗭«5ɩg)vR7kZ>Y0$f7R[ڙ?wzJʸ!äs΀u0cc͙?ᢁ^ghήw=>*(~aYN5c# JRwo_,EL 6@h L㓳#԰ߧsNWlS LacXIӮHa\쿍0)AD ,W+`_@vkE7W;k}OyoMFDT:,nJ.W2QSS{Xo+2zFO+ڧ/3ύsϺUg+s3 W?8F09\$>C}mJ6ޗlb34:FՐyfMރv&>/J~4?ZQ4o*M ~ 9kRXP% ~?sQd>w v^Kmvpw蒢&[(2o9DqE7 hiC^5GJ+m=fm픠#yk֍h,$+8Zyyl4柳KY{j32x|B[C ify ҙ~JJSoPq_~+OnJ7xm)Qŭ~l+K/.hZΏRy>!.1‹?S~8KB81:/ +\f?%nwi ,[yoy2:\}_Q%Pm@m.8OD䉆YSr*7t vF'96INT=ZlϿ^xmz{Pg #v{鉖~lc캱fWɕw,.2-h_V_ LfJZPb 􊡭E%6)>M+\[[~gmuFgMӊZx *k(ҋŒ@dEcZ[,uAtb22-S!f{?Ij>vN0 cߠ s2BgIEi?)ETSHPw䛇rvi>#aϋNӔ\e<&lSJnƻʻ%w:W"s8n b]4:184DžM< 1_M9s./n=cE&LsKfY54?ϬtipfIC):;O|ܪosiIT[E/cS?^WTEJ!;77{xLxPCs9# .|UM6$_ӽ(xUuw} y؅7%6auKHͫ0Vֳh~iM;ZƁ_rkIH9:jIzSF<7x%R4xwUjKolCi[N9v~{-A@!D9e1begxQfil aꖲs_ڡv{8>N[(^r5K/˘⳽Q\n0&E+oIÍQ 9j`-lSSy0 +t0uy+kʺ_&ر? +~)VE#}*)9mg@.j3Ucos5u')Yrq Q~ok sگt>OvC9qɡwX)?HJ{Ía³joR[)ΐR'[}O,㕑&Σ! bP3*\O;!885Mz}`;AYﭺ7N0Jz(e"~}4O>kB_i4MMg_e]7O@t̥>x$"'M݀iZ>2nBOѭ#.[ƙ9^]ɇm#ӤT<''Z%蘕9{ +^sqL.=?t,%fuu)77c]&#XϬ6ȭ jcYjqC{,8?DIuH[ak~74g<'oEMiV0#c6,0/lSA+II9>eega]AJrP+@{ܓy,"㸘MH=z0"g#22`awJdoԤxzf))mR? e\G'fI:Q 'OkBޑIp<0k =Zhq)D(pN@ +,4Bֻ!G鏿2D.ɣ/_ Z2RKov_hd;%ʹdXp,ԭb$_dߓ7'\[LГ*ZR뻽4Kt+(RpEDUw7o‚)~ .BVti.ڛ OyUe%mʿ(o+ +wջ$؟_\9S*Vy^Dܔ4&'`q%zn~, Sμ&G q3X$iOI (9?\3U<βJĤdE9zm \&CE.,4E>Xҷ]k8UԝQrBh[,5ۏ~䜦fP˄2%V{QyKS5>o|0v7iZ6%@wʄH-:JLvNRMc8&=;7%|i(wK\]΋^=Jnq=} kg>߉7*0O`\sjeEG jOîr(DX+]C{E) pZ}yti&)*8~ zKQ_6WxZ#D炀(9^|Kxm*j,y!|}XQ,*bƁIa>ħ?T<¥NwۃW-5y5:'c_o}eMl;-:s3G юi|_IH;ђC=e"&:uԕ.}׻GYF Cb5.1S̟v!a& :buN0+Kj*)VJהb wao~A/G-Ĭuw_gO>2P< +Bn~z.|F.#et<_ͫ+EIlP՝Ӛ8f9@m+( =%*Th3#PG,ӴF,Ȏa\i( gd uB~xn]_$8^^fIYZxq3G:eak/U~-mIH65 Lm0}U{Tkw\s2j?eyC,:Zj|u +tMUˌ_ߔySdӠk=(NjtwRMǮilSJIs eE.^5"!/ 9S>txho#t1K˱K9w &2Q2˖{`w=Z.fvmՃۊVf9аjewAw(H); RE)DUq^阰⬺=QaAM#׺LxX{[uV+!Wqs'1bM.dSF:1Ryi1+B=ywo9# w>F _@o*xeH,)ͭ-VC*.655&řF*n`~-mymbT r35(\{ݭ7MygU?@ Ĕqz[u}[oCz?/)ҋ2No| +g{ÈABv?9u=&b>[ńj[믳OϷ3!RlWIv+9&)hO26J~iW~EV\cDs:YXe%$5UXtN]@ŭ1㕮[^ $ȣ\[Y酤~]]S)]CϚSr\_]KZ&>U6{u8Mc`Fяl3 묰J Oh#I)BV_b }Iu`F&ۤԓEâ h+.h.xکe'IJ^hypO\7@= +!iwtuo!$N%*㚀 |Jc$-h4ŪXy jm7_- y[1*,o%KFYG 8R]햡O{PhQы&&C +vQ+D("c ANkA.؛ۍ/Ovkf$n}ߥ .7O썔^wHQOVY@ϭN;fITjwя@'|٬s +fqh_K`APi 8ewuQڀeCޞo==JZ.H9{f(ge5N60CeS=Pr⢽ +z)f{cנj[ϾBi}w§Z"q==BD8f*-NmkK 4HRcLZy +(*Fߚ{]A6}:ܫ@C̫ G-J'{ݜ($#9N=zl'G?_B/Ys-i.Ǫ߱N[%a|LC/fiFjwβko* T=u O95 +s{P?ux(\U l +Tqi/r}{+t`Eˋ~}pUh,:k#&Re{BY[㌜.B%imԋCc83o}ы= bB'n \`U~44oLr(å~ +ث9pYhĩkj8Tuv/ғ{wo:atdC$.2ѾehE;ZzR.圷+)j_~ܮq9v5>ϦE6|Korr{Tu$Q\2luleCJ<1H;ԍqo=ADDck_>D!G*ΡnoۜiN5&EeB``=IBmv'[aq?L[ݣuw؋|`B= FL +uQ}pn~o i㔋9jkqizo+E}4*C{&nӓWT/_9$>q%ԡd6zORZ7_ۆv8.jx(hBGڲ-e7WFT0'[Z~wWp83mCO_M_= ~3?Dd%Z{ЈpAN֏ڗwJ5`юTZ=;liR+ڶ^\\S2\^`Cu<X} n=(iͻ`?5㝳ĂhY#[w 1O^n|Qp+}Z>huW*ؒ "؝3Z,}8CJ7B{z,_]EڟD9V[$Zv&`y4>Z\@O͓D8b=Vocȇu.9Ȭ-|ZcQ +4e >zKG+.ёN-"&;7CGy 6ϭ]fc22-djw>꣯7Eg",h[ܽ1jl 8ǫV[5tI%lvUy'agR&9UDёy]`ViC?7Y~%{.p:_N!!BUƅ8T= +CRqE#9}8~䙡e}ٶi|M&F7{!7p,2Fx= 6-{voU $:,pk^ y P!W85sw}0II$Em QblRLQR|j>.[%H{7_$]NV(Y>uϩni|n)?H)rI':ryPK-ܔqYc.vXxfrM\f^T&ts{ 1H5G|OG̲M2NV/;u׆;Yѣ,ڔ_g㿷L}XB/c(ɾ +2w CM +ثeVjQ˝0 j} 9cXdx۝VG9Ь=?BWInֿ ZNǍE>Z,:UJLsȅTXT"?rB`ŭW% ԳIx'[Z>o>TiH+v@D"^xd*"&ٹKoiZ+.(.?t'UcMIV☯ԍ?,_(pZ 3 +RpEL ]imU=uY=&{>!.fBmׇ|ȩgOwboҙqQߒchW o4yD| +6RG}ZbR'+Uy>֧cýjf껊R~i\12rs횣d5d-3$]ն4a VޙmȺO5OcFx4_+Ƕb}P +NoFe_qq*kmZg&_!_ʅ́;]ɺeԓv%swZ[aٯgAbyv_9,97lS1v9E3:[Ov*yU~=}($Z8,5өVH^-Tan9%XO)H'Hِ.̜νrj?4l]} #6)Ÿq^꠰(moʕ o`oKoZ$8nMQ^5f siIt8[G/YSgQ@2N?n4h)Ek/ MZ^p> fIYؗu)`]J6¦Bv$bMwD(Uf$Yg0~x۫g)~M蹶ZezܙjG- hz] &~ N%&yLxZ-1qɱIc#Տz!x7/gy5 *(9.9!4 * ]tR[x&w~ZQO,gCLsQFRzĻP7ojlb8'Wh7W}YVJFq2dMYSwrʮoWFEmֵTR^R JZIV8GIGlԇu>x[ |`d`[So%^A/9fy0̜;†}ġD-cW(Vr +¾vfyPqn%- ֥i9Ub7KaR æ9@%ԌYv@Ui:ҊI. zK^j[Q9doUuyk-(%A*v.994ԫ%;@1QvP9NS) Y}u8s4{<)';fY>.rk8;릉Vu>K D^Sb"Mӥ*$1\qrhY7)Ft",<"6קƦV|z2IC$s+Yp kR8\nn3bdhNeFz6ۭ&ut_|-ŭW>4MN+W(Y%)ǣuB豬˛Uaf)#W2B։UyYV=g" gWR \њn/V>ǩ`BlҩgL!L#m -=7 ߿zeӖ +*,,!x[ߡ| +5~ykG(&zclSP n>_-wDU&PKڛ'T,Gˍ3N%PFiU'lg^wc:$lGUVӏ y.HǬz円O E1pO%.܊F'tN14pF etT0?,_6|hh.05@[HIvs˜4<*gkOX9jWR\ۜ~(gʈۃ& !!g䃿GrJ&r9iw_u-f,7Ի ,e"8To0`<&iɫtڤM/?vYD $$lo}y ƫzuLѼd%ozaڳ|gR*q]{m/=KΪ+I> 8>~{Է%ḍ5:q`^@JGtTH{JZeV +qOc 02[|Mٔyfg]nzsy(ܣ^p<%ByrYvōfSC/ Uɭ0U~ 8vɆw~|r e]f,xqrS2t J 1i_BN8eWX,?l2;&CG5@4p'"/T+rRYBH +gWbM> )?E8* +4^)7\qh\qRy =Z$ţ}Xcb=J~SN/Hiv9>)_ub`%lu +7E.khn;̲FD E8+c9fO5ud%x~-9G+ݗS- XdU{3L |sT@Ze@lqhkz,tk8C˴}5ݧub{*rf!ZW+Zf{Z,)ŧ13 j(϶_wjLMdp>R\P gGz-gF  v{GC<8=ZhdCA+Udz~ f[)"m HHi9¶v B {l,8?Ŋ;KkSSY jcaG)}̒AJRcIvkU5iE(mjFojӋԒ}jtq:6, 75[f' ^-,7K,s 6y`'R|fwQvOA/ܕy/sKߪ~w-'-q:g㊗\,t(%e|f[MT-32~9z1ͽN Njrj/nC K,|2UaW3UQ'Ktg-Ӥ,e0y=,gal @K|j>GJH\*: |@J tα +AJ0yZ5&kA΃*plU-~b1i4=GȰN3lJ~徼%4JPN{*omB5Yz,Ȯh~®z1Sׅ3Լr^#0ϲKzgz5C^摁VUG"AA@:s^YlnvpOÄZ&9#dl $am_0022SUF -u=:ܫAM`qBSE/ +,z!ȓX{mӉf)9Ŧ}X>9Ymh +jכ;0'\꿯:;tj]'|ևXXNV"'dU?:ub$%'чrGsܣEty9H{ z.dlYq׶cX'bDWǨ G&trog9/ڛcc@ ZU1dI@4I I;C7ˮFU؜k\M˖XtźAu2tG hE.29T|X>h VR\vS%ƺ5\\ݫ4ۥd򠁋8^Q<r.Ms{1_Oςy5~[.~Hٓ3lmlKV{Ɓ9}?ܖKҧ7w`M7w?^Hױ K|c+/,?>~k9eYr{w-8}` ]S{f}zʷung߂s=;[}|S}+ھckjCzrk:;n~u̿wy[u~ƕG?^8鱾״L]}oѥsNoM{7|r>;㛺g<5nj~pH҉ח ^~'.Ds?jm If{dS +q~6寷okf13J^5ɞU.Yؖ{z]sc7οgWw|vYg7v[7Y?Mu?wgo.lw/<_]tq_ܽ}w+T⫋>»NoZzrc#OwmԃGmp/>^#~>yKojwi}#/o>_ȴ|qEU}g_[}0xj+Ԗj.-_O0Žͽ?o<7n?K_zݽk۳4r˒G/ydɇ^jtS./>X{(d(?|fNd9^_d'9g>Y#{yKv*n]Kgoڹ/αˉoos/u.3v"ޙƅ/퓷.?=ku+}3{qθמWV?|?zC}۞zxܡOdww<^ /5n}qNJV8m{ػ~>?B7 +;l/̾x~ʞzz~w>=>.7̦˻zg_3qn-Yx^|'7wuy;=s׺P{ryڲ$Zez^S<7V=_yr(}dg4|yޭgvǧw?#[3w,]thxʙK26ыswnho9ͽX~W'5~c)q蕾{?|ipk󫬵_L㭟)v/{lI_nUC6g:ai+isvcݼu~Owv},zL-ַmܩ}½~8[_nKo,^޻Ħ]9̎އO\=뉟~E? ~f3;r/\ܗvչ sm1s֥o6Z~rGߜ3; \EtL;cꉝw dl\pdCޏ_Ȇobu|1[Ƕ/|`v,8StNsqח.]}oj=qEPTs}S?ٗwi˻{6tPxk/Ɵɤɍ/]~v}뿼Ϗtv~y/^qrKCǐq՟Myu]w۴sV\8cp ݓ<5#r9~~E;elA;rp+}u~;C/,l]=xfc+{ad]ڷtɥ7 RzYs|%W=t]^ݗ|{ɢrt]΁m `^ 8CMFpZ7.:aE/K&_)>mvGk'wW;I^igSf x3oPCS>̱Kܼx]qbo{u^xZ?;obuG_D^܀+\ړ./\ܽ}枿w|ߴ{'^^vbغ$d)g7fx1e+Z39r<'WEGv-}nR-'_]sʮ[_K;/qrkg]ةMwܻj+?7?Y7 r]Gׯ|v_^t/ts`z+~rSW]買oXZ7.i]V}mviI;=w};w]vOןymy]w\7ĺY7=tٹTъw,=~6uM=si'V}嬲m\˙rgv{5_. _?-ŝ;?xq y_tsnK_=NŴ~ɴybۖt+泽g2տgʳ;?.%}6㩎m2-{.[ux}ۤ7}ߟ=8>yj[K?ٰ|7>~icϔ vOT:;f~n۟\3_]9>pqg]wfn;u-^:n3mxbեח/BӎloӾyKV-~/.@䧜ZwJ]ړz~W]Gֶ|t]~](Ήn}?OPC¿;mGB}{q=xߍﭹ/3?ۿlŽK{1SS<{ug}}Eϥ=+lY<]Ǘ='w/8}k߻ce7W>{k/˜XyuV׾#JtXR{ws>灏~럞޶hg{9תtટ|ѥ9j>ZE#3.+h/}Gn> >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >󏎑ϔu61ݟYw]{u'T}lky7/OestaYf͖l+u\RWr8=ސ׎?^c̔Zv5MoYͶA`X)?f5l6\òSݼʶqWAa9*mah7VwU;k{&L]Cjyw5rBasZ_Q ϛVz:tҿLC8}w亸67cIn5uJ-9~iwWc`!`?eS^Hǯt +^an?GӿWVzR7ߓ˨=WK?ʞt\H|@˪вi0lqE7;|6~Ҽ]yf̵KG.1,f'zT'G` %Ck'TUe7XT=Kl@W 7~zd=S3l _zh7Еd\ 3#pՒZQS a.He(dAMV%˺xfgTI%#ũ%IR\5ᇓsyU_$96H~+ɉcQi`lMK`uDjFQ]~մYۧmxF*j4.'l:]|[SR7/JgKIS7/hEZVS1|H5ؾ$ H)18no;,MEuKZ2lwrU(7fs XuAStUV7PhOgk,Uvh5c[}O֞tO ,Nf5pvǬu|_Hypzy{(ZZtJ.I-5@ +1[rb_fCZ虉YOzKzta@FMj(MK{=Z;V\Pyg% +()h~g +ࡒpICKFiIa$i[FtphQ`:ârFd7ĈjF007e#rFoD5;F l Fcaޕ럖΍d"'2.dr ܱAdr ZFFE\grfɕ-M@5h(\U[/3L-Wo !U!_zr6Y|٨ kt6=jlcm[h7I;U>"+9st1qHשTttczN+T(s*ۨ n䪏&h3_`'J5ơQmpdLFX*l]W}nnm!0=[#WJ[۷R 3ktݖ4ZNe= 5)#Pؠ;̈́%BP!gJ0kḜ:Whx|sU*q#B'nY2'wub\%I'/ؙ:Xd`u\>|0֣ +1PX0ХX{CGFcGrj1u}U\54YuURY:z!EW0lMibpKrmGkh'͛#ߓy畉r}@#; FIxI}l*2>jX]nkAطaD5QcP/?i|V1#md&U^%4b<(`..V{..VhƵŚ,C}OQ۸A|QfM U7j4i\RI,.b1%UW[zJ\4ׯ_k8)=[zW@o0U2}9 H_jg#cV +]*I>rc D>8DI :lamePN#J/_ޖ+f5J%fYM{ݘ{0I=#qSX 'ߌ)o4K7cSÈMI7_@-WI7c3 +nj1X2Ϟ8oƴ_˜q޲lUL +. +P945idښ_IiӺ1M>Sz(Oj&G% zzM Ժ᠉׍dni+ls4oJgz +k6 َ\O_fJ<Ǒ?N_ֽ ߥtg@Q ^cf-^3/ff-ïշmIIMN͞c}&jIYvA[xauI}1A[aKn)TOa^hg"u6^5FMe4[o,7T_,r K.3C7\ٞjr73l@}q}#0L4 L^i&9@=մm>d6;imו@Mm2fVANUF^2f{)WTv`Lw05SC/_h9bj@^xꦧ dW5Xf +siRo-,GMS 0,ٲo2<ױSCa]=W̨j~jTĘU먇u P[qۖw<o9 դ%TMhr[u>kfZ.yPiPoZw|۰}\.28ZIMoZ!h0TEmꋅI)R]QBij=H\N&EQa6˵B4bF[-"ǵз<6^q8&EGerbՠEdf5늸÷lYQP"1Ӵm̎zm^Cm"E5JP}Q/0C>!1IR&5 SMUkn@'\ 6Q]8l_P>cU6լa{j0{+"oEL slEc1b*Av8BA-Ig$Ƒ\l9j#nP LzjڲH,8!&yv!$5XJ# su FJ 3?Y8:$4|3Hv.YxiA;XTj${-ahXx0v}R/bẺ"f(}^h_zVH:S#5acɔ|21Vp+MdA.~SB): D`.mM CM| ,=hYؘ'EF d8uU99Ǎ=|ЎcCa'(6Gr=t=Z{S] ݒN~To .jѷ|:$*^)˨a &< @/<0e+FpS8Br\uoa PLE'LW(r4E1Szusja1'XuPW*g)~!j(GuGmjyUP).1tKl? ԠWzWP, OnPn+%և {bV`D0HFVjh1XǖQˁIKf_ MI5\Fd K_Ʀe$UͰbu36)kk.h H2el/#$8bz<[1T+կA⭁! $Y^яMUkh|>\Qꘅh48lCAB7*Z1ؐ3Baù˔OISR +nwk9jžKkFAє7lZKBOª`z_kٰ=j6SkJ|@m>)kT;JN(Ev`d20~] `!a@+!U=AY'7"a#E=Π +ʰEkΞ bgR]29MxҸDDc&d4Jh-F}m.+5EJz۰X 1a۠@(>(|+3T0 6݄TQӂ_Hly_p(,TS,Yu U & sybU9Cbd性J +_ +AY7͚`n/nڡ,CEQө=`FloUc8Ufఇp4"D-y c|0#zhuӉSRۅ ̴z3po9/u0Ζj(peBP`ExS,CvA/񎌤V9݆q˕2&Ϙ.?Ӏ[ʠdBa0hx茦h?LJ nDȲk XQjG.QojiYC{U{`UUS_M42Y]ja-@cEB -K$C[,(,mXqܷBDe +0~P{ eL`wEmܥ-mCaړj+nA1p_~/ mϩD Eh~lMtz5U8sIߘObl^*fbz3%qg}C!L-ɳ,;W;ޅTap G?́;HZ.uVxqk*9Ja o7MBSV /$hk +MϮ{.J}Q؄]`URa͵^0F:ȋb^ +z.%"5,"Qȅ:3XVX sǝwzM!ģAP67;VH_-OK8nޫ^}oE_0fiG'nӣ+7"j@/W}2*}J (YP+55q;zXׁUz,ԮQe2TO}hg|R ̀D^~8Ǡ51—tC5[^$vG0JD02U<, -:) j>wTBCKYjhĘA3)P7)E0A)pR+עEM7t`RQ9)T@Ƣؼ +iS_NFg}(v(k3\񶋮#^ЛpJW~ɻh&S;iM".ţK!uP@E+|c,:~QVAX1.@҉ѲBGM@EA,SLEJGf^n[=[L@b~u#S:#)HW{(?:OrŊzv\Kq5 [BTNJ[  +vIVCg2cP<=2F#"'0 ʹxFb3\qA"1HW,`rRʂƃ̃bŢ+_! R4 XX8U#F/+dtOa6(%H瓣\N̖EG:JҋBp*h[׊ 7 –EsEWD3?c}<ƟCTb +@"m ]L>ipPXK XZ3:[o4G)5TRKų2?bHaqPB؅xyPUQu<''` n;bA{d/ +BSA-n[-kB:Rb>=fo!S/NBυ:aHETV!\SM7EhI-#Y>bF4:[_"1lAG| H#OZ Gv#ũE#l -IU,nFK8^#@ +hTBb8>K!|%{,>mo)RgQַaM=N,kʂ2LD" I @lCzjĖ:CU[MP !4: @-T6_<'H-"'h'ڄ]D!2vca4--iD2F`ubkObVPH%uTbT0%a$n]K9ñ1DWD$xAW~UexygI璑6DZ:C©eMe`c@'^AS駂ɰe8ZM+w܍`0`&a0┎b4(ETkb+b +xJ Ò c63P5( !-"V!):, . bg:`4f@yE]JpD7E(UJF4kTMb0AJ"H8|B hD;fjρ(mG.]W 1yE **VWAM+CSǛ M#%#n񅍭&_DB4=1̒FĀMЧZ(]IׅF7h=X +54mA<:(q0 MHBHh7LC~d3U: DXfrp-)ezI|1uG@FP3W"ѰР\ +b3Ck0Ba$3+ *{ X7+SGgjN1aj)idn~I1S +jxQ+( ;>Y׫&ګRmLmD'M!]ꈼMױB::` !PܘN)[{_-X\ RGAyĊgg ?A-#8.+ѵT"S:8Q#IbP؍F*>3 Ng|+_4BpdD&țYpe8!B& AmKV$(ѹBxd O@7H8/5hh{.ȂE.6]FQ(\::R+qDa+ 1hK+7}Q$dƧ #xC!, 4( 9=-`{,pr0` -R9W#`\b7'Um:/8!_ +G[PL)7>emڄ(J<z 19~ B $|NC\B =8鵮.-+Xe(0??s퀞> a*4gj`c`4CU`*oėhkhИwU*K1$Q(rQ ޸Vq R&^ѠRGpTϩ  T?2Td(J$InB[66irTG.Tv +Q:>F[0Awи@ze"U 5iPQY2v[ߍtT6.nXK"1l8UxQb~HHiYE?CK5KmQF@ A7Q ١yZl͗P.V@]sJp(dfWzE)6CԄH˔4:'d"& +CS-tIqe" + + +:xdb2Gl(%«9RE)iXzoKZ{иM#\6Ŝnl +#wv,%M{%7FW9C7Fu]E6&/Y/LbX]=uI7`<2$Yk L/Jk:YvЕW7+ڑJ1&N Jt&^K锶{5ý5Ԣĝcjx(. -YܛʶۋWbl3[zH%ceQխ"%!$.k ]gL[Hm)#; mPSt)1Z+Eh潺;݈;Trw$zr4:[C^e&\枖YTzktYa^{c&ȽZr]d4Fq* Jvq[ZysĆX;c<հLI7Zr%L ڦfR臢u]X|Op/o'addVk +du'[eM:/1 7F)mHjh꼪֒ -s[LK2W,[\H3S߯wBy桜2 jꊼ靜ϵәlj0r}rZTGuu|MkbFM{XK0a3=p;5C^t[0#!`0Nl +Eq<Ѝ@3t#kUeO(9gSITpX0&:E}?w4:%NgLzЖ|W(A'J BXrףN+C4%El A}W + P)eF!4YaԀ-z*Y8C&P̍T(0!Hiզbl@5*&TT||_bjKp9K1 da>[oD8.E([yRʓ nHUhm?|/ *ִt)2O^5вm +V$]jr9;59:%@gcItxAj 5pKE|LyD@~L]҃%,q4xJΗzTP׻ &)LfDG/%8r3g+"Z4/ 02Gaړ?#.ajgڞt&4k4G 6zGϵ%mƃJ a ?r,.Ybrl|(ݬAtNjo*x0 07!IqkU)3T.ql7/9M.Jj'oke' +endstream endobj 24 0 obj <>stream + +;p&%Q<#uQ>E>B0DU!5 &l(W=5,؁y h%]u}h5١u2C1ž4=Agp1t=C = {.Ocʁ-p8t| . Ĝ~30 Ր,q(A'I0PjMO#Bd;r6&L[uG2U&Fw«AtL`=83`lԕT`a;KlRC̈́,7!7EEK.E$ɝWejȞ#5ZPRl6 2DBTÄ@v-Hh& %)9p݁YF(ҵjM!=%K(G }P!w9@yܘv37 6%9+ls{}Y6iZ~brByGl -Gn,WW !SCU*$G Ap, ͌|>ؤLE(lC8ڎ(XJ+ɍKe~C+|V^:ɖJFmZ-Ex4Y yF7$? .Ј"*L ^e~wHeDM_<Σ@#שBhQ uZUGP3cp iMaL,XT<|P! +3Kޓmj LA2bF +mhߑMl0xD3GD0(ꆠ`EL."t%_4%s]tیb#Z +0Eq#هC+?,++?reA|1/ZO/aRf-[JQ͟DߌJ81>0̍f*sH/e6sU/4sڜА +EHbQusƈv@ + pJz/Tçsq'-ꨄgJV72pI觤.엠Ip#WrD~5hx\\~ȒA&7 ($I,h'j!R\&Nj&%C8”u%VX06@mTQ@#\cfjf4#.*j}.oF U]f8wQ08Ẹ Cu(;gӻXVsNp"`ռR-Dh( +QNy YS +@'. Sjm= lH  RЧ#UPL$g#УY+Xf]d[!D!޶(RS'ڇ~`#)fGź^CC\3 ++(sr ãF ~i#rR5]Oߌ߹:<tU9J-f"2 G*VXCNĕR>L? 6se}6=^ +@#C(jbN)>hq0Bӗ2"Y?cigbL)_ ,+$Ge{(m>4RJ" d7968W꒳-TKQ$ +o7XCoDO"WÓ8]b~A18Jne@ 2hsIvH>mA=%7@fSlQ&)&c E>+ $.l_أ;< 9prp3]8SMJG{erP]=dyۂWBKw-񘄧npeVRV,GqeaZ+!~:Eo F2x+M}0c Fz[<~P`.<1s-E񵮐ɀ-&_-QeP tAOVFPPl/MHWdjd*>^|8}iQUz#޹x~j 9eG.y.nbDҷkr'BTCHAA Jr4C@ *RxT:[RrM w8m|5ؖ纔d ;yKZ*7TxUE-.-"$Lŗ!B!lٻZtY_tK[j7O'aX%B}D7HQ=cZMzS{=mto6՝oސ.~ǘCۗ 3Fp+/ۑ/+ HfbXkdž<@yr)17ݗMwMNrKӻrL+qg!vOv~qB>iٮiB{6/{ 8T^s@-W>a=T@w';d_ ]6ףS}BF"E )iG*X릦MoHxMZD2f(/BVa_4a{zٶTG!ݖ*s8A!t (SbCfc}>;Q+fA5aęk-_ Zjnlp=W/zarڷD /+:܃kG4z9fq„F0d#l^d/晊L@OTh"W@+Jd 4UM8{ +gm-jCv37clNZ;%5SZȄcoF4K0zkncLJ~(p Jhc*H6g#ډn~gռ +EQ{LRAÐe=ƨm\)5PNy{ǰo Fiؗ4U%QwQ,YXܫ%bhW-R+e;' 1)~J)MKZFTGi9V-LoOh6LQ;5P#@Xu=qΧ&_;֙v22^Der7CUurԍ5ur&C5'3BRUeگ)YY]t[!71lW8Fx*$Y`69s؅ ,ktı@.Q4t;r5HϷB*MD&>XO69jZħF^nf~Z? + rcȔ +;&Z2JR2F4c">΅ +ȕ,M$ǢIl;cjI\sB`Օ/onA;cLy鹮ܯd[:uad&mHUdC65vG\=/- +[-=f9: iRQ}; z +B +oㄡq1{#Y?3 )Rӑ0Vܦ3⮯y0ó&Vq=+yA +:(:C @t3uMRx%1B(F#xPHtj,ǬWC2Կg2]vʢ MX!$Q`گ13/Cpgq"\I&y4!Hb#ph<t3FLͦTCͣÈtjb&!.I3t1wd(%YD"V h1ŠOsE#5#"pPXzk!M%VQӧאFy9B@V|mL1uq5d!h6\)aʃ$$ +]|zfh3WTbr(̩\ +3,+&s\ +<#n5\!j9.8a@HQ'yX}P-;z;كluZM`=ls*ˁBoJoY!!%"w# P* xTP#%I;Z,Ae!<_CXf-[d*bv@c.AVt&#T(&4l^c5eUH'iaFF|]| Y03t m21Ss)YI.s!X7gm2LQ;^]&Ibz,%Ŕ+(PG:REjs7ٟoR21/7$0U9: %wc"UHV-͘=hrD۔Bz<E@~Ot^XϤveG;#!}:]nq8CFI\'G/3Ȭz(.UQޢMZD j +D_RMdR'sy.{RNBڒl +nA ŊMoc#ZyFJCyrC_ 4yt4E9CG)Ʊ3毫@q)=KՙXDÑ3]a\~тiT ,99TEaå' E1Z+M(GMáxG BNWZkhteLg<\`.)dTAf#9E Lˡ>3a!=d/)lsXp5Z}C]:^aD^>ZD2yhB˓%\S,0Q(n3xY*& @6~Իp>34$\!,8wuUGj\(#Alʋ6LF$+49V8cX jDn| r-_C]rG/Lj(>`f1X݉ iN!@!rj\v c48L@3PhO6h $RdNJ . \3)X4lē5eJhu.]D5 +qԋ:I3@dgVt-r)UW/e u@3Q2YV`$LbѕӠ&MW3nV1Ӵ#JDm hW6qP=$go(łp6xT:d/*hblVL0X@J +DD%_Lg6k 8dF"ESICш\L% T)2}p3o%,(MR{tn$]}_P4YR|* FЧSdrn,m?|>Ӓks/qQ4kǤ/;]ۍƢk?P9S;eFVΑ"$JI1~y3?vBށ=}TmB2L5Dz$ Xe`=T*`huqt&z8DQ N ob~n DX4 S>dps LdqH֤Nx PX:\L 'l4p\"N,)Uag_sƯ.4N Uc K%w-$J`BM.؃63 bqꑌs,f@d{8R$b +}ƆzЕɭrgh ؄p!Xq)40 6G*!&(b>~c'h+ ʤ~&"[jr RדA9tZz9h_OŇYVg@5- 6}\ICvHYTN3xa_SpE1"wZ&]cM ~NM}Ll:AYpPFݷq4ڴqV1 m$Ng Bw-ҸYpݷq4K jJ *7}w(ui=\gߖ]hYZKi)E[o4%-o>jbRc^AU[AuPxR'q_I {6bK;\\/nCoJkL=;&bW>8<0=< + K rLZ+eV갪8\A&܌*3HcJq6h\%my ˦56d&7ciDf,`(5M8goFKPⓅ[WHcN!`>V<̥ +…DaėLQ +Op'$\'[ Q^ ۋ/d?[0tp;5,p9O6q\3Դț#j9XQiâwEq`eU% +Z4hH*ˡ:1XZ8@XAA0 "X a I #_ɭp]Z<dKkBv&ܿ ;P<lszA^ ,#\.͑+xaQȝɖbD?j C4W`C;5drj2<5{ul\9st[S>2\FͲIs"`XTm+oI^1(da(Sy +m"Br;0,Q5A$4Z+6}ekT'a[Ĥ1'FC 5Vr]:7Al_43qP@\7 ,[&}e +y8;#(~8ԉA:Q;r396.ѐzo$Z)ALJW@.[4bw7Ζ6F.i٦qJS.הjI{C^"o RO LSy!8ihZc`S"]!c"4'稁@R4*r8 3j 0c~ht"spY>YSڔ1)x!/8~B!#-E"gq7M6", !Vʠ +qsЪE +Wi -)o$E<ݡf 2}&%,i[4x] ƔzQP;Iq>Ɖp55i72R/zCExE@!OKf{CH _ GI2H.JeEEnu IL˓DE%kǑT"-zRڒ`ͬae‚ e"XT}gGu=ZӶ +^>LTxQHƹ /,x# ?syD8T$% rF @ +3D(<4Jc`D p ; cmtƌ 84C2^}#ހ p`N !MXjz衯r$JC @Erd1޼$YMD en|t!.sy #56<w-/3G,1[>& Oͫb,_*Ҡydt _“Ҡ%йG.S04:+$@by|?TС(f1%DL ߪjEc1%>i@A!K1%@NXL@DcJXZS <^yzԵIZA"ISJ8h q\R'ͱyrXI4>=9D5[U=`Mv櫯; 17dږI‚J;Sz{*Tق! T;hHJT p bME I&B e{b͙SUb›h?[%CX4fgr<CN~HV_ +3d_H]pPu&<hAa6[9Ve‰iDo$ u\&t֧kR9I)g6#RpetbU!ˠ|}\Ca(}EJO h9I18f*ꚯtaCd,a :05 %##E$ѹ*-bc U L d‘w-O˜}KAi$/C9LEHQu_E$%XVZ` $0(.DA[4-#,[1#G`MGF#}R> J _z' lgP0req$ +B$,V!Wxt3Bpq\N|uYԜPwE`-i@ xnA 0@(gY& G=f'eqѐVXUSfيUƴ'\/rư{NLGV^i҇s0`(7  W`/+yD^kdZp0:W YgքNx0媤 /ٓa3/N y([$x;Vڧ&9cJwmOb $LOC9 +4pޅa5Q$c1;SĠ2FԔ(J(̘Agk0w"-iE}ё +A" g\ Iw`(Og XBkئ. ;`^yRAy2qB +tr1~UN=J2LPڤwV4)tdϦc(lz'4jTՅw%iqh@; 1$%CA&l܁W7̝M1@!CZ鿔G&k-y=F DA?[lG Cv1(E/(kzaMe{Vv +>`ፆ=&8-bN|ripO)XP"$օ_0sFc e-S6RUٵMΛF`K""(p$ +~J*x8tABP*l"Lg\ i$m +san|: MHMh 6Mt|k 0Tg'33%1wmaz3+ÎHG)ʢ)RkԶ-Fro)OdI]P]P53Tv#b&M&'|Ve5䗒ELIkβ(+1C[:Խ.Id@3P, a(8!@b` ,>F B VÄΕ3X*1aY'?ʊ6 *(WB!#iWe`Rr\,s0cD!@529B'aERĤNiOGZaSa{,L8lYýw +&: +rމ..LƠ2BLpt7q(|+S /ǚ30e'+"YRȋTJ2|f +Hmb?)G"lr/۳=EGmr2d\2GQ#v[a;*@E0 5d$'W+FA&ǡGQnӫ[tm]|rp 9ۣ.7mzQnSCUSHۘ=O. RA&%UnwOEܢ73ܦz`\27FqLmr'b niRJl&J613&? .l0Tc#jө8vءx]v4GqԹ⋺)0{I{ `0@=Ρ&~[ӻL3YUˢ۝[qJq~Gؠy9{D&q`&mvŵM-:j:!}LT 5}Sf.6{7S"HJXo1%^/ ~Ju4[]ċd.'K`HN>P~}gQa(x9js38ymHTd3*CM/r(YF5k%^QlGyQ)%hr<Ýje\,fj#9TމBRQ3D)䜇._D5Jd +(($6nH$U\7ԌBcQ &= ŧ$ҁOPHCy1#elZr}W<0˗tY/B*͑!}^\$7]ЋezyL[SpC×6F ,|iv+E9HB/fK6+9נdPA̚ 6C; یtBݦk* `ͩ\3kGJ' %P@fP.TުʬpTwNל,3ƒq- +u  N~a>G)6&~SJ( %CyBnk\r6yT8hQ+gj]FSR/r|RoKөG(Vգ +}J(!85r-Oh[D- p(ĠHtUwF4rޮ)k+K@oMD-xR@ (4XڭT,nvP$NC YI6EerH+5Lb*zIhE5ҘPfiuKP%nA"`4NBҴ +%єdW=STXggYdϲz%KQ-(CӇNsQ$E%/4zŇ3O +5GՃc0p?Orх)3߲ɾeҳ/coOΠVi !mf?Fdԝ*:oC"4P<YJa@!5 ϊqa)7S~zD03sz\IKS lB${ M'0fI2FezX;ӈ5ND;bKcL<y Hu"^|O,üaԯ)+ }IԶ3#7T:QQy}=6>~-%32 H* +GNh4Dǒ4^#Šԑb]MϢEmh)U&-G։Ddtr0i9]8 /Ϛ^>kE=˝"&Tf +[XiJEz7 b7.{F]]~ϛL* +5 (4@ q!W#׳iE%гH8i/9!6_ +5Èؐ)DN2զ !XG/OBhiS#9R_(/{LmԿL71#%m\A߉6>XdɛP0 +%j1$&"*4gТ2=lYh 0PT{&h!@PhSu|4|JG"qġDҽG4BuӦlxde(aa,F!'v Rm AS7 @cWK#oPS=ǵI*7I >no=pcÃKhDߍO?$gD?v?Pm){-w]F%R3'ĢIZBc۪=vj]ѱbjX +\d"ݤ-3p͸?wȏC^~nﻍ>hE%?bd[v?3NZTRz'5RߚVf0ehJ-8afk8]CsN.nӪ*Gj98*jzZ~]FoAm?h=oZ^z.2j%hb_&RgT\++U/~ZQxa._#k] /TA*궟S:VjU ZS>\V>Jj=FOeZFRMצf\̇Lи'j꽪*R{_K e^ֈDQoV@H7VYu/8HzU*W;Aj.k;n+l5ZA]}i ؼ6lYB;&X%J1sn +R i UHI|T+USKK=JOR!\z ,CAZJ3DD &trRͻl ZTa[x+Vx?"Fj>uRނJʙO .8 <_]g~ǿII +:)=4`f$Cxc&Ot)$L{\6smd4U0<#]m3eJ+EL4N;)sHSj| S&:Gk2kQ<;>k55|JTH"0-3 jSh4NFv,mn3XmKNlSGV5h TkѪU&AmtriJ +RĦҚf4|a 34GE2m_/)'vSW7Z vH.=!)_JEwY06{|l)JbZF+F=acZ>-'+h &W6bv,* ~Z/+?C.>h}ZC6ݷ\Y GxNFi!<r :Vؚᚤ[zȪk'$o$H7V#`?ED02Ɨ4{ +|?'G +S`Ҟmy:~^O6y-\ž'{؟,͗t815 Qۀb:\T12迀iȰ笰vn1_$Ef.Z*cnT6[!f @J0rEpנQ<sORa*chu 5IeĻijtɻGvkt`]Y[ 6 "M?9\wRlR'꟎@ \Jz,u;7D85kB"Dc p؟>Jet C^a>䐝F@:HzN2+RAmҨ8'ݧ "aJݺQ>"TWڡ&Ux3ᨫQh}v-k/=l6ex2}Y 7|M |ҤKb=5x (gH--8m+bZεy6sDst{ݼ@7 ۤxD?HyfQiA'4WE<2046 K-*,7 +%1c&ru6!Mtg糵l+EurS1#%i†-#@*9r1[K(fajMVWV/j`o R#0paK-lMSn۲ lh]@GSqk-@y +4tn8XM6OΆA6fT˻t5ؤ!`x]>GA̦@jIJPJ+z)$4W*b?yVRˋ)%է::|mz Yt',8cQ*\"*d[3FU(Ҟe)KŔ%ܦS qɸ:1p!3i2V43\RO.%MFzł]FکկB#U o*nXqrL*MFT$IgH* 6*U͡PCg +e{3mDlH%q _3^N '5?u-UZ0FAkg:UUA) vjf,:)ǡP)\@\ZA4yz2N ^fl?%+;_ bjZ+u:C_YGK]KNHZi)v 'V{Q:T.TC; ֤hz".PBQ8]rbF=iDkkPh$oGu?>duqupDY;$.a) Nž9mX{m?}pvZq1k; AexiMw_\d}@^>v]s 5{OR^ǘmuO5Nj:\YjT֭є9~gH&5ljVb굎LFkPnihC4`C*j!AhEW2VZ_q['UT;ja_wLM3Ε_K#1D4ASi_1˵L+(88!87:+(KݚGBꃖr=f‘` ZRD,}9he"_+ձR?Wˈ30n!uOegyۚ4àv8$7U<J=wuz7g65-gD(CBMҐ:N O4kEm{ NJƆH,$9: X2U&ڜ}*qwx(fUB=n4Ct*}<ʡ~q&q)e oAexւV=WqEc+<>}T[Goo!HaY1}OgYzdkuJhe+y@WDRhuJr00e +-}(VF=#g*cٞk*.`1xy䲖k!r,eJZMbؓҚ *vk5i*>#7#H`֪ Նv-' qSԑj +i3%֦ݛ"$)_<&M_qNEu[(^1 / *G9̌G5J2X#FF}C#n!BR}Aķ(jXneTM+hm敲c]GT)ݸ;BskHJX) X`bTɂ@Wo=P !2 q}@|بwڇ7 ;n;JdlߠRz֛5/*S@szv,PzJI1,-z%XmYgVL +_?a9Hxс ܨW]C8@*Wpz?4$QdTkj4&<p# +SXZI!WRZU<ѰߐeXs;U#ʳOЧo8-sLq`&xzDOLtPoLuxsT7J4贰nQe\:Q;TP'6R^eU{_' + Ldx>?%ԐUA ocB49(Δnqpռ7^o(o7BVx "91H6?#pTUIc򫕚~5!W돍Cz;cÅ:Hq +_|dy|7rc8;i*#^w90xI2|{aJP+_!#-q$7tÇ#'P 1F 86f+kC6j)ѰI7<_XRy+1BjjM$ԙPI}Uv>*èH}C"?WI&38xm+,:1u _t;%o0e7SಝFjU[CJ[*;!M~@/mRb=&̽&+ \CN-lV`jR ]Ъ+72S\B<€B8rVNL-?-cJNRZK9epLZI bn{W5ͤ]wM,O$3XkנRd{7g/}6/)vih暆e3"z+>p=*}xO(6]\!fҕ~I(: b_ ezloz*C'=YZ.֪$ N">{, iuRFlbd^WF5f~kZ@Zn" >#OVqJ_v/J{ SV3dژ5+%ՆG"AXFN?TֻzTbb@lF9hn!\ d/~@ϥJ +z_T/~i"sLa;~YWqmwbqE[Iw!L< )<Ԃ\H-/2wF ЛpCoAm?h2W5x`G~hZ~x\o=vF7.z*5J$Kd$w1!}'2m?_qMDPf~ VSs5h"ی\JN3U&-^ EZ+RӕX}WW|:N+z[U T {QpU|cZZLRrphx9ͦ:A Nlଙ]<}SiR,9PkNwPud*]6to +eԄz-~KYCE',&꥙҇N(*T yt?hY63WVMq*GĮx;žb((NTD˝+5Ib5"H2p@CS0o ]fljCmV-7~d~ fL\E4D6Z*ӏ#DHV\(łlWH:Ro{X~Ovձg< #b=)}}v@#1Qb}QJ}=V _OmV@$5ԱӴOaKTdۋ?G +m{/~Cpڐ+ d^I̴gfO5%z! yEgd !odK7eW?)|ֿ΂Q{1A+J1vhMVe9 (".&Q1rܼevtlQnsӳ&j_,-O,gZky>UUKsQpFNWvՅݵV Ʈ7[ֈ/Ymtm6=4lyPd6v֖(W]^)鉧H_; ԡ/-Mֺͼ5vڙͣ̊3-ѳKm uԶb[uG:sK&*[Y[z-ެ-o3ٱnqr|C?ޜZ|1=|Yy_[Z8# AsO k=Yy/:yE/3B>=[wK1s|&e~f-7qRӭrUg +;Ϥk]/BvN̵fw<ŭgu,ެe剷yzG3*o3 :oj"̹{fjjnY] 5wbgl-4rVm|n~YqsۙՂ0rДV,WΙsPǨZɾN9s@O+;~3/-f.[VF{޴tV&s{Қqal" +>fVV +F~i6tXyr GڬT*Ňp#O.R0{(t}j9K9s?oJѬprdrQ}f u.B/eN9Z白b.W}qƞipu+ ѡwۙ.*; d `43w2+-w3[ntr!J`qbMiؓq׊k&R1hdzv&o"W^\|V]ݖt4\/N>n315zDFbAqr9{v_ 3;颠W.l +LkhwɍL垞 mw|rq/:oNƇ s~ܲvu9ޭ f;qㅢR mn|:ũb1o_3+6154cݬ3w +'oBtSy꧍(jc{7,69*s<݌gg:o㙰訇c|}z>˜jU{-wrw# +4dZ\Z'%Vy8]тdĺu[\~?'d}B "#;wkWgז6riT~ٽu- +c ok8Y2yvs޿t҈[Ҷ'WmFM-h;Wc{ʲѶ.}jw#jd)jvOЯ# "[ɩCɗm-1J]㺄hD9ch]F`U @`Ur/-/ֆ-\s0b6a鬿EqCH KnĿ/`0XjtaϺ#ǃm!EM*\rh}_\ toFnnD^WCh 3pWH +c؎bdA`Ǚ`=[sBYh8cgKUFf;ߟY$Kk樶6>=cd'f(O_Vq:{Z@c$pFNog_wgh][~f_JK^vy>y3C(xQѣE,[Fg[SB塺+" xqL iWKLD.w_HכqS37"XN/ŽPv\ _ƥؤg[gz{!&BH#m$Xv1҈NꜯNWC4BO+R^{FښF>kB*f$L8|m +2]ۑ}#W}[{f#yBx{r}3{ loOI-c[\k]̡2MKѿ/\J1n/2p-j>D-+ˎG%kpq'Oۄensbnu1ofL|fHA|ydxm,xZ;ɛ,(SӰ^Xω ͕jCKݷw}cr/fC,mhe|+5lu—WIsG;zF};7$ O柃{ Cw`7nC45:v(=bG`I>85qkumQ{|A[q}sZk䶓l1t#94sF7.v8zRBڰ_+c;|8˧mbqrr k--"ug ӜҔ_2{zD++yS2KmhKg*d2p7Py[4Tv^(׵T &2n~y Bj@pIWiO 3&CmFM=4֛s R>09x֦?RCx}I4`qZ;t!*;YMκZڬЙYBХuRHuZ #פ]1l힇><{ւWvDn k: $k7q҅T^nH <\?#@1OO>⎾1!ڽ~IJTOOCxOŷת=)SGBubYcW6KbXzF(F? cZg=Ϭü6?;71/Z:X0 >,ǝ,R_7FKh__CyhY2rh.c^MUkXo͔ӹ-ö掏~[msFbݯhV[9ooy\8k]?_}^\սtvm(wYgJ:2Pnwty>4464{W5GCYrU/\%= [mb$xmrsӇVqցiZ6oM( rm9V{֍^B{],F{0[ s^^[7_ w ^oG$T{]VL⧻_[t\ݹ^EAFؚY2b{.Z#'N\Z1ЫG뭩ZZQ|CKqlƱdrzE㡠.Y뺻{`x}¼SW͎OLzfRwqBk%-+&BPIn. ݴGø^Q7m 7>7ݙJB^|ŅV/+PZ7c/WxsSL{zk:.iH^2{k32J{ axL0 ׯEeKڎ;^#n 4g^fx;W^ pFJL7k^۝{|_X{i}9hq„^AzlG՜vt75Frj2+:>?% 9z>Hu];n.cזpNtO[ÉޭwzV^q7ݕMl7{\ؕbBמvӮ́۞m{m z%ٵ'Z۫enxhfz]xo{G{}0Bgr4M12NwG^^gCv_ޙ Xn{m7ƗitC;t]"f/M/ζ'+Ct=mα:1 s!8۴c.^G[C cŚ< 1AQǴq2~XH8N +<#u1xW31:%pCOc#ozįuB1}xX{.N$~įX`aq1pa#᫷1tH{xCOfLs}ԇ__O3WigcCϮ ˉ_nį~s#멑=HZ\M&ph E lybrh't2Ab-cuXO2F +l 3U5^ +}=__CZDZNL\}s?VԒ.ل e/ӌ(} +1'ašas&;j{A;,f#l s#;Hb+#&ޭ[oG$m]>/w'q۔#)ī }zNar`%`;J䎭^Xy{;(W ZWhT=z^6ཚ@ +m^SzHaxH6Dǡb6׋ۖm+ {]J'ͨDtAH+ʺ>~ѕ@L.+osFo {rLOSϔ(Ȣ_gRdOaJΜbEТ&HϊVm9MNB+ b_#&V*M(9c䐟 MnI4}8& AD[ԟ(c_۲Lg7W3qLľN +ޝ5&V5FHot!Gc'l“`O5<"+vG gړkH626ِK_k@=l>M_wk`<߲@2'rBݠ5?"͖C6b6 + #Gmc8a8YEnϋ=;+əǻp=.B 2`?=NI B)-هͽsix(ޢ,lS/Nl Dq3ܘYf <@h㚂 ֚j@}dϻ=WsD=g?W3j`%BMN{*-p_G CE[;ÒƆfYC;ikG2]zoI`D~ډJBoU2@呎s)b9'!6$V**׎)D䲸ǰ:[ sט.@h *U4zY]Cozk}) +iQ{03]6r>> +vnHSǑT8Vĺ#&>9o|Za@ZoO|@Y8k5r[]UR%|!ލo%譈m lj/k}q;b +jAP.٪ jvH͎7o`pBrh6\=q'rqOMn0n@(nne᧦4d`OVz2fȺvD㦿JDL H +`anN1(Y.UuGPt󝼴h`I[#oAC!zU/^o18C+ii(i+Ƶ"5Мۏ֔(c1PmIUAFl 'A'OĭF +L6X)hޓ_"ܭ:#Qߤ^n{c=ռonݸI}NqD.;p7 +p(CQ6PlvcwhqvDir2^wyd,YD:ńr?хC#GqshfF&pSC DBE\S qNk/3[j}YV`a9Mz~p~Z/f867Rb4|s0Qx~8KidzR^Ojc|sC!sb $֠oq+‘>${x2q.uư'&)P %R;{,@K牛\X҃+=A8 mENT}w9b1 k@da1K!ٰʥ!3ȞW=THSAlƦ%C; LAHsC' M%[\DhLYyJnޭtm Fih~p74{z[C|}qgBz}>K⧏>ˇ>z%ttz}pp/ZN>G o?;;qPtHl88VH`bmaŏwrE`s[p~Rr@2֍*ʃZ$BT <ﳉ?6mL'~!7Y~Jaq3б;=4|]}M{jjegڽUhccOd1&` Xd7緟nifF3gWw*0B{.z1|Oة0VB)&%, p7_LNy>%4]A=['Yh_R<1TVb6g(-Z}n4v7,fGVrDq7[\ d-A J4p^ϐG~tCgţWΔxLořSx 1ra) ui$nNGIIƔ,i A'G^:3f8]1tBoiԉU-%?2C +\D'楌xT0 Us>ۣf22kJc|lA^.g&(0汝Y!{,b%}+l&Hklxucc:!aKJ=A`W/ >ҫBH)T_PU.bLz9zZwwzBJx l| d7< +ILe$HMV{Szo֓7Nެ񅍼1FF;_!Y%9 (_t78N{Cgn` TmAB ,* ]8F46U.8f G䅧rF_Y5pYK7]xq&H~uh,RO^I }BSS6YfF4 djcEcL~yhE i<G<HMDr;/7.Rɷ/Egnȼ`@f(2 fȼ޸༼ya\pހq!.StrI#ho`Sc  z%鰍hEPyQuPMŰwKȞbٴ +C:вXO|MF'y1:z՘gHnswe.^wW?i:ͳR8\o,]8t/׈qQAa y|1;koz0د2sQɱG4}=p.ǃvnFNN̨oӕoo0N;}*6phÈOɵQ+3oq`?cduΓpoI`Qa͇8Cq4~ԕUBN:Ӎu/PpnOOXtFKbS]T./Ҧfh n/ؤ^:Hr@HA{%חDy>1z<Ř과^ܝ(}6}*9S<Ϧ)Pm%z&^+A=ͦxjS +Y!7IJ:'GhfMLY}H)ʫuM>Y6'`OT}<^9sP}Ll-/`/ċ{eU?>3oww6`ϖ 1t>cQ} NjM>uM|}Q|}?-7`obP}g,E?}%E^ )F,AAͩ3j-0"+BUxlE'T+"(~*L$"T͟Tm#PByHs"S(4V//L*:ա9ZbzF9TPĚL wdRGpbS.6\OpS0,zL/'X!Zj?AL_ӽc2Cb)b-ً^oj?>7Gy.c4 QpStscD~4Wӗ(M0} +>tL8: O aoO1ܘ)IpB#XJNjVw"M@$YR7gT+M$<9H|} $ %w _t +vdNu8i \Ѿ< [,ڥ{^`"-=&klƩ)OF-x~9*lym&2w +*B@LQh81)3T aԎ1QAJ" Fv#_/gJi"i IcJ?AU}кS/1c8-KGY-n,wxf6z }%}ORDdi[^hߋ{}lA;n^j9dtD,&+ +CtcTi" }?]Ft +@.LU3p5xk M wMx&:D{7 ؞T̀b^25<Đ}XR9O?Y?;LvS*QINl`%#)*Njq[N0oIF@4J`=9{9qԎ/ V0wĦIe:!bs\_?i<4*s~Zݥ8Ӌֽ21?ܤzY dqglKM7;t"yL`Aѵo͚@1p]/KvRRlbmd-}z|/ZGd^ W&M#^R}E2^^A<4>(Ep8~UP%9ڞ1x]s"z`Z uU_Fs–rBxpTRoe&V Y-t =$Z*(R"Z:27xEP̱oB}/$1NsKDS$~hqHb D<3$1 +ROf/x\@a}O cڡL*xؿarC&9PG)H)x(^p^/ +> &zn^JM?& +&+?AC. &˳!}=HFWa&^ +&CC &/xMK='f^ģȤv 86Σ,gSGk}*L<ΏqE{}.\[Զ1!n $K1i>jcm0=MoO(81捱=߸\iWlsw>-9Y9YZ_st7r26v*a5Z(irreKyMRl3盺 0m̹hLPώ?ynHoLyjtɥv$Nj9|}Va^?L𳺣@MƦ(۫1 +mr)"7Ѩ21_´mrg4U|!\vӪԷ^ThpX%U;a#G-Iy=[e`xx']PrB:%D~lhgiK} R>;(:9W<>VGgg[R!D }RwPi0F<[Uw;{~ETe|u~Ru@tssVCɇ}ݔ׻NSf:3?hAeVs}Rlm4CŇ?˯ɥݻ?͍/gQ-3 W-ckuu\9dqsJ uy5UoKdFtv $Α?= bJ8b]V?l].6}* ,8o=ΒN_*.@]}KZyxw\~$Tv)IN'>\U+trNWdiQVV=>oi\u~jģb +}zL|-qQʾdN]sV׽ޣj۹2 RԱ⪴;7O !TorVD(E΍ +] +}I޾ۭ?%yQ3B5=,Ҥ-mLoTǟw__a"1\_)1!Z}: yXÊךRZ[#ԕ㍀#ݽMT'?EzCEPbTe뗚~l4 ǁGOheJ0Ih.R;o#φVf71렉Zc~ð^8ǧK^ϥ^}Zbbf +r2ztg(j.ދoUں?u{d)<Kq,RMaC'f̄o L.LWFS\>尶*ٛ"Z}qy=BI;whe:aڗG@J FM%RL&Zq>pQ =:xtSapSo{|"4\"tBK(CCTd)QWqȶ"0tKNGU͝ʯ, u7F@yQ_t-w}:nG/by|lx&q2+G:q9IG\S !н Qt!/qvxS|G}v8R!Jj--uqTrY ! LGMJRU>GW7~wuf}iM nP)N+iL}p:sr6`S(^Hd9MpG疪"}T\fؑ:|7 `!3; 0LIF4iȉMs˺2?Go= +GEIb<7o4 +11q#˧*UF(7EŐG`WL@M̘WBmk׼ M`Bus4k%/WfZx̫nV`̃6>\g<.>mܤIYh}u(xQ/m_^v+¯~]'Z"7ĤrL4fUXx,;=hS^45 +K4Q=Wp!̑r2aڛTlAkw"vϦM/9;˺T6m{#Pufoyڳas~SC6W~bM/7xyta~lgow=oNTo7ӹWʼިOsnN.HzF^%+nyg:/*󇫢u…[_cj^ +{*i<WkbR%Yr%T9yQFUy?O~th6_-25Y1Z[c6ьwMi}yi0}Fbt>ņ$#ua:B"ua:MӔLV?5Y>zhq34=T_:hYza_rfp8&Zrٟi: .ïb/G]mXޟJXjWuM-[q3z\ +zx&0Ldj{8UDŽ؃s;_[$>hhLݻP(FWObgv}}?ӲG^vWNի Ɋ$rQ TIOK" iI]Hq GWȦ`PgCNL^Z=*y'}Q}kDlZ'xUz [0uXA9nԜv.WH՝5ܞ/豤_))mptg9$)-饴ݚu⢹u9LgwazDwy~%쳱r{HΕ`zr2!5[sRwn/|" 1?'I}̼%2-gV~&y?g$3MOj_]͙!Vz %y`ld揊霠.x){?)lG̸B3qѬXVkerU7]z6Qk^YZqc@x^sbzCVNAtN6+ͺBsd$5ovws ~ۦgrn QWא%0' 4X!,:h"6\hqw:A\%ќϹ?WsDm#btZ\>!:K *"πFyT +>w֔_7´-9|brϩP||b[9‰/twE_<^%.0]Tk\䊗rIKaRΔP^2ww@Fox}sn+XvڮO5ﳺMmRSA? =qKrP Oevm2Bt=eτBboI 9Õd8D8c ѤIOUG~/okɹA8LRBw̰K@҃`,!YnxbʌWoNVQRr~@e'B:FqB~/mSuj_|㘍ea.I쒵Nail*:-*YiӁC0)QN'/t5aR4`ʀ3"1侉0Em\4ǀiiS&6fcO@1`{a=ࣃOD.?<>oWGK?kCb )&Ըy}C%swKMCӭͣ.|ifsV&Q.θK:N?RͶ l[U 3{?щBo_?C45t~) 4MiaHM\e2UEQMz+jfMl]2l݄ci`.lK2˖-ٖYk"^0V5]e*vMl]$4,[J`8I2mE2TMiYuĴY2`Uͪ0ˆ*w0tm͆+rѵغII[0|B+udh+` dGZKBeJ^fh@j̑V0# 6CׁDKd{l ɲpF^STUI6X5݀^LC5-X+JQkm<֡ jlp4v6gFe蛥l5`vJdvDP )àmmJ) #iR3 +Lۖǚ@Y5ӪeVADh: jfpBюJ`6@%Ê,KeVt"V$&s7Sj +`7n7#u2jOGJq#ܯp U= +qXVT`,ɴ`*"A8 tT j cِ #inEX1Bp+ˁ K? IJ} +`9A@ [X5.C)JiU 􈌜 ֣BD6p TRiDPVV.(p,)tXkĤ'F {+4XVFX u.N:|c@.Id%A +:H]12 'l#47E6/iT:;if2#T:P Q.%@1Fm0Q +\z HuE ӄ1) AVpJ4ekFITWPUYycoI`i +YK5| -( AA3 hG[`1%SXNGF[h4_u(H x[3%Gvw8nN o]V RPU}op@`,Y:H3.'DeTq)h0Àp@2fI 51k6R-DGRd6c

t>ÔA +[Hd^fE[EvNn`@0`CSUxb9LMI=AvztLMwb;76^zMhq")V:J BX +D-X+XVebqB c!rثܟO:CjiܗF5Fɯ7ok|pO)ѮiBJ0RMA=m<pj1YR5}:l +DUtDV>?3Cݛ'\2TG"-<߼>|ß:GRA(M+Tg #jߖVLM4 'n}AH + +(Q:- pg٠PQTp+DMWі\#G#YvTnN$i5=Qt: +܄28Mg]&fW0Cq-hGa3ݎ4ᬋ +k30&l'?*g@$Qg, +Qw! + To _`5ex`(q;wL$ ]u w2)`Gη^@4O'~RUPlצUU4AQ$,&npA v4&!~Tn Z2 +fmqd4`AACHVK @ A; 6s & <ڀgh0"%wm-|vKTH +tU C9M8iut"΄lZ,J:TU8p N+ PL&k¥BHp-lTϙ]d j|G + SЭO#'x3ۂ>4am*;` .^X- `PG<l X%(/ἐf2@YchKmGA<Vt6$/ Hĺd0u ϫi1V N!t`~a>lqh!^|b%''@UCf{T=:!'AA$IQHPs`/PБ-À(l? Q q|![`܎9¼d_kLg4G0s`C;Q fډ? 46V#`p2$.A:6AFG`Ҁ6bkC 9X4 pJⵋҽ d(co.;Y+$'z +ߤ۽y|8>stream +%AI12_CompressedDataxǕ&f|m#5oڶ6ˬK{$&RZъ@X.3ׯ~oZoyR]~ o>տyӛa[C:$o) w1b?y=lor3&*78{zgdv}י `s`am<_l~}w{vwe8.wo޽>{cgC^_ݽ:ƒC\59Qiz 6?-uۯO=c>sw2=^o?vK>n<3+oܽ~8b[W\޾z(Wy _RV"8}~1葔Lė#&!΀ğ '&$k\_jqκ>t0Hoqq*awo>_? g#>l?B뷇oA7?y?{uw78$߾>ٛw^߾:w`52÷g_bC?xw+ogWo?; .v8 zu s`og ^ !6& gpݜ}s/?op|͏=ps{sǣ=߼~}{po?ܞc+bjWg?\gaYIgo =价g{vsw0廇pJܙK쿌k0=wR/=_~m~÷PNCwMqg˳.Ky\.,Y~g{>|B y~>^?ܼyo_&~[&ovz_/r=/.^<}_}= r-q}8{Y?0=ww,^q3sr7-o{u /ƻwy7=c,Əǟ~e៿-B,h.o_;b MTg;gq Wx6B`G|k0_|ę{s +S̓|~xsey_ΣѳŋE,'8}g{0psWX+OO..ίW*]ū*\+weUwyuyyyqy~]2^_K{i.ˋbH~r/p/܅0|w>xޟs9W|>߇߻ݛ=rw;wݰKwawngwf Wp1a-/ q0AC4CeHiviHSB%LU<.1.hb_E]?}߇*\paB }l0W_s;?};or۹]t ;笃h쥽vowvF`uZc;se.ͅ97{3I&g1a;;lHh>aq y67_nr<ͿYO/Pa_ݾzG𚤽?Jgۦ nۃCOd=͙~}7|X }o_qwО^;fCq{þñ +,Xk"L3OZXLLx?}aQP=r_j4RL ^e\Sށ9I_+v`<`{0 0+=DAHA4cbB|x$A ^αZU v,ď!{pRe!|BYSSSSCċς'"Bb?   ?9ˆ'Lr*$3Gf#dY# +|Bj{HoP x< \+ h," z |`qG +7r@ x#_a+yBȄ̾!0ZER$IA¼AF.\^ W/W$0^O^y=&yu `+%X`3 `bway_J吧^F'V}M OyInbm97N0s˗Fτ[j!jCx.IAEh' ZR\\A.?^N.9|GR ѭ_ rrr\._QX W9pA$p˹hj/\q#wrWz5O?y?]︦-t{z5=FE׫%s|@ +>hR׮yG#Wyh^Ktk\ 3=D&r`RL&L׆"g@ꬭPi d/xIg@-3@@ZvlY|8[VǸG }G=# +7~£`W߸0bX]q9u5gY*lT>ƥv0 O_Q]-.ₚ[6iZ9+)(Dz$ۉp4< ȶB(.EI?XnG G\tV|)/˼x=J,(f)H9%@JC,)P")t<or2JJK"1̼13VD_|p'4 \{((QJ^+Dލҕ5KXXPnwȫ/WXP]e?%a'd+[qѪ3bI瑳>[>gyqQ,rFNs:tNuAwy/Ώ^Y̶:VcK+Ym!ÈMl'}>O!j+w2]sJ9vhCcd|4NMfvKd>7S^>.Aȍ@yja rD1ZCo=V|[M?;jRw̔~̐وEM`ALIdNsh&b(}BWh PxFD \GoQV׌Pa|##+x?zzIH@xG!Q_$[?S_S/(>$~A|O;?kpN^7N\ּ2B-Ě,EkS3s0l)ꦨ7* +/.jo2}0IN/_Y ,Ee⿘,WWWTWj^CˆﻧAqcS3CTZLԫm\\{5k4x[VK#ְ <l *& :AG8O?9%Rhg1nE~{Er?3C;x4c9ԈxzWyI>DVx$B$\w'k/a.ŸIm17KdD R8w9lI$O)/K X)*0G0]ŵ/c)q[JܙG/O8bZFf!@8:WKHS"p("ʈ80,,"pV?jcz@x*\+1ɼ~u A@mjVკGw. (~1Ҏ1~3wW3EwO|ZɌ( pu,eʭh&6z Eq _٫iҦRRUb]"И|^'^scr#)17LIv[RrwScIv,s£H^L5Q5ODhmȬIaĖ֍Zpo't܆kB=y1NO] 3/]$o7Vמw(é`۱* Z|GKh)-%攻GXGIHAϹ~ۂ%޾0r{)L '8)RO: M ?^U}|гgO-K~,mGˡn}U-mGnlm𵵲;-^ȥlgk̀OD$ mxsxT3Tٷ^TY /z,jۏdeQNA2SmR086;8r]twf'm3B+CciD`GeM-cuM)bNX%X.23~6sE72+Ljqd%Lab e2M%,Axk2(Z(,@K5$LSھVj?5m2?% Ij:ZS,{"{W.44SP0K$~ B#4[RN"ܝhZFbĵ)ڬkaħ :Fx/^G̜f}.W,i4 EbP_Gɒ/`\{Td^Oi?!H3f faXee2#'}¢5i&hk,y#@,лq3{plϑЃĢc|0j9Og' [MkK.IW˥{.t[duk&<.5Dn,/O&ԨͦNuD:e~/H\;U46QqW" gx 0 IMd_QQ r$V\LRT)-) /HM #> 4 KH}6M +#-lUq"dz0sԩLGʒ@3Wiӂ[&M Nt{SOC89]:]pbyD ~Ja8?QiBë>HhTO/H%Ѱg>x"b&PxծӜ:'sB֝qď#~/6ʅT2hv.#9g,~Q;fweY`6^Ub?|E0Yd.saY3Kxf LzWi΁ᚗqٟp:b'S2{}W/Wߧ\Qi'F<ӯ#?7! 8ss+gIiSڐ6dfR;cV6l!'hǃF~2==1ŢiOݰn5`lS5.=s{eke[%ؐg݊g݂njh3',2:O5i7i5#yˆ>Fxf FF]w͙BN=ڒUyv87R83]Oj6:;->AɵOWguUZݜT7Eoĵ }^8ecw19Txg.n=<<6w7n_ݽ{ys?{yv3/6TRձL}1v}XOvfmJ5 }L}'6 +?w_>~r_߹/]۫ûׯ1߲oLoITq5tHq1m~y!/ (?n0ͯ6߻ͫOӨ?~m~ټLw=+nˇ7lwzg|}?`^>||KXv0 +L2ڭ$ƤWȁ `8KB ,@C1N !$ x4;Z1غy8X +QؿإaLȯ wuӸ#1 Zj7aFTjDŽ=r<#]hq/&,xsHc+/|[Ę| c:6_g97$q$㘖 Cn-5Pl CXm`o[_o9w-;:H8lnpPv=fK@-` _ډ8sAn8e364?/dq,u|5*r Pw߂ED.t$lAxMUx x 7>\=H*Ib.,إ;nt&)cC?#M [P$"xpX}_J 6>vа|$[" ܤKy>ЊՅs"Pb  +؋OۃH,gsH8ǖߥgY8Z@Z@sXdP ݤ,4_N׃a2]v2a>d;P +|ᮞA$#ہAd XFZCl#xHIbp3*3Nν1,303X"x3x}YZxGbA7=%N s9Lw؞<|@ 5Z̤dR!B`/@p*x4vac9dY̖;**7 p"hRq8/iq+?ίy6 P`W<-2bc#mA~|;KN] +ρ9w |-F9Z|HbZ09ilM.Scͱ0@,^ +~Aւb u4b)ĉy@DAF&_w q 8q,<{z Í, ,ZBnnhr2cfVA7]ǡ:ICV<2ma< p(M  `c8; . rlaE c9z2 o2i{4q؈P`]pL /\4-O~/yaQAXeayd>a͋ Pւņ-k=XsBg>B7= Œ1>$29S@i6):ian/\Coky훔Is`e;=,崈nn/hْlw,'4ƹ},(lٯ_~{_ygϊշw? 0׻φ1_>>fW3۟3]7?wyr; 6@ox@# p$dy /1 +G8Q"A H\Lj@ +-W ȵŷ[1WmhtSFh-x0E: xc -LZ`7ˇ 0Pqp7bu!N:g/BgJ. ɵR?yt_'$ʉ9E +F9X=~6/0-ZPK؀ne 047502{ {2rbq7`%f` @@#"C;AR%?6/ذ4}KP@mƄ#-BudxW |̱EgErJ y"u@X(*$nDڲǝ- 8io  O 8 hS 1oowy<^O-; .mIF>+ tIJ`T,,G#N_qJx .\&\wZ&[1(*6 P>O/Nb*X{r pφK>Nh<p0~Gvd Dg~ C] DOT[YpR VE, /Ro ¡U nS%b[<`shx%.!!x #iY36FgrN$K#GP83ˑ1d>"WATP{_aӄuIxmT`-@޴9Ե9gN&6m/  8h-dshuP{20q4Yf<8aA- + Pwx?[ϖ+ 1ȆXT D"M54K$`\6@Iyi p]H#չ-eCre5s;HMO +u_=׆cqy7'jII|lB2 wOԢ~A~0Nm`_PahIBV s}W>d$`X-Ɛǯ(2@C1!A'h\e@Z񐮗l:;Be/wv`TD]i*gkѠr4`BX:REX5_a:P.TR9B)0F9hYέXp!q:4Y?p^~ h(3ef&m;d# v#L S +k%mCM̎^@"[#?W 4Y izyqg} ȃY +p%r 5DwP-$V@&K+u#20iq\{̍$EH3>Dn-Eۤ \R)Y"S+mh +솧&%ahf,9P:pF_Tu:J#4:J;rf(IûE2kz&3"hXhw.ZӮ& zJ<> bdq2tx k -1F< 0I̓HD )SXvγ>;كgq0,H,N]cVq4ϥطneSkg[,dQȭu\3ʢbfv9 paoq a] TytDr>.@fsy=8E jI|*SI"API.F^ٕcT(!8EvO'=ŠaGĆW@ב@6C +wG<ۃ*`9>?_j IĐ7G؉l"|x6; K&밽VS +<厖~ݸURɶ@WaLe1MG -?,*mQB_h +]T2Z]eR1mV8]x:Li TaεQQG+ +n1UTv8ne<-mk4%\UpzӎBۋWkJ4|e=Wbۦ|;<*8TB*QByFTEŢ5F'{5t :iEVdބΜWdPX|_=5|D% m~H{c!q[k_P%-LVE9"Yryzuj'Q!x` rS14! +L9](8Lv4~[QhbZ{cXv9)Ԯ함}zIkgza&-=2E%A*AW6tz|TJ ]>a8@hmolVb)D Ifyox$Z: =c`^|7I%w# E)D\#SW#Nbj?H8G_e* crj#y1?{&Y hعh'&N +>K^bUPHj/'6c}~sib 4{HH@3ƒ&A퐞n}q5SSRmcF` Hf +1E' %vHši R3cjthY?QD!X`tę ba(%胳Ut~:ꓮdzQ@jak܋ƙI1Q~'uȠq_''k~"E5 +=ɞ:i~AǮ58P{Y#-yq3`#l``]"`6˔VY%7T8v3R_ +t &gZc Ձ+9ZϿ׽UGU|_dYGߑEY`tO#Jt` ,hYfZ@8e)8.R5$*1B9IGfEÔ lVD% _ěd 8DgPlb{L=rDòu-ԐTG7d13KﺱLf 'H]=x|b# + Xdvr֧Q!1xgHp V@`\3V{`IWa 8*Fű$%G`Y7*֓Cz) +*V9&R5s=Rc͏K HPqQ`Ga {BsX;ib?HA: .Ι5j˱Nݼ`B'1E5`U?䄉FB:/ t 0X\nu{, Io49ڇRa~`UA!a,- X$˰$7uJsyCҮ蓝$0\*3pFKi0iB2IDͧ9=~8Jչ 2p>)#߳2e\s``x+J?ݠ Fl2LQ8LFꘋVe'،u[m61l%0rh!BofpӓZU&,s>h.L!u#HtU/Ǎo* 1)1^4i)3Ph,1:&c!Tj3QaER1-kj8CSkPɡVVLXYS':龦`kMT4C}H>;QէUL}̪fzyjƣV[R Pbh7nRf57Buj92{`j77+ZFDTHDݲ-bd 6ˈgt{ʈӨ*<ݬ$ѕÉl9(tZWsQO*SKWZtpۨ0T-LwEnTlj /g+`e% LY9c[J6[ )f;Pg0G +[Qnޥ [N!)=>B,z3#c%h΁p; P6%<-D~@8W1br Uy F]ܲv,U).gP #sNTx`UFzUOrp&|X/ic)s:Z`Xڲv<``/"±j\? gv  f 9():Y7L2}4⳾#%-m$wv,䥷!uӦgsN?4r t~UQ4Sp0 ƒxOW8\ubL^DŽ,0UeqAN +TSubKt 濈̢``.*WYtMɼl$i2XI +N-^A4ZP/8{+ν-m +I3hsj+RuafA lb|fAVwhٿnd%$e䆴V͂ VGFl$Mn2cn$VOcSƸlRLY4扖5P,s5q=YӺdt IwYV,0&L@7^ )hUk ÐY,Ug |Pm3#iTtt^X:[LVb309B]C :g}9"NӖTcH.sa#v`A4F;`E;10Hda_øR9N̍}0EqOnisnhseX#J5,0}ݖWjF7xwn G)׬ƅ-+0?i-+5UStdJ$fb+ `tt;Pw4u1L$ bw3df`'g"_+톸/ Gcz) 0gTd)L1Ł% "<yտXC$!"Ã#(ATdxk,e W==j +ֿ 3qX咘5l\ٛku[‚jKcѸ0G::X,9;Ltr҅qUO9FDMN4rqv']ntdkaMMԤϳpQ8̾R tqX(HD2fUpa"E"J^BZ/ 9*?HCT@]RURaRsVڙ +" +̩B + +*0¡8iVmUԂv^BuX}C򬾭.a[TUVi42J#Rx.jX"pTA֩ĕ.nR Y J-G=WUluv@OezJԣ>Ϊ{=6ɣT=*TubӨ Ofa^23*u!teiTWVU؁TQb5jք-L|Dʀծe_(~2ʾ֮_r2Սj3`!] fP[.ۭSRP6҅AZ۽V5&ຑّBVYYu\\enwPfq52OQwnSS;׎c;U9"<FjbSnfk]>2QṔR.rvt9]h/K6c=eR)G]88*%LkӒu7{iRű<{I0f$S{2e#plMPP^;LҚĩjrh|`B g6L:Kɐi]mcC5J<͞jToPP;t*X]\|-R;Ԑo4 8E,.x޹.4j0eiu]؞aE<)qB>(€eEVy#='ge.oXQ~7l\D ֵpt_t&oڊc{kMXaUÛYG挳;Ϳf+j5&e ҆BQDi\~wcyGzXv~8h[N޲EcZL/:H3u۪(ٰ@OyH(z{C=mH㎈9fO5PatljY+S 6cc4Q8R~QWJTvDY:J8dХc=,v|Zcȁ4;d]:ڷ "n@П+>66x5?6v2!j +rbzBqo#C5zaE{c-fh} h ǠƬr.u<] a;i4Z02daXkj-[o;7/A*baƩdl!Æ:k+@9(@p>?XG). .v+7p=6/Q&hcE]G5!ֈ)@CKfrPU9h%kg`?VPHKF7((nDk36b|XKQ -4ꈋKKlFȩd)OnCb٫MmF +mT rY=:ӭ(\ޫw@=>'F夿μ t.`iءn,<=u=J9CcۤqϺʤ 7 O{8p%2hzY͌%T3OU5z +z-Jj9bz7UVխ5=5]5+mkKvk~3ҬΚ>[SdR#PLKp9A*QMke+̾&cbc3Q,T>ҟ)m@@L1P-٪Agb0[Ҩ)bfͲ)5:51("Y|*S c1;5,` z!༨AS?98ڥ٠nj7b9V@KpSS( +7:5S`#k>NM= {V̶k_:5kCk:Uk*qF&Vg0s0%kY5Vh`4=aplZ%h'ḛ薬 +Հ*OBKL"Iv뤗D҂)qXn*c4-ųw`YtĐ`5*W=-B"dfYVw.(2x*} &L%h]` c%GKO,ٙdRK3 sƱWB0a:t((vgPbl={m8X,ZB!=ǧB AA~,+FO,1B>ń.$c{8nrXxLwC b|-V>cʎ;7$ hH&}qzvy'I}D< X $xh"B$ҳ5Q]Яv)CrpzBN3Ն!e[P +))PY̅18 mI + n!>`Јm4W^ }(X C Kz,ME1ś6=1@M0ZYSϔ ++Ҙ▧2gBs2ƈy grϨ4֕e {(E`,atJ+F3x 3АͷDi̐l;;fD1tGuBX vɮ>;+2у:i= Ji̳`HOޟ>WbJ|ǣή0 Za M;J.K>^` ųaʀD8K]$0dM:MapDGZnShg%z3.1i_c 0 qiZ@}bLNH!g + Fl yC5!֐–yGW@hte1do1ǨOh=w.eaΣ 'Tx SЃZb uu9ױyo!Q̩Q WDt-znI82mٍ<΀ [1~I64 D(I. إ.+6y{@g`pD^az x"1a {3MEeHdC\'!hg):z鮄O8)DD>YIU@ZTpji ϚD[$CiOHrN%+ !A/SYĒzIJ6kVb((;)uP 30Mb>,%pY^&a@KbeL8(K˄X0" f !]ˤ0#gCysq-Mc!b\UhJbj*RτU6"48O`Z)C >HP̤yG{G3I)GZl=0ZI);Ka=0T-QdʤHN9R֢NLT@%ۖܤen df/-A&KrS8`¢wWc ܶ:rYHX=wL`?KEh5%AF#8hyʑFJAeJˎeUwʥz Ct k&ipZ)l^Pze4&1Hrl[ѻXt%F7 ! 6(l~hm +41 Dqk+ -rӜ=M';IL6qyY@[meRaJl0z)teó@ImΕ-0j'wfǶIXif? CD}R[G aKW]hT@>hzwĆ'H'6nII?꟣3= iB +g[z 9tfm7al,naŖ0_3BDOM1ɺ8lH. )>#a6Ě?FE8 ȗرRۑ@d&"HarDpT!ɫ|3+D(퐮\h ן,nck81 a{!:9tΨãf=7fe8Fv|&nq!Kѱ)xևu:L=3v/t3ed5]PY/&!#sU@;; OO 8 +ɼE çT'ObyƉd=`L35kQvҦ@$$*X~bEIiܚy٣u5/B={qbzlS2[AIho:rWϪ2™SEbSfUsB?+\o)bƠh, K|4B)%* m%Sĸ5HEѤ0ZM.{W;'rYH\rOVc-8c)^Vg$ph*ZvlO@pʭ4a#tbQOƙ<Ȑ7Ud5`TicX3s3nf[H';٢XF$Nmr h2&!8DyUx I8vx R_Y)h`6%g5),%'(EKYw ~eэVh: 7f~D^Z࢔3H*eLÐ1]FZ!ra}~3dMX{)RO$.9ئq.< -ynݘzy>s lFr.a&YoTQŮJOv<%yiV,D4%śh+g 3 ] F "m7DU^8Oϟ(2n#3hW[=e''o͊Md($HT#sgrq2L>l|H -k3+ܦDwHqW `mc :IsQc "PXR AC]8ElPGƅ6yD<$ +BaLJƉ#X='Dcc,XIIlA+җŪ} +i4_V^{f[J#?Uoqqۄái-]B{g̬ΙKH`CgWz6r롪š-]COr +Uąk-Y@R(YJ>! +؋-?YM NvPggl_*Fg^A?G Ȅ{:܀,00'l"ހد߈i%$GDJ#%3ݯfP'xL(atbS08$V@[_m3_ޔ,Z mu+.n]snl^pgA [ vXep}݂6П?# ^@[ AM]Z^fчFD#3` ] !c֬ӣ1b +k+fYhBHH䅎 +۬bh} >5C>?yB5ڻh]fRWZȡiR!6\xh'CXԇޱ;zEлj -+Bݾ/4 '/\B'x: +C'v%.eݸ-?ڤRlUp)BY6%A 獼4g~'7;P;(Pt_%4Xk?J}@n+kr}=G PӅ}Q~u:Dio;@dflަl;͑Prk_KZavx@y?&k=ZFW@,[Bt+!" +r^eH0P95vE8AǙO؎1Al-dAJha,^"V|',`(|<$!^1 gy66pȒ#R%7Ϸ1'~Bq9ԣ'狃3g2\O$ٕw9a(qsvma6ư@&}sO=1yG@,G]}8@V}33\Cg "]|ҧyשN)mm^bIg'7G+B8Ƈai/*!)>m({vTl:z5mfKD>pIc\L}:A +`R/sWxE!Goٔ#Yc Gi;lfM@ +*~_Z/sy|6ODM7[X)>7{7`ֻ.p0A^ s!eތ7.da2#G |Mg%aN[c&|^&YA /^x(6 +t͌m-$TRC +ӶswC%Nr>aIz~ I$wȞ"f6f@ڈP. Q!x/Y  u7԰ediX3Тvvݲez*&!@il]ܮfAvĴO +Y祶NP/ʉ92GOi~ eֱBa)Y·V-"![ T{HN'hAY%qZ2!~=)LHF-aBNIj.R єS0 atwجlp 6GrX齤 +!4wO<oa$8i EI lE4twfÎв+gYwy@~]Y>b4M<&n;\'d˜f{(f/k2vqGf 7@b̰xDaCrf5Mb᷒X>ӝf|('=#h' m~晓å@V~XJjNJEG%p?w +g@>y<%|bo!'w!Ggy%DaQ/(}u]Xv2JvDouc(B@]u@s"0FZ}uZ7&O$YTfR%ў}7'1#͒EO3N~Z94{sW%RDvRo y连b9'@K/ bI--f&s*6VS"QQ%@/:t6DŲpnDgB U}s)JY%x@|ˁ U; {uؔ8vy w4͎./e\Fܾ}_2$e>vv);sſ۱*6ɬKf`TP@*d#*3; +eDx{2O L0g>61bacY۪/"qIƬ%ڜfl:Shy9Y3_](A~.6ƾոVN^4 I6o +ݾ9ĔaZ&l辖٫CJTrƋl-7 + +|2YHT0G/x Bk>tc A|luUͺ?PzJ KU{fݦ+'BgT +X%q5B LhX%5D#f ~ P-{NL9z# |m3x*A}wSÔw^ycuۢ*q>DQj{~]Bct‮˄m0|ᰃId[:i7fa/ʳ/5QvfMy! @] IuَTw IKBJ@ Ms7y@,}(*ɋMF˜9pK@,_?e$"@-!ERFuiSK`@OS $A Gݬx+P;yHWˀbt'б!6s֖NL[6֑\Wj:6S&V%hݽzq$Iwz%&+[LT$+{:EީgA?[ ^,K K=`e6'+pqɻb¼PH$&G0,1(>E? 8"V<ͽvaO33BNϠEmcMvo㖙z wA:B'(ǽ',gE\`}a(ĪZƖ]7F_`e4 [ {SF~-7vӹ1eGUkMA,4TdziBVYiشzƦ ɠ33LI@=t\1Ka!Q,N,~=^lgY^)ÊY >C\⠥4r11/d grb$}J^:J+Y=1(R5٩k:ݕ5{Lݐ4C 쩽77(Жݛ2e~JTo3(xeS35i \4n*uB~j:qPj.Qg@ňڃݎ"v)$hBpP/4dպji$ +H욜iNeWL,НmwI";ub]*KLM쿽,?j'5Uar6ӌv›6TΊJ!G?pS$V]' +trB{]|Bbx*:#ĈC#T%Gq$':d(hQ1.ݺ~ۊz̚ډ.rČZ"rF/X"#3fCn[:Ұ?QlPBW(7Ԅ>a)};a|4t $C*6f<(1TJuQ'. ŒA—FCE6ZAEU2G ++ Ü$JmC5JJؼCUھ4QplWk r(3`0R4-PD%[ON&3 +f /Ce\:}tL#!~@\T-6xE[cv11]ȍ6e-? 4],dJV#3/ w!\Ȗ`#EY(nW+RY䳽-^G)+EjX @72:(l +'|32cw6@jy}BlN, ߦ+媟SF0pL=_56@RAt֛e +DĨ#,65ow[opz^Sɓ:#D{p.p0(ΏO2'P'1^457%EŔc~S`\Z˴:t~i.Fz/$; ͑[.5KBTuٺ)++_;5Q٢ ^fj8DmWlz@zz-BHQUElqBӸz2r˨ikhkQ(21vh[ʾH勋 F 6/|4I|pQ +/[R[|unϕś@PzD m{E!bό>=BJբO]i*n;QrԫOz)˕# vK.=jHۣOK}$:_(Zucѵ/}&]{*u&2 ͽkObBm"Jnw-R޵g(Uݶ^Yӵ/5H&kn]2`oB꧒;n׾yp d~w?:_^j?0vX<:̈́ξ #7/:uMCn6끟'sao2O" +x0Cʂwۜӵvd^" j_Ob9=t?}sJ}~==)AɭOW3%ztO&jdu뛒EgZpa*tFWG74{^}+ۓfNW. ;v.qzxlS/jBATmzF? +2{bN7}sJSZistO>x(/OϷ>f"5omӯRy1Aczw\ޫ׌=lcs]c\lj̄ZE'ývŻgʊ\3(^ջoѡ{qPZxf Svq(aAukChfa&~{jb=wDK̓E,)Nөճhtf:U[ jPh i1ߗv}N&ԝCL 2)ug=.\K[f 9hwo_nF&|r3Oڑ{LdZn2xh =!r3c ?ʝ5U1Zoqa +d/lJ  0kY}g7f^^HJՋz3o+ (,Yovq(tَJ+`7W" Mqެ $k̨8!Sx[+x [u$WMζ ]r @}0U^֝g68sp/ZH$KBu[$80 +{T"|&u"nn[bcR=C#s9$'zz! ]/3!!f(sf3M +#eazuĔz>ݿg3]Wc@C25[frL=^dsgvtkiA?(LAhp :WQ+fd$|5D3VK$1X# yM5.@YΥo~ҳ$W}$QH=).JS6F̥Sh<s0=W1/6dBe_odx|?2C8.Ϙ(P N%Y M?k`RxwMw:Qn"P5joX O NWvcE sќ .`pNTQ5aa'5]u l|PG[#A1 `PBQ='[g1otw]£Hm6:!H/.8%i[3Z,EBΠ14ḟa#fgACÖx&lda_YZ5g^Lؔخy>Q2.9ڊF,a*ܷ{[}d(g7Xԋཨ8MMfJV: #'^sRlQ~Fi:=$QNfϜ|z(@glJZ8H~0JǕ/vE3fj?5%}QOo} b;ɨ .Ӽma+0I][h3pa̯÷qD[WgF^x|ʑYP2[ ڕ%d:֟"|)Bv򾫫HfˮUHyᇲԸ¸ZT}G3(ebӅ<2H7=jlGc:1G <6GC){) +ēg>̷1YFP=6RƘͭGWBS=Y\mkTQ6>f +S$'[)llNȯ\l3Ko-g -F/Vl F ۊq"l_J}#);UE}uŮWTT|3rYWFz8k1F:s nA[mʖD- +k؅CYB/d%sv5F +_cz!hYSTAmJ/S혬*]g?%uv% C˺&Qk/9/;!T@Ri&IH#)@>U661Ń +57)Ef[Yv弮}+ۺ7Dt1gmBM-ŋ"B/uC*`p[7Ԝb,e9L$(t^IT`p[1 [U^sA! `A 7֜2FI-{/%^.R05&L1Aᾒv;(?OWx%q>&jʳY" @H16 |QP$ο>uET>BǛT3xmF$ *Tb׵7t8jJp]iN+;Cܪ8Mym6jDN'MRs4) gſ34ʼ;O!V=h42[.mgzzΨ ~p𰥏\˻;}:MFYMqhٰBt[A?&j q1^7]xB,G̻q'-pq,Y;T^@Р[s%%qȟ-[s6#Ʉ +gabCg3&Ct󮇄W*YAR~ Yv.a /gC>dkDM HC2|0(aUKU?%T kk\%A?a.\277 h7}iI|ZMЀ_.GCY(Ɇf[^IɾXQvgRh6ηP6l9.ַ]bK<2InxKw.g _J#p  .onPk%bg +&lS8 B7E + ,TlVn +tYXn3dآc˚~ m2YR!B g:$>M@ioc݆Hrn݈gAё|9Yg9\x?Yτ v +-*x}rk-\mgd3]+h2u R`}?نvZ[rsga;>њbCآӟEduH?a L|h7&Q} +.1QFo.Y< UeoiG +Ӝ6r޺]X*.!]95vV P*vr%^etNPEGHa$l{Zlm!?kJJ[De'W+Kݬ#@Ú2v'%3V՘w=Y?Mn7|)_$c,^,k8i;$Ǧ4N;fX{cݮo6N)fb&$#V7NS,]>`'2IDXܼ~ EC97uT)"C>#Ve;Wm8U*ôµk3HPz̹K,T5;,TO껒*+[\v+,<n k}p]> ~DYF0;d%5v;z`pc.Q +w5kX~bfh0$~XV]p6]ugJ>}Ӗtߏ39k ZQa(#^r9){j0?UYnAxh} 3yя#C0ID  D4RoIDW +!8ΰ +h @!xo +/oS@!׿ |N,":40ܿ }d\%h`\%(#JDW*\+%h s%z_^$~XP? u&!m.ĉS* &(G-JµEܩt'W,E(:Pix.*nԱ7.V6w} E+]k.cџe' [媹k!䨠 y|WX&4. >{ e34](lDwFZ} \607}nfbF|iý5\Fs73ImãzƼժ˖ŲqHC9V&E63C` [=46fx'hlxfle0/} [coyץAy?譢-Emz+kK./ydd;Y"dd=jK" jW)m"hݝU<k_nj6inm_f9| oW8XQ p.F.F.ʽ] .Nʽ "Fmʭ|TFp 60Tm` 0UNcT*0T0T.0Tnma\ma\-]T([([¨_QrQr_^?9wwI5\,iB}_o͗ +YZFa -H_:'VJ5*}fd,%\M4e𖱴u6e,q ?aU,W{X{hx2y57ZBUbZn")h]_6OJh5i͈xՎ[=77N4xtQ$H 7nTY*g|%ݺł[0@wm$Z<>[Vd뱑pCPzt6$b/&5:5* >)Aʍ&0; )7q=H}0Q{Rnvit#ީ*~7ؽ$vcj8ul?;_i}_S2;w߰gAcwҮ"};57t\ñMu\ e"m(v|J07ߒ;B. f{C3z5}K^y/LPm~nkrPP@Viς8VEI>!T*3.mVt,ߧI_^!|_UOj_~:El+ZZ\k47un%@o B %;4<" V®F"l8a4ε,a 7la03Xg,ɳf&( T`UV_ߞWnm|$rhΗC\T('+ECXf8\oG霮ԓX #4n]y@;n;+F1ڟE<H$1.ztԢ.Ծ:$J޶e Ғ> j]%u2t[J.%QٛXK 5]'u2TFqS#L/]mx=V"H:KaPxhQ`g;u2CTȚ6ن=ԉ iފ~׳U*2z'Hꏾ΀SO=۷?я_}po>MJB"@J\,QpTu>/G +Y62~H'j Χ}7'xSNaJ,I,魡$WsմzUM6˅_ +Gpz>ap$ܾ|w,;ĒmZ󟉸U:mY~ +iJ;+M 4>;ffN"=V]rgQ*&6Ho#e%BZM?"N65z$`ᤖ^ʛ@MD9hXS,^i} %h"sC1;p479g:1ۂӋRnTg u/<2+He^$ 8̾BDEXgQP>J>e~{SMBI2)̨jfeG%fNTټ' ^ydPӥ${$ט; =W#H5 +̽%H0~Yl:6EyAgny3RѷKRPD[t/"6^x%法mtTF ~@v불Pf↪bÔB)>#nNh ݇-Ȑ$7w,zeKxt5EPoJ?hb'e0~wz5I}h1帳>j4|nԗ zMN +C0 +} ym+;WtlvIͻ69ȢrPtR:iy ++o +FmZ4 gtwmuٱwRE +1mLtKJqG&1"~U%GCφM 0\!` +gpZx yXj82-b1cqڈk 7BhM)6q21 -0P>/UPEo.TAg[Tu2lrLIlj'4ŎMvMJzqardM0uR%0:$28Q|#d?!}eXq]k|*5ߖ<*ntŬ#&iJy`<|5ARc)M +NNH56R)c֦)@E5Y32Nj2DaϦms6 ~z<:Ϙn?B]coJdu4Qk%(/``Dr=VB|&O.G +#6: + 05ܬFm4GU +􅻖#,Gb-mՂC"y$_qY}*]rFNuwreoĹ|j̀gkӎ=q7ZpUH'V=^IO-sjgQ}{qIx yvއvq@S sMF +EDco bQ\>=;q޽ߡ VlX q.iZ|nkC{QP\xތi .{i+b,;>,M$'MC toAn+>aDKqg +n(B//oW̓%mr~#m73LaeFgiEl.BEYhNtnS 2`&׉i.7A[t +t')bX.qt-lu=ݨ_SB߾|sūBKuJ%3H_"*fI !#taCH#Ր\.tr2 ዿ)fGG&N084PpN2xP9*8L,`KaN$B +Quok1 +ݩJ h 3bflM}WJ%HսAyXݯ_X"w LC'ٮRrXOp=ND!9lXHr9iPf:>1JCP d+ӖC~L.F;[ZY`*`P@)k54)U]8N j*]ZCj9jRZ Za +Ytqz/ ]ꌏ)_L'Z3|-X-k7WZP~tAv|~[KVa eaЃ{׿ LĊsfB$m +m X`#Հ[wyn@읈 >H%z;=\) +^֊M;i| +a\7-r++,8:d^hl{G=₟u1VX!z/ }`-GCcĶ!_~+2Ɛ+0+DZ5 ^1^A//"hc @q+,8&=V| +Tiu3MP +`혓`}*+C*lśZĭospy;E ` }wrm#&;f ] kB54A󱡙"s>} rh JrC+>ZYB<Ä{ffn %/!vP-IK"6mk%X]nj,%kE>)\]/L4kjQUXU#Mpa71gkNqƒR{oZsOy=\F +r'nu9_W+b|8GWyn[8|~4[E^t-qZK:kI6~?&ZK0T|P^Z j-Podk;Dr߁eqxbI3Jw& sJZv" _8n6O vjPEϠbߑ&Ңb>]0FdF4 +xcZ׾y9wy1&}_ +￟2X9{`ٔǣfd[S`r挡DG))x:Xx, rEk|Rg(5:mlmQ!gR,ro.4/>ËQ~eד]܀gPp )0d= +oCb=q:O~-?}^rl6|N|6HEecwƥ>w*9So)|(cw,FaBfMTVDL /9Irq~~gk<}A'b5D E+ TgK$Qfo뜏H8IBE=˼"38U(&TO%GֹE@OKg +IP^ +vԬ_V7 T)ќ; q'ĕ 49Xj?4 !?Q`zZU +wP +@S! +4ۀC:U09CA;S& si)C)r̳NM%*̠>ln^1qraZ}H8f^Z,$n}T@-r}F֍=5]Ha~Z>v$8.> lSh$\p~:2r&R;0 7&㊈;bBӯ&RI*=(I,/oI62dY55Px !qͳDWa4Da&V0(\Vf]m9#x2el{Ҧ DZY.U3'^xQ: zBgOD-NU44 |`( .jSx씋a-A'{[EuՓ쌐MwqC~E y!)ȡڒkt}|uV*F[hS E0(?N Pa*L6_h̢g$ogR*/S@̸J88%bb&_2oLH07x-:yOh"!,v2!͔0 HJP{7,%>!nB(3m"nUt6fJZJ' AJ^B*j% }z&:EҘ5+=i~?"ĺҰf^5.̑^BN ۵mpήIg-ҧSLtHG=ފ + 3#FE?so⪴Y禯i^B|CxDw]Z쇥U\ l:+xr||i/iJvWem.v@\Igh443¾|i1|a6ePYi|fsȈ^KS}ԢAxzsT!@lC'6$q|9=GUҡ v4/.4\3ƒ-fi6As@LX#hfbN^eG ܳ(S0~qؔtۓ&oܪ>_=(ev45bj1ɹݲD,?/j.0#zlVqAIDuC;J; qUK)^Sk(e 7࠺p-/8a3*jՇM/M !V)_gW髲/By3ڝzeXs)9w}Pb"3w_oҋvdh_tpxq ۧ/sؕJma^m= 4T0CWj'`I+B9,' +˅rM@Ob)*U s)A̡gzS\6[[6y:U͞女ju$o*ӪAyU]1b{gڵ8I!3ς96[P7'<gQSմbIѝVD4wګ%³+ [~ēpp/؅|۬$ot()1ӝ ?O*ԱmM78u ;* KbvisNbF|aCi1'B4!P՟_=pyqGJ塶0duW]5/ƞz*9`s4 +!ϯފs򏉕|1k(/mHT~'4eOBt)oH*zdXB;m{s4g/e`zGb~A=<  J+G^j>3~c +'x\A#T@fm;xt'KPJcd_p|Hu}; +}" Ab0j=.|ϰ;) +uq_m3z0o/f;/_}_}_}Sj7p6WW8J*לnYgǿo~?~/?/y,% h_g?o53g=[~nW}?IxxL?|ګW`g̈?w_~6ݣ>'=?/GqO~y}?G'?~zI-Ą#r8%!Cy#J:GfgdS_?>ln[No;wasם/~G?5 -2%q;NWb +R\? h"8RK";dPy<IR' bءJ{:Ws~i*ĭ)'(a%~wB 1sQ'! melil"yPST{mN.&C|7wloZ٤;?"'v"f]@eA.4{ȻYDŽ/$fgtOu4dAP\8<\gWH6>iU,/~BW'H3LZs8C5!tB<.H+gي&oAA9MXTDݜ,Z$1ʜBzB}Wim4!z$'*zenFSn#\D|ysذ}$5IV{ec{Dd_3׊Xr!e/^tl|v&ݧP ߒƖJ /iEĦ_iyif(^tH^n{}QQsG~yHY2vLg=Şx% +[P8ql3ǩqdq;|^p7Z7NCt{ Gm%<@0ŜA% +7.|i?|63IG33-c2`ʼn@rA[\mI7}/b_AV _r0y!d>a2&T5dۊ2~= Y}f(onuq J,NƦsn9*oC?oSpfP|nnlM{Yj9?+MjPxJ[7M@MJ>ղ_prSOi`)?~f@!DsA35Y'8ɠ9DR\#~̓E%/O$}ڋs]ۀ/37PY{(z."&g8:`K+zc\&;=mbޛi)e=^rkn,eb䟨W1<]7ue9 +qGɟq,NꟐ-*?5U@A$d?mAHys8E.JihJobQAXsAh|q+xǐ}8BS9JerRL6uGkx~ȁ*8|^(4B]@y~jo`1 ĕ}~ŝ8!2>ZZw9) D``G/pKd7gCr`ԜY/ЇB5x)} CAcĀER8. ^H Ϡj2m9|.GцׄDgQZzDishlϟDA!U$b +^H@ǤeKL;q8hQwpf͉K']sP?SŅB棟> P3Pɜxi A4lzHj*s +9𳞿D۾6yd0<:Y3!C5~uCWe(Y%OpA*=[*&=pL{uYnp=Q.l-k_(-J<0\2G:eg4)%o;E@Zl>%:~JuD/+1pO% zy0Ə!p|Iތ.t=r +VR|1cW MJuF]˵s<8Qyw5gMg4H3wε=GND1Qby؉LGJ̰)1NݰJSfĸLdt<fA `'[QILL-;IZh=7o$D*b-cNZh-QZ[0/*+\!D&~mԤ.hgx;n)a +6R"Rs)jG"e{|%"<2#2JRp) ] +f  x/R9]I0,h~~9X J3K$*Ur `1&M#q?iK"tw6uhO:Qi|(i{C\cmcOW?yoX1F͋QWdH3 AԳ?, o4_ŏPiDZb-"W@)B*Pr"7?|]O%3 P9:˃ +l2A"̑0))ݕ`R."=qf흹)6fk|%c!@Rz4M/8|Ad9T +iR6"%iƝr*Ku9ݾ`:'zemTqp%& <|äQntS)5,N +B "9C\4QIkusc\C@u:yՑlD"ћNfOCژN x&OUpK8kPt3ԧS}~y]..f p,(hk> '|@ۜrÜoN@܅#+-yb:⹹lz.#\^=utw^vg3͡O]U`t8q(t.9;@Ɇ o=]TFh "7`s~U:k8̦9>^,Fw( +gMU!։&^%ms88S@^MQ,=&"ȧB58á[5vshi 6ҝji!'SC -h%EŔ6Oc|G>f> l:*,LI6 M+c59M g\C. =T)"8|zj:nT%$y>b8t? +_8(f7;H^e& V@4h6iCֱNFR;kAO*%Tt`ܱlOEZ}*Y\^r A)zp4ީE92]AeUNBfgx;CBC'Ik"gQ"ꮮS–\_~HX7+B]]%ɤ*rۅ1ih~Ü&' l2< X4OGiJ\|- i'C~[x3u<{o M2 l ;U &ǬnlmGNэG7\"#$!vqy}EtXVOd&NE-5U2O ez&q-#N5WNiȌ_6~seKN +@ ”C> +HX>T`643oD5av$wojVp۞F @!FTW^u;wZ(KM[ՏcNU 5Uݳ&:DgYң?tAYQ9#rxg|dO/qNi\:b'DW%+Wx06Y#NBnv\ۨxExK)^^fq4,I YK>{e`NTJ`HX48'Ɔ#N̂v -'B1VϾ, w&N['>hz{"Tp:=Шz[ծ<֝THIΠ -p{޶U ثj U#zNabs),Y1L7a 4s L3ASEx)#*}WxQR莙6S6]M ŌN1tv+u[p(\g I׿º܋T`[|Cٽܨ@_P-F$ %/1 wڐ]1\SrGŌg=4~()Lf;By.4p̗`pL[y H6}NC(l5AbaFށ~3-0^vC;}eӀ'j3Hq}0 +rХo"-MX:"U> alX 6 +­VhBf_ MWآ M['ӽ/O(/V0w$GB$ID~鿷La0DNym_|׊:{^A}*R GnGtI^0&~Geb水h4JQ0١'*$GZхflCA;%¤A$f @pPطn pR& ςB.p GփDl6o +(*cgJr͢ΛEcJs$rq~d#[i@$kP(o-! +쳯뒈EdyPFhD>9R-@.]P ]]I W (PF;0r2pba)9bU{O˜ԟ0+m%H$TiG]̌R^fBK}885G3f%®B{^^0λ'j/w萛Fނ" +;7z-B~r9%S8<r ӊԋA^CV" + ل]QbH@!)< :(-Z H4` +b/d +,3߸a)([ + +VdA_~Ӣ(5o+ +HHI">9tArLb*ړ5>HuSF}ަϺ(N@^u@HHVuY(rg6NjK:$83!YƯ1"119ޒ_E+?D8TAa +3 Ti} +Q|h3[nza5LpekvGym= 6F.j,D@g_ +e26ĞaʇzZ|tSTA?EbI>=Y"JnԒ7 Dk2Fk=K2O-Ωha_mPGd&1nV%@`Ͳ`f){2(<:Ԑ؞wv/U/u ΰ GEjTK{wIZWlz`!4w C.A&U|s:C:c7++&BJ^LpQ'v'E)uTqQ#իOHJ2 (ŦU J|%{/jXpk*Sn8? -'_Vxo5gUP4 Ln0N.禵Lر4,8 +=RGЋEی2۹ؔ(>+=XN0'Թ(VM@T ȀfՕ|k,F/*p/   'y,v=M]>=uW'zKߧw]i:BHR@Y*$hUoz)܀P&p?T^2ć`֐Ya*RB8WtSPV"~mSӭ=;IT޸@=[{n)n6|.Jx=C |u$0K&K=`/uK<.Tm7T{ <9yMHeCw/2أ3 99U@c~7XmR"&Qa:X⒎z*|:׈46לȞ_*+ (hV6CxAxe~s\ի-oMIUZ Jcޱ >)W-pHu?5jyZp$Ex/y]X)82y#/F-ho(Is7Ñ4< nc ۑjϒ+nՉ&ؕBQg kIsFPh)$ 3gUpKYyJk s4Ĭ9ۑM>d\"$j৾>VH߿ֲ5{z +A3tb;._+#]DbӲJ d#KN?)E,){d;epMN\L=&QOXIԋ o=}*&x@7%KcP_Oēr>d!5Kq ,8IAQZSa5ʔQU1 +MT@^ +o%uҢXӱ_ǯ]>Ki͹uM+?Lg79.z̴n_l\^, ^hHC^ })qEA kQAR~ +endstream endobj 26 0 obj <>stream +QV~:tcWP@mf/4_BOF\Rt V{~)8cm-,f&In(>IS)īxd=ȫ#@ ZO:Lku7LwB մMX{2e);]4t̻G#$4쐒IukZmc<@g@S"Tnkf' Ez%ť7 b@ݥN/sIɞ!Hc3i-ztB˿ܟnk]#hI7J) ')$fn#Zp_#65I6n^7줦,aQHjE>6wYjܩÇpšJR6:Q%)N{AWT[[\{ e'>KPB~ n7ɕ$ +mTo No3;/V';$Ua/!0rD!dKfvo1-X<\ SV=Ad~A /dGJΓRC(! X6WXA!ȸ7ЀR @Z;Dt** +@)-{K@p4xmsr:.*=>d l:*Wx2dTH_ĴDWViRajSW]A +a7ش`ȇN}L ow wF9nG{ _q^=3=B7| +>HɽAFb` +!ٜLRP7. T_?%& R-ב@ !qB6&!)`=h$En#}aBwGz;:|[~P H$^Ll*H8|y^|ŋ'zZMgQ0%֠9:Ȏ(fгߍ*ÑH5Z(K/Z\~hY$#+I@g"B5XjaS"0'ia8 (H<# u`Ϣ?+tKc`6%MRL*yF 1@B;u +[z\xys +Iؽw6h +يUt}݁P)*Q`=㊋ c\tF;#'˽`#3vQ?ˡ(@ٞs1jJd|Ǻ 4~aj}#6 6dpaaGs48M7-`jHLE2OgB39Gfrw@F%C7d,G7»@^tRw/E"t`z#y/jGC2t᫁BIG?rO>@@!>l r3Qnbg@) *+PX UVt: }ꤶXlANȻS=3)ח(>9F=`YbW9Mvk3b G?eч? %*{| ~2 "X("Ǖ8& ja H"$ +_;;™9yN{| %\ .ʕ;"^WD|pՄH{j[@A/G>G(AE͈y5.LބV_$7*ݭI=Be@d8+BPlaҢP  ,10}9=HpD-u.Y *nN=ͭE匯= c}+yfv'pj!o[xdjt^ 8U` 2u +F|ý ~y5JUÆM&?䠐s6 .bHHw43.T] :t=,]9V[z6p*.Ga9[`49A/2U>KC,uT筜y-MsNU@`ȵo: ybC-58D^ u1o1 %!A9?{{k^wSPeJ/~PY YݭLlpQ5Ô)'ol`u2>V=ׯ! <&Roh/b ɞ]Q%?v`bPa:C 00xMN1K+T`Öt+h2^j}c 8JNY:yXNLqb: 6 j':`Wͫ!+ΠꗂSq!ā%\Cl +|*v;u:GZgf<SGLdox04@V(a4JG^=q'} +C |&}$47h#ף~nh"RA0+Dh Z\&! j}I;(G7fPD;F؟P2`fRe$zo+d^ +!|M ScYT\^PEyܶn9:>q(7-/)!?I7=I +*k7z(a\S- .&/0xGL^{ȬNYƯ`xTB -k{4+u2_sƩc&iHR\ly%Vʳ֤H*W0e>{4mO_QH Z^Vj'q|1pMWяn2c;UwcK1@9Q|&M{s$xۙY:_cCK mrg jďQY"UΦ[Iz]Ǎf;w)rd.#22GH( ,YN**1ߐH{5GQ59i6?1_ ܣxNu'+,K2}Bzvae)d =p 6 SGˆ!^ i߻jawQ[#5釄>L;YQA00qD[0586GKHQ끺sOt4X wt&%1Dkp= Mf .f6y`^]$1Ja/\{@qΣA cz2mЮռ=q-iyJ @٩?aσ by-W*윑S"xDI +Ɇm\3(Lstli(>TIEvTr540?V TYhWp +Wu43j +Z3$&4ךX^)*+DF/[wGXҿƴ,Dstyf`M.i΂Jlu\Xl\3Iz " 3L26qrR2Q'=Cm`ķ|BƦ J?K6Bg{H+H[rH,ZÊзKVE$HH!"~+~~~Tzk_RNϗL5$YVUi>^p=\2]+ БbSʹ?ϦBud + +KFP[ӝ= +rqt<% gkoņ=\lfGP9A0a1*Lz3~9V9!+8tt4-L`^jf{gn8!ݺ{T-V[CfM.:h&>4r?΁pBdH;`#v`*J +lDx-IMT%|[ITij__kGbJ=V kk 5ErA,ӨA{CQUr"+\ +@DXHalnՁ`0VjVVYY酡Q"SfMSuQр.ѺB߰{]gl̹Etx. 5@_uE QȄ_䍎F+5.9leG}vyأ4g ;ϡotcUx>̰)7RXl:~Ġ zzE<i`Duȓ7 +P/!-pbLHm qP}QLq}2)s۟r̂l#`ku]QcFC}hF%h{LCOA}~!D Lɔ +GDT*#TэܩQ9] +!expǞT=(Y ڭb8 BK}S =:43oW/!g~N ~Ȅf3;mI_O?Ow8O?_z] ?n_#a( +@p5,Jr"[ &.TՎBxi(F'`eoS" +@$wRW9V wnlgj$x7{`DR;RTtu th +1  ~HPcDL#=vL9(z18͍U -Mt18C#`Fփ"笓NwT3nqCw!&W~: +0dH7rc Oa}OE!+14HaXKihq/W@.v'c`!&:PK0 +YU`߻FQE-MqۨYqXFSz`m6q Ԝ~l>.Uv#=г}b@3JdN8NE=!/mE= ;D' RTZ6a߮zJKfJkKzh^yEHI790D*zEV(8*@Y_ !lgqZ"QnT D@fTuYq;ĭ;9@ӁP \u7=e˿l~`W~xe/pA@GWpۊCa݋Qc:=*7"@#aA7t +)*^<}H7ݪ~ta䦑`[_ z0GGYCaW̜$t【+*udσYtyy*F, +`-!qywd)9^J2D- ;(V@WwٷFKTb hS i8.QWȫZUHtwB9 q+>pG `҆* Ir܀j6U6[[ߪf}^#wWF (#ƲG ?(y숋C /ƏAk(QAxg_#܀ἱ5Hb >&isx?X&P?i-;ׇ?9oj g/(\J+S) z:cfmqpu3OEb{cA}Pb\a,*þt ?"ϔ_R[Ym@,˞l|S~U)= ޭ |m83l~it٬FT=40G =:l +.)jRTm@ J +VuqBqu {}9s$4@h(GVd +C"6xeIKKuo_>k*2&]5D"ZLy׾ hUƽo%aeu&;8'wGfҫJijMse +d>͊gJ2}SnCR +3rM 2 ++.[#!OD }[eJ{;:ΙA˻m3^0zP[m,rTFдVjg4{4B"I1bIx*#>׏C5q]B5X"R*UcLk q$vNWC_0 e bR"}{f@(ưk@ҏA`vz֞ t{F{b;Cī= gvdkWd=3a2hX0nۗVTTSgteڍݞIH`nxqNo1"˜M% pǷkZ (>cPy/XP6Ki8qcSP"y8Lj՘@W0&NϢTD ؼC:j?PQP tc"K]jnM#!sBly.LٷY/<~ASBY\K,7>KgUʒ&DywƮ!̼~~NE8QL$HfߪR'e|CMW< +΅{ոـ\cyupGu2vágy6 &3[)`B  fASʁlaQn1ъ,=-<" ޿H ;  0k9Ge+D"vr2it-Q$c F%$O/O6xf@=_LHQ|&h)=ա쐬 hjTsu`QAqG7zojw˺OG#b"k>=~䆬-6l`X`%@ܟk&kLB<ϗ kZ#E8ɦU$M-1҈ mOZ3LM Т Ocj;3lw$v i6" @ʈsiyOL{ۍE|_V3~W/rP`b(GS$LŲ]FWV)`w<ɕ9~il2i7@ާxnz#%5a}83 $0wAGd9Z8 c Kf +-2]A mP@BD)1Q^Q~4\9'|<T#^P̂O:2X(e#u[˔v(u]Q-P "C%ߣ@ [QCqNt38YuN垸<ګd׍6E]čPM,G(4$`1`XI~#A?}&M~?bT71}HCA( +Dr_pi!j1k遛=VF~t$j" T v5H/p QeK8x@z1.p7=dcx+|- nc8Q[bD$kdly +Nd1 bʴ#JQz\@Vz ;IzY@/y vS0wl:!BAc SeiuzSZll˳C +o-xHq,P+|*[ a)QV;aR{#<_c9Q(M K!m;~F칊\\<6dI6QSG@F?D-4NeABUR9~dC]9jXi:f +ꃁGhNφPG!ٌ~tCD#MVy0W:QBqf)j=Ho8wlT-vN&&=jup@(їpJF2Kr$_z;K$R5UIBw+)ow`=tSL=Q i63EUy1;p®QsܿvËAAݐ))}1{=G v#5D<__~%+9:{t!ȡ#=`F0G1juek:no;=&3Q:br/7ō~`3h-ԗуê؁`ϙ f@p2Oxu,!Y.Q-ԣquc|<7%N?%PV `U(&&2̆p_;s[HZi.]Z7, uVx;H]bt8{Đ;LZބ/񏃢,% PrsPI $8uao AA _x mt! #,8o9C(,)erV}?3i& G3?ρBpgSߟ qtUS7Xg vڃ$ {*Gw0 _hP[/Xyv"(@,C۠lqGq{qΦW HDΤjk2yhvhN(ьx,x,`:<)+s+F@!DEa=$GSTlMҧ8Є#yfD}ݷ^Cbg;|ɺ53/@>ܴu`}7u4ܵ`6XbD66cMQ^:hY)\k7q&yǁaSʋř?.R_n>4!ECWHE`Q`f`3#U5 K|ܖƉxI!y*L]g +gR 0~PU9@"B(F(~\7STDU6XӼ:~1s' B2;DCg +*XB `}79\O?$6|t8Iv^aH le Aps2ǣu2?\,SX܅Pdh_~f~q45Q_j㽱Nry[~_+_=Ćx3\ ~'xZ +[ʢ6,MAb!*=gWZC'WD UN~NÑq<[F aow'uBQJۧ&m'!50"v{,3XqRiLE_CEs |;jW4c;EJ@P6?g/Evx]%KRD|Śf=Uk=ܕu> cuqjWu.mvw23li'~x/MQCi%6>hF HA"΄W&@B! +d+bj`2%Q#aE_ djZ4&615{M(|]-uU >JqԄ*mJO4f7|<4S2dH)>*p2лв68!V +=2+2LN!ĉLE2O5J >5mEhƯ3dN.~P @ĆԪk $i#6m9#pv2~R]V?@p{"=wNO ~ѳNY +,;^ΕCO-cn )aš)3zPؤGV-vϰUxy#[P8`M6+]mQ.{4y-dDYNǀ$B7J8[g]f|9 +9`!޶,#B& FHN^#'C)>NDPf8f{`lY!`&"VEzkPδg8 Bi,Ȣ@I:Ǔb^KM'k9L+E`rۀw"\81} ĝԪ0K +R( Hi J~y9lI.wDfnMf +(Dgl+Q%Ql9KX Ⱥ1ȪSZ 'zv;[@M=BB.d35Ke:MT0|dh O@ NУ+* f +u}15>B&JjD}W0pk7Kd =1iF:t \0 z|jicBW{rD etzQ`lF"P?0{+:CםH6 i;x9HYqjw-O&ύWxfσb"!Z{٣/bqWcg)\Fu"{q7}` 43A`I Oǻ۾K%D%kw[|I8J9>CAu$u-̫dDݲ,Bz8w{ &2` gQ!hbVJ%]"Xs/@=2 +FTJY`3 LBs}8:Yn;C=0SD`aND@'u)k=b +t˔mÎ:<>0rΤ=`3 1bPT+t^G>=FH}=.=AȽ8iH&Cz0zBspD6|oE3!qv6U6Տ!ݱ|Ҹ&4<\14WIS9 +Rv0C!(GnV gM,@>,PO[Pj;xNaX(ӗ~_lhWo:(c4 W1AӇJߓ1ֈXV/Ê:=0n 0|+B¦XROB tػ.6@"!RCoуu$iS-[VRv&"b/@3^S{~8f(kپ 쥦++d E]Mao^&{H~DHQErHSW`4rz|"+}܅'"|N#rОٰ0W+ЖԛC_RuX`7yxц&7eӓWw 8%-3`+zTzrUnS(W +yt;u3Fs\oWʙ/(%$ # @GH.d[4X*)/-@N\.t3ՓrǞ =yT|Ң(]q*- yȕ~.γ7 ftLG"gֿzϣā@$tW}!X22,e=21yQ*&^IZ܁zF/kltl!oQ¥`KmD/r2p_ +K "l 1닎]ÆϠ>KZqf r5jQhJKd +nl/x7dmkH~ByV:S{iw:A62S5\kC0Y}3)t8$֩8xݡVӵ'0b{iMR!{(ˬs 9BG6LDF}bAT(JY-c)ϑl3q<'*63*ʬ.,DW$Gc2V] >yX2R"L`DE;W޼;5['<*޴pH[%lY:A`i} aHtߪr >T"LK%BX9ř@V!L⴩MT֌ⱍ0`/WCR>K*#b|% 9{0PB;q=[aBV D;#4' |"0Mjž^Rv11wFlJ $hfn!%9Ojjn3 zѷtإ[=|=eY:=kYf1y'{h-PF0z D4=]}j^dO# )p>$B(C+أCꯢǰοb Xwۨہ@_]`:\ʉf缽"%0v/N|xV 84jPt-=/LgX7Vd {`@(Sݕ"@j+= Ӌ(HkƸtC]), +{'Zn+0X!¡/RčòۨDFhm8/\ `xAQeG'<4{ +[((va\[5d9ح]p3n9E +{ڑr (K߀ sY}B=eISAӌ#M@&=OxQGu&gT$ 9y|bSأ +\n{lͽ=ː +OSpc)Е+Y2b&d +TFywB1^lxC-$+ j6On)biX(gBXcXJh%k+iC-$C + 6]BO* +qj.i #!0%2 ~ .VrժZ}KZԂ`ђ7Cbu"pZr8x fOԸP*h\$GB<0/iN1cs^RԇnZASg-v!KHoT`UZ<®F]zz/<<͑1QKJ`g7T+{KdLJ7^n5ဎ!хlH%ؒ]NQ9 +pcb0 +mLYgꚾ5B=಻ŠrLjRoLσ92|H]xԋоdlu1m Z#nG%'(R#8[|(P6bFzjbtXv}^ =bY7/ϩdzl*~\IzS!fs]G 4t7u6o&p̀{G k26K#`뀡!"rӝ(YJ{OLQQeX%!∀idkfǪ#C}@҅Ls" J_ڗ,)Qd+r;t)hpb/].)EjmOXbk:֬U@X[}d:wZ/v?gJP`+qheU苢BcMԋpefeH)u`W;0Q0/"wjIfAʼ X,nw+J; C8x DBT~M?d=It$zJ>%aNutUVD nz4COTm$z_.<džgs0z6a2R:3SڴyvOޟ0~y3U> RnŰqfMpYO"c~ )ԶPs>SPcu1Mi a|{}(L +j#jU؀ǰE\G(a wJn3_?;C"z8gVΙӞ0?$BvdRZM*JFNi>פ! 4 :3S@ƐL#hV|gD+jp d +f5OiEK1JJ6.̺{46/6c(yB~@ArwP]Y$@ҍ友eAnYE#&giY,pLp$$!1O8 +wQg2K*ȓ=46KTO? SXBIPJFLlrT EK6.] DJsLGL<}']HMlb'=-t .M֛0:O[d>  -#,(lEnu/P@A"SHO9o`o6>hĴ89{ +9t4䧨ePbjr.WD5>eq~,vWY}yf;kŜ|Uw ?5[ +iJam,][hWh-֓ϷN`(lŸ" R_ˇ ً볛g=n_k'm^h/DD^:.0}yɲOiIYAZ_J9 Ov]!X"$}%AZb'#L+(ͷ0esNШp=2,;Es_jL\;H2Fw\sF()6$GReZYNi 籀IYŬejLЉ ⳡMlͱ<50-R-suINOQϗP-CPh csau9m4| :6{ + {F""Ah`#@B7dm`1Ђ kTliF6.7#ʤ1 &VSQ Qq,RhpDGC`m`GïG' @hS+*j;2I)1H&FIdcVh]2&8 +¿ת+uU 'vi cXal(ؘC}s8S&oC]` {!`ɨf<>+BXd2Χn~y׌M(w{39͹ғҲGnf00BHS45*GŸ-^翸>}XB>R$ 3Y5_"|jr-5eRyE0PQ " TХ D4dz +z<Ŷpܛæv{O2^つ:{ u4\i%ez@L~r9UƼh ExN:u%<*N=Er"&] Zp(n> Bw,=C~!tק uk5.5?`G)=Uˊ\'K;+UYW<B V0Z ~k|h1ŊyYv`P-{L_ ØWlvku}'6 eMUDJtA @>Ht+B K_z]c <5zSWؔYZ48$V.\IPQU4Y: ,40Ȥ҂9|l)4<U)c͐+dB>Ӡ% +brgaJp3~in[ܖI !!@9 +i \U9@)B<0h +tk!AniU\.efҏE \}%/X! @y qڄ /$fZ I]tNXR>{yܭީaYVXN8g_|4@uuA)āí[YRvm>tn P6>P4/13̐U݊7]m*8`9dϘAAlpPIBK,?j cN|ף[4Q) ~y&.wOnNu`"{B%:{{~#, +z*֯ IrHx'&F^Y`k]Fڐ!t:d» +ңc .]C(b"kdd=!Žo0D*QP;u#,:ڒ=pJWda +tZ~~Bc֙&{ӎdXrn +? ez +7ví@CIZ9 7910=:tXHS9:5OUsoTP`EY0b/K`][.gc:]a܄ӥ#L%y["Șˡ8Byls) h,ur;VܿcjׇtJjm|Ko"D ijlmQS-5ǰb N +ӣhOKͼF4GdD0wiLz oPVf{Pu0C9AAXWLg%U.% 1BcO!b4%b"ل)B&m*L %V@f=_r'}QIr`z5-@ASJ}$,(/CrŦD'I,kȭq@N1Z5q y%@wt(^0^#WC4ir?ѣܑ"RntCe[7xFʊEIUcO= dޢ; m9 +{kI3d+NJ.Ȕ]+m r7E~u&zVf41Zs=@8=nG6|]i~A[QnA+'60$CڣG:=mPMX8$,ògrlChJ=c}+yhxW]&2Z(|txT,qTcOHb"|7D12UR<q$/jcW^ +8`ǐiGz1u(JD +/LȀTc.>fDC7, +Z=N5ohO5)_PְGHgH֑p 3rXs썰ʎNNaIm`mmsLk/n{FBYz ϩ>AɖG(B I]I' %SyG3Kɏ0pQwPkE՞H{޻ +*:h].oTg2kyqﺑ}t} mԙZX|ۃP + +0"n3 W`:Mu4zK֎*(N ;`]qnW xy~s[l/#Pt) +M&3s&_ULV9|M6 0&Y@Dt'|}>{+X2K=¯Ɣgȋ/!"{ӣW!a}&9&MٻșzG h9Wd ;:̯@ ('eG\Z`JI@%bH a⁎h…R=N5,h_%V=@:um"%h0MY1LrZ1Q<nχM=ԬmڊIr"uxh,{=ETPx梛w==!.QS}[HƊy|cPZvQC;8b 5q(JMB$j<^p8+N3Թ=BrND +[dگ2,EIFa/ZS)z_t08twGKjP G)jw&}I:0t +w6DJr8w]qfICuSPY :ԧ8T%1D{mGԭ?z@ [323|BٶJ7Pl8KF{"8@&%&'c#Cwy9y)i1Sdes2uH $)fsZ}!$%%no0ƎsiOEE$ɑ2U;pP,qϟJeas}U ReV[{|ɖD- NV/[Z%foZ<1i!G<.mQoβ-(_!D +G&@bRC 58y R{34T`fۡcYUy݆KXQU +o~HŒ(.hxGIB60de@=Z)5}ӲKbf:@pjbgFřdQffG5yG#DAuqM>Au¢s gaӰc_g[NJ0VW~O[΢:{) 5NE sO= bd 97rIK %d#`yx܈ [yf)t&`˯:i|*nk 6wISR+B$8<,H@88Pa-` > +m|Ə8jQZ3l>2̴<#uL-2H.%CFN&] &pLtJٯ-)R_/mט~aC {-p\!Za" +-=fW<1J?~ͣl6!{oh+uZClQ&]p.Y:A jdd_46A?N(w0%0^$qA]3Hxj1d徑iQ N0P)x30t8Ul'e=޺BζV)t+'ADv~~e,+oÀY«MTHPzk.X{AUح;;֐tӖN3Dڗ +M~.>0 eK(dFgU[B@Ii N4\"vT|V&E/%8z'xJ(>ot+%;jtBEta*NP갵j.{3rTr2gAh,g/|`a]'R6<:wo2TV݉P/E(s:1wMTD:5a-'K{fPf8GA:22iZ"B+Y.{C & <}by_?m2a+_o~'O??o9?o?U^ 1qY#eg1(B*PCX(`l~?ⷈ=ZZ0,e?ΦԞ'(K[e0zP +(hP!_Ӑg'KlTȳ\f~Jbm]vC%Vv[k~}nH*=V0E.D9bl';AM. +zgHg>B~4OݎpBAx`ƭzdik>]^_\1ہ%/d4f,86.E1|wz4J8+w/|Cs(Jb\Ό#vPɺ H p=,ΨMe֦b&.90%9BuF h.ͥzn$m*k(=Ufj+ؔ|QMҩ3kc'&VLBcFUL7AijY]|__!*22s~*sT1G0dF#kqiJmݜ"".e~:{SO ػ,dy9rb2e +(g +Hq +ƽ` +A)d W ڌ)ٔ +\A 3ah`krhj+P@ޚƚ?r6!xU>0K3r A% y'@kv;bqd٘JFT!/b-uwָ{Y ~R +waf{WD(. ) _^]_=!I=z$W\ªb&v*QQxm:K{Q#āg___[_ٍp -WOсdYQ[v/W}Xh,(Ѵx.ihz&0edi~%GɦiņbcχܵQAWW +ngG 7Hn]݊ă_Z{Hcj CDM?z$7F$Myxbx(1ro;Adaܤ")':6u :Q:]$TMy%A{^8A{!T~LcOBcgx}iF+uknUCm/CD۟/W,kh`TydvP& +%E$c@)KNtpIС(q*u +ᕓ~laɚHS4%ThJOk5 R+7=2iF$6&3wa r!=1-._`;|U/!&vT#V'Ju +o+AAe"^3s95',b~5 8Pv+m@ʆ0IRUMĜl*ͨ6ڠ;ޥCr/g'CcuȈAz!=Y! +KUЁ]gV//9-+ KȒ$IH;MRtJu㙥x+'pc?n3"~j#N +8SzW[L!= qq% | D9@Yd%?\QFx@v3jxC +-NMԲؽ@@}D VSh 9,Dd}oٿ!~j>{>B*]1XGVR<:2Zؠ7Ǜn8.lGB1i٠$v }YMY !bR.R׋p~&{}:. ላ61}4Y*"u{5Fwƶa\`˫7a +RD>?%+׳kUMX8XpdW_);>k*$m`,`6b_z'4zw4-6@= /d>$X4{n<7X`~LTM_)kASF+.P{F85wA(8~4|Q+[?Oa\QC g9Lg8=E+H>cRTח#DDgP<YH--ْbsh- @C WِwPSk\!" l/SOe[aChi<-AA5)iX]O>~ ^0q[/:ߡ S1Þs4V[7? }Ek8%OoDhyr}oYg7j"$uhI:gҝ)h 헴"~fbzpk(:ᤁ1i#BeNYWnydFf2nx2m g|6r+nzkh@Ai6Y|{@[=ٗ98GvxpȾ(-_CZذ_'+^팯P|ff(7]FYLvO + +4{To!6|D)23-la^>ozHǷv[iPFK8CTSqk/ԩGu|զVFn(:ylA:/PՋFt "ˣ32{}Q$)P$bhwY_`}>laQ)db 4φo ݅Q֞sk)ַ" PyԼsa\a)fb0\~{f$f~sjt)#A +9?-P7w~ze!8ǘ!iꑧIh >=@ + Ȉ-/4&&O@#xJCt^ǹ1|-TDig{Y^TTrXvnTB`bSO=e!DԎ,4͘#ħY|Xͳ) XO޼o iEHoz bOnf&NH`k5s [=~{/jj#moJD SU݁`c/A>)9QD>U~= +sDHc:ǁ`!H#Fz"6epV!bqij>O={m25GS09"=Gϭwege"գ^ss#к;\bwLާFy+ =]ds{T&Ad_pfq-R$A! &h/,š~_ML LW;L3 Z1Ɣ(K|H39t $ޮ5`jL9CYw.2 qvx%FEMhV`e4*E}Бa/ A`ݳ +OɽBE<J tޜ|_ƁqY#~ω&dBK?Ea{IwV Rj.|-ʭ!5M=Nf|-kAՠL0>5!n&eH4\{ 5߃r@'5': ]ChS8| 4穂8jQ*hOlWT#A:yЗq2di]5 +==rfݘcyǁ:l0)ࡍoz4'ޭ!y)Yz5*s_\ͅVu+Ҋ+ʣCڅz?QsHqgF "C;C#'g8Uڥ{Re&*X\l;v[7hcId+s:lk ͫZA>D@٬S='b_1ʊ-AL*S}<2;o3٪PĨpCF(Ӂ&8c)g@C?mgq +/(CEeH.? LIb?bJ2rq7 0nOHQ p󿢇|Bb r\9t䯞&Jj/s\Qw5PlC[ĘBAY(rS3TfLT]YR-*l|G0*/ǯQxfrFq"\\ e \?kc%\ȇw# !\gsZo:Su }p;έJ( i@yVQ[JBݳu: 0AF裠3UbT@:Z2kL# +LИ-΢#O5G61X<#}-6dAACFEN0f}X4DڢwgG +TS:Z3sG\Y%ؘ$MwЍIUUeH6s\+ߋIʢG!$5@* \ +[)&(jL|H5);LB4"6HY}mk:ψ"^ip4/"K5$AtOAg+dQkh32R  Af~qփ{ȔBI }aK-ʊKwr5ԖWʯ1hjĩ$,1U*MVFF +4^^{r8=,r ZQ˟S]1%D{{bǛz%3Rnc9(g,ey@r_c~%Ʈ>ܞX-)׏r'bߧB5F@ԗ9 S}}A ~{F&7 RL+~%,H  %Rd@:01S6ǂ@ɜ7A~ 0}_4HPJ +w]ݿyrVƁ[HcuċNB)) }'`q,V`Qn4~/j߫>+.ʫi 8%f|X)M˔1)tG"kvwx +]v)!xXpq@ف*/Hf'3Uh75ĩ^AjCGBGL!#tv{uc/܌ \^ ׵ɻn_6T{)ԛ4Ome <=1ʱ{1+ 蚟Z UM<(ތIi7em~~J۞0&df.hHN VHIWկ3樋РY9 I xҡ #n*Cw#(Z~8m%|:tUHS{'"L^΍a)`< J,Y*nGUw7RPd'C8u0r눈ts(b&5p6I ч"%;Qb3 +Tio>y)\d(58Jy&ܱ!^.3uqxm"($u v_'𙳇MT;l;~(chSs?Uv9=rQ.2SJ@@س}"ƊjReJB0H1U%3MYW +֥N0P G-%A̧jTvqB᳜{Q~>gbEN< {w`vP7R`=k;?YPY0-5>Şޠe u--&I 61kJ֐y +U$1wIbE< +̍HYcNf"Go% }*Ytk{r2`(1}Wls*\dۇv#g-(3 +!q#r(}L؈z꽞jP~Pm¹IO녬c)t)jtP Jp '}l\܋tIe.)d9"3" ub/LLZ,ZOw P@qD-|~Gm =46 HNT-i@^,ʮqϕ`{~W*~WmZյJz +J6p9_ʟ|H2aN*ɒ{?s..)LJȖ9#C/4SCR;%Y~U]_2i'oB\K2ӨYfC!kC̨Z{/7yf% h)¨S[%8%!@I`Ʃ]wEn3i7V~x,6H-64+Z;Ŏt:ePIӾc/Vzw$3UݫP *q> H!\e#ٵOz_qvJ\!s E+|tCXstr"ړ`/6O&EE]h1\,}E$P bqQGhPqNq^y7N+ 4koZB_gIF9r&(j;< `;$?ҙ5șY2kyݭb M;B Gi*2u@MqvݫS QO9z_BMԗ .II&9<ԨJ[R@ #Cl*dS#-/ӴKhhnB[D{|zd&n4z>;)qRc903xsm R5VR)u(I $#.3]H [`@ߗ]Ƞ.=GQ +fZjS5%= `8lRnmcIL ?;tP<9Ĉf!Mi=4 K馔]cȦMXnXNW#>h SPa/NbH5:~HLՍ98u^:rfpPkHv򗸞0RLz _ z0A7tS!89,.WIC6|R=*DpmePeJT=6Jl8|;2a:\PVQy𐆝JkO0)ϚNBF2ǍD!~ҸړX_ӡzi~0oWT%:?$!Zh}PvkY rBaֱ5n +ms8WVs_n)z;5b-|N d Z"2KrS#j-fHyCB9њc(JMݎ0rϞ)ݟǤu/堫₂p6Œ3Z 1?p7k D4Cc? m~AiݛT x`3[W S(g`ȓL=ZLEEp$u <}hgʬa'ǓulxĝX]WTm,ifwmTEaY{kBC +`/ (+%L&㲣† 8giZ!YcZڀhEB;LQ@Ƃ**sGF#)Y#<Jg5AޒU\*U81 cu[,|iE6HwPC.ܣrţ I 8Y +M.ilp%<+,Ĩ?p_wScuRD@Do(O[6JD${O!TA$wFFkOU4ؽe_aRI5G9LqxÅtA>z҈Pw!XB>ZhDE['&t? h(IK'ItHNesD'_~R-5|$٦OI¿[\(N5[W5eȃZ{!*I49yLD)!^嵭5  ɒCJH;kS + /rJl:ƒ @ @5Qhz$֕QU'8uN7If?v+Kq pbWtr Yy^.&|iD@M6NT*A|A̯@^^L62 .+j($R[ԩg +p^ +2Aѿ!Ѽ Fφ[?s?PnPU&t1uCH~{d}B\Ǥ.o+lѠ{g;膽]QV0C{c/@.}PnOcP ;c>gJ!{vE7>DFm*l;^a7x 쇞ңECdljYcCnoLq>ngV {2@KkJ? Vow=j-Kz&nF=M BFaPrLnxj}j,fif ~#nl43eHl:X\ %"~y\G[IV }׍ªkL^ +ҏ'AXIړBq*6#HvBf`I𘋒8!c0}`f :gQڜf;Tebܾj](SRc cJGAz\%D9~w A=fV6{,U &Z:umIvWX~(#G X:[7(}#ڞ-ӡ_~nxmA(mՌFD-zJ3%wݚZ%9l2ݺp<\9F]IH>8}cTfzF:kU{% )4u@x{MAAahV%kèW`Zb-oIȷr:lx 6CsFIl'(q(Xb z iwUhZgY6y}W7~CقdT h`OCɖ;[ثw6=dqX$91W!f#$SsadW%ˑ_A;醙!^^[&L̊EUoO|b>xDM"_&Ga3{PY.i}I-vP _J["@?hGj8|+b9qB"th2jH<0k`[Qfce}+XBs_0ucH?]UD` j5 f2g\;(:Z<^"?] +,% b]b +Iܳϛu> Z7F5xEС~i }qL R "${׉gCL523:v{/) HT xZ-p}{ovHtÕ ܤsHq ɨnd?BSͪo:"[f#8ղ E k6 0RfD{Cܘ$!r*6EG;5'{Rv5| $7 .=#--zu.sX_T]E$6XhrK +Unkпd͝:φrMx?65!f_T?vl?'x4"Nvo0-.J}3v撯5tER 8u(nin=`= hv(fM0\q|7A{_lR_<w*Т]d +2ELJ, +BMOH@4"2{ @G-:chHi+tw$ @sFPZ1Ykr#Jtd`Ugë[NlEB2䎐z*Ro&P# #7Dc/5w601A$yvEJW̠V鸷U&>ßjI= +<&& Fc4 ,/{yIqx|>?(z8܈7ctʺ ؃@b4'ֺa__B +1 h!Iq.: xpmizShBY'K41YHowaOP[ qȌ=SAեQb{K0 +޷0,w +; .ku-'Ug'\R+ټ}o8=R =ڊT> 8\$w-ʾn@گJEXX'׈.{ +%YY!:2]4^&!ddܯϔG:=B䙊ڴWV~5C g-jFGaGy]hPyjL@"j(9ota8yE7<Bnl +-[1v3\`p@GoP"gcw)Ri8:2Ɠ|} N +U&_=Zo0Tz|\>> +{?}R>^o0Fa7剚bHo7-߆xx8E?FZ)r`?!TFz kI{9^9Țp﷋p0P&lR|Ư9lEtc+Jd:k):@Jp +#o$,jA2Ee}gYwr\CI4בQc~T@S Ͻ/aү7uTMR +Ͳ% a7hO9|?!7ZvXCKZtI5Ґ8\loQZ'j69-|qf309tl +p֐6D,Z^ + <fܑ:]89>f>zXY=[WhzH#Vog`UZ%5O+ȕp]uСI$ F/7=>˪<"K@e{|mL_3 "ퟺ9E,E]SDÊ8GzoݯhcB|H&u+R!/>R F %}D )M1H"(C|OKqK"e0𥴃ˆ11XnXjNxrߚ2XY]b sNLUMb.~YcN@\9&}-Fۢ~YtE|?P?dDsd폿7?'?w_?o~7fo7o*ׅK8\ѳߒM}Zݢ +[]an=ѣ +Az/J2;!=a_&d;Q"\ҋ+;K".P;a^]#}[A ֍n {PF$X vn r@ 9OyO}FiTZ`=-SVhc:SmkF]tRW{7ׂl"O} +Ej1 $pS9{6㕧-Gid)m߻|x;놻WxPR =EaS7IBZZxA=Dڙ}-=}D7FtݰFC=MiO~V.a AnC\ީ9~iϘ e7ovU%\!Kq=O@}_F0vc L*uH=+=xYMx58loۯ)|u3wTVg6;M$ bӭU~O4D /ߣ%ȳԨxFLH=o BgnYlfo'P=[7 + umt&rVdk5ulZpi:x]#BnݠB*Տڠ`eSuB(8ɷZ~:3C!1zUHX#~jzxAI%z50z`2(K%op' v: i\tZ(arc@==ޮuRyZi.h7`(}ك2!=@08)z*v=EĔI0"5#z qXԻL,̄7}Gz`Ma ' +E+3<g͌өs56ruw梈*I0_x,`te;Prc}xvNCvNR` +<<Xp8ؗo2?+gX!T &ma"~}`CfïKӾf@@DF-ݭE +}q + dS܃(tuh`|C&gͻuo3N ɚi~@⬧G.t6֋BeMI܂OQc&`㝻){>5)da#l}:9= CBr~s D̘巭#*HI<=쌮 J~O dZ{]:0"W{]Y 2 +>>Cə,Vp0nU _uΤPY4 "|@ʗ `ebFL8X̏l +nڰ]rג5utj# U2ڛ)3T{~qgkэ Ƈñ~eWU(Ze 7y{i'%h O@ܢ" =2b.3|Cz?cgSJ軂Q@aJh7J{y|Yߐ99<2 Aگ0x/cnRD P[vEZ4V3]mJVgn;dnuXY ~ A"!Ec*hށ @` 3CێګUU(e ?%F*{z.|mV6uOt7y'JfeTDħ]WXƇ JceэZJVpp4t( % :u$;&2J)Bd\vv,(^/y5t(|4挴ڔY3p@^=ToށeC4n=BvSYr0BtS\")=о#4U Lf#/q*YoUaQ1Lϯ-/w m]pڳɕNg1>y_-'Ԍ>ŋ_>y4jEV(Dsc#Wz75p4 /jq |p,%~909];[?AiA?)>fEFoz(] +D *pTa#`s#2ϻJ0f\ax وV{7D}&\C@-;NGpj[sg]a]\^UFjDjܪzAU'Q"%$@g*ѴHOIlЛ9p 2tO_ ᕙ9R3zԂGTR!/G}X~Ta zZia5xŌ s >,"ŀ8yuK=n {( 6\_A[vЙ5. L°%;CV,;)v Ya˳0;pcޢq"G5i[BA5B.,vuXVr"W&F"A욑PBǥp?ʡDjT] M#]%+{s4Y=`{F@ +mzΏn9q`]ZӐtH!2Q?&ɍ^xĎcתH&82S.Et4~{U;"0P 'aR2k@q +H(s3}=:p6J]~S-`g7rR G|jH[]^5Iȥ} '+3TvtMEPQ͌L X8W@5T9 _} +7!hKNqa1a|?9]7BQd6-pVXf _=)N)ftZ[S=^ IWeH^MLY!H fYWV2ZduAj=}hу;c]u&袀GX8=zP~F% dWu[M emLyvlaO^Z KMx>E\CaөSS2arǸ3Wڍ^mL"}2NlȵDUәue"3Ё <=[pppN4.Ep0=DR ^П֑]H'd@eGj0廬%jYz 0(pbVR~F %`+Nq-BHI^ +IP 9곛=S-QJԨW:; N$j={v +d?H N ^4F}3#VXP+1bU&4BBzTj\$l+`~d:?jsnWp;W>ۚ}DkqlV8ۅR`bQfNz (L7". }{T [AJIi:܉(&Yѭ-OuE*}cCq}#zz +t3L"L/ +d+δg2YENQ׮Ȇq U1B.'?#$hm,<|?0"x◚$nVM=|퍘_?z\b G+ MƷDѾ1o^OYnSw3rP + +dM' +;?)*LKg>xq=y\veh݁CKvj>HTq?;T5m5~6VX!Uq48#6},@ԀS7ܬ<&Ț2D$ItA;˴{=t\m{s,h}׉"0ʛWNHW C=4PKWB" !9AP[ƺ0kѡ-AA$~ 2_NX{=8qiEɀBM%DC!X9SwcSN%s\1K6# 4,ݳ3Ij 8.x]8.eEo.y(РyAY⥟uANA}aDi^1XQ`GlE- y0O8mN:5v.l`CN@cO5zy`Vj@Er=pSbjYnjq</ =)`"wh;G=V*a,z`6wDP2p ]n: }#poz>Ar&I/̠>Ua62,~{Gf!}X"K=2B~q̝=1$fHPӀXfad"{  9Ar\:R3 xφ)Cϛ^#@%Ȯ][==lɈ ĈS!&Gyϩb>E>f*3*璇{{W0 @o4pOU3pû[ +)\_[Ɋcg(=kƌ̟Sw7>Fwɀ:J6D ZyqNy6<jw\ғ%,X9\s~Zh¾'?a+E6hȒXpiǙwmPʔ+_(6k_ȒဴTDlU ݯz 2u}a=G\[9!{7]$dUF\}T %R{ |'`D.'XpNdF$ +E/UiX[` N n+ֱ[`J 'L$P^Xe@`=]%gD! +?ܽuxjuV gRu}GW(yo=NE/e&@[8x=9Qك + [೗ ( )s+к((pm۠A % 1:@7u=mԶ$v u%"źr`?<R ozuv{mBSTGFNEKq CpQ% ܊ɻJI7T{5fweVT'd"l%ɇ>?910/D'x%%N|ڞnNv{C׊14({X(:SW;2bJvE-HrG"~@PhClefB*>>ZN5}#l[+rZEH;uVnE7&'PȐQ$qW5m.]v #.{kٺYБkMYJ³=!\9eu`M;AxűAeFBp 6l;]'7lQ T>KžBJhp!%7/k!ѐ1u,r* + ,EK{=J;gND[b ʠ@+fP +yD~ySU/#߱)C歈S$+fTN޾qj,|PWl.c[S9L̨{ZaIKs^Cս[ᛙ={SX  uK6>U-&jԫїY(0=@D0ؼM|{چW啄ծhT_F"7NV zXr<'byAؙTIKcS\:= TrAPfzr0z@:'=1@=."l%QeGXCl 2Jue˓ݓV[{5S€s }eJ|w%s** +D0r`X(Oa{Ny*ՑPH~*`CپL^N*:1=f}gT + pޘ_u_-%qX ('__PF14ȪƉr>Pc M&2lVW"apė{°Ga n`=_CV"!\2a +( + %$؝TdL9L'ZLIsu*e+ʩZ69C _uɻMkX>4tDGv`>^ K0}!ԫ 밫#UCԟ Op"?:FP]@3K_gKFE#RYz/ʏBV\7ݣ857 XwA6b-AȄ5ciP{h <V._QcR c *Run:%nM `9[BzxHxkBp1ʯ_AX13zxUl>|Jа8L2Q-+1Ldn~EعD4JMCn +g+`GɟH;>"E޴C%{RGyrB{kipqB 'XzD-=*R@욐{/DUIqPph\F:H_c+ 0YfM (|XC  Qj$ҒƁ F!^t&wq)6 +Y8ss GTp%HL7繾ɕ>Չ?~X`R ^fUI_H퇼rw,0@JQ\TEzpmA%Bt9؇\YDub'C꧌I ɾKP$ 3l*A67o_2y,{ab6<3^d*(QfcK's+Վh9~lV s{p䔍Cx-,Y(E͆Ӟ_ rjgM*эsPHwKPǗ{trܬ@] h^c誃|=U y R6Q0I޾<޽@r}%mn)|7ub@Nzt4wT( ?wpYVKmf OhADYr]DNys/"v* (`hi +. +7d$I2Q]>I0Ge^F鋱[ +Y BkN!RzyS,u0ũp͉hC+~4};DŽ͢*A wuQ '386z + @Kj*Τz 1x+f6T +ʦH(Cq]!P{",0esɯң4y_v[JGYK|Rf:=Bh+e1Py 9$>Bd% )nbqS{Oz^vGE2aI= +a+!s__JGW +WA`?tYR8- ,JeQ hG$ujY;iHJ0o Sb SxdWg^n(Ü~ܦjAlo/$)fUb͇ʢMB]՚h'x؋:J X ؚN^klJ=x{t5Fofs;rѩ~&{_|볼 wCy}/eJץ).$3:$ =p s@`b6R0ͼ(DywrG :w{谫sl25qJJqrg-h:9 +ş=7aki} =bNvŰ؏9 >T+=B2n6n v؟;W 3]G {=xkk,]'8f]Qs qXl]x}EVyH꩖;JaXP Re + \V^_+$]S ) 0~_TpCRD%#5g#ث?+؈Fy/LH{/V& +bU+#n<ʎA52M=v9v/LN"sR@j^b06SϠASQG(r׹Kwt`F.SZ7):#dY739c~~lBd:[8` +68LfO=F(vLb#2Ll&ĥylԵN„&"`][FqrᕮF\gRi 'j +A%l +Ĝ _gD_8pmN׮!ؤM< hT;VUrE!ɧv+&}h}(w>};kUWE)8# !, +DQ#WDt7@YAQ'I|vG,[X ʘ){7-E"۝܉!YvvUWΰ~H޼Ie+HPp,F 1،H_xE>v$%߬%*|wǯ}] W>F*&%FC#7EUdo($̠H@sxbiKﲱ{vZ v1F y:M +y1e2J=׵ +adᴍ]=`(ox-ׂweOE +k¨O+@k-V㵂F>vmTyUii\c31|Jp -t*AA?WL9RggϼN;-Ҁ=s!ݦ.*w}O$nvK)ULj Úa/fsMh0 +suSH"" +ul +Q3"xNU"J<1u$Y"e=S`éP1ɖ457lk^}I̭OuDlX}4+Etl: 2dnke p~7@Dn\qlw% Xqn>zP;3q;+9y^POKL+!^oJh@] +>UԱ^5 ~${'}!0SQ_4\%wo HxHK\. #NW 843-#DZuϡ>Ι,P X;$s(h4VVrĈv;O_ׇ}424´/H!Q`(]K(f@6-WN%JFTgoiu*:UT4WFroC&μZ PaU1Y`)SI*W4s,ZM| JDel}B>SaEmґT0Ax26} %Q\]l1N&1vgW+To!/2'HG~i'//Xo/N ֍5AazM⫩mYM͊Rc>h" +q t/N ]S/ ]b#!TgEP}Ak ݢZ`q_9*PmoY26lNpwZ?Vʇwr%Be"hoAAI|zq] 2WoQs)a79%/1EsݲQ=o`H{bF MIpЇܲg=g(8MݲQYNțP^U"z= 09~}LUc 죨*97Dcr{ꑧ'osׇJfn +A~uH"\Q`m&u7%Of0G2T0֕^ XRثw9RPZz;GWRm{B<$m糢p"G66%C6pH/FuGe8?m@eX,Z| +(yԪ +S!9 +^X.X$?rLG>Cl[vBd [Nԕ^FFCJLqbjRe-{|Fy9b!z3. ~ YڳF qN©c$9FhxƜ}E|Xb2ʏQhXس2 eڨ1M;hJlV7afUʾ(gWA{CEZ<}).ёMA8,z#(Y{?:"QHQH{_6qY*P9fEDJֻ T1s|kp@w"tdQy-yZnlPHhSă^>'?ޱV%% +r;3"g,Wd ' (?D#FFSQ]mtIĈAɡ @`02ZJ1v *jqlWe^,>Eylۭ+0~bK zȱ8 )}<_Dr澐 +gtf|"3G(P3Asgk@cn W3nWy)YL&D #ڎxh;6~X6qpzŎ:i7D _ \sNhr)]B̺y ^вI.FN9 + BoG 3V@߫k.2>/5Qf_ϰ岊tԘ>Iu(CǤG"6)0*:D:@zEwTY)mk% &8P;ꢘ (hfg8d($k:O^2|%6]>B&F#jfBC +oȍ@bՇW:OAp]b1:qn"̩"li&^1EVC) +=pۖ;"@Mq`\ۮP B˞f]b&p|<"M2[CQ20gЀeU,:= j#F<*_[C>JHg> nX*p9%3Fh5n{*Z߾܋Zn# bn9`8Uv?+@6ZKIJԣcV|tXtnu P6 ,fYUG']T륅- +YM@I(wZj2Nr U  Q/6.X gp>5Zp;"ñ"@NbChN]>n xj΍V$Wş%M" +24 V[`9#<i^no[צZ] .wfP$4@>k/> d;!tMy3aH@ю s)ɓz:Ya=.xa}/:iE.R"qÈ1t;yT`bJCxyT Dr Li!B-gLI2poxiWc &QŔ 7ѕ=yű +8v +j&Z2@xo܁ohsE[r%`Dgܜv_NMP | N~ozD +RO2X|> 7]xٖX_dvMnu$gֽvƠy}0XQi="DєD؋"mP .o(dJPtwRUZ>0ћ% G{!’x:pqU9#%"H+=Mv#@O<#U@񖎸m|me$LCT @ig1z}y(0UQ ]Ta\?gQ#4%I1)u4dd(H,ME[ Ys~F[Fξ qt#nLn(ᛢ~o|A- +mMTza:_a '6`y@ȬIS+֝]_uJL}Z~ᑢ"jj6GwFץHRu t;e +~DUOsqG +v T`T/N!ڤ} 8SWF Nl|PaDB19nDeD- ".eyEtmy;8wL,^Zɲ +S^kLU!#SR PLi/ԙʈ##L S^T#J_"gXW5/ ?@nn$$Z5Q/iakSܶz5J0Dl}Q{Fɪp%T#D`ש"W\?ӂ/@I['M5(~Viܻ$H|YXg6E_s{mЭ:^54Cޫ~Aߨi?1]Gt~PĂYg0N\串b=94ēj->=)kycʜb?{" $f#0g^ᨊ} 5v{{=A}"rK9iG|~>l`E:^Sc+PtmDyI/ +3\nV TsU}eɋ~p CؙB: tX|K-\" G"Ku3,M ^}5͜BRVD4cq\cy*(ׁcjZj R Q%YQ8PdCb7lwQ Y ++3dlFF cG":R +g}r (1{͑9H]:R PJDNtYg`mQ!9JQRGǔfŔ!ɚfCTTJqֶ7 1*Ĥ>”()DQy7Nc>g]ƹSfPG3k +6Y;XS`6-1+c[nAE>!u)a1Tب8|YP8cO;Z"@-9F)_kS$g[]=pFtk]oD08 ^sj&m7"9@<~yD[5iVҸ>Jw3Mw<8o׏kLĜ 3y}V -¡YdN׬M@6Ce"4ǹYSV t@]"n*@#'x> +7ఉϩi̪vLEu𓿇(36ay(Kpb`M&}fAbU$6ޫ/gDyJ#4nޜ MVwnWl.x+33AL<{ +tEU5V-p@mÈ!*6yq"}eW_(9 M0"dcB| t֙>^?E`{{xv^PtGaاIї0Q<бɏ +q{jh.e^Ǚkݙ#C;~;J tj +kWzЫCboW@s;x?dʾWX^Hq?Cwʡ20zDZHgb!֔*2+9]nFshXwĽ# [w{X)qdy൅@U5w{R8\puqu:VhReU'M+PJ%^(>`DZXcԎbӢǥw[zة;IҺNfjW_aЀ%V8{ċ{J+ۧH{Y'T`}߂>z+@} ftOH@!$ClДUֲj 7#ӨAOA{}`!awIow_SOwӿ?/U_GYr|U Pt BҤpZ #ܟa +"Mγ_Ew+ +Z^r񤕬nLVQ*vHTu] Η>2\3 cK8D.ݒKcиڧ݆QG=Kᵮ 761eXjtftE´FGe1MOE˄M9Z`tVVUhgM*s8TuPVulfiW :aqT*5ǑFFoCi羔nІbj|Da"e08v9UL8`RE9=l/dz䀻aW}!3!ma=s(=ZC~B{Od1U<9%B8{@D ,.uǹ!;1-פ8(ԐcTvDv6@Wk8hih4UHġ#3u&1/MdtF;&5;*C=B(U0CxMx+h\<9JjwJfp^gcƐ[\> 0o Zo9qеg1)_]s8s)D~'U4&E(. +r&E0.&j; {ޏH?]nLV]ewG5`?NDzwa܉YV2Ս3ZW~ӑ?g bn=Z-@ vֽ̰{8[ΥT}'K[߸;$ XYݳ:ʢӍ@ ͂Dw'=p0S{97 ,eP?9ų ϩhRJV`mZBu" 9EJ\"1ʁ}ُ!lL3f(򁏧ǟo 6ZOb& +2Cc0]$"g +'d@kFl>F7&d> +aPU SYs,_f_4,froJ9YY զaV!ᦩ+%2a93`+taF l(N0S)t٪'vykjFi*a,D󜋞Ɨ^ po%=*A"%b=0 aȸJY՞0dь,S鬏k{J+_,#$L“VAf<-C7u@Y[wXV`}IArn[=W 3z4 RLzNV7О>gP: $o{"Y3N+{Vq#^Cw@'dgkN>"?CFo[ J\gz"`8zIn:ܘ@Xh.s~ʘtSmhψۙZ@硔=Ooth="x?cʷV +y_ǡaY$B <-'"Y!~[  EвQ$URF2C#^RG!̾a(& /{e`3ect[nD͝KڀFzw/yQbˇ\L +ee9sC_QK Mu"Ï8o=M; 4J R;:1^m:7֦v/#!gVᐉKJv;Ts(6 2{h2ʿهIg +y_\"crѝQiH +]>nfdo;:C|nZ +(Q@zVY*`LFWA+qgUCH:~?~-׌>O0.ȳAd~PgDN/7b/U$3B#7#bJ^D37黍 +>wYnpJ!MhGI34m{+ѭJ1)|ǧT,;nҺp_hO)Wp.k[d|@W;۔S=0^0\V8Y1D4xK.MWR0̾s>q]9xp;stD1.U $ǣj+>5zkxmfJj3))Q"$BT[NI`@HK($FDr%52S\P3 +eGVR#Twyw-`NAߌ!>u.F!JWF3~8bFۥw?' htf{~ώAA?߷k>czEey;ÔRp ?FL-ͯ{r1u]iJS\jjl_wiyϔaU +uo{رMPk/~2dGb,峎(2Euv+frJw6vƗ x3*IxƇ~ KbW3Հfբ6"^ɶA{N0׻AAf&p 3'Km)?Gr0rO0,M45vMZ u9˄ـt\;(Us\B{ +/ /:?ԭQ=j!3pDjwd-3s]ƛ9 Dyme>stream +y9N\Т97nx-AfE|IБ=8TίOoOYbg뎀-=p|F'c-x+Vb޹JBpdt_$u#]_O0j._̙uą¬!()$J7vv-i+Sߩyh+(ڊXQ2kr;vvU?t;CbZմSp!$Ï(]bs[g(Z]l[x= %,!Qf1QHyWcy꾥  %1sQN rX" +9U pf DV"*|Ne5Iק"8鹬DLyZ^lघGAoK|FƧZ< C#vl;8rvDO)DTʵHӹ2fqr Nf}{l +A7IЮf0ťۏT^"L̅p vwE~i9$7{>ba맷k![ [*龒<2xt$\Gup.vyS°4_aNmt_4µ#9<*JyΞ" ۜ#SIy VKNQS)8YU_!lږ +Gh ++QYCN fՙ>2u决6x;5^yU!B U 'eYEN1x6>b?"@-3 w-xlu@>ApN%Yb\V/+>8G;CGsuzd]>+뉽qygߊI VX>aU&E%ݨ*9e-=[SofSGC7xaa1Jtpy4]XDe^>K@+졔HG{8}"U=Vɼ1z/u#QN\0̄iu0TLIM)rVkbfxoG$B^ϹƲʣ3+yĕ3٫C"?ԏkkX7)@`(] dS"Iu>5b/s롃 z깷tL}*|[ab;wrgĹ ;f_bgtyQwC@EA[WX-a_?2[O5nhһ sX rw= +@?w}ʹYfU8ZGqeP%dwaP'a΃A! |$qO$#C&.\Ԃru84xsbr"hMEIɯuz;waŭ_p1F}W{ŨbO$ǁg|D<k-FYz_jf3:@h8!+?Xt׹g_xh cƝ8W_A\#yæRd9v^?E(۶ƚV.30@TAɘ`Q@ ӒR+DJW@kDа[;r*7cf &&W.ѷBѣ+jXy&@}3,~^}o9 +Fck#c.^Xmw +Tz(Z:N 1?5CKKlZy'1SjQP~*ϪWqʄ0~X FS^;oht0v^p_]ZdXyTm;՜oiᶷ*%f0M| M0@kkt$N0 +Mq)tvdtS]F܀VDg|4Ttt%S3SzZ̒1sfiiurH鴛?XɑT5nfF]20~۹0C9Q :#=?lQtE\ʼSz]o9_(0>S{w 6 O4] *[-i+4v+H^`^S@oyړ[]ڥi5~VZ9xπBRFD"G:nݜ~AR0ȵkيRI/p%9Yh+{za7h': bXZq 3dCNmDĥ"RL)P?bߺ/!EA hyJC^?#,h1rPF3 ) +o="d1?Ծ!D 3v>GTȝ"(av t͝.<1O«yu,m!]rV#kmep '7Zx_H/P@oیlд>!dx˃c,D]G&=0+EgҨ.=)**-~6Y1sz?,6h^vmv3­ze'7_ïaŋThέ'\G?ڨ t)곯tuvՙ궞n_N)D9>L] +̼ ڰr`L>P\2,UލVAۃXE4 l iڑF7[ 0bs2 eU#fI +I@Y8TshoB(x\!KABDŶ$@x왮NQ,L2c\w +^ */#kq@kx\ )ha1ؿ5B s uTo% \ 9m'ʽ9<LBԐ')} vy +(@38)[JD͑|=ΧffL<@WLL'dXJPCQ6툲DPLntIdHhI>bVСxG~.OJA@—տ"+Vd(8g!ϧ#Xر_f `Z]ږ <n=]v$^ j!,00*Wi@4i`d)LbߍU3tt҄isξRWk{oz8b_!cy@~\OJ8>tMt+3+6'oc^(dH~@!m=41b]cr}CI) y٤@*@pDWqN =xfuM384$#T=6}I~uXƺDh5@#%ձe+JOY?AI>aDw +w6$z۪DJNrA_Y?z Ձ}ItIp~kp+VW鄵]|n-uo[)n /5 _[֬cbaf|UlfRz_ eE)yyɷ*;JPkPgTJ:vOV{F$V3Mmick]$E$1*r:]-!S(M;ukDV֞X^VSρ"#>}BFu?ă+]T2H#_Hr321֪xї@]Sek{o3kWL)@+D8h3a=Z*wg|l 20N[[&Hw^>|fGLvwiѓ~nEn`95J +qC_crGc0L÷!gj+#ZeZBf&B/o<^;z96- sO@(V6m_aqX^/8I:kѶw*h7 +VX+!ۘ+i~ROvܵ((^t̛gGP`GW|Fn_cRYv]i(Ǥ3ږоS~s%K% kh0D5_g:f. )ʐAD6/`M <tNۻ[GCsGS8VPFe +b^3g7e +W;sucl$Y>;Vҵ7 S;LXŴ~1~A?$3R5!d|= ++mG#so%HP|Yu.b^MUBaShTיdO:]:`i a uDN H1ׇ3硢80L6MUԠoR IX˴U `bM2nݤn `C~H:׀D1*y(K*_犽qvOz* pR*F#+Jz˂Ȁ@HotJ➼~`7 K}GJY OlƂ]ˇ֓!4ׄmpz,Nr~7}+,;+*zD +m@D~/xcY?@V*C;6#Q)숼)¶Y'KYX$[^L~6|es&BFc+0baЃѐ>2WRy)P2QA|:STLAa$@0S8tpc + +]^^RhgeM+%LA{sݐQ[=ಭntuj(EϿuq}OpԜMO 1əiEa#"b3۷I5.QQ';!V}jbԸقH/<<} C1; Te0b]L +Ǘz= YhdI +cDpibX?VSw"Uh@jŬ7Mo۲Qv9{>~Ċc(ךWM. +cpd +Q+qt(!۳8T.uo>h+vfmF\> [ɜFI kF@{>,sѼ/yz]%t1Q,'*X#~n:oLJatlB{RH!j{ +Z"ȭS(UYI8[]a+{%H%9͍&Bvy)bhQw3z&[?0}w[|IIう˱+{ +Vk/ 7RCiۭYfLRg@'ި*xzGKa4ͬ$?X|b)|RfK:فO%t&MSvL\0*b^v8PD,ķA PG pk/3iHՔDgiu*!HӀB$F K)P&(KJ A{ ~0OV=xU||#:H)6Fhdvb3ԗ \ɁW]#1Gbah)ڢfkz쵢Y̔V; Eslhk#DІo!#mcE +a4)(gՓ7L8 +`ݔaӃ;t ȧ:% -1T:pkлs[0΁BCt,'.ϩ>)tj`t^/-%ڛZ|04 ? U_v8mY8l^j\%aG}t؎'C_SacpAg6V1=dN"o *|"xQm`(F\$rpw~yDsn\3`[9#ӼV8?OʷI +yNpC'툇k\h[X(º!h졪gϏGX8pm!y("V߹>9AbGمgV,l 9^F>=rQZ0`ZӏsmMitM-wVuidL|jm3ޢdƲHmPG9vuDƀM +8Pǫ n:K2uC Og͋^\N`QԌ,t9͉hYu2_HnM/#ܧRGjJQXsX`FPs-mk$o}w/PdUYQf E%zoDT "Jaг BFVg}+ϢSFϧH7npN*J? GDEa֙[ψ<3{h.0kVwZ)tE۾Xa3߄rɎDI6)ֆf$WXu dЎ3Yʕj[K#6~sVXt%Uq~毌Cx#uSvF(ywˋG2<6n!<~'r*"L'3#upɴ8'ʈnؾ.9; TSb; +Nx-b?ۣp~ 6\ }|旦2/0+h(UgIY1!(PTF\+\ÑCM޾d!,E ?6xHIlז OrP7ն'y/~ғr˗6aU!lbi)YuTr<f0fG{V +]M| fW0-G֣+Qc!2jI+MpST￘CbX!z\gH.Ŵ{"3E0'Fԏ7`87q|X׭,lg~hb/GѰ;,mG~p[f[i@,K,@l=(ˀli%;/ړ#@S*>MG(ieGߞEu{m[C80OmGp+s|`F:Qpp +qc%&7c؏|ȏOʨf-'v8wqȃxڽGQ #ХRcL3FtnwVf Ɍx:u .֯bジ= +D122Z Wwak۫2mO7Lг1yzpqyJg.>L% +Taz{Ս D}{ +>u8J^kK2e@.R$6.,vDVKN5|5`@#w1");C6_Z~EtĮ]j܂@Ye/ 5Fl~F^h❭πU?^EmCzsZwZ`WŘ0kH>L=5D=(AgsS%)@OuOttg$ Q  ] L_Ηl;)hzۻ^ʞ!L??QRfHQ g2k;˪Ɉ#p^a*P$\&9=*iTSD & /aγ]`07wY)d9I$Ŧ%Z:| 0]HDnz*aCF'qXlt91:t?ӍTǓ"~K%)c vSCc +Y++?sӧy"K2ЩĀtlv@UbEoC:*˔I =}#pXlXl!H}|O*}FbT&ݙYe=PW6XLjwFyS ;*>.ȑ;bcs&O_kmd5P` +[ MJ-˸uK|+eɮJ"{*C ؖf3tRvaክaR8O8>.X-_NղÃ{SlӭE=rn36DrŶhb†lZ9:Qd2UN*~>cԤ6f7"w#88 :LcjiARہ6XIF %UqA:C4,fT/-N4 +v3tfkSĺfЈί9 ØTFlF_$0ʂ\V 5Cl95\j[ƤжW=HɆz<;6[zBsYJ+GoOJ< cKi*>?ڲ*0;3Isa:rQ^##$sQ3?__9&AW.&#h> +TU' :(E [aJB΍[a+?D{8P ͑9P!i/HJ{r*/l2oo+✡ؒ[V+Ӆ$`kEs?EU~"Y< +ıV;m]M00 TRv ;8] =oݯ {-pUC{RUBHDfGEں+hؐ36/AL +SǑ7ꆑJ)t!8NǦF(g"6˓4e|/o"/a+YCꪪR]3HMc-w4u[7(:M3'\6AyWgub6rSu^;}u]| +XǛ͟oQzd'TeaZ_WCC zn:צ5T@0gsNܛ}7qzVo˔~J><|Ϛ2\*K{7"[Qؾ`"!,-8\ gy *KvWӷRscƆ/lkGs['X`W1A~Q k3a2= +5 oFQγ0yn<}nl^a9)r* Ήhh8Ć~Lhvr7v52"[a,E5ϯnwfG:]bdgŷ `:5gޯtQܨyIi?Ӯ¤.{9c/V8)Pĩ$[A÷r0o2;Omv>5g|kXG|op~q X aep39Z@d}Wƭ_s*NxFXjn0ۖy2{erDMl|N٣64L|@b+t!0Br +(@9P2AN^k{J[_U M@yG<.#I5p؜Bg_@wäcv6$>^g~ߏWbk+("tѹ5O0Uze;p]qPogFUaHA _-jT재htO2\7O%#hzGiyAW$ Z'SfwĮ="xp5|}{ݠK#<IsYwf2_!@#IֿtkԘ(JfFF^Vz~ϰ#y3q%ώm "·FlrAL?c%$Qy&8 Yւ+\7{K?-OʟGϒ} +ڏŁmQdS.Ua˩^ wAA T90Q@k~BQRU5Pq.}v_&v޺\4"D@^_mT_L%[I'1 e[ N=n+5 ,7N?%$9ϥlF&+_n*,@6h)A{uɃPpې4D·n$/H9mrX-ywճ8Ŏ`U8s'@oﵡ>h7= +Zn|!>paE];5seNEučڮyaZXBdm/xXLA j*lFHSR:\ҙ:$xН|6jssΦf(s\wh=Tb +-up@ vt22(어Y&)z[|S|tqlz,nǟGB#-bKjU@rxToX4eǦwdHlwqT"n (" +{v +Wb)V=:clR-} iTI0tŎ&PD6|D:KUs1qБC['6%,DE+wEMd/""եmQZJ353ik2_Q?<5ϱACZE~ }4\YcĠ + iꆱOeh+G83r֖oi"гT +#ʁQ@ꩥޕ,Df.HF=Ց }]l="@=%Q%"lXZ[ϯnvoxW{Q81\0h1t|vZQ-hYeTH)"Iϼ.; u,CPuM>ZssF Ikq*RC(h>}0b^C VQmU5(x,;$hy~|YD/ihs?vxW +3)2O%O8ז3^ zDۊL6ӱ7%~zyxM}.^ [\J}`ʉh֙7@m΋=ch{|Y_Gl} D^Gtm6Vbn eРہ|+y$;Zo9?GY:ʚ!BߓFm|j &~]jZ54۸jt=ec" }Ljլ4!̧-ci}á"k= KM6^j*)mgUfdΙ]1JlK_)&/ /Zd"a1[m Ry5f8f.gG|qm5G8ӰS"1$FEӌp&8"? +bqrTfDgI"6f JFkU|W\U6쾊nsN34W^_r 2] }=#O_tH􍬲O_ȝ0Y e\Tm,5EX%\V\?t tw{7%Z̍ #sIvDz bCXVܩ)`+ď @6YE4/7`=+3pǙl+I E3#rUR5ͰEP)rx%\W|.$ygqղz cX;-#8~Pv Q'Kئ6qJ@Y֙_ +hfB) xd߫d9I#$ jDe3L5ՇS6XsK4;*)gGh)5yͲckk}Jne5Q5+m'G+sRǘmG;6@&} _U&|WzɲꓔMK + dO;wB(svS|?M$H);] =O[p _.s#8^GyS0(Sv&bbDK}WKq6Ii.Pa@ynFØvFXPDQozdLGbo0C +i+ Fvn Wtp'y-+*[ g^TbR8Ԓٗjiikc)'asjzʋ[k(YXV9y% % ss4wGKX(*jZiO 謁=2sZf6ӌ$I.^eԴn.1 1c>G"Fޯ4/ ɻ{1vW2 X렵V1U7fsJŽbi~UW5CPU#'k8QA`ᛏq?{m;;RٸoXq<öyd/H&6+)g3"Ԕ,vsڲAyGƽ؎WA֠̉})VY&ʓaUT y#ݰ3]HT|Gt Hϑ%ie+M E3#l1g&]?V%hjo&=axӷu %v xK +/wOn%Os,&מlkU9GBH"U({w|̲es/y̢ +jk +G׽0Q^H +qQ!325㶲g 6~`~, "7 LWuj0l 0rAn3x'&," V&\Ϥ|F)*vDP!§1(g.ە#JERB-agRQ*])(TTpCT_V=a1I׎S7eذ(ʼnH{yCu4mL0Fw19Dl/z  z[?S˩iW`f +@nҌ,>w: d|^{JBqS@}"T1{W1oV{jI&vVۂuyKj9H[9չQWQ:W-uS<9/g5ZIfNKlB~BÉBjOi1)]~/T%ų'5'g&N +qā>gJ)%*&Ƙqi;(=IS`f-I¡a-*fNjt:BbzޜQT{-ݶl r|$ԊB+/8.85 +⤌}ޚnDrJ2<Ru> %1 k%}&}Qi~̪e(%iF€CmIYTiҘXe7@d *Mr8W[FB&RŦU17~ZF4;o]Ul9\=Y۪wG<]?[ NY+N| @=ғU,3_[SAlebwA=bV4qt}s"~MΖ-Eȫ`4~a4ԨtWqgfjdcvY+R΅[[5z*ß '"kTT=svUξB\#jD*!&}VZj6?DLACq>#| hөb]ri#!(l3ж}[vDN"oy[ ^kg3go Q9 /` nٳAgDIw.HȹPʰ:Ȣ +F$ E>hO?92a 4?^["t|18=>5Lla0@c,2n5 +Qaclj(BBٝx.9ǙzL@<3 W,#ԉ= S k6."&(w"`-*sВA=Ë=1VoG&|6RT 4Pʙ')$Q쓡ٞ=LJDȆ;`tmrJE@]?t~]RO%G=U*šD#,I}PFCIlHE1wUe*y b +]4n1c~=}GbvGNHEJD^9$| >~#Ml%!,1KPh4ٲO]E)IJH<_e޼=6 NM"%|6CJ2S _"k>28^,7hUbc(s;Wd@mrA+ź߇yh eu*el7jU2ԃ&OQ{OxRoe :ѡ׎M dTeql ۴tiJpƞ=!@xcHstJV-Χadz"2捍.Oo#cF^~a^$z(Bb +PLCHD YLk$s__ES:ӇG9:eS!+9\JR9!~c8 dC#'ZB+p'GOuH3{_^)BnhLrB ,WУ3r3e/<bLbF|6E=Uuuf埣KG58fqtJNnD[0%R>f.r@R"DEȕ&-/JWS &V&I~tS,Z"v+U ]$*a-^k~/nF~lqZ@gLZ)LӬ%ALJ,_2qO>G! `$&F/]r{wDd׸mX1[3݀cl.K(ݲbS -GpJ>9߾Vusu8qX;^8XB֑-XB\ˡ*RRxNׯ~a~'\.V8QR1mPDjNKQ P΁^: +^DJG%*zݟ~l즫8Ant=i|FK@s)QoHYF)-֥|Z00;G +zӐ+ɓL3{%$H*q%&ɔȲ47mؗ'S؍  z@ +c4œb29r󺌀#s_Bڰa =3pmK +A߻^ +gan}(Ϛ}(FXo?TνlߐО n* P(udS-Q"GEP:[B4͐r;*ʰê:3׉]i[G\3) ƫ5~LY2~:>]Ɔ}E52@wr$A7-i-h7]HN" /feM}9wNde=.~]p7NǶco¸C#ơRce~0l5sM' V!Ig3pSF΄yf=A$[v= y0mqW +2+H,ЈC;im>W$]dhd Vrv㈥;\&yFMuRň;ĒJirnj#-z,X(8Jr;mǫ $gk>ԦnYY1 ߫^,aE+3C/"\߹)d&1  _BgIZqcvcY{"AE!c;v}`/RBq ,R'gl,*~L%:ZyYzeXs>LZG +9vSTN)k2`q; VmCE|cU!U\=&yK@|sA AHWdbvv3j5+ku ;ʱYbe[ +c7۶GwAږ5\`tM܁&ՋU`ޟJA2izLfc@ ?/dv*|O`z\J{gcr(k6MhRS&J@l|#B5I5yܺ-V.i w\`gտN*zpsfH V=QbRR㙭kwT|9, dyEdĦ Y #rUҽ# g.5RqA ֔}1`E<3f>SvJ{9RQ.@RAr`AZ$_RKq2aK%YJ=EA#]T.LC>'VsGP&֢K})ٶ.@hdJe$@TLڀ{xdpO L16A۷d*PbI@-ݶIyh|-7vD\&ܐOQ=2MXA:P͝l8bbՆ"U#,^nD=y,f')-d+՞kf`K6CR +W}7206gS0$ +ZG~؎-EQ)h.,P%Sy48%<ֶ[@  PPn4Ae;T{g1:R\bL9!jzh/吲`pCa$]bq6T,귺yב5+bZ7QXGcA 1;yb L^LjfJ :DºIAG`!g֔ (ys00r {.$R،|#xGD(;i1fFy3Ǽ{z$[: ǗeAB`yg-7GLw2T60KҘ;AS%iTŬ + _"͇SJV7nWvL%/&~9וU- xA\TnӖZ]ԗKjl>h96UGmJ0jw4>R_nع%4tٶc44 S^ίP[QG$O͐<b d\:dعAd$>ډ:g35"[)K#P?|%cYrbVF4 +bN+/G=1IYal - hw1G @"EdΛhhޏ|ZBA@qVVZb2xzgQ%;"bՇ8s v 6VTϥVM; JG/ų6U +o%Q)Ym 3wmT1zĀGuk"0kr[c+To|2i-y9T@e-ŐحYF~Smn4c1o+EnZ?oM!*bTTlaKuX)z,L`׊$r~OUva FЮȥʴp +Xl^m fUT0%j=qyZkpT>{uphSj$u Jp_#b4Iw*ԍۗ*ajC [NpЈgׄnw[JA:\h#6jlj -FW*UvcR"1H`0>fjp7.%0 -^xƬC K^DWުvXɣS=c}]I❧$tZ/ZԢu'HF(6hkYq <$-{Adt_>n-+LiKũ)$e PK#/W GK4`bRROoP66NFcbRylpeTF5%ymi5AzYZᕭ"L*6SFMfD@*ψCŁbSz &J\" +Dh.%s>eoHCد8_|ev8Kpmh 5Cf-eSHJBp8J{TXf2 +pw~;pl霉vfzS5 $~}`Xa39N'Go#Ā MgY:@zQ%`}ě% 9#J݌%lL%*<[_M&Eq'YkymE'5)/ 9)~{CPi@̣8l-[DOŒWC[ ;BwMՊs+fv8d-;a>8蔓C@)>޳#q7aځfJmuwjj2Җ~hHɏ=A,T%MQ9}501RpaZWjariKiB"Qr Nk"보`ގTgB]i B% +ҧ)%-aͱ0 +nT6ʡ!DKņv@$&=0"!קCtmYAqߗ"6خt +l&tE>Hs&o+5.}KJ1n:-'C3fB91pgL* +nj&=~A~vp_E< rXMrMe.V0PTqI=qXS6$y$DL.˺@_jG|F@# ߄C},GTo 6v_# }1LHR[ fG2azrLIBŞTog;%qἭn9R|~YX| qэWKMEĪđIDgvv?ܺk>gF4r_!$щzPٯign)7" D݇+=<&SBؼHgH`T?0w:~->-л(r -]Gr&:L74 4foFqO'b>g!x݊+z>#ai8Rֶ%y%["ctOިNDu +-xEoe8$Zp]`$'5F&zAw\YVއYξH;M-O\UY+mDZRXk˪( .~xOjrӽc!NfmpIh!wFn,syVM|$rwψ](JZ>WD֭dr\39ك\⢃CpV=ҙYØޔ_M~+o+dWNJ<^;A DܒDOF{\_K?:$E.HԹ2Ƥvk:)=SȈLOg^A ظjvd6Rdl=8pq1TM42B[l kȉW͚VڜBp~F4y%/l +g +'hk"/ngERZf4W⪕N[wʄ ^/jfl " ; 5)R''5#Bq H yR-v$LԲm9)+c%~МD$'XQjms6JF~(Kx>]ԯ _] >@k I5[/,bD>ṷ9)Jh%/P#GpBurLٿ5LKN [>ILO§b=tb(.ٗ)h7Xh낂nYBUq"KS}P|"{ jɝۑv^NZ S:+ +[?x1'I=c 5FwIO lDf^*U6) U|t0芤pD|jm7_[-y"0Kbּ$c"hh)nOܒ!ɣ0ts3y%svYߺH4,/'I8RB銑;56+ͲEcCl-n)x_#l3b*oVUTW.An#>Ifr S=!eϘR~Ӥ5$FoC`!oNnW5F;&2ǚ+ܠH4sNbc햃O 'Y0_!fzB~DlV1;%vbϿhnLh;9wvCyֶyf.}d *H\[Yw:w8SQFi-66|_@D`\i/tm$GEwUM-&z ɤ t؛ ᴢ?er E(..+؅ stQUe[dP\TRUܦ-`NffY+WQp`d&s̅晧Jw)u)-eQ6xD Zl'uv;`17 /'DڱW{u.&ZFC-Qut0]|Yʍow5ۺ'/ϫ`?Jþ9`;(\tH\pr>9'™zOg~bջ(+O3j1n{N-~_s%ߗXzp25XJ޽vWxյ|ݔZvrb]a]]IR@s>ڈgU\PI%p4;ogz?:T盂΁޷~[?7UEB,\kܙ"-!9*>BA][ɛOmվCt1Me3cHѿI5XyNi4WGթ`ySw&Zg &'鍠ȼ2U?{t[*P'Q2w9ZrjhBq$H,G~"Wy<ΝO + @C +`@#εv1jޖdH@pL Ћr::ϔl\̨6[_Q}3ױ:82 }E 儏϶ԑj$LQ@HVk"J= +D;wJU5}^Ѿ 0.)ڿCJf_S+fDJփ[Z[fVq">28 wGSa%F{ 53%,Kdxf}o$o|`p@G[: Lq(wUv $s G5S\c)bL3Mo"GsX糸iQq6ST\%^JzцbJ")P) +j=3;qPߗ^RTsK\g/7أVƁLT9 F_c%r77CX)1~FWK6ZQJPq;zIļSzk=(oa}wz?<9m8}9.f8|6ŞS]ΩV +V|-4%W~O f +{d/c`؛#a?~D|;6}:pz7oiTtn3@kƤ`@|qweLqiذg2ߝ#Nז[:h7uH;K*'3f Zg{WG>iܦd(jI 5غUI*]aع;M+ +ss{kJ*,B/GRA{C[8YL2=3Luma`o깂z}(G[eҴ<hIŰcc%!Xb6q+mBL\]m'8u*yzIF[86% 1ƫiawEqo}"VaKJլ'<'JSS0rdgPú)"Uמ"U`6A-># WGrЖ#=~R21 +=Ar+:])ul%%_(i1j@ dz*g)6/JP:Q= P'ኁXՔZsUz++W40ChI軀@JA47 5Tצ~a0lΖjӷ r}(LL1-Ti>r'gUoAp<џodt2<ǭ̇ZW'I@>y]'PO00{v76*[bpjW偑s@}ߟ[JKk̤ +GZ;Cnc]nv:SǏH-@xI#)(CmGq>|B&^CJ`!ay۲(j2S^Jb&$Y>.AL/dCз8ߙyǦ"F̲W%!Cw|Gyg D|e%شny|_.,N/,A[I0%]q'Z%i £ TeXr˿,d + rA9y=%3#)?H捏z +Gnvi]vhɵoyacDRt}8={.U_r=ګ| ґ3b׶ߘ9yh."(Mx=8#N1?r?lŞ7a6Qc`|%$E}V;=?نd[>))SgZ/ʔe(5QJ}2 +C sL%`g^J*Jp3^;~S7qG\J>AOo8+DNc =L l a# j)K%؆ U6CaDO%S_oQ1S!EFBϮQ#.dj%$UR)_1*,иL2>ѱZljrOB&s4gB_,ǧ0d89,}yQBxb IzxdmeT2E]T|jqw2ar(@UPL& >E)CCJʾqޙ.4b)I`k@[~f&}MSy6؁J{E-`dbsb'ũ*  ׈IfV(xl=bb}P,4HxDt^ꈒj,"aM!;=$%lV`Gr+G x'9lcGu)Pb?>uEkQ0ij@2\i{hjO M&]/8SE,ty QW_[4W*Ei=N{zqψU.pŘ?ODtj46ϐ,nX4yCWSISg%'(.. Sӧs2zzO#N4!c dV]]%ispUJkƂ>1:)gvNXsv=WK%tt|&} "Oq W +8P::Şr(3ihPB$M1;.'N|9Li2SUW#`,2:jW<p*bXuaIoGԄ)C]vcHS^\~)7aT4D3y""I.P>F۸M,Vkǔwv.Lll[23 ~5qǁ"?yAS#~DJ̑ s||t Cf'.ˤbEioIL XL~=C{eڛZJqRBSt.˔qn 9t|AR|(;ļ;']10쳧7:DP.'=E:ҁ`RMJքłzҨ'$[ЈΟuGHzm ވoȥ)mYJkC"G/`)x0ZW[.yXD6h+@CCi&'Ȅ [EPdOBExQecHzM$!O<7F{4Y6?&t4zMW|-I/ Be#܅'v*oZD27<[(˼jy`33ŋ*34[-}S1k#OҩMO^ S<'(D-PN Ѕي֢i#w&-W&1X,MXR8 +Ab)Gy +nPKU/[d05W!ZT|kQpbXK# j6oMW KP4 JXЛ'Ė{.9^4Zi +p6Uqy +jF`K{Qv=q$Vm :-*O%#5Y]G#ID8ͫzs&[T `K 1uC2y"T{[l#RXAlԆ~R}ZCAl<#Q>ʐ+ӛ_Ϥ^41+ҕRm&]A|L5(!ѓcʜK }gkʬkCKN5щzݝTEؒBHaz"˿J,\ +>]w*" n:&j-тϑWL|P<( @Pͻ=})^Ur߽&`.7aS׼|vf-OؾPǐuYzD1ؠ.MՒ[aTKƿH&:(XYz$^91]~=lՍgxٻ +i4P-p~L2"0%'dCOI~Z[\0P[K3[`YŪTF4xu98Z|F467(ͩy@;<~OsS5mzu|:}g+7+)4oN[ڄd L=p*8~xXk\?(AjS<,FDOF79 jJxsD䗩T b.5'T~zXsi~Vߥ3~WRTSR{F}qΓ?>f}3"/$<=)@NvbRXXAߏ#&(UhP]_n٘aP ;]s!<jZ|EEU<E;u]CUwM-0A?G'm2`0ڲD$Mbn)춂@0|3爺IgT@y%3YRb*W|_IBT`#^H2Dх0))I_è꟟J Nbź?kDbjEt7f@Y?Z mIՒ gZj2kvh.?1y7&iv:Sm> ٗz k V[N'd(M,ObEsZ ߏZFbn=.+Qw2w+N*AdCJdL.^'QCXL*>OTeZ(;k;kQ+TW6T#دڸv M{h6AjwHpGMHD ry +t轳^ÉdqTsrye9o mh{=rj'hfg59/zk}KڲDR# _+z+JD/WJ˰ 1w{֜^'_Ѹ<]nh۝DZlh*zXhȾV@\+ d+é/](&I }<;eA axgrd1yJslFGsψqGXu(tA{J׫J4d݌KÕڇ.ST9S7O6N.y049@)!uVT +|lQP rxDCX$Nl(ސ݈Ð^hW\ F#'V  +ayR$4yt# qd2$>D,d#PȂs})@fe %NM3b)%aMMX;};I@-ҵnWaxwôJ*xRbK h_E'R<$6.ڷuv))u_dMkQA~丐,]^\k];a-[U/h{<)3FNDpOS + +{^}hgwcךCnŞ`0шχSnF,Ch9+36#ധH<qiRtԹ4U/"<1´0 +,AD,&l: LXzS5K!Nϥ[Q_ڮ,q@+;ׯ`)UC +hЕ'ԑh!2}@ۖx{h#n,AXdċT41PK6"rS׏Ģ|fγ:2oBG }݀ϰH\[,u)E  3G#gɧ +}Fߝ܆MߝH=#NMbয/jf7VHybh8x,V}+#0BKHÏXs:L-?aRZՓ|Ό0 X\6zUxψC%sżUd,\u%kඪdn.Da{!3j;˰FXVO"b7oй)t͜To.~ÃLcG +qLyF&&42EĴ?137|϶Ϥ97'k|.HLىѪSRS3^oUB:bCm 1SwENz)Z= +}Q`6Nİgn(%J>7eE^ p۰öh7@2r.3QX!AWNy ýår-I2"U]TZve,;=_w܌X"dA!֯ď1iĶ2!lXT`4\5 =J'0F;^_т3퐥 SqIV#cRT,ǁ߉^/nwG-;)};d}De?)#*L1!`RodxGf8@LiX|.oך`tcOۿTF, :e;Ą@M?>L9y)ܴ`TG j%aqy?"۰@G}]*pa^-b?SxX_TԺ.`ء.VLvXiiQ%G2 xPocKpJM7ȎɱGDܒN#׮@LɑJ*t <$-/†n!"t#šu3o(gZ\KCb >ڭu!6VG⎨O[/RI]hp\F̟oMHMt1Ϭ~~|$P̦@xUvR.o"1?X%b)zu$AZ١(Ƴc0#;h8xq*'=i9pjBve|j^Z厘@qϹ#NmZb@&`sI~$R?h zP(TušB)޳[5A` #?sh)m/bh q15kjD >#l̔zlsqXg/NrI{`:AE",GsΔY6Ʊ$z +V9!F0ySױ:E0MϒRTb0ƅv/\#3 +qS\Q!CsĬe +D"BlNa0MR5BbiowM%⇆/@z#}u( XhKa` j@JxGYf!$$[7 `ovXj~s4A)+tL׊t8-]s˙ +f| tNU-f]hrL0 2m.RIVenxԗ m2դaDKs^ɯ3ye6r.1H }z7 e}a~%@;¨D~E +sʡ.-&dV$;EBbES^9x34 0Uj=p OkP͘.B5ř15_VpPY:w@o&g{)#y"bRLvZ; ixSJ1n b(QѫL 5$ʕ --oÐC@ "KrJI@=a+y~ٸx3xH؈ D\vŞ+yPI7ҠE u)ٽE +R` j +8o@5}Ԓ;^vZrVjv7LSL!VSa۶+$ LuPM-8F^# z؄@tN$lľ&[Ōj;q7vyZȹ*u}!t&xJR/9$25O</T s0KGg[fضÕ˽_BZs*T "`wO KV"̺ҙð$-Ҟ+!4Qd, `Bp/Pt} evוF,w \<8;+hlhؚCwٹ4K"AvAIp#:Y\-|\CC&Fpjb` +Ge;5MNB aȩthql(Q>讒UD-HlM:g I) 0!aAR5OzV U)  (g1 +5i+.R>84qѭDrO.X$)X3u?#q>J $پb >ȪґRG1s@- Yns}zz-kI0Wˍdre+@.([#NR*[1*}sѸ0e.H:%Kp+ +D;08GSui^Bc~;JܒlI/3MofB)V8M뒼E~`P`2ɔ:R% sF+!,Dȩ&oYRFQ#b6'u=SU\TX+^eOa+x1[$6DbD{R%j:609fK&}LSr5+h{\e)A ÅKl( A3Z@hN>j[b 4BufQ8&}Ρ2%Z]^@5\RRTCq_xq%gBdhV B0kFv0'!lІ%Bg]zW뼿NGaXs$H'qK0pd $ ><5-4,wd{RzjDplj fF6!ue'33Ch]}Dݹa.=F18>6K^9iu5Պ(PK{v#[Ũ_Hj[DuN5AP(QkMv|ɏ܊JH^Q<*3({c& b2sW=6[[srшBiCZd0m$%j3.p=wԂ37J5 }{ik9FY"9p_pEX:O?)!|0VA}l)Pbe)i{=ywM$YJfy2qȕݚhB5؋%65ٞݥlqhz"oyT.GCJ\\xXK]_gȭSCk¢ҕq{s-kXV'܎ + +XWx[jsxžS2_FqS$-&mFh,xҩ,ʅowoYkjp$x!1Ҵ5^;E(k z0go j&t]t=5ao9T$0=xꆗ([`SV(;U-ݞPJ{#4 +ؼ *&#^cxt@%6i;0DG1T 7%Ⱦ_}3l>^ ԧ&.y#S-56Ϫ.(#(L01BE(dĵD}ug]}ױuַc a̹=B|3O|sG ~9CBBN+6 FN=s 1gmdDNɑ13?VpsgVC@WN6,W`ia[q +ϙR9#i5Y?E&i&" ܨYEXHqN!؉-p>1a@e[;g׃Aj+&`>Xiً:VfxdSLwt:5mUov 1؋GrǖDDC3.<X!'uW!>*0f&ABߩ6{ġ0)*YgPtNJy}CB>_NS9Bŷ&pc2FdxήulM8cnWҮ9{/WQ\d"(^OǐSՎ`n(SQAtӼ#kT &I%Ԃ.CGR NHdA"y)JX3cזnjnr~1Q;QueJX+T_>vt́fp3 ),+,vS E08sO^"" +l9^CQ6YQbtکZٝc?h}Dƒ(n8^M>U-_z"cRk7v6jgrZDsEy'ÊQGSIDx8E}&,`l wT'mʶEC{R.`,kyEb'+ +o|eZX͆TGsf=Qf[sܯ%jsUϭ/[lkGw,JZy݁?ǫN>Z3uaL W'DvrS[C,1]oаDd axM#'E}3s# cH6 +"Ⱦ6*يѱUB(9V4AR=S) ӗ6vgZZ 4 siWQw[IҟNp'x\&8#tNt`WK\ۥKMj %eZ% ._"\u=#QHbޡ ~,Ƞfh*VEʇrRft>j|3\ +UaTTEH~9S +D_un9w}} A x{>N9q xzPcx&*QeE`Xǡ2NE<#~qkJYH?L +lk +dMiBa-B@ bR! +pOɛ}~~/DQeߺ[y~-Bѕ)ft78f6sknLE RTRN 4WHBoŠȪգnxSELd!9gz*Х/3"y!p1-X^ _]}K%8v]fB^C_lA\[~sn:FtGD_F;ˌJPʎj(8 +/uZpPJġay=fx +Rq $I4vY.1Q>[`CPc:]Z&JZg%Zj^: J飔qU@&+}Xiv3yH3CVgP]|&ӋqF+HOyWr.I%ҵӈ]_.[%@ _hu>gRg-ez=Rerh( Hw%r.<3ʟB52'bWAAͲrE (k#Yf"s0ܟ:ã9EF0JFYݔޥ+ R 9KM(3HV$ ՊhغAcM*c=9 ZxtI(C>% $_tf̭VZԵfz,vWUR Pr.I1;QȆun'EviDŽpGsX:kOtd+Tekے"4=+ pꮈN8+~n):2|" w[x"CcY-s-x!Ě/kRvݟ6a'YW`_޲06f/- 6y}F Kmp {4%@SV 3bKIL;Ԏ+0&/}* !32fyL##Dd?  خžmEAȎ6^\ +gA s)U?23űQ: Ɉ:2Ǯar(VB4;f|pCz\FYF(8CwtYT+֝dgr店qjaMEϰ *DPq8ߣ2X'ϰ rײX[:t+;4&ѓ`gTL2j[ j A26| m_0qlz xKWP,w0e{&"WqRe,q*7/[i odS::C=xBzy_}k؍Gmw:S&&5}vfZ U֢`=P!i aIz'աy Kyg@5n(bQ68y)! Op;1|97lК@V??z8կvmCO2|oz_Ք30V fwbUg9iUЍnc!9838(eG&nE@ +)E9"Rmmgt&jkj){">ܲi@AER頝H+'O4w8T]];͌aSkKI&$ +uJ!ٯȎ@-=./eSci9׉kᖏ2,m"n[V;:+v)1ԮH 9U2+ub1FrN\*KIWʥfabVztVң ɪ <2{eZT # GĆimƘ D97<1L~S؟<^͂5![$*gğJ${`?)]Li;~| +M*ʫPkJmpMJ$(KW3\7# h!L6Z5at zp 7#x5QT|B]g| +Qdh*vkAݧe+ON0wԳPˈGj$wUDf:玫b}?죒Q"6OevvltQ)@2ݶ85 N3 +c]~ޘ|? ;UDX54}< j. LX6,?Ǝ t}FC\+l @-[<zJШI0mW/iHssGq{rY.p䦣p[ 0^ à n_2j(b%9SC+QB6ZY;q6A,(mȰ> /H5]a`WT>(Fs$Ӫ_" -``{TвQ ^z }LodWRLV!\OduHkCKtq^s|)E-tInw;jpmbni{ܖ=!a`kG=b M(1ho2#*܆V?>#4m.,;^ +@ĭ?tIӶ5Vm7 +z_ }1i8xe!0 +Bͅ Iޞc#Ջ[u,,zD4]AFdGm(bP CѕX@4YpƬ3)\IĠr= +[!\{8;"|q=&-viO8{"`cE/"ѰI 3y~ +VQ#ƯHIf9Ʃ83l߈+Wa::l5L$gr8=oNqLٞ[FQ'uNEQA%lJrt4M]njedD-l[[T-bqm$;8NJ!XY cVFd5f}/=LR`lEpk06{-?6H4usAb8{x^ڙ=1"fE<2K1[6̉x{QNWU"z~g\(V[Qun;rYvS51a<"䊛 &Ve LZ+^ bG28QsYO3iiLgi>mxֺ0_Tv3۝\a +pP@"(25sVͷE*@ :gLnJmj#l3rmɆ[7>#bHCeī^%MdU !0:}q0:z *"B +hGʩ2UҡygľgtG`GkwJ#$N3g<&ݹ,}଺f{+@{OW<_jM5ֶ:qZ7R!TDS 5{6zP=o +v{i`vψ}JJ+fÁSu0jGR+:()4j[n+,01Y qF 霂*pF'1 n~JJ- p= ~L˭Y䬟G>%&W5 lh,L: >3A^qR7^?Q`-5玨hO_(`Єyde.+Ҋ^Tal6i-'ǕVa5w馅1s`%%OZ +fM{LݵBh#XF,!Dž@ @:UDPfEN}S%i!Tltj~WfCʷJc 3*p`Qͳ؊ׯ+CW+kK|#}?@F֝gVoj$'\ +[| ,Ep.cÞG׊LHȟ4r'tf05բ=(~w_i_y~8zWH@=]# UnD8/ǥt(:VW'ym g*Vbʝb.vBDn;lsA{Hg'S, +0)Y42(V&A}|OOK*mF?u~A-H`Rl9mà("i1O(Et`D 6D"Jtpb;b$L#%,M>6O +)wW)gRS-7>DG xڋ(r~x"D#~ +$l[z#3NdyQR@Q}f`{ħnp̹x6fOfat@̱1Z dRdjE3KҶJ2;1l$LlݝmfM׋= \s&ե?YP-7u#[.uP,bDONR#ZM28iΗM*=+qn&z6"m-4o24aQw #,,gp4\996qE?XF8F8<*5G^NZi4x}lQ80=gQƒmvޯ +LGQHXoi0Mq J D=Gfbbe_J*1V)X~96{Ig#ɹ0gꮼ~1o3p애;"-t߳xQdf aADs~bn5ʪA6wpvjC}}AG,npI0#E:_aHmr^Q3fQ4Js]%FW"ڛYa;?'>cFU/RgC@O +'נ1qjLgyԘO:eGB{.ҕ)X_;&?&š vb+ */c +Y?PPVDu4k}m_)@sv;#9ߢ@ h 8RS.3#6^4]`vnYX[ +qP}+yPk }{k#x>M$^]Nۅq%. +٢YS* e&X,n {oRpŨMbQbEfFDT^ʭ3d_a֓DrN@83Tu: /YTןΨkcdd,yU^6Mܜ{&Ly(:0jeYu+uR~G"VJ[=zcyw3a"Q<8HĉhM"I]/oA$Aղȳ<4Wigjiq`Ҿ460p*czA6̛uv+ lpQs虿WúGE / $r/1܌=R#.ȕrotuAn"\,\Pz-@S'!@V}+lmto tݯ/.K4.#sBjuܘSUKW@>#vEU+?qa}L#u +ᬤɪα[~Yo88$qu +Gu;l= +O$ܛ}ԐE/ai0ĻŒ9-2TIM$3+aj[ub#F"L?sm ynPe> \J_vNVB(a\r)h[U;3W + BC@K9,uA}dW\r=È%*64יbG^c 9ӹ!CYeQ:ڷy d`T/5O~ܥzTx ;W7?)6vrm-N$qاIw@Ǧ;B'QY O'֬Csp\ޙ W3 C{;l% {t.\^Lg_/f[iۃkOO믊2X&!PݗE7}yʤڱ!!XN+ÀYɎXbrQ4WX?8EFftUd㷴9K|NY>l_{zODN\ +!;5!96ەP#Qs*j$N,a+oU8_Q!Sep2wGX7$n WBJ “W8*kN$h* \D`׮{B0Zo?"""^LWGiB!Lؘ:`t-1Qy؂g8Իad@XqyazP?0XP* G'6=W%Qx6 ڬ4DzE0b݋]h%F|eX#T'r\Ͽ{b dG7x*C#p 㷦EVʆނ +͸lL!^Avmjș{A+83ºXL2)Eop(!VvZ3}o cá[!ؼp#(,F"b-D"yN$Tn ANɟ"." ]錎L"PX:W9bx>Ȍ7~% b\0pf؈i3?1֫sA<& K CďOGuF,< *uK a 7W3; Bڏ e-҅/ꆒ܈Wn<ZDQ"LěӺtxq3G(wa nDeƤQDr\X T&;b#?EDz2pc@2=W"f!`8egG| ih맿7V  2R#)L0$MR^0X W=QӪ+iտ}[`q=xq& +5xrP"fӖC(Qz + pOѲQqIǨ$[mCP&jC+: zb5h:[Š2u#K&Bv!6Pd3K9;tP eN5dy5V||qhڲMEb@8@YݹRp3^"]iF3&E:iVyf+Nԋ \:I9S8 @( +H8ՌGHZ\|lZ(~q-/pt͛ +aul+[g:~kENZ0ukw +@׆?#rvKd]j%:K&Z. O>E>nra2隕&XWQTi~XDqnQ,,%ҡEш~g'H+5- +SЀf3}}'N҂@ n9gľm]͌Sb1n0U"kJ+9շ0E5*>#˿RyB%7j2?#޷?}U!pw>يn}qRAhN+~3 DIqh3K}nEn҇@+p{LDjJ]V_Uj>Mhܝ{1Gx3)l nvt̐I*BD:tש]ara,.ܤ$Ɠmt<;^״n$a~hUx{c=[ lm`BS4YqRMQ2р\圗/3EE!/4 +B 挒:g􆭷 + WTQΥbDEBcXg+6zJD94X"6+ &n}mXw:2\ph(7n bM$^͊ҝ`w~}z~uQbۚK6nGI9[{>c nRHfC{1v*D(gZu " exaF4iӮ<MdW?ܛٔYOesGf^-p"n;}} ;t&a8gfMC2g{HB5^@оŮDй)܅kvX:5ſۍ.x'c<3Z[bi:g0u4)d1 S:Ogsv|}Z!8bKD z~L5n%vfӨݚ@A! ow] +sq=--;*D\יh9Ox@D׷Ktm~n0I-%wƃrn}v5;GT{LSThD(ZhÇz9n*.-]Eka3}D''@{GGat[A1&l`=ʌhcB##R.#\:z<ОWD0+ +QecNđ"-Ъ +(f~QĪ>t&m %JmtU6{(APLA*^tBD̩. ƾha}&|Ҭ.e1S@߬٭aoH3h)3-atZu Y"OF괞 u˜D߸B2N@ur 2 +&DXL(r|:]aJ?5 *يzk1i}7mzEſlCw +zt]`=:op.5s %D@=tN҉ĭ]u<0 -5\>m^C Iwoz ۧkGf]p G,JVj&<8k#oT\9m+,CXDDlW0\  =ܱ , g|!Dy>ꥳF18}\pP_RCbiVD啳}nG FQlؘ̠F 8QE}Pz* ڸ2nX`mH AL|ؿD[/אm#"w0ə,:('@@9+ c4橏YU:&ּp& pWm}wV֘u[tKGx&)O`p70Bbܐ}:wa7:V76y!C۹NoqNb8sՕ "-<@'"WTmskCOBOL "PCǾ+@jh܈ӂ;@Owψ??=>EzK d\LRNaJlW@Wx6*{1Iћ3BS1g3dx~8\b"JR1ޗʮcD=,)̞&QgO"Dk Xw5 +FDvLS3vP81q ѷV +>(Q'v_"u rȲ†ѵDGȡڒ;mKqԔKEQq|bu8Ԭi`}TFI:O^I IK1W_EG lܭFdzFSF=uG*uh' %?Y-~ʯP}ɻ~ 7F5tK@5٬LQ8LM+着<b`6u{F+(؀ݢJ;h,F RJc !^@lwn\FrU v?xs[r~Q anE\[ +m>v5UM0=gʗV# k1Dgh^~6W{kr W 䒓vY:m^rOoo/aFY] G0fXfTŬ?}#yXV}Ə25zt7C y7c*)?uy +m$:Z~&V:5iP__?>֬P2.ϓ6r1/Kh30 &[F+8@+X@`F:!D=HC)f&FE0^M]/\PY9gTN oˎvD`ޘXK'w$AG>gA#|~Ъ>RТBC]!3g ;r/f+E8Fຢ=G)c@q+Z/3. *v[h)o>*F}G}`;ZHL-ZwPWo(HD=vx8=sI9k`&IwkFHh=qˊ$}yE%0R#QFD?ҹjc *B &`3HuP4I8&L W3ʹ#Xh70G&z 4y:lofhm0=hlZ=)hJT9(Q`ϞͰ!}Q2Z#oqDxD?U +6 ε*&w(G[[~r9.;Uў$t:*^e=zWlE=6,Q@lZLΥvSkxj(){]2Z <*weBջ̩+9r%}N`X|o]S\rHHBnoxLq=dP2A{e8r2*jv g{:ץI ^6sh2:t|1=+b ^ATݷaҸ"I0RAlưՈ --?[ɯ1^vS,Q?p{kk},%{"P1Xמ֛#pyc(ŮkX=b|UMS^D39_T[SظÓrI7H9jtR2ش@iZOͱCr&Ls?WЁg) #,:S5_ ,p''ߘ)F~Sp; h_آ t3}=&GpRfJpM?ͽAX= oLw<: |Fg-&VA +eZ~(S o:hJ>9| QBk{=QgR sgV#)^rs鲤uUb%>Ңo73 q5 S FA8h5l&"'/6niV:\P/ +I漽^/mys[\6%:( n^uQ"DY*8&ZëP>aH- nmȻ4p S9ZWdOèt]TyVZV3}8`9hwf|VA\q}ktw/Gwn ϲ `S^lîLp<'Cl`(]bnOTpӵb?,O7D{6mٌpuulrIRΈ ΀GyOumڠ¢sND&IMzmBjS_]$Lvi6TӻcGԡBӆt8XՐשH~2eV4uO+ZQH*h;Ip +4d¾m8-}RɻR-.7V +vKm_<軬1B?M6GOW8Ņ xKH^1#\sI[=~]e.?zeqݎx%\BCV~9pyFG?pU]BKfJqY8%c(B` g9~I`7@\d^'0G?8j[^b銞90WI2f<#hX7ѿO=Β 'HaujX2}Yi 9.J62HR7bF<2w5 G;w]K(&=)rJt4׿zUVVht|+a)a^ +dY9Mt&w^s<~ۘa?.(6 +endstream endobj 28 0 obj <>stream +ߛt~#ol:2`Y'AҺir.-Z4rz@i9p=]& 0Wiji +uR\1w`FS߻PٿH`\p%NYMVq zp +x^VU4ѓ& +AHUi\'9U# waܕiDmX-gÎdmۆ농X? hB+sgt+le/ACmh@yWvgFr.Z Q*6;ԭ%#^~{S=V1Ъ|Iܫ٤K]Ѿv&4j,#qL y=?+ⒸrbWl1+h˛ c ^ iHon8%O֍2)ѣ3z5k(?$(E-zIv8)F"QN3{\ +Q;ҽ8̩IM]qzlp;K8"(eU_g!$\!gi= + 9er^S*28ϩ}Az-ct~ +a(@F)~y 7BḳJ""g_Ҋg6LDඨyXF}3d#GĩD{9x[ZVwdbZtWFz'Gێst5~kEܡ53ߥF|uPtwɵ<8{|cRdjѓɣa>΄ ]KuFMDȹv2jDzw+fAHlPB2`-*}?w@3\_ ;V2lT ;Y{\W$; /Qa)hGv>JX.TRGRH.)ׇF)bZkY=7"lI/-8h=6MP\v`aDTQtS$4+E^VkAMpg M cR7Mew)G~=+1mOob@P$4`}^X\5!v *Ǣ˪Fbk-#?͜]Z; ?w0( +ގugT|QB5'݊o26}K[W|om(Q ڈ!"<'3"D$z+-AoTߎڏa@"фxF>xro]/g í\c@_1?7&qF 5qU8o#At2-D7BFwvn5ѻQлF^ e^#j`SgyvZmM$.:G㇕ԿFU[÷nGA(/H1|S<#1*Khې=62xc,@`^m<[bF:+g oq8&--4/#Q@EHo3V$k{iSm;i4{0Xvaޑtpdk)q)w}%47!ſtt[A򵈡m \?"P(SBx>1=0 5abV╔;2}RecbRI#~mC 0QZ0rJzrµ%=~a y *t>IUɘ&>cTzG]$ճ404W+~i&n"Eq~O eӪH2 Va'] +%oF:pV,]dTCB& ꐫ"HX?2U† +SƐA?YYV1`EZ)J~^ė]~+4x)X4WT< @iB~NPcͤPڵ.moUjzD GR#QL,LZ> \fB{z8ʷpftݷV;=h|Sf) WlY-IBHxpH!m]ʊ-m2f=XDk+zwx@u2|mu8OC9S}jT4Ye-V60F*0D{~=H#+ :!w@-~*ߘB(ivhV҇Y50ݐղ}}P3`(ldB|sP9飀}DFb3e;$ ~wzQWݣW=ocO{y cdRG{uK^3z72n6 +}b{~Fy\m#Gޣ~#ZWH +fLo,`h}vUw$BPs4&@" C_D~j\1ª@DsZXBS4?1i޴:䠣[٥֦L86^BS9|)hE>ǻrG-odDX|:zhR-5=:hхFZkkHG`&ˌ#,ӥ9hQxbvg?d +nǴD`m|C#'LyP_i +V 2.4=Kw^Ij"* 1O~}8N)-0Od]۵]/ W 1{kg:} šn7נ&g@DYcUݵ}mo#bxK|? V_;^$i@[S\,SҪyg<@ar[&!.Y.dR _1*_EO;t摖cu5."5C]Grz!ZK8s!8c#tA>aHx`yPMckJ: Є=JfSыL,TԉUW%+~؝GअÁ,&텩?x pN[Z+)2i0 aFqs658XUgwWɫhwQzG٩Uu_W:09A>wfHJwh=R41]=6jbޥnO!@/{I_Eh\ 5ͅudLC_Pʩ+ڟSiBxw g!# %P+}{EW!uU|qͬ;1Z}]ŠiicEU1gGInkW9ݡM;--U oJ/ګ 8-=θd# o\^Î+o}P'i-_g -2}P)F8 +F-טAʪ, +r̵WiA QPB:7xqxt:dPBCRh,i6@ PP$5opÐmkul~hcBe` |OyR<{ŭq=fэA&Ð=[[Ȩ'ϱU jQkο6q㐷 @-A|zgP'C}nY\x0Q\Mp ])755HngVU`!4ow +α{ܹűs wWv9pT18P۰SY=l[Q_'鬞vzĢm+&Hh`ĊM&2c7%^eXup +$ʿ祣ַ\qǁȰf-&>ܸD<ݫqIϐu +ƣAest}͞9/Q#=*Yڽ4 %"wE + ?D`W`9>J땱WT۸6_cu5X$ʌ>LC"GAe?-&VT % F&ο0E"hR Ah鬹ͭOtFHN彌@CĘL!_C{'S0m*j3P裏gܢu A"W yk"yr+v7gLEzVӠKg>ÈꁇF6ϯ*]iϐVψ #LE*:\t13FK͖U|DL|@llw@:ͽhmW4-&earV}Ջ=F^e{Oa4E@诒jc)+'i_ +Y. R2#˷rM414@1#:ZHq~FՂ^6D9$hfv)ylJ+hGT֦oqGjvP$B~3AP +yv8;FVzVr9iy ҭtq9e;K1 ,Z0Yt$zF[LY{tKRgGͪouՖ1_g>THRYe!NJf7Q bWM0TbWJEJ.ӆaY/$c G;@['eDw BI/#ױLf=ڨ[ l_ s)ʂ\ ]Dt=@'. wjtYnYl6TH_{mI[ +=XWEnZH>IY3T:թ?x"'%FtE G^ρ]a تZFnyQ @r*EH4?=+v_r*t#>і/Atny<Αgğߡ 9~ VP4Se."~H?œV9"~0ɥ^@A'm8$㍯5![z_K[? +s95ùO[݆&cvtifjHԋȉ %XeV=Pd~m22eX(:b34s"8s/\ceqwH.fTAbю/'iGD]%IVy80R&nfL]B3VkJĿo{޵wd@0c?̖~'ޣF +Hu2љpi,|VQ'CG~} ,7}#Qt3هb  +eҝCw $$HU4^>9*{}c(~+.(E_q7Oc +iZ*^2/&kM3/ eTS"GOu/6bnУ=@S>ZTd,M(^R B0 IMqf񽈠:˫L&=us.0zŢ8v[}0)b#2c}cUz%|6ԍ=iT7et>úv0˽;m1s~¿# .9JoΜv rA*"FLMBOOZqdPd]{D%`ɪ TþI,F?@+LK$Us,Xrv^ݳajh^i@K5EA#IZGJTzldsz\1 M%ig쨧ƁbTD$4H6{'DBKj=HJb:@3 .ZGW ۻxw; wḖi栴(2He~UXK;n̉=8l:vXr׻4 ]T>ګVܨbgh'%ޒ/G/|lݽ;O ;w ٌ/լ؝1Ħ@k8Uٙ$h)Rn=j9[2d4_d_M.11U|?6 兩lYHa qnr2kżrzH /.fǤ*9M|UJZ}(xuoeN_7B"a iDҞʹLf0,\?v%"(80ON)3ûN\bz0-S6t{G]a_o ߞ{Fmh`@|6^%Ee-P`d`d!{%>a5RQ&E% p0a@}UpWE&^2ǐϮ $W3 F=žT-lILxq\ l&^@>{.Kҥf5t@@"LxJ2uLKXf߷df$ g }pj-CY9 廣fFI W~Ф}-LDSR fBaȔ!qHgR5 eEdJ^]-ZD +[ SCh4_ 4\ JJ<R}ۂ +q2\k łӥK%*9lohj@_0i=,~1u;BPK((} /ԙo*MԳxup-Ŝ. @ў%CA(b䳰=u%S4s ]L/)6SK~ۚMrDH$f]$ 燱-M4qb7tTV2՜꜐[R̻O"K +?s3#sOi&ze=zZV=} р0uW mUsV@vf7yhnBr!eQ8l.BގYxIԏiYP%͇~;XiB@:]ޚ`6S eSDr*-7 *ʸh3H-31g;,T%&ӐƢXKxq@OxYBG`W4VG׉U]bV +ءt$f.Ӹ`=E`p;UBI,Gdx1jä!@%o?=izz/O~}w/;ͯ~w~ݿ}?|׿O?_/#]_\;G2zgwvȆВ9tG2hU_8㏩ǧlp0 moR—BM U'ƈ|MTK EJv9٪u2U;|$& xSܔrXߪ/&٣[8a&#%k ?p62V@̹\й2X0 +K' +GPO#;!}[zJD 0؍vpߟ| x3NR;V:M67d0 $@<(Q$ɹhr[bstA~B + +w,]\oIz%cr%-ӧZ_ KYbiG.9YjI,O&#I|qG0{Q_VfV i D[rj?J5 -}b +!ʦ}$tcGj,bOղrg22CDwlCG5N١hxeșCY'trkg}%9N\偌[ZŅG/᜕Bӫ2Dbz#ӫi]Jvl L:Iكbދr%"PB`aj$8`QqX;{?n1 V}qt*_Q5( 2n-!{fECou@@&gGJfQo4pv?4MQ⿗K %N@ZU qV=gr:(uuyG?NO dJMv1)$z"$i]$XyHK;pV,z1p%4䘄NȆR1A7ix6 0NLꁎL0 0=21@&\W)7՞Phm2SewŌn{왂Jv|&ωzS31MBdK}!]f2L͓38,JnsQЄlbOMf6|8GPE}|<%jEXH1F(z,1jC5; Cj: m@,pL'PVpwAf{?/%=[yTf]ԙ4Sp*&ߍtU{a)hMq5Ýo6b_T>tBZqoK>E7q#,ݞt 4~6QĹ\4TՅ:dHsQ HR\SU۹{LՇtCfR!VXjnnA"qY +"۟vL DmZtB$~,!!Ige#k2N7!n Znqen*jǴJ׬B I7L:\>@~O^]rEˇc>im׃f 2<;XIxၗPYLz7#t䂊hɦPvSra^@`Xs ~8ApYDa* +xjER؊@^$˞Y>p#9GW7%9UL*e ]ͮP}x|t" 39dԞoI=QH@^53wcI՚oKFb +5WTy\"V_D^WІ9GX:9x 7 )_pgVVR|̂:;XnIks%s SDJ͔R.7@\,Y]؏1e{ѹTԭQI2ޱ#ڏM$:(])sˌ7?m(Q@/!AUd`BA=E0D*;1B?P6H吠}a-\cd7L__%)0(KVk!LNgNd-mZ4b'1\UBBS P/ؾڥ}[lz0uY|XO7Mt%ݖqj}:U-gj'KyL*bY]*A1=_JB~mc\fi@0g L}~Kٕ!0줊xda>L^M,:92ES4I&p +RBu.3a혡 WAQ5ݭ:/a*ڞC5nòl ȺPY +I~6m3\Y4YN]8p/c<~eS}Xw2g~ Y%ijKJZ{\Gv"5^{^gWͫFZ#w\4\s%D!xs#i?$g=fɦqR(I@PXg|/;Qn~l&r&>XS`:.XrXo%#u_@r@BF {|J=g`T*Y| Rr&c#P촗K6{ofIM@IuuY'=R$o7Ϗ +Q]nNdS6YD .=K&$~@\hVS(_/te4l{mD}xhNFȁd#z=[k^v` -Z*0LoIf$8 nMTL 9;|rENeLU>狂궧a=@gYLv#3ڻEnS7SS|0k+,6\ʫCΓ trh:>^'̹&_?f߶i{a5? DU | +3tO=VUYesnRk, +%df}QQ$nB +?8ߦ%^D=}&s!KeI+|nìc$ь W`o᠎_ZDwL^{D՟e괤k3X0!S"gvMqlNR#2g%k25kr;pQҭ(g)M>2<{ +HlIV/Y-^吜!o0{4 !v  wBIgxԟ-LhR׮!eI!$czxpᘗoT'rJ$&=Eeo0IB<;H?p$M4;%Hx1$\=~e3sdE[9{{ݽ* d; e2EK깎Y[Zyٸ0wJ2 +˟֕"Wq^@=pOQNIHdI + UJ_tRTʘ)G=[ً}Va+ڬuT +iЈ_َ,l&a3A8X+ [eؿ;O,N\$&Jr =Tb{5tpf Qz"f-vmMn'ïOu'Kjy_bz|?[JݤGbQk$țd Z$-*0P.(C87EH~W=Y6%1 iM&ɲbo;|;)(ȍh5M@J@7R.] #A)X6q N¨Xuw]&}KJF$li-G40^ݦ~ $)qfe + oQtPl8eg! GrepAyCm|7z!%/䁧[ +3aI8U&rk ~a@nw(_hU/;e]Ĭ9VC>H1s'R3ECNt4mװ4_NmB`BuZXRS.UT)bagd H0uOe0uMrrB졽z(i[B@7UX*-mϪ@SAQTQ +v.# .dJAh7PI-jo=nԋxUU6˒wO$BR(y``䆳=c nߧdS('W+p8O3'O]_skv +q' +{M0D}f~O~p%e:0V G1ˡFxRD=3{mCDltU/2-"קE=$2Y$29V˟@&i.3 ׂiQeva~ X%u#Uk%LĆtbFi=&K0QIN;h[6_ tY'Rwineqծ/\[. "Γvyfz:$ё!@y W'522?uK!.BY1AUu2R=iΤ!!@TF ܴ.(xJCA(~qi nq2fPj.01ԃ#z@Ayd4@ A>${fnL~͠(,MSǨHȇ ]sc=9A;f%IcJJ. 'vg_M*%9 WP_t% F7I(/?bљ6p'^aс2ã:fm (K[ +{"F&JjaҳG1%[rE6XtSz2FfHC)c9> "R=v+1س;造:&i⣷LQW v])H<3ГNf¥©u\+ɹWehh7V +Ԟ :h.7֓r`{|x=踬XJr57f|"/bihPN +v@ \z>V""{'DGSd`a5cQYc .~`IuFߑkQCidƄy: :ҩp3[RIO=A%p8jҬqpVI%9 PG7f-dIr @B@I5,[m7h $4 >5̉`)bqa&<' +:"q0%T(pqJ)E+XkΔ۾nK#7)a4[Rݳqr`AB_F-o$``TQxvFc7Mn˛WBcװA.}/=Zv5Kzy)f1jcH1s _jݰ.o$-&(N +eʠ?e)F]6vYeYɀtpM)Mrg}#A)!ۤ>UeSXjŒxh@hJi.p{᭽3YV{1>`zU9$ic 9(ARd=MTf=d p!%)aY93һ +E@.?K%϶jĹ.CtT;wT/=kXX#P5cHVWp#W8*ӱB*ZMvT$R%KIV/9})aONoCnNv:ICd&>e} +Jxuvq,%N=`Xo)M +1Za̬IOfRhZNtR~ ]);;^ת,h +!=̔4 3=#۲P.=ŅJsap~Ԥl5=°|-KI+l)?cVOH^D2@Y{FJ_ b3@Mh@ PȞUqx );W: %K\{Aa{ro$oyg "lͪ`_KwPgV.p)d!GUs6]KG)HXC +bt'vt|Ra}% M= pWE  p&[-Mg:Fa Cq6E$:֢h4H'ȻCzjs5t4v=-}Vm e,r/Ѣ$fCtuIlUY8qѠwG/## n3u cp4o \h0ϧBm.m?PHI"P&ڞV>5p0 +l1.Q!I؋i,8P[pqJ ĞݸkG2Ү,3;,M P"m"'s3Xh [6-%6A%I3 'R$Id0.sY|@L +=0vrJr \DR/J.Щ&Nt($P=v@RF8alGu (SU'imBh~)usQsA#Kׂnl@TS|`9 jz؇(?p&+M/%xU|ZaĿ%/WUUIFʦ4aLjV3*ByS$YkPq](]ɸz rcvMLsa <~TMopxXH"?EA?H޻; ^MR#"KH!rHKR:/¡Հt+XCPht(;n,`rֳLUk(r33i]>,; b2 ^PMށD+Qnx[Jh$/$@)`$%?.!0c$pm.{EY̤-c;0W$evp O3N9\Ѹ] *+**~?/:*S!c" NLU)J9@|YfDڣ̂܅tEG|!X2uW3@ЪM> +jsdb7b.\}HM:>gX]aIQ>%kɏE5"-O/#؝. {R=ف@fgAx*5A_Q D|7=}&4{kz%Kmc6cQ*)JQ%׃G?^ -:& O^.mfajB6&asyE- _SE%Ps L)3 6"%"hedDƕS4KKBcȷBYZPKl7Y~ +GPcߘR$-D"pG +. x/8jN0jrٟ, +g_!iU7d=Z7J>5>pNX֞ iXM,,~.x^6zmS>k:/!rvs4K2?L5J(W !6}XXrש&l6ۣ=#k4""*V֏2Y?xZf ܾ +t[ \ݲe) vxӃSTS(Rew$a476i3xmC^dtYt]KbsfVciˆsN#vח' ;7BiMVm#%ph^BiceT(0 u ̘رO$)H>pol&!z`Ǟ)fT$"+@Fןc4 5YXNZ Q8"mK}TjʌBHC09NbhtMsykd|JLB#D&/YJ6y':6)` w$b1MԘ<ȅɘ":4iZO*eA;bh`ޥER!ł-=m|V_!R@d8@9aLPB{W+6-t.A8)Ok}.2#d5<ɓנ?BCI511Cͪ:ާl9a\KPV*ɐ8k¡ዐ>UQ%u[Ew?aKj>9o|7, yP9M ay5+TMP.z2 +9^UpVk>rHq>;O98!~q,AJLBY7/ &b$KT U} Bi#H ôT -3ck#Z8,8THv*n(bj Jd`PZ#Z{6ZnBR]Ղ"Mۈ"˯j;( mA &`BRBق=ZӨ"(GL}243-BܡPuYj0/~K6e>j3pQsJY%0gS$~B%vy'L!R/U7)l/({ً}*[O(anBuw]T.'Zev:Bf{0bohJ.d[|~s$^]e\G.ӴBzҼfBS۟\HFʤҲ;fIZsW@`(I@2<-\I7(VŎŊoT)H#@A"8@kpi-y)+}jؼz@-4f(FLm‚G^M0rPH]_#1ºZ"PRhpr!'ZQ$v{b!.> ilsʏ-lϪCR.=+(ȯU^{azUl0xs`xzSU:4_V%gAmqɰI,~Y~W@=lA C큤lOoyaBQ[B!})?Z=;l0f0c`sI$ f[G+_jN{5E|KNqmu(BV˵?OKse~=FtבbZ 4I zvrܵ ׸AUa_1%=a{ A eFIuI%f4r ʇ 13䵻Ȏ&HBdB^/L: "1mSKMMINP $ W=mJ*փW,wF qǵ;=`;:^!I9LL72Q`(![uτfJl d%޽'c´xRDp7e.ƴ`3ݢEILꅙ515LBRo6/C +qbHtO`$}V9WWtlf69v-.fFAhbJDzKu{s[eYRszHY +l${ةDXE_!)% +P9 ߋ,ǽ};z&!UbcEhAqe\e&ɸKҒc@4ğ%q +"?BcC q +~~ ,F>Z#H L{,:\}ތD98R㟺FL^ +Ԩe 4b.!4\RlnrӈĖvrzv P86G/x (6GbH[T x2c,wnޫ9ٗ +7i/Y8{ +Y}ed#+ىYOz7ۢgNǂbj7u 6W 4z'=pՂ ĭ%|rm$3@m Ua@fۖCpz^v!,=G%kRBʿVq*)J q+c~N4٦bKa =`fF%%B}TU˖gx,dG4>41iRU( 2$Qd 2h +(J.b!HDp\"AԐeOț5Z0w+U]q0<əq`bR3kGa;*Г$-@OAMIƟڂ)rw=9d7˝y->{%$O,$ ,D=[3F`ݺ]2>9HI Vj" ߦXHobmA_u ),^MSY/ ~7I@Hx)o$dy5-GѼ$O7nM&? Ngq4 w!M_R 洧<@ALtKR$l =T2I&]pݕa1Kf^4RYW/-\^'" FNjj^>- !jIcxۦXwUզv͸"nIU]FYQ,q@GM=Lj!j!~4_A +(H?~,$5{6.&tlHǟB,'o-[HtrCocV(-bv=,X` QTvUP]hBpb5vlFKO= .JzJ MINJR`At5UbuI$.^ +IHоoӤ8W@ Zމy2O,9Zw3Y`N=9Ӽ#IHN dײtB`z], +42=rD&1*T2Y9ᴩv*պw0֣[8Rcj GJ:] !< E*MsM勏sD{^~Eu6 X#M s>1i+)V +$ZQzѭio9IObXUՁҜmɎvcDL.XкLL` 5)2 Z=B aM6i։.K)*9@M4 +_IQ}MR34&ZjɮQZvEpX՘$\$٬ +VQE>\xcfG|:zjȅ`8TSj0]Gv$cotZ6$z4I~NWPV)$D0Bb-p(#3&1QI>+(vSG0H*[#V;09PF-cVYd5ā| *7]߲x}8a4W#O͔ +" G>+,gjSPng2t?'NK% J 4!`nY[, nG)#KSai4f2I4I]jz_./^Q1lFu5 vy4j_*9<$UPbSÁnДRQJD@̣tI$ n6/zlŗ?Tڇ1Ccܘ,=tû2?.ѶeR5zLH!UVUfHcn-Y혁b!Pʵw2%Mွ0yF}l(( CLǗFa;YO3?t?'ߙvNQ êz [ydir2JNt.-hqv0.#O6YXVI ZyI2MCA_F%8nP ѠkCF'I[ ީRyxx0@0ų;@U'\jC&SV)C\eq,鏈.6XI$R50lT +"<6we1@/'SM5ڑmQtJz (/W`M1:ab~|'W^lXEwt=NaZu@lb?.Bq9.Uo-ȡl CUx z 5{<0F]u[qFqRYqIYx$ +nP' 3Jx%c,_WtuĢ[=;6Mͬ'%)ߑ^/CsYHy^>HG^CGrZ ]HR/87f10᳑ufJ;zA5zO?jM]|<5%x"<,T0:n.} Vr%#fi+j}$#Dܥ@.VWbf=`(Q ŮEѥM^d?Qַ )*z!WA֫x/UP)HӞEfz˫rSbz{%Qbb "<l҂er= @"_k=0=є:=-[L]]|ҒRWt J4PRK3ݜ4rNq}*bZa=v~# gʋ T!,(E.^u_vzLPI#=vچL^$o5.*yI6"%ҽ0@ Y$EViKC=;RhomKT3e>] uuDq>?/߳U*L6YpN.6T%boS\Ez}74u$  bɃe\¾ 4 $ 2ﻁ.3YRt'IٕԼK/=m|U"@f$FDvx1૨V/u;V[fUux>LIFO[d, _?Kױl IGuPV/H-{x{’փiџዣ|oɗDuL|QEIPQvBis7>4y: 諒Iy4QF{+}@n@G:輈F@8q4K(,"㯉Xs`$XLI5)*bH .~auG)X[Hv, +6ĕ"Teg&}&m9RCβɈi1}pDFXV9†؀22C^xHoQgO~/__ỿw ?݇oo~W.~wۧj(Hdo?_?/_޾~?|%bO~?? ~}3~z~g~??z~(qh/~Ñ?;v~3֟??O^o?g?\mVo('@yu- 5Jb>>>? f - `4C>ƬSXB{>jXhoO6^CVs˟N;6bwֿq>)&ܓ]N1PHbw줳\>*b@Ű>'e?1$q?zGKaibhҜӆ7E񑼽dhш+7#rdIjǟП!NaY/ݿ_!}(?2PH9ako}v쬔mwcǬ‡8!|_KpeV [+/{3Eh6]3+.S"rXWBa~J+&*OL2әEFџi-|F'isno/Ox_K{Z+֦]z[5I5{ {U\9qτ?ze Z-~wsU{=aj?kwk "/lds^ >5 sUwSSiV=3ioq0'@h)Y`r1 ڀ5uǗ قQ`~GM=Ŝq?pH/ҧh/5tKQq _92FRzo5|xxx9/[>,&(IFߺ#H,G.tOHk{b0>}u@q5-|̶2k4Q]+^߇Q]$+W=IPzX_DWW Wc>8?S4ÈSfѺg^h+:x{u ~wH)a-qu3;fmXMĬ +ǗtƏrU +X/O?Cxh|yQv6#ʠO%^=iDHX)Ƥ(֌Y,L4vO&mE% >_E/kz [/mvc5۳}T1;K8WE:QYti՜3g!:Ň!#il)]"{xXE ⎖1V+o9 +7Ʊej2j%^@&{Xn:vxu$_ÿfJ2Z|)}Rtu<_k;՘ھW'4{k vؙ7% ++Gϑ\ 3ڀ5r~g5Qk۽)^&uWm!嚶d61j’ 5и?i/!b SD &R=χyݓxeJF{|h{ kĀ3_o2]()kN>xv/P\'Xc='\'䕩{DCmPeg{Ñ" G>uߗ%q=+BN}6dnͧyfb'U\5VH_Z3C=]W?mǕ^50rg<ۙ׵S'Ya.'A8&'~9>7'=|bۿ=P-5!g|i]7q;8vᄄ9Ec+/ͫ$PVL׈ FđG XDH֣-r躈{I pfL|yWɨ뾸+P7ZkD@/-̓,G[OcAxذ~!} `Q;IX.Cd+y<#^4>*=xMG 1_F; w7-~bh/^n_wCf˱# l4c3 y`[ڨ~8gKSkDcp¸\WߍsNU~y;mg ײFY^|nM]:I:%1z礈ՓRj'SGA 7kw<پ/I$!3ǭgV ٠5sULhWUW|Sۊisb#yf4{Fa}ycYd<Plv=< ?/J)ׯSZh=E6ly,7l<9)loNh`-˂^z>MxqYl[iaj,0U(Y规uݛe떍;A/ZW};u_{:݇3v?h,zx| P'h/싫}`4B^#E#˘vw!<Q)U,Ku"`8?|܁O|y&[84z$˓_^1=z|Dč(' (TǥȍdvX#G٦D2N{Nj\ȳңm"eEz W < Bt=)0%z#?<DwJX@k'w}7:k8wC'pO}{3B9#xK+:{ú)| bhr:3c4xq<|ivJ<^[:7*0%`?_>x#ΛC]ŧh/a6idq~=St=x^=7m}y w{z4گz4#_t)گ3#vUhs m|ig*mKfh=^?6;`I״b K=ٌ Sfwth7{O'FR/FPU_8h7n>׈:1=H[Ⱥ{Ɯsiq^KJ=?$ˆ2񒃼kk'yx3BFL= 2ηBѽ_a gZ`/[i2mg/<ϗ`Y /I!C]<7`M#Hd=ѤG=崚hj|ͳ;:]<&-q#UF.V+F(ؘ`qo"/H>x y?FW(uZ^iQ +qjНJ57LaS<ݗRNVji[cdtIGy_C֑VZ;8TxcTȖ%q>ճ!s=vY.upwZvo~~'$E3xli[G^Qbm8䎛%]j u8K!R7l+J%#؍鞿**|?7*YKbe'q{"^9AziC(Uѹ;3S7"nZ=}rS֓Э6հNMjImceO.s1}FièUd.P$kɎ04l%% #2S/,>N,<EbdEA2fTR(?8/?(ʆмqΨze٣EV@DVpY[! VSVMwz}Zk Z, lnW{0l>f P=@tÃO",C=F{{:iW4Ζb^ wF(N_>i ?ɇGRũ9^8#{Npcګ߉io$u8a|=Y=M-GAԙccjlrg'5U@ĵx<. xBg+ 6E옸9Xb@e)Uw E[-?R\‚}cLs5LR=KuT =B64<'s?3IpFΞԚNqu[+޷'Jմ`dXR3nΊ~e02N9SQ98|8H.E+y#VJKLs'!8%F hlKe PIj4WZ +vc3?j|㟅&|K>HԙX*56%vlogCv4OK~`76G`5 ua8#j { JR|R(d3֧lsnJ0OZY:x)c*HGv<|s~1 gD@辬Ў1oG&Fvv9Q9ymg{zUx!\TԈ5AYc3>iW,1$cXbU3gȞq"rǡK99,ɬtK:sGco(НʜNx--$5>HX+*G\7+I):wC1_+ {2;U22>BC%h a+;7\G9,1 ]y_1YW &[*Ʀ2ln38 #4) i/@@]W\pz=T)cG5qE:r`(-?\帖v&3pޢ1 +FbS'yʸr80FY$t{CPW+(^喃 +M@n 񝒈`,wuh.F*>GUDﻦgdF8#D.b$fd[@(ut'՝6V m&7~=-] + QO9o˫>)z ë}t?e&۔#pz0xo +Aj7%ʂӪxaF0mV:f/ +}F}fIB!>;gA,WoI_c;Yo7rL%0,i3}>{;$]cR>'Ogfs9aGi!@+\Ό_CxcG XݢrCps>`Si7kƶA+{DT+i3E9N_7l"8%۱Â6glVȗo\-4=Sgyh))aGx 8"q~r@nq,T$tt!1dKj}Y> 7(wlЙxyyq w;|F4z.,dc(\wnӯV}3o' +*fU+{AWsl ȑڌ0Azph)1&!WsCDIG6#@rƒg `H4Z9[$a3th^ PF9ʕ3D#V>#Hsk:?Q>r< +n1)x['oS ڡ:O$?DhlN$|Go=RB:r0PkE=e=.QUor3]C) SeJs>.x\oȱʄ0R=WNYGL9^,5$]qJiayЯ +|;KX:߾=$`gC$s4ͯvEY1m]Uv6bqq f 2ڮ\'s@y:~k`,60i?KA~Єc}cD&L i#&x3!)-yk=?Y{8,MavVWJ*4 E@$@xo{%Q"EOx '=lL;̌H*윳P/{).dȺRd/ie񲼘S'L;QrT[9r]Ϭ7sFZ!Jjʩo4*iV OZGB=Y'l|ƿDJ$},oNDwS *Ѝ~J1,*(:i{&L*5Syz93d8nC..(B|pt/˟-(K +rcS]f zoL;lO&CM|sANTYFes( +׊=rRaᐇ+wF^]衘C#Q-z*BCgP'dhjWC +: T@ّ4VtcJQ=W,(1]G"BIxx;:&WlgbްٗAVE%ׂnr-V4lBM+ݓ'ӂFWЩ7+e= +i +*mKVD7l0J]QAӨh"A*@Kd^鲮]6Bu@D.)#'}I0L|j,V>xZ%zc%v +z +TRITA*Q,ZIAD%U +QtW +VIY*)@z()yLfF1^IAJJQrwˈ$D׊{(" T(LVYGdF~_ҙTႀ8DPAe0z٦IT{iYq;dȉBbXI}ZCѨ yZW)=gG$;n I0%)ӨFIQJA,R*J(]:2*Fi+S.BiF= ibuӨSRJw)OY㗐N :UU̯@> +2aQURCfR\Y`,rOh/C)_1lFRV~P4r -婢d%`Ҕ%d!h//nR +T($@2JDJڞ4U +zӊ1Ū?!Hb:{!,dU"=$ 9' +_JKڞs1G朢^M5\?ʅ +p=՞B9B#V7*R\Af;md䟏PP~uKgT3B&IwWn 4*n@sxEGQB26*FI;T2-`P~`t_X \#:]tm2r +H^r\w~EܒsB:JhgҋIIk~1_-HL?,@F2)W*WPA՝xc Srͤid]"rdSI-, F*EPqr$BoTIGҨ_LR4 !tg|Îy"xSFZJ[0Qc&o9x# Ju(CT E:_ZBi5`^xMB)B/5˩:Pt|2QDd!}FT0&y-.Z(X,Tχw˨;Uskfv)-)%.R3U褗lOtj" + +FJ&CrZ21BC{7qTT?-J[IT4Rq +a󴢤.PHH1/b2,Yp-Ygc8" +&nGB;LZ`yd %߸'s̼2*4RSieq:=ɗ[!^YJ^Tǭ_e_Pk[3 +*RBHSo+ +ޣEs}1p{Mȋ +*RoTTر*Y*+UT;deҋPm9i}e(fϪ> o{IڨEzKM + Quj*uʪ~*ҭTfh/8]Q{!RVI/rIU`A;'\t| *W֟yg}㈨L)t)}2Q`+i΋D]¾޷roA[+6JK[%5j; MVi[ji+y|"©<##hGxh꠱$[lzYݩI/uO"4"xs *|8 `JoB$v0N}$PD=(pa4*2+Ûj2%/yʽ*w)_3Q@$?J_TGeO7%)0g;dnkܣ(7sys?0rtBhå mcN /$ Q#A{cUsqRTkQ{g Ӑ)͇*ot[lS-v[7?9l6??SR8Jf0;r$Aț(v)%&+T(2wyva'(ܦAğHT TiӛR^J +O;A!i-QEx[YA/_A=f;aYgcNYJi i)qubAՍ۵|̦]EK*otEgVgyyu829,ٮ 7jp)b|ޯۜVm<XԻoqwetw|Rt +t-w%5qmsW?ΰN PbAXt)zqNU9w{جqg2ʾEޖiE)Nw*&yk/x,<.NZu؜32Ӵcqz^gߝ6ZrNzhY)~mFovk[p6Df59YfSQ-&挑6j~Ow!jL\ʞE\WEe[ӱCXzRٌSTi^x>1dnP`.rsjcs$s)DHԜW1/jS,"f̗R~)XI{bVF{=[wKVMx{N[K{S "JyTK%ؘ\eeWֽH_//{3A6 oâڴZKmkw*.w逜u 9uZ9jn;t9A&hHd=q' S9ΑINųt}ÖAc)mߚ;NG.ˀрI6naLZwVl">1QC֧Sҳ#4PtEG³Û @?ؚ7Aw~$VaּܶEwQkߵvڗTuw*ko:kؓ;=skqNNܡa.sEIԋN-7a6&x' 5喵}zUvQoL +CE޼=-Kڔ͉ޏpm51]=/>ko+_Ub39EpX>[lZEů=iaLZ؇q5[/\jvܩz16iwBQ§&\q:80.8V\bFRK8d̈́Kܘ 6>+oLҤ.19v^pFrk)A 'zE]00QdP-Nx5st>I{~!rT`L//d zM%kO95 {Upj#O:%Vs sb6Q]#8>a}>6Y_Pec_gc^%{ʫZۿa;Y;jSA%/<|vy1':jUEthjʯy G'd} +QRq#6Yª승ͦK'#`nEh#z5ˉw_M6^дo@qmD߁Ѝ]$Dڧ!*wN4V=ݶ*;6(a7ʲCn_ޫcx^ +Mrs2!iθMI+T'ݶ֧x#~͈N'#C/t.gwYF=[m*s08;q'$)m"SS2>h7u8k$ pq qp o0@,FE ) 8#ceɮ_,/q.2߹st~wt}ii*ߴ}ɉ$*6攵~Q a$<7g<!|c1/ mZE #aWv#P 7ӡ[ o@ԭ'j; J{R);f\pOn^L eY?7GԴaH Խ.l"03@ul/pNasů _Nt}Qg߲}WJCgvINA]#iŝfcP<(O8tEޔS'x>;>wo6e I;y[?=ۄYQQ&alMHgeuyau&-k0+wYכ~Nk&6?͋%/|%ְw?] [^.0 ;pwŝqGߑ|׾pƯNlZ ۳IIΥxGkw[ۼCfe/u>bl={qOx(|_^fCI^F yuobcc'?Tܜxs"j6[iNNx ڬd.ܣK8MSٝqiˬ&;tw|9Y;'qkoOt^Jr&kM8]@Z H+Vuj6|k 2N|w_I_=b ؑ5n~(6eg?FY*]{^zW=ojm>ՇeޑYv'8=>>>eSqXHd,;sR>y_ ::|+c.yW'{g=頰ymcqk+eA3fo϶n]`J )7J~ &}ג 8`ӈCp&Md]DH%$)XZ pz-I!::ynQsd*CmPm[U~7G켳j~\D|5a62ѳaAv?4tyn?Y":+:.aQUM,i}ofd*3QpMK+}z؜h/?΋G, s`~ƻ߷v.iS x቞#ܣiʄ[;kR^5?TEkç~_c/ H1;p9ޱiΡ Hx}ÎrϷ x><sn ϰ|՛鳻ݴ\ƯWZ, 9bC_sI dvpYi1=;N']ӄONdg`d`>Yw=\zªLKe=IxRAvVuU_K ~%YBԟ)DJHo(N9čny{ +5DhsܫGl9dxbYkd +z*xuʨSڈUT5'8 js{,6+kMԂKb^X?>*dشLtR۹1i~̋8=A[Ix?Ef{b6q_B26<<;|w,eGfYٵG[Sۏy9Q >/kxquv' G36;g}4<k_08`ʩ}݄;4L߁m=}G=#8S4Nٗ (yOذ5Ru$FƄ$蜴YdR|ApdGO5[ܮ`V ;iaVL/KzE`chʯ~/n +KڞAzEt>P_`oSA6YbnnMT'> Ł3! \>dِP&-/* ?6焧na.LP%\ֈw*e˩}zٸ_F%)_{ր\-<'HLf M1l.o]&|͹ÄgZzTl-5ܫCu3)dGHF^\K 0j&-d,3KZu:S%:Q¥oo"4x%zz_unc__OJkWsV̮ͫVrhx gyyw+7NKA'jiV5v8EtgxOf˱ķT4pç^82h2^pk5Up-n4f0'Ni8̢Ky.opO͇[ǬҖ `I-V KsgS#V]֒^J "<=WD, =P+ 5IN Zm_ԔYt+ Ò]aO/ \]4jQʣg/.Ra IQ,X(|A#3S:ӤIx>R\EjOE81gÀ>4TKvV IQ7*S<51 `m` ] Iiy;ߟTQ 4.-QE܃Cܘ9F#D-iqug[◓ʶuB aו NeԼY7(C#KewMzܫ%Ab^Oe;ܚ76g-ۨ&ܞ׮l>`ڮx}=Q=>\T*ш^=4bջ$g#.2u/Tasc; YQvE eu|Dܦ~zŌhzcC ثI37LrN#"MlXGOؕ=y<6wZܪneoʯ +NvY)}TJ b.~ )Q !YU͗uAd L*vV@o `=98{W5;賸_鐒dVTHI/+ߠǼ_mmaV +rל WBǫ9-eWI iu72RށQ? wV4a??\9/DFi?^^!X)d.~U{_a+Sbv`8ri3t1DHZog.bU]o? i6LHg[$kScI12?pIZ3{ Ziszܡn/_~yg8^QI[{u1|qڞw1<7~sBܒ]Qw=.̦aÚx>͖Eչ>+XY UXoDw]' =B|It~c}xoOO]Zq©Ng SeUށۤaZMo3g٠C\sS.<3po홦N;ڸĢ{}`¦Wp1tBWʥmx~3j s fEl,L:bS蜺][;i{ܠlZO0'8l18cO +>kGXˆ(5,E ^~}ZW?%5ՄSїx]Ą_X}mXlhn{~u˰dg4 w"󒳉u7R~q[&ȍ9lsRYu$&ܣ |&c8+a*1#zsp۪[|,0w1恘W#[s3˷{$3{h Mx< + FrXUL:`0ޕZX2(Ft:Sݗn/^MzG1nREBM@d`Tp:擳`|\ܯ3^ иӠ <]u(.Byw:Q>3 _+4܈]^,op! +)f3)gb1=+YS=->AGϾ-*VYlt^Ѳ5_?ѧUQ!M%%f=p}sFZzُ6xaw|xg_n^gEr['C ׀)7u9dwIX;?z85k%)夽_q)XepwY V;I囘u黨UQ{ꭎC >q_g}案S+y{,230w+z6z>Yه Gʼn%Q+6pܦ!&ȳgK?}oףSgXw1śg/icR|}g Ov2{F~6)0epP6(}7gkIDiX͍cd!^,*٠{yyU6"̭ba}ᯓն%mإ[zrYO>~V; ;d 1$F)) ;~i_+ a `fEg6|mRѸ6#>^oʹĜu7`OX5ᙘ0E:~axI§7&"^`˫W@`ZM:[q+yB sIZp|ʫ~5YQ,hM.8< +^_8'l5J,\,|ly;ˆ~1 dY֪vWT +طW&-/:czI%OY]625`Uˣw*^Fc PA+jۀOuʝe,4 ;t]2Pũz5Q!Fc]nUDgt]8i%adk=& )z cܲHϯrm| -(, 0q¡ᮏw0B7$ִW-؜{ePO+xpuy^}ڭcv^xutsN:n<)q]؂ $% b.,m]t^wE0D}'VAMҡaImwdFTtMB=,kQִw\s՛[y Fk akcd[9c]FM® s +^QK+i](v ,1ٌl; iCG x;VdVo> t?r^ֹc068arGJ{Ȃu{Aݳ>+mX:sNj e7v3 xb;>0(xj@-9u[,wWFbI SҾ䒠h*pm!fO'/e}lQv0 +i_%Lσ6C<24>Ig:.?Q[Kl}8FnKwE R˱;4DL:ծ4V;K %A~ڗF8E*7zG^ykXCWG0 dtUTH Y6&5רw.fìrv1|g^7mkFTӁ%Fuܩ6'ona^/\2 Z8}^ 赸[N ע s7#MNwE_W:s>dYɩ"ܲC~/V|^-]я7>WlUqDG6'셽e5iYfmAӻ[]nxmZղ1'c.\ R^^Yg##{u[I#pߠ%GO]8왝/`=C3#+Z]%j^̣f2[U*S,=n~cu6@64^6|жK'zj:+cw‍bA ށKITpK){iw6RUnwQF{6jy5]tڑ՘4 4}Ɲ hq&˚Aae7[5+T@hwA`òl42t@Eq)IׅK_dV uj @!ٸ5Cg73 YpeP!;(_JCN &YnRli{v5's +(Eaw>][ۜߘ.ZG21A~n5)t=9[(pO[=9ͳouLiVgwuWYYǠJ8cvQ=1^vBߟ\nCpg.gwh9/54ʄo%;+lv̭bo%.EKrF\s|(Y)F]TK_9-<|L";|7%l{`ەț9'ouҲ0TvWBW4*|Z9p 8VA] )7^J듎 +ޑ&mƅ$T e>Ȯ \Ϯ +*xMc)qX{ݚ\ Ҫn84_޳]3ûǐZ˺NqCΫ6&Y>IG6UzqRW06,`zu,E s C/-:Uwܭ%}pK:_$EYUqP?U!KÙZEvEoY58pKٝ6(aF^y[?۝%/t?N. gtwQ.J{D.9eO˪7mr09,flm%$ YљV9dDxa|60#|C2AE,bg@1{{̠cҸ 6O׾ѫGp/6`C~ȴ❤g+ec30OIZ۰9Je=># R^a}9q P~DmTg|ckGqhNzj]-Xޛݕ&WĢ +x={nwUg3'Jy'g*ΊRrjz|jݧ j3pըW/S / Ly*oHJxckqߕ#<%ԢB郗z;O=\uά\ u(® m{8l;pJZ^/j:H>ejQ6 } F^4_ +{d]a/` w|46̀l!rvxVT5!<]x62==-8ŧp?|;)êRpFbViC&m=ӻU!QԩDZ$"1p=F,⺸Cѵ1/9S#I;&hx/J.lKg /$Nk O4a6n듿?{@<ܥc~SB¥z `8mWPrKkI]k2,j8zn,H{=iY+UCrwF9:#jKbtT`b|XqvVm'MEY٩etwUoYpзudzzx ]iKQjm925}v_"ޤG[~е/qy<4E q[nS>x/y8^X2Ɯ_-CZ9IFĜfSvqj:0x5n7i>՛r٠P^<y}}gQƸKT{͘[ 2qcAKze@>]%/lM?{vx=bDg$w˞n}w '3SҜ[Sb љ]H8]y}d^NJ; ˨[TYi$VGDѭ)Ii珄^>bY8G#(Uxf}sՙ_V=/nS|f5G,[3NAfsBR녯f@>'m'Ҧ8S! )ِV)EUI`CҰɭ?&R6oN?162ݽ/>V8Nh +>C9'k"dCޔG_ښMy nLyI~ql:evi5Q4Kގ;M%{kd(٥3z]*do%[LnRN᥈W,된 j6>8XG!?e0t``3 \J/4q/,mXMCBgu/nKyq)JOy*,0%E%/VDmkeqщcx,Z?GOU|3]y~pҤ[ÏXTk2c/<;9'p;L.kE1Łd. }9O4\̡aGDg_=xz/ǽzy*`PP>{pmMp?_~kbnۭn+*XADzキ {@H H[< άYi3Cd8(Dg6# !Nss4\eh&FpA'jZߏbf7zmvCm"]𩦩R?DCHd GFUA\% ˜yEF~%[d8)|k |HQ/1w +piz S;D?QҲ#)% "k >6a"~,|<*2B߬6_hY͹/NN/K*I<<o=繾3YJQ]Vy6&gڀ8Slÿlt!vGȱ3<9r~&Z"]ڿE|E~=%ؤ -pΉ~U +0#K=Z +,TE:q_w0_1_BV'pd'F[\qEJKLRa%7zɅkP <$ø!VWk@櫵' Sj`fi86%=0 {B@2\ziAF Q Rm0\ny$ž6)ohSj*ܘrhpfޅs!O܇X8lGmLC,Yx1C1GvBw>Ug=]iwGLWV[a?te@?c}uzcދ)\Yzy,_jk-26dgp3.pZK7E}9e7 6")|$.<C};Spå/ ϟΕ,Z0N(W]aFR4ցStZ-9B扦44Rݑܘp0^Z~,#gZRtPu dې3 :A\j#ZCnJ#`zgc2mS# 3}0^y:[U1D .K}2BK<71>k/M=yov۲]{kMlS|书8ꅹԦ>\L~ZZ~':.Ãw{iV;4u~\i 69G#/U<҉ H( qlo}%k\Kvz0H$GX$(?0L센]{\\[$=HIi@='Qmw B4]. +TK\=F׵з/lkd? :LBJy87z]LDMH8TZ0ly~RS~VPLWp ԧ)ӎƱUyϧ(7707ǘi6qA{Ä72bu +y*RE]}OWt>凜prօ=$Z%gj^= 7㾶"i'<)+ez"cMv`w:ly.tə1M +`z2i uHQOcomsf8O#NUpʑ?t_챜vOt\FOߎзZiv).68.'<.?St. *b𝜓p{xSBOg?oCnM "jW; uYg+ +v)r ?y/1ٹ v8Jrqs6 uWsc/bpasؠNj챬c?v+eBUγ9QM΂Y*nx9Ku/7Q /6w)a%="$[}q5KJ/f]Xs EMJF%Z%*x3NJz:NHvP2A :@|g~dT"[ӟ37Z]pOuu\x,ו!OAWCszG>KzYRARK )"ws +/U[m*rS/t"E7M #Az[ŚsIUɏNՔܭ!RRL%uzz{DP銔}"㖬uxAx9J(ѷkh?W YYڽIru;(y{vwȋ +y}^Xϼy$mB/>1Sïk3p 6?PWdy7_|']׺J_Iw䥽91a-%^6Zs_yw1߮uܯy1m']wP_:K?P_>0pv¿:z(p!gj?ğ3w$q>8,@?lC?!}wzо2aKbÔ JNq{2a>$9|ycS_~OƷ#)>ycj3@Xr9>+ugU`% o(ɯoQ>GoA䷵k[%Wak%NBY+Է續Vy_rZqO[1q,f|M)f½?^Wf ] op1nELH>Qπr$<D-ֈMy/zř\ax8\Зn=ヘsSߞTMov7En woQMw/"N-_IyZ0nw$>|čb?&%~ e| {5i!q)LU`l\U~ /5u--s; +T?G):l{1"TQk36'T:W"B&7iQRaǡ ow{~t:є6x85ewolelwClH+l, XHuf#@~[Bznb\)F7'RT46Aݘvc=S]>IKKOr逸xKII|BcBo_ψn-|<"H[yMOyMN|i#ŪF];3(%+}ZVેvx3,;&][ך_nwCNɤ{uuBPd(|e,ʲSw9>~DWkKƚ'15+y.rn#j%O!OLeppu}$FgjCG8a >QO $|gRSbSK ]DtXcޢO!Gȶ+%b&1SL>L䟋/'qϗ3Tpau们6fr>nwŊ~xd%G/6_)d;=w{HgRW[]հt3|"n #3w{ܖRou}d֣)k } +Jؔq;0\ӗq.RW3\ 78M΂nb”Un,6%#,cT`,wz Rޮ/t}( e9*2@ds v%fL3ooukXI\aᣩHy0-HwKy1/|?a24]NGNh1|cG ]nN$O< `w(8FN< g*zodZ|q8TژP :̉?A["kE*PڎBN#"Ƚ&FgaR~J WjIчcH:hgcv!`b󠀎2^L ^2N&YL|X9Nیk_,}FtwdC.5pIs,zLgցoCyv-OQVq!&>Xiy{0NiZPI}*t&E5s*Xq8醆o #Z 2Kq[𹦬;OT@|=%YĜ|yy[)+b#>lj< ?#edv Cu26#֬|Inz{st%K^v!剚~wp?"x9D+ +"mF\caZ rkն &jMOxnV!n9!7z +>쌕 M#McD`\oQ3δ#{sKOrF=>b~q徒3,!Ʊ1te'ԐG'@6WCC1XTD8V | +?utU#Q,g)˰b_@["W8lWP _/Զ~>.'MR?=EJh%=^(>Y\ȱ{vɲ\܅%5wg`g=pilMN>`LRV+iwT?߂ ~V;=k]~]ö́T^[Rih,|]Nat,gm Zޝ(16r%ixwG/.V75}ۄU y +RKɷHq`WX`L,R>6]eTfXY7ŔpWP *&6Sb ]o_tXhNkEPu(YEML=ъ6%aqQF -zFHz6F}5RVⷭvb~9`jUG:.nȼ?v*㔚'`va +VYNN3B#1Nf./mvp`axE^z\5V718U_ORUA<; NTv4-ZkzɅLb}8-R-6TM"7@b6Y/:z C=GbfəԒzb5٩Za3'e[sm`~Q{f+69@ 0HQq-ir12` e pe9q.uy.[a-D0IH &9!ޤ$&ZgYr]QjT d06ƪ`@k 1;CoSP_qE 'k˙VubxiddUU],T$6RG4C)-rnԍ.V_p8:Vs'3T{ቜ ziwe8t74޾ƛiyHu(8A+p5b[$b#yxaXB{|G6vkY^*ϗk;Q|2eXV/ +1b8䉸y^fdz1* A +endstream endobj 29 0 obj <>stream +9Grre>תc +?( qbұPZC篴|,!t\K8IE wA N`aOլHC;ius6bЀq+)ba~M\k~dG["fȟyaWfdwcOy@ TP.BM\K KT/m0a{ lΙJH\hU<(t7g+H :v~[yu +![UFK3t]Xp0+B6jմXUe9RQ%H{dn6ݕ̐JF uKZ:JE@?YP#~䷭~UC:a2Ηϖ:mc d_iE6끹 "B,cĬ |8$/Բ7[EiFmge'*r?v,O )[2vuO.d[;,d _x($vyy6^&QvK >8bmbm|Ȭ`)gBᱎCJBw:0AB|=,Ρ?ˊdu"Xfbkݜ♪"W0!`gS2!'c%"AYtzOߋ 8U16f5qx{#ArA?h8 fR|Sև|~Fů!܏>VZ$k5]lҶiyБP\.^,W5HԤ{~4k9*Yjyڛ@;_.#mC^ZvB_?1!]~z/@N +9Oio +s2鹚.Y3峴aJz9RwėtNp'̌=1%bU>yTU'~Bv'=9k.Ϯ{} Scwd( +殘W9 ^n^+}WiEK*v'{¼~s p8ܾryx(Dz_u6kMx¢/TTUSĄc-z"aD^ (NzQWU^-\L|ۢ Vc9?~KϯC$ čwt؃ +T faHP}󽻠^=yw;B]]@y^WZ9:Ze [s킨JF\m4;7,:J+VA)n<_oP W;OAn߸xr+ѷ1 oЧӕ+hE=׿Fu.+D^ x^ (3苓?@@\}7 ډb%ǫ~Dó~F86awY +$x~ey}{{>}?uݻ _c~ԣ;>{p>{7on\<秿)E~gZb6# @@ʨu#s3;>2j7#Ї@/^"޾>{ O@n] ^gw++ukDٟl6k+B8;]و|?ȅ9U!3">  + p;ׯ^x1?@n@ȨŜB]]x<6|MT寏sszɡZ1 {[+k85{X>; TzR7<$+\+oZ›u|F5Hlo=<{ۗ={1-^#JQA\DX4 Y'aKcUŪܑr@?HYWщ1Wq1W2A/>G׷qGϟDFIyЉKu~X%uTDM󫦉]wn"Iy]?|߼zr@NO{@[sP}?#^?I^k=,SeiΟUU_7OA.@y:>}zz/'G;AQAr!QQVhTCؠ΢O&9-C?+++c p}uq%{>>{;zz='N/߫Uv"e1b1tm0a^T!wWR}%zyb<=syt9[.X=g` ݟ>s_$֋J3&9ggmY%u_SW!aGBX tBoq~ tg3 0_]ggܫFe[B隲fc4jx(uӞuQQ;ȼ[}z`YCIߙh*ۓU@3V6x ?e8T=QhZ$Y#9߇&ed%&'e:ua1^ 9asgaTW,D-yyGVSա;"yhr^"1OHxu_7wл'Z~r~t~֎!zE+̘I^QV7LU` +trHI>㤈PY. (qrP5At;(jO𴫐.3nijڽ0?|Ey&E]w' Y$mQZbwrfZ1 Z<sĥ}#;"tf?=_}yv-'!!)>nV|u}#yk1_e+ݥA |!5BQW[a!#|nQD{¢Aщb{~ +JKw3—+ṟ3D{]lO507&I+}VsYhCmuvFZ摲c><]7Ϸj|잜WjPHrԆ:UCXnD:9]ĵ*xwPz};;SQg,ʲC% | -S 5yϸQP-ve;*z/'I[PmjGʾ>9i!r-k`^J+7GfeSM`S +ē9>tVıMWr7iK]Ԩ^DjuHYn.PtdM6룧*~C >Sܐ'{WWEJK75 R5)IVF7IL{A|2ç"6$$/m?\5֖#noi: U=\gM+'tuX?"?ҎBeyhpd;Og0$E[𡦲X\vm)MP7T[V^s.nT' &ZmnhShq:@Qf~` tYS3;T[顇 qRZ؁]ݝx k]ZΊZUkL"#䈝1~AVMƔ2Y!o b&vE&9,sgFZ=mIGEhM2(B0&F]pgs~l]ͳ*FY'o)ʑ˒J2c"NZ$k).n,f&Rȡ+oi p=c_usnҠ`o//PrDۦT?:RXU0rl\Bu큚ͶK&/:ϖ v_An 1l+@Wk6U#P 5t^ ʊmӍ-SuBRD1mgpUIZi3@N~;QG6GTSQv(!VY}Mv1gpVmY顢 bӕcmH- Z&EPU_/l[bRAJOߟ$|b??m +| gY8V3TtYY+i٤mmG }-ug zU肴du2g_qlPK.UϝvԬ"sq54iv'HCe6[߾1[hB  +6v_#di8̷+d Ig-gjL z$쌢C2FΙ9QKB7V;Xޙ|!?_% 2Z|ڦ+J' UGKu=fpQNAךXU йO}re~hhyO9Y s\<j&gYR?7+ZOu-VeנUgѶئJ,rZAL[n)83gδQMSx4ЪĤ-~auwئPV0Tv `:%&˝1Ol`ZĜFcmeTSYfSKvFq{dHt2S%ḱ[z(gcЇs\⑚Aq}k>ebvpat Ъ@X`,WT[4բ˕ZihPW[dL +Z֑ ?-/qݭ굯q{:Ɯ͓ ?V#%9Dˀ/s*6ؾئV94ރЌ:ps5]= к*?OW{*Op<@lݏгӅx^Δ*j}g0 5ƀ`'seދ 5u=;R&H>K+`_ gcsNub osդ<\}kR +le{3\f'_sI`.h糌b{>yX*0Ȑ1F%>\ߤ2̀M%a T*r0ِ zReYBwq1#xŧ3Nf(yìdG 7l.@BN3щ&51@ML=&&3JΗ+7 Ng~_d^6ӝ74ѯ/fp۴;JM2+{0Igt$2D?Z'nO`w'Q +j"rUgk5=gMuf>H=Q'q3"N9Q:k'~n l3bY|6o]lSQJf?zzz66E)h0*Pu>t/MEO?O!of:g?z C9oپmcKU%㧮})6H7e i[Q^sBddђROc%1wo?**/5ӓ%1b1< ]L5 <7_ =HɳNO7𑛃 ~M+i8g|לϕYa$L"R&PUէ9XfmulMt. < Ę1tY$)+X': +վ2 F< 5 ZYI?Hr $4(|q6_px'}O &8pHƇ&߁w6S-<)}goUbj%V"u#U>`8uY!Tr7th[nUrJ bZ7;Wwg¶9Bg7N'N?kΦES-oU'A֧?D\C(~NycЊyo,:~WZֶ/Hyo7:oNU@N[b~0CȐ'[E&ުBEƑ&[u2q.ҩIy*c琎!Ox+SxsYs,gE'Ygd6*;gl pOeV]Mm:і!u1dJ@i"NW -&&%tB]@-Z&Jd@o!tPm",22xP*M[_;x,(p LrٿҵCNl(-~R]BM'U)LC>G,M;* V?&]|m.DÄN"7>'KOg94c2`1dwȭaf/Xţfeo!&_NSrNUtEEʴj(2b8!|5JHҵ&UB?X{gRJʥYr>òk傈 +uOp1{{[JM[hjmd {R:|U(:*fY>$%zgSK߄VN;NjLrjQBICj i?f+kNNjY#yYeN|= 2B桊 \}ܵ֟+ܳFM4{p$24 >RZ)ά`fV + b\=Lgdf2IuL5{AAzņ +HiإI&{<7P9ւxliT/`1;UZ"&ö@ iBeRf֮k/}k( 7:^&Iyb0,)×-kLO+PvYEMRt[mAS U#O_6݇z"d_K|)~]f}DϦdvjf)8WZ&aW@8!WsJ;C5t$J,>=K:@qIBb: zc-}.$]~7ޞ"d/wU5wAXV1c|\_g +l3OzbuOyraNJ轪Ua"%y%rf%aw\8$%oS<:w&Bk{sQϊ?o,!\scy}7#/l==XVads]Re;b%i{PH}8>;E/"ЛYj|́؛EwKIxoWul`^!4}UoǑ)Z6V Pi^, 4:Qs +暣ov=f; EF}Wۓ4WT0[WW1`'za˱yp{5BrS떘^ + 5A[44Гњ9L摞?cJ}dW9qj&!L£7G!;x=hP2}f +Z'n𫕶Vx(g޲hAn Tҵߗ\f_膅GOVG`fE{J ~SKi"i>Z'&g\0=uz [QqGp4>1IHݝ &o #Cm&1$PXaw I?y3)'$(ld>å?m[}rĠmE̡2ve0+O3M[ֿexԍ]%X; kX +ԋ}~ĩ244+^E1%(:GMS] a\cX0y|WHNt2~屿DiRաw,zKέ޼G2TS̆-X6>Im?-7{v)s?s>dp)X}% z4x; 꽥67O+,36_ŵ Dۥg*j}ρ +\~QiY8_|SK?u+˶S<2u@iyx(o:6v/{W}v۫j!nHsH>ϳg;oVm9%&u-Og]Dg?j[m"\1e  H6OCߜt>5;vk61#k'&/T8f'+4>ikF_KcsP8:jw 33u[n̿k)y\wKӐw{97Ʊ p Ex{b 4Whynwǻ. 1p9UsHgT昄|4u'3UYyk=1孭9FZo{6WF(&ް$ڄֺ 1ky}#^j ^'J D+ݨc ґ~cc([Kڝ +QZM ܜLJjqX!BGqT™)r]9{6u?SLc2P oxywLmE/w[SOw#;BAi [#:a֩7g+L2=z^rv}!]mȹ$'_$ٞTF,’ C/ { +ϫ6+_ɗ:^"aG8\ vѪZhchyozJk7DO9Rǰ3bJ΁^WV#ȸd&1XӣoXuXOL%'zS={\EvcW3Wv)|{V2`so`#%*#E滗űD*|sk:s_->12 %f]F+_mc럇w(gÝ3b$> z ~s$WDd{/L5 z H*ޜKUlKj588BUz:EBk^ࢠ,X%:Y4,b!禂vE/ ~C?ܟ eDZL~Sק\3~^ + 6Ǡw0))dYMm5e qRņt*Y'&', VY ,)추sYFϹaNSAV?)XY' O7?}૆tHgԵt\W璗8+×? U+*jSO؍G#{V p\Pp &Pi(x+#+;!ol$бZȶMaֻrX +rEd2 x]QMg\Z |ӱ {ZKCxa5@m_! ̣5!>%4p֟ysH*ܛF#B7LȂ q3ML_>4w ?QH + 2{GsIɥ竽 Wcct\rֆ'@<̧ࠎ9iPsiqKn nЪv$yAfQuT<ޞI؈Le;QN:u_@hZuSc虑_>`+K* yv9ҥcLa$ynjzX.h5A+]zְ=.ߚ$<1 5<Ԑ@ ܚI^Vj-sT":؁Xj!,%Σ`#* HSjc =ׇayfM51 uW2JYR%y}SE[>| }R`zkʺgv>7f޷GZtM;60I^/QƁN4aON.uβ=cu< 7oG iRo _Ea⻑wU/sH%i_t Kʺ38~>ְi__!;itS'j;V1>%p2 ql (1gdH74@QGF6fwP +>1,?\T:7ðw]h,#"scW2{&eݷ|E@BLZ~gɺw<($lsXnJGݧgF9yzYV[&O uMG*z]Tjjɿ'- {nE/!QYZ1 |껍Qtp>w l$XEx )kg-jGEN[1n +3nn" gH82{uǺ/)/F@CԨt_dW #σ[2FJrRREK )S;BJ$=$ؚG˸p&iq%E ",Z2BN1OR}ZDU/wk#}sP"x<(6W IJ~0.t:|74b+( |5C}=45oM;:0ȵP&X $..u)0<^mh5bW1Ů%~OAC8lQ|T;{1D 2lAX_0"~{`yc$o"%/7'+?9P@>{-π0|&VX%g$TjBEq@y\ cSN@}Gs + 㮜VkBAoPrVtcyo%&25U냿C]z?{6niyPsusCNYJmSwňXqc}5qo2cD9Cc8`=c%y9#5zdScIF#Oۣd@[}uϫ6jJ.5G(|6QMmpvk@2b[A>xI_ֈw-g#S}[C'L>]ecSPtš 7xyw|X!dgˉ>)2X,gȻ1\nUNq +]]vn%!߱HȕC/4U?0 +̂T`[ d-Rl.PqN92O[/3oItHYõQ5鶙16}[5 PrJe\`Q+<.gwi9 _@2dvJIt FXme]-nDđ n V̓" =׵WG*BEaş]󈌿68uk3Kqjl>5RzhSZDfnݦj;\c]q*xj?(9C-t9U|jeD/lOcSLmu\B͝6g ;v?zk7СKܼ[]x~f|Y86kw\exդR\u CN2{j0s,틑Mq.; uFPJc?l(|NɻXa˦‡c0S?eqD8gN1#gB\RTsg7[_LT1(v%'E$Ij"2X2o#2&ړPQKN`膇 a/v.{Q鷛[1՞7}kybc^`2/A{R>ɥiC̫AqIwծe&gh8Z7|ll雺|!u]UA!l^;"↘kYdB/ R./b/Zs U /^>2U<7V<ϷPQA` g}b_dfwG|*hiZ!^`> kdzH;ia֢ÈRyl6J%QdGl[v w }o~WJ/(yG3]][Ϊ]fkb&p}9V-bh胾e)"FSC]Þ 'CeXq;sTH{wFYA=zOE3ħc`XS)9h U7xlcܓAuݛ'yfٮyRckϾi,|`!ǵA/b/.?fdC'_%^1>NSj^z1b2j9#cGWdSw_ؙ${ mS]LH5W׼o3T-ٙ-}햣:4oOp0tO94 !yTOZbcZk> +AqWK ?nh| ~nD"G_^%85w[ %!DpO(I%yL[i8@p +r)pyn%z`#BC^tp6{@qyVa3aLԎP~u\6j>k_@mS{J6ܥܙ7E+-6TGdF'1w)g^5\rt4+ J0I%d;}V ӹBYe]ëowǖV9I.<4v.z =jK}5 ōyF|虺J~f^/c!S(]6ɫỹׇQO¯ȱw+C5j/y.Q3+#Q;LEOIhX$W@Ex̫sTy `)L-!v捾%RpuG -29EO9]%A+]UkC'cSRi_mπ>UhX+. [f%MLGKJIjb"t, }Rb& wG(@.ـ!\1jy 'şwGl*P0a"v0F'JK喚3^Z&Q񲺬[Rv%sOep ~b$0< r's[UҰε'94xuG6ܡ7++Ќloo!%P͵h䬪9yi̽+ ]|_*B%;U:V$+yU1#5BGFPg4Eړ `_/d&8 o >٦jӶi-["z~\*p.<-2>>HR4Hȼ?ֻ+#$~L£W{!A;/s%o-o] !h;c ub $șR{j"] +DcN=|ip_h7vR2Wft[gnRʝ*˽g9d@#3 S}R.rYAM&r+-ay6HomHt.߾Ȅ9Ul쁆 vʈN18 VX7[ -J֢W\UI`뒀|]M_/t+H0ukaOV)h xDy{Em Yv81VlGwM=ШQD1|,-u6#ƥ1I9D4>CO!Smq@]?Z!.ťSz\|sWy@Z,s^LAϿdܰbljlKm5=rFS3<'_"%^4Q܊ܰ3o5B/߇*\q)hYоBFXx#%@qc3v+]/dM講c̫)6t.nLf1a_g3(|}@MC=HؗⳏU;`}1@ל5n<6<zޥpݤRH96$RsGMCm0 _*( ' ,OD{Q/~E:- D s;6quU uL쾎E:б(mu{PÌ'mlZ_V6?bӛ??~rO +vH`}t3dHP ;RaJNVS!x1Tڟ'9gi3]<:|gUu!..MFiD q+h>5dD.֥_c'\\*yD'TlYSձ:9+~bxduU\uRtRBe xWgVH *d{Y/ι=K~Uԡe]ޚDD(J;8cZc|$,{kM ̀ o& ,~j``0'tzEXjQCe:r[blVOEjkѽFp G}#A JްJ"oPe{j#<3䢈1Zi_dInr{W}\&Bߜ\I|(3>3-\;R+o+"$\S3o,U$ 켰?g `4u^㙑pK㕯gO1$8*>GȰMw{sl0&Z +X&$Oӯ|qy{0*vŤ|}/4<<$w=du&eȸ^vk{\.-bP뺎V9<*pǗn92 I@N@}[_SLh»sߍS2r?\򫟋5޹E/>^'WwFk7+^*9.5," <ቱeȑ".a7O)qql*W66hoܐipsE˺mz"Eޝ_^nzcVg5(Ap`+D˭WQEGN*Csܳ'9LډuJfY\l`NRsLݐWRn3;ڛED2,}mVZ+cb~ x\Z&|g10JW]T:qΠb &,Rr2X[I>z +5˄R2SZPdks^?쐐 +Gk#6Q1kx2FX̵@.igީ{u~ g/-JqAތOGKlѲκH6JKj)szc,%]QRnϒQ9! +~WEhN"~~R;s[#Xng3ĭ|~"5݉냹Rh̙!cXُu9 \j\baS,k}O*_nHO_Y xuI27vΛgh3= *ywɫd~yt]\c#IkNW 2u=7hN:^52>5. +qb,xMFL6jCG2nlg.VϽȺ4E̹T_p  /}5}o~'LQLÐyW6XȯˍJ.hٙAĬMR +R~_å 2> 3wЏw WC?gj#sؽ9lWά.QbruQhUhZ~C#>xPd[wxILoSw"h8hiBLXl֣Vt\[A-3m1:M/+gflwm 1I@s$=6xcĢ;$DGi(+_8sBE:meuУX]?6#&#E{Rt,+U\򧶳꽱]p0d‚0E-=5 JL}i[@'[%BXmK8Pyaw?0[N7ꇎ,pSiS9N6LJ=PR%UaΉIBQ),a^qKoZk12aٽ_{7Iŏt-Npecn@9̓qru33JlR>@W'pȹM1=Zm^ |/E,_V^ ~v7W: a]׷d3b +~F\^$i,DN,7- eSgQL\~vwX;C,Ls6Gpћc}xIXqYVTu{<@KZA|f_ZDDXX ĤK=d@1&c}KNٸCj)j={ 异c?W̽Os# dGj䢝\KvkP>۫ s|˭v#@828 +tG‚lOQ2bJVKá/fcC=uPGMꛫCֺѲG|vYlPٳQkSW7?Aj*}4.wĐWo+ 07,'WQwPԏi}yme϶ʞj[2HK0|}1]ĤSh?dvP;OW:Jl3ԢA|;04<\iExEl)7@9HKS5m 1X<+vq/#h&#% ZQpq^|}W0P͑:[OtDЗ:J8"e_J9&Q)"b9JޚX>6ՀئP5ήd/> ߝ $!|FWM܍f^豞׸3vqe*xwhaT#  |@+uc}DUMM^!gLc#筏}::AXu Ʀz([C\sRP6)ƧrN <ΑM82p -s Ve2##ۦv L=`"@IQ o S3 ]cWkC7ڮ];H[W`Z&E}}wYTMH0UV99N 'l2VSAxTOw2mao#2Z81*/ nw!εA~1[џGqiWyO&]1*oL[ |wR8P+hl}ӊ;u}(yckm+&sOC/1nZx;ZJ?}!6׺K󣔔[WM#/L"DG2O?N +UQ꩎~k:)GS[5)3&8FŽ>>ZB|v_k? .1R,VYԓ'Iile&x.0s?9: =<-v?2n_/b1rvjxdM'*}k\ܿqFٞ v2MQ[万A>7TgU}p <ڣ2R:B"{#B'{QƊQp{c{{x~h{m㡖\mc +Vaum;X<+gO =yTSJ(8ұz-ƫpǫٺMAKN,jo:7?u׻k6k?lB?0=c{^XϲMq+wljIdž[Ǝ;CȵZR;0KŒ+ڦJau42-C=J>ۣkЍab4H.#_xa`rd;TƼm>JJ[Fx6kmjCT¬B ½CW[#A.رȪ6?Zh/ ikȐ[c(*K8mҊ>-2bh[̮R$}(Y;#G3HO?HWr!ڂmy&aCcJ, + +3?G&^7wnm93dLc4&${GŎH" HQPAA齫({9ss#aU`R`r钹>kll\', +;\ Ǚ7-Ċ9}7%ꋯp9YKrX=u~Q"?>.E 9~>DxuC o˽;tل +}DWVf]舘T$44P|\{H>V/$SI~w}4n^5|GE{rĤQ^sg=)me!rXvԜ'K3}eXX99͕|vMR^d:,*UNh袘+/8-/1,KCʞv>[pg+ps&7TSs޶|lw?w4f [nTᆵ&? d4_$5+4e:i*efQxټ tÅF>Qs- RZd[xihsŊfc4,ՁVv F{&jޟrDʩe z:Sv W"CRPGyw3RJ[\򂣫}\ï_wv<cBgz[dƎ hL:xQR1ᔍxn#;t&/YY遦;-wsɷygԸdBt=Z@se֭,ئ:pjvCuZ=ʢ:i@#(ZTʂW=B-95#bDXPɪXۏf,\< .4.oJ:.m| sCX CTu+6Ŋ+"Rvఇ`W@m /:5Mk 87>ЙwgP6'͓]&}_hhi^1:ҮY1}T:{QVZ16[ +8Sr-P<&⋮YZ/Tqݢjd,  V>qѾK'=\ =m\ +~zn@$Բ:Ã5O-3kbLIkVyE,[u +mMSu&xҞhՅΛ64%Ni.襢9ʾRa7,db06m5Qc җVi6=jJ_r4E3~Lz3#'e-qgDw㹁p;7碿jAѲY8;ô:fA{E~פ,YꢏsHF. t0 u !&ЃQ\7B3~Vmakʜ׾ao] U1g-fzm@(!2hRfvca?Pfe .gYHܲcܭDo;f !y^Ӓ3ƧZ>E>}RC*pw6 :AdbZR1&iqkcwf|p|gA2nVӨU:c 7 fly.bŲ_44A+~s-5_}g=k#mmc.ܨW둣cJ4=p3 (pҘin*XfTLT1,)v&q6FZLi-&vϛiFzC-\baCt91= AGȷ1%-w?owIO Hmɗ +Z[m<6o]2P6zٴb"5&kY_dE QL:"63M#vY赛^J㪛T?ou7=ken!xu{^*| &|x/*j^M7!A} /xh3UKxچ\kLI {#4캝VK3TM%6m9X0$c'T/Smer7$m +}mb\ +yGg!{^l _gbe梉>xԺҰ3YtҖl̶/<egd/ɕ&NgDјꩈ^q@V<亇Y69+v.o 7]^13HəSKgY#6k0])=& }0*z~tH(YS>6pMhoqhv'85/5lY4ȂeRV >&o]qs[Ģ @7؈E3hB6Gc5_0m +{ܮQlM> 3Wʹ~M|G9Y /VݲaaYjl`=Uw;sɧ:M 7Ng͟ m05A}= "7E' 6DG)&9!:|{s{pt|x]j$kjfuoh|NoZc}Pcvj|(*RŒ9>{~4In:gs]lL\\qwi =ol(A٬foM悠! +~ 9UymݻM# >"RZɫ,wBNHӶmNPXI#h o WG&n@_t[pY~aU::hx|}CqvL@1`7aRF2N@//ua m/ ֽlp+e˱5nq6fY $P@M &aKrk}Eەm91!h!Wm Q1+CLlI\!6|1EC6l ho+rMp:-<زzz㔚P +0omokλY+>oMYam%s~suͬ>:C̽!.cfÊ_tvR4JyĵvLd43*6, pT)>%]_p:F {[I;&8Ϣn7 m['+-E5PbaRxъWeZBSy/i?Iz6|ld,YsDq()Ys{DOrgk1uL}ݖvf򄖋ߘ*7ߝ0δGYTfK&.uo7BָWtiV<ݤWdvW w NIWb^ovv n';bn˽5AM9#:iE73k}dW/9!lN]zxy^p1zk/ޛٷ&;+>li˝1tԲ{ L⪧5.S̀amܙjw *n) H> mB ҕ֗~q|V)Ki6+O7i_\;Rj]V`b߸xñNݎ_([rZ|jCζz TNjػV:9oYնozX9#: אּ +{IӛBP7]ݲ DՍipn+KF6V.ͱIAWe7I- E\TG] Z ?Xo)6xVv@ ;*rKQnϝ5˦tO fbٺZzT#DitQ ă&MP s6̬YrL 豦 'px=b=\FvIEӖ.Wбlc@|2ZWLH/ZƇ?Ki>L֌P屖\œ: )=bA-ب5Ϝ1Ju& F)[{JܲE"4tD0t[]ޏBD3o_7bIYrb\5 )˛(U:t.1fʝI8jR 0+lhgW%$XLTne5nE*p$0w*p#4¤8y-#= tu{\ ߛrTVYҿ_gy,ֺMtuL%mZʄ0SN>sgZpbKeskDz>.rqƝ"h#lp )b{r;!FLT =4՘oTIr\&gEcPe0\F$`%.tK0MnKe-Aik0PD)ґUmtϘgI j!0}/4$5hTϴeU-W-?&~~4Dͤ2#+P{lWS4[6 vG|rVwfIxY{j4]Y^6cnj"S__^N<76=$h'LTe}cK~0)<<~fA썵f< JԊE<^'ӣ0 rޤSvRNQn'tCgNvS"ƤTSƤة=:RsioAX$aO9Dq%4V䧣%5^,lZ }pzF9gYtۂX9d |[/#NJfs).kvav\< mP\EB`?rӰ?'~>["xȟwx ( ;kD B4tJX(F҄< +?܄=F7na{jMViqeP\n0Pȝ! 0M`oV"0m{trC.obF!I/*-W ++(--S+ {?q^vH;̉!7C~;<$2旒"8hmm8eι[EH9Xu0h]̠1y\Y|h1D`_݌萴3{jrӈԛT JdH>H:7zV|;מƣ9$k +(\"w%= ˳g!2%}tMd2Ū3xIKԡWU{MZŰW?/>[?]* pk!Wof':$-' o5熺zlG'mU)흽x +o:v;6/*OZX8'GO+C"c''= + Y~o0^4+)Bm ud :(qhcOhY T@ת!K <}Rx萇B^FB,9y^Ƚ{)'ʫS<8|CW4"ܟh]bSu:Vmڤ^Y)Rf&:~9F8N8Ts!=1Yd\ A#'v+i©\ll-U8Cb:Cn( 됇!o!!We|BjGkͲ*riRxZr_JkGd ,CL?%CnUu~AȳȐ#Q?U.J: >kRѨcPv$h:7~:t6v&>OXRA!wUD'N<{G !n"$*{""ÓwԓpWUXNfV~GPoER`bqD\2t}DrJ5{WCJN|'n? VrEMȋ^$z%)|2U@m[1kr|G}*^1F3H,meN)̓@:* +ImȽǕaC>BD4p9?$*~M(?s6uԔ4 ݊@j`-,DSF0w(\JV?:d|a? +1CJI#TcQ&)Ue+|}0wRZ@8}mvN~9\u'NrR7 aM#Tn9 iD&ATiR}EQis4~ ǨT?~I^JܮHh4N .i# m{>Y}İ\Q`ĢL2~FO5u[ukMwa(-L&VE*s(h%ø ;:{^K]7{([שhj%_*/vkE]"[m} G 0=xi$'vc:{JBKzIn>`[vrgT6j,AZۏjc1[OѶGɅ]c?%t2< ~N(m?UwzKP`Kvl eƝ^^H$JiW`)BP\ o3.|@LV$pR 7W PPS)L~MsM`U`oM/=?E,7%t}dQۦ7R=EJQW#Wғ&WJ:_ =.B25M'95obml zB^VFx)ֵi$- v 1OGi'4DG"/÷Ym.V`\\SjqMs=ä;Ӻ[7ަ؛GfYJ' FoI[.3!]~'sTR"TGa7@( h81}gӰʥ,wDuEWN.g EL٭zk=vBMBfybbnzIأl-2(bU(!4U'/6+ri`n>e,zIK.>a%rX]wSᄴA@lgM):VeԎMZWZ:(l5R -mvuOÈ7nN :XNeázuKƘi-ÌV5λ{F>rX(p)iVY[@6g"$98Oܥ21 aW~8kܬh-kk@,<~< ifODUяVHmNVax 7}=K@n8}2U"y pۅ/v_M}aOϪ*_T&_-c=z 9$%E-qȫ ;*Jfϣү\qۋ+5Ly;;Rޔ3l<<մ.؉%+9JgmUL-+NR]UԾjA}kTY)cP VX:(o]EMq*c\G~ɂژu,`\dLi_FgE NWA9b7IB:zeXײf€תHW:d!dNp{~'~g^?̪^i7|5#ߏtwU<\2ʂ>|xZ<@e ?:Fiu}mtA~joXZt%LOm>"O۱c܃aBX9gWxs5{:es ;2eo_!Vj\ƪ9aȣ1 +bӎ-@M!N*Òw3ZB=E'm:ҫMc32)9wv)uρ.88>Cn:Wn;0sMKU;nAKM*prl *~LZ>& (ƍO0"gLIkvl&; v̈܃V6ɷ@8gM_z㠣[Y>&{5LلĀULw`k*rNϨY0EscΎ `K=T(p=urռ?ҙpEWrGW vd&SpS Rq{.4x~rY6?~gȤ-'4e#q$0nlG5#,qtο3SlφW`KM?WL<MجL;%4Sr3V:jE͜51?0Eܕ7N^5~˟ԼW3ƤKԅ3mʞo[ɻ.Jռj"V.`wЮtߍZՕW<_h^ YТ@=]GK<}=StQ {eLFtn/hQdzTҚ>bRsyϙY9 jLzfq&aNaR׵M)u5Vd)(}agg_No Cdغ ڱb=''YsDf{?mc{65CNԷ&Wt!ٔg+cA5ȤU]I䶳&ywa`:e5ӞW{1Z:1jWuȔ &cCY#3G"tˊmI,qw{՟-˚`_Ey }kS [k%iXȀ4jqAY @/j˺3YxkJZꗀwCcϯ(`q[j?' wzsJ;3ۚ~~NScIcs!nI^4 Ha&^ᤜ6UY {^7@v,Ue]@e$VMM&FפpǾݱW^dgdϊ.uGjJ WB"W {^b [,{;[|o "rY_nE +_3TA~ucJ;ًYlΎdC :Pz] Cb]͕}o4`r?asҰ-MeWlIY5%)yeF:𒠇È]O]š÷maLѾ[zu] I:eClXnc/ I"h]y4*؟~_}(nVOiiC[bnjY8ueò +5lZBzC7fD[V|(Opho +zoz nw\[;keX)gMV~/yڷj_˪J_5ZBf_ly;EsW.Qg<3 PT_xQ{֦/-K:RMa#8آ!PǙ韇5 6wώJɽBem;Y[fdҦ:bu? e9:c!|]z5YGD-Q12dwqmʊ 1/=59i FB|-=6uԖ<3cvFyz9/ [Vּ2ֿ[?|cKf{ꢶM=&-({fd]07ŜZݛĢuN%_,-~A%YKdzRiӀI2w d .J(ZSֿ?Qcߜd^Ͳᤝ4Dxx:J2-y*ܛ*{}vk105%~wg>,k@/P 91$L9VvAsK})WwMUQɸ?Zþ4׍ . :9WLRϪ_fc ~G_Y+GWgȰ_ɗWL=_Jėo=W4ذ_sFrʅEUM쎵1u-!lŗ@ VG.*}m,0*L%$^w7̩*Ote]_UU( oQ;%4I +O9̏mkcL_Ù^y`1ۖza릺7+Ҹ8; j_ xY7_>K_翎eՁ%9(bTp଍\ JlE>WmڔȿY5?F+}~zLi!ByYޭ!^̩"NO)?gJL5%~dv0r8i..~C/;@}\U[ڌZWWxX[ =sL،5M}Ԅ(Hk)7)1F5doqU@͖¼3Sm?[OHk^jy[srHԘ䞃z1 ̾%99Ćh.{7 I[Dʶ9oM K4c-3+GiٷO-~,|& N\/LW-eYM1V]}u_^lg|F +}?Q 3"DҖ㦮_s; {_ 8./?ii^TA,7;eYYIҧzBݺV?$7{3aR9?잯葯=WmjʝLw<?ʽ8O+x9?tQNv-9"㯀l^׿E@z*jcY O[73ش ̼?H*ߞ4bx|.y\ȇ-8n0p )ᚃuMIpJ_iJ|h._54gX@c~&qP~]ז{X7#]ʙg3gs$sOug]%"~ߋ,)i? |\οgh#,D-k"4Ց#$o6|سARDT8F<5Y{=JvO7PqFRtش~JUWkMĆR1u_*Gb\׽ +*qIsX t6P }o|?m{*hl`IAޕ)~ፕޚ:Ǒ:lSBpĶɻ0*,mW{N{u zN g]/"e5~FDCy{%CJc&ּ;eU}4Ʀ +xH0dWeEm3$nD\anY.9:Cz#ɿ5tQ ~\~ГN3T~dI >.ϴ!sɅΎo:U6T aP*c3!)+m੨#'pτ)~g:a@eA>A3Vaܘ*|CVD(w͠U%ㄠ𖟟~!O>f;5Ox%<]6?>{1'?v2N"ܱWtA|kț%E]x78)}!>#\?"Vuo-iTس3G늪UWQ꘳VIW>z7]ܧپMM雿G&4m; `%)8xku;󮟗ugK_?A\Ü棎yuII]P3Yb kʰ s]h9f۞nPFg=ذT0f{ xUG>jӎ pd,sSg44ġPhŁ9YU2aFRU{K*mׯ`}Ucot]v&\^ՄoG.Ji\5&-3li.*''%iC܎Tld]:)4Kk|[_hGŝe%*~ :ӎhgׅU5/fԡg=_ܭ5<~M ֑[>H޴D7 #nBO"uN\zod!fvߜ `E32c|ߖpvFu-ܟxK[uJ#j>ъ_ڵҦO\ݝT<|iݭ”yv-Uُ vSzH >j;?w// E/p䲪.iAQى,~zC lPY_SLueIᇻ6M+.NB]Bҿ@7D/p{nD@RlZY`L j1qճ<3--#9ayiƍ ˺X'7ۑ|grk[ pjY4b-]kSچ8Uuء ʼn+4 TNty0.,=]qoNz0O8̌)Ϊ'NrEkq; Ua2P誶1qA{xW? կ]Ms,z޳s؜AEuCO~ix:%}uunx]=;H  amʟeD%}WUWu{V6v=!yb^5Ǟ}v0N6zBd^ҠS?Ћ-ڰǸمNFe2u͆S}CnJ_#cH)fw͠VLOEmتWp2vmԚh[ڍ:-)]VЋSCq t(8p?{VΛu]Ues 9gP9D693  rr"U}g-]k̋YkXwxa$γFEjexXm?y_+;+܃_uNA3~à dTM(\|Zclc(rE/n 7~ѹsNA-g&-*qA1˓17ҏ=@&}#9{{qgcF@M h)[~Wc#w,<-Wszr] N$=omxva]/;m)(:âGͼV :_FSe@);jz\x> + +f7Yg>A_x k׈QU?ͼ<8t$E+;ͯw^u$992cs/)z;ͭ3_a.loJ ȩ.Pkf֜~kG!q(َaM5|rz{Vfոeܪ:GnSsٰJ!Z'A%n{Q|Kɹзg".?E$|wnKX$k'UȏXDlyisXR]3#/܃)hPs6Iai'*s<ĸ{{_YJay \1w,͢0}5g^םhE47!.1JsM.9ƯcI<(L?a~]@UU'!rCjɯ*!cԯ/>'~*oԮW0Rs@OV\cV((^q2ɫ4nm8aW,1Pc|;dꄸIFKA쇧xiE{צg4Tyquf +a板z䢀6ZjSG+q~= 5Ƞ֭S=; ) `7$[_}00>sSS`iP:d]p…kke_o!96?,zO㥐VDx$#4`/9o B/|lRR:3fje~)CL1Cj>1A˳!=/Ra3Z‹ƔU-jfMlv)ٛI)LQ, 8%9O.aoI$ Tk_+sM(؝RBZ$ |r$"U)F(.y \X<3!a} 4! 3 v.G)#~&NAY(TcS6G0WmRV}i.گ {ɥa3R^rk, K" %]WR^WSY.ewOuI[ +r6I"=N^P>}>:ħaTͽZC\[|]h)#؛Ä9Ӽ76)rJkʭ1N{ +gVs:rY" 6 +qۥﭯ~BrfՎ MC j=&$`{%Ѷ|9o\_~X'{}]IQ7TT|" +=ȅϦ8o hD؅׈'ugV@i%1o~ cIScn9?>,bV:qwaggӶd|SAMRG{MJqN1| +zIXÃ9'A8☤]rm+&P +D r|;`x? ;;s訥!99?$WAo؜ݘk)?fl;FPm 6{j^zUwүmVD % } lk07Ԅ垪g}rbQ(ƀ!$;EqŇ5|4yyG_?Xt8t7Ĕ^ xCNslCЫI\WJDm?:+L@+5 cq&9ݘZʡ{O}ܯyKN)K[:wDBGIsL A^֝%:T"[Y 6Xjm7[~i>/qL41W%v`k unm)MG]@Eqp~FHY}=d[kqKvvW"t we?mn /noPrbOůf!"3MwI֧ELK #:V'#!5A,Y>]}Dbc1i[JwL2j\RlN,I8rl16 )jibIޖ mRD^&[V~rzk ~ɫB-Y/͵[ǬOl3궂cQϖ4^w<]S] ?̿$4 FP/`Z@+A r)֖qv6 g,>͊_',*F!NalFHcO̶t /D5j}Y{m@Xظas > +ɐJSb[qdQ|IbL7 ||M:`IѲk#^s883EGߘ]q[Z FUeqmi^t}ٜzڵ6kSFXbf/D1udgB׈T3K: ^q\/?o9'Vu KroaAV[ф^1g~7М:1KHe%oO {}[}Ƨ5HYY'o Q 7i `QyD^Wo>ڰƤ MhV_byʟ.rgyGw{aWÈ &M\7#\淸Tm{ẳQE>{m{ e+;`_$tu ˳ V{aɾiBE%$'+4nWG4R R37Ǒ7ش3c톟YgDĬ6[Wh~R,lhmO_؆I~%Ưgg !qO$&4tyYqmekLT9HK>Oܣuv;%{?j/ָV6a'_ѓTt=dd{bG-59`^X|Uz15s&.02A=(ɀ}R#LGI-Z}8ҫ7Fye򠖏vJ  /-4\n^ݹטh@%%FYе}(6Jv+ӏ/:I1B$|s썿3zʣMH=j8Wi3h~zeҦԻufӧ;u3 +=śð>.F^wAD}敓c3bV"QyP-@죤G%C WvNYIcbڸjz?֋9atv?1n@Ft82ף$d{TNY"dtвac@= #KKQ#]V%bfV6-MG:&IE}p>=:8@yuȂegIQZ&|m0¯w_E̝M!e8PI󯫾]}7OS>jlb8aZ55i=T"+ݽ[ۉuv{Y=W 0S[R&)8[J5À~- c*><;dlOHNQ7ڮc}+)zaXR$d\#m!i-}u56SC6C,iUz%t\y{ +䔳"gCEa[%Exx4`m{kkGNYvɹ5~㘠f4[Jsn;ezy9^!4m|F'V `%QVg]c~|lrBY}~⨒ԲKs}$oA(!=5Ȉ yW[-/3]g=J!# +b ;iS_[>sL nZ`\5̜?5 4wGX^\醝~5c^Bo09TmC2ͮצ!n&\JBcE$ +16#U9a#roq^qa{-mueYe:\Rx0+դ* +ke­ӋC&{t!\Ǘ%6 17u=]~8kLHj I/CFE(BCʫsJf_4vAVlqٓTX't6.g5PKW9Q=fWMaFK*qO q}BQOIgm{5V( ^#ٺaBrRܳ ]YL2*RvsܭZ57Pạ&dμ(bIfEՄI 9U?Tz,lzZ坦a-!:# <9!Tu]øk} gm'z7M!r?XD1SmQh^ǥv0ȸa/c8x:= c cm ; ڻWDMZ>A-X![w[:6$%Gj/tSÄL.M su[QvVWŇ <̶T`RrZWkLQզ2BS=1dyQs1L ſ5uA}T4l +aCdӯz8_Ϩ[jjfcY}:9!h[lGsLz}U_ my?X{ۺV[rEI?K&9l,tV\Z%0+&^&|Fկu|_#B0S6HM_cf,'vT:-h1^OPnoO /`܃<6+$Uez&1ҝxBG]r7*1wq7xԝ՞s \_-h\F_[ï8FioV1zpIԴžSyw|ĬQ74{'i)FErʰ7@O(qiثVf81Z5͇MS{k@݄yH$SaGl\] +FiHǪ;1&fe;襀 ؛ha'D/u˸>)0Sq$b]Ӵ|u>r{s=9V*93%i9I) @̲1 "~H&/+rgAp=bjGM J՞o#F.ɧ ]JduUwu;>SkL6#l4 )RvXx9&FaW-r=){ ݪ4/ߩ%Y +@oQ!ڡ`G's" hڍ~#>Du7zZ7v~ FQ,\΂[p3lS(c6> )3B݊1;w-]cgzkYF]+1?o_V~ys"e&-VDXjgMkX`.;sF0lJIu{m2^}Z V4cfG+!9UB89mm{e (3w_PjEM-lЇE.T(-1&rLjmc512}:F$z/R)_՝ +r + +93v26{~c89iJaLC-JQg1 垦亦HY-1ofJmq h½n88fR\FtTa;X`jScVFM, W[)"eWCcٮQChbFR6W7#ȫ[K OrZ厾֊W9y;|0kNHW),Or*쐾=fnou~>k3Yfbss$L"34O^l4;!!&fX́bkX=~#>x%լ!aUTJݨIcjo϶ G3͂BkβefG%ڷ+]>C|{g(Y9ҐpKM-;Gnucvju}=Хfu*VVC Ok6(413fwڎK3<`Tdyj?x|8`f\QHxT/j>$nwq~ O%p>]b $2+Df.=-wN [cz-[ΩZ\ n$tO#DzFӴAj_9͇S`?C{8m&VQaY 74#$ Hyi7A4ګE52;om%ڇNye,]Q `n9ү WOF+qלSk)|FD/,v>K56ȍET~6YsگFçm393'U#P!=2 Gq%! .g}Ĝ-oP⹾i42pfj)6)%sk X_Fx8&9QK}=%A% vLG炜-kea=ۊ{̥u˶ |f|=:'uꐆPjFm; +~\z;oP)gf|PbCZb_F, 13jjze854H[Iη7$lӄbMҲQ^=puyuustzlQA\ ijMz֎'"AXK,i.91kgM_k}zɯe4!n_zkU$ 65qqRF 2 {"-IުX3Bnt}yUm,`V.` ';y4dܯf@ WbFlC]{Zڢf pOr/(5ívv qN1>Ko+ɧ$湕|Y;+f_|~5 @_pnUjrJO(<)eDV0GυT5-FlE2RJmxˣ`ozuQJZ?R_F+[Zf]F/MP=j>ܫz=uyi 8 t(1V.%`w Qrkӌ"VV2Jם̒YLqqKoJ לrN" !/ՔB)n;RR^[뇞?>[Y Q֪L3ǯ"+11֎;쒲;.nY5h/qn9`Գ1OMs0/<,[ZUI3=VO1 +.ư\҃B@nVɡ&oWMB$b眨>9Xqrw޺^-}Tvܩf@>pf - 껪󃖇o j"/fiG4cS%VG!gw_X0Q8Nޮ↵T۪;*/E52d{&y7G(^ a?$)sc=M/ +ϱ9684(& +k@yY%bEA.3U,8RHK. xHRsMKm[o*[?SkhĻ1qU0RJ[wOskōBG>Qqk_pN`2F64da6}0| +11%0=.?o]t uܪ-wQ_Jzw^1Fq}TR֧SM! nuX9b lGDϵܚ)z[VӪi+X: 1xX,_w'!=(& NqsmՉnE q5Zx8G"rJn L_ k>cmyi[F, +l{[zףh +r{ȹu]S8љ&;t v걕7plT~cC߉xk/WĒmzx~LnLX@ωDY|3 n":rQHoLrMj杅9Fag ~+dEfH%N9wnd[&j=RB+oS/Y^\(4//ު+n%;VߥW;:5m)9oI̗w>ژ|oLTXAnROJQ52v̌9R{=I 0q._6*Ls +r`a6gk<[$zd \lX(/K}Xv@- i849!) 8Uw]za{ 1kvX:!IhcG]XzWWFؕ1bo>nߌ5( ̴5gf-;]MZX'8&% ÜR\u =#eY_B|>Lsl98=wyA aBN:ROO)wk~m /4fҋlegA"A=R*FE,=[;X[Ģy;`#!! +_M(Y탞؂e^h~=ؙ677gG xRvׯ`V,y{_ 9=]ĠjWC +Ȏ)j 쫊Va>Кlzȧ0 /CkSORZA Z˃z.̈XvHIJO*۝~]?,rp13֧917IA%6fCV}F-6d@=*8FܪN ˣgu?y]359oaL"ҐaLiIȁ5,Z)ِ?ܣ@j ѧme͔NDn6a%G$;F\\דm h46}⛜^pA?i.upDEL}b$.%EN"d5jPu1Fϳ<,nqw@D0am"Dϔ54#:.t{2<﫹g_ |\K_džxU|*3ҫƔV94 +I@~5 +N)hži0~Z1,dfMXt;H/[C</‚J>rsԊ9 &[$1իfTF,lH}4Y? +8dR]JB,aQ?yoYg|,蓵>k/w^oi]j_w;E$,#f9zD,ܞnq'Gq'iuabnpx13>I-Y꣦.{/h"ո hmE(Ow6ǐIA=!;ȅA!B447XH9o\DlRbj/=?FոD~Y"ޙ@I~&%ħF#1psvD91=bdC|O˩%8`5"t(@U!.j!wbjUjnK@5 jx sɹծ !d{c}Z {+4*N;bvdO.eVw}tU3=xRҫU[~%߉ 'k@oͶnIj~%ҟb:r鞙k08:w09ͥlTF81k# QֿhY1%[qf!1j|*Z`ٍR *lhke^E  R+*6%ȹ>-E[O֧?GԨYJվU Ťmħn&y5NH}ZQe_\ݝkZxMA>_rK,}S0sd'V] ճ~vL @-j3KBWJDSKbSo-A`+MM9.oZW*v9\<1#Wl θpV5+=l #RT-;3]C.'X ╒xdY>bꎑ X 5Ѱ5m}Uq1𚚝baԈω~gZ{sm>~zBڎ[z>òD~EҴc/GlHTM+aWlÐ[Kn9)3gUX>,7v-BRؘx>z٭6ߵHxqk UoRPJjzGŮ^e,@olL}zm[bolg:&+oP$9w]ڱ;fig3l{߫o+i\G喢nd lK-!{u-lpMøKfv( G)[,8^U`_~9fXG隈i~(+Mcy +?&ܙZ-SW1ܻfޯ. .̿,9V#svgeibKF-+9ݻ 0N)o=(l : cc[aׯ&'{3T3P{vZ[7tfXi>r}Z`&vJQ}sVn-1oY[lXYvclN ]QKRBWݙ;^WNؔJ^1q1fZW_1<.95/iu+;ƔXGvĄ.ڮ:bRbs]/sm]~ )C$;&:e;-ΞR&ԈdW9f3JR{k=faKίz6fU'or9K=DsЍr~+=)T遥k@L .l$aζI|6t{u 8w~[9}+1r`wQ 99u5 'D4}3 ;'fY!ehTFGآ,dhNu#/No7qإ.b`F>2q93b}b)9ū ZgA~R}>N0,m]ASg81ͫ ꛘO`/اaK DT\ڞ`EBlHèڞl쒡{UȽUP2 +B*5U'd'inC*W?,Q5>EHǯ!x+} glCifENՊp룤^tF_Q}@l'ppG.paoߟgLWI*X2R4S)k1ص\Z q 蜘q`[kI͠\3G|XMC-Imj/ +}԰&]pmizUzu WpH446qiug=#q +MgWZ:&qMrg " 7sn ģ\V" Pbswv+7';:CJVMHE+81Qޕз]li\Zb&.bsvy]^iof,BbPk%y㗣S & VӰkcf`dN$Uҕy3# ̈']sI6ЫrHy$٭2A}D&:$R{VpoQ]Ӏ.l*=.Ul`Sc UZD[TWNޙc&qL}`07h5.\ k_߻`qDR@Ǩ Z}sLr?&#RbI! nf3 lK0?.q.9b bNti`Lo<Og;ӜڕAr`<_ih/m> ʯCyr2ѫF6p)$l}ʈF܌Yx䃕Ї[z&IaWwLڈ qy!sӠא+y%tԁqhE#;!lP:ŭ"m9˭ a5a]3#&Lm\']3*zɇe[< &>G#o!/BNQ }ӸW?m;s{+o#p +A-nL +iʚ>W, h8xY5=[Id8> zok1b`wy_7S-K7*E9"fzw_,=8 +ٰ I]TPKÀdߖZ"3LȞG_zV]@ŃgWkHD_[v0*> +9xmc9)*[Hk!b{ ~"~POӌ7Iɪoyǀ7["ꖌ K +'ΓG\]n81=gCފF+#M)p̩]RM3g[x8npsԋq3ZZPLXܺ赠 +&PMҐt?`N"8b;\ ͢87.(qK@!(rM/T|=;}Xkn[ni͋XV};gjt<[i!r0)C3+f{/qe3lnm>Xk3 ٟ9`ZdJ@O8=Wz1)޳>R_ro}`Y` .}\XjӿuIqO5&Fa"o% E[$_ 09Wߨ;S? e/q>?E.o< G[yYtǸIbz}o0C_ّ#͎9lva#G9rȑfG6;rّ#͎9lva#G9rȑfG6;rّ#͎9lva#G9rȑfG6;rّ#͎9lva#G9rȑfG6;rّ#͎9lva#G9rȑfG6;rّ#͎9lva#G9rȑfG6;rّ#͎9lva3ob8y2AП~)ב`Ks> lB^rX@so%]xKUx4xq2hN'?>%Y>T恷1,^zx8R'/ONy8㿮$]LJˆkK[-#k>ǁ#a>}&O?Rhq| Gko{tjrrҍǯ\N~HxO{k`OR>?ɏ{[S_𓠎 %FB)yuiv[̈́L<.j^4F-b_npȈ;,5H!`U:}QOurӤՒ *ID<ۛ< +a[(tMnpa98!f6ª%6c[amTw,ڐѫcfng3kCjZE{~u][ovv}|mY%KVIQ")99B"@B圐3*\Uewo58N֜>ihulNR4HͨS+":9QoOέ}:0kUaM 6gQ''aeמ~i>[ՄM"]ZH᥇5?kf}ϒG3v ='.XeS͢F7w%m&i|۞R5NHoW\O|J.8[ىĕ+83/Ỉfj-ZrM_{A*+01q^2(0Q_ٝOAjUWٚEjfƩ`%l2*̃dH% +Wɀ3\B9p +1Wtb>I ⓶GTMT\=Jy;WqpJ;-ڞc]@\V" ioc}x|h&&sҩqT?g4$ְ@-*wu^𩸹Ex _֞ kL*\j.蹁u\Dnj<(DEO+Y'2>s DrZZۡF)V9ֹiqDqX0Œn1;vp29!,K̋*6E 5k36u(Ӧ/ۏsbʦ:d#b'Ru$fZcNeңh#: 0^5h(}WDMO֒ Uވ +!I&oHȫpO2,4pYSG>}zĻiLڽ +WÃZ"\܃{̜TRnY:#DuK/] +ts9ZT@# }Z!7(ɠI-c70QA<:{ JZ"#.E7Ůd`z^Cze-GPgrAVq.̩L{ZN$m0d*/ȅU&`_؞l+yBhP^yr<ԬX]]-Q迺O^b{)J2.^q#oѧ7C4[@u|XR +x_#:l>]ٞMW'Ob~/mߚjvs˭SvuTQ)cݝdO^ziz9JN_ŅM>>E ᅤCٺ4Na2 +~%կdsԼ ͦ[ٜ% yw/NY}4RڭO.->ifs25ΊKюu"cWw&lC;#+ +`Nq jOH{H_ sDKф#A}ĩhfuʮOj1 c߇w¿|yc`'T [#;y''YگC|+ʏ"N( ڿ=8D-\> YLAժq!zeфx͸KZꤿ4j/ĺ v^LL~LI)w%9Ϲn;EQ\H#A=*1ģnh`LTMu +<lr.@ MWX_4_υo@ *=vsGq[Q4S1 + ?s@[Z,3'n=YK2Q-ꕶ.e{.b0a].,>E_.KƧn #N2,e>Vю[;/oޘXzsEGZĥhE{~e3T3`^T4Zvn 6 ^~Uſ9z4x䓵'୙7՗S9>T&#m52^uYZw'o]]^ >!]Yvys/M1Na]GnWfܲ-78MbRZɪya Oay0(^6|{rǨ,1=}<1;W.I]eˁW|nq4lGPNxEՠMhW'ġ.0Y!n|ь}qKpCZSNIBKDDZ׍_G:d5m_$E7gS#g59m~ɟreϠ\OWw-0,p}LrIȣd yCΧS2D@NL-'<ʎWX||y O| QD@LNvx׿ZANY +P"nQ%C5ܒ*NMD~<`d=P QloQo[js1[} Ixy^QEUBT))Ĕ"*$mK0U)O<Qާq-b| ATi֖BX,{r3qx*5YaXWގUoBLڙg%oC݃o4x(5x 9 kg%}Zү`BZi.da~݉`,i-(MhPNEUB*܁x@+Bނv`[( +U. +=\L@m*28v u܂JBBU>Y+S p[  t˨GXq/`~*픷&mb2"=w1-e}WnAǢzjI 4j$({7zb LLhNQz1ֈVwIj33ywP"\{TI +k9}yu?'M͔OPo>6R7UvNؿ,=o?B~BmԌ|UKj KJw 4M>dKۚ :]֪l(̼:ḿݞh?`ڊϐim[rRx%5<<^Hp':Fm +s2NnO@8:ϮK I;Yʻ;9OͰOi=Rx.Ckf6GZ~V÷Ggfѷ \t 5͆%=vfZW)Ȳ9OMZyE99:I^U*SU2o%}yO"(@=+)v& ;Ȁ5P^`7J-\TV1_ LK3IKI$ p.52f E(9`|`"WID1foYuпP!IK:O&D b(d,1S".Q%OD֧]\X#z=5rzCz> fjQg4Q'D ؟} _!$VqC ,ܴ3ys_YY\:EP۴;!s;v 䛌K߃ߋ9MYvwk^)}pO73_V__?nO۵jfU[uެ)VaijVT=&@y^Dٜ\ڞA^⯎63UL͗)kÁDJאN-0)q>-X*Kn~sw㍡{^Ycp[߭te'ϰ;%9C7?}wg5 j)#8dxtԼ$5'(ڙ`۝bD ++mD\PC3b«NYhWsuہƑP}/S439T {ʧ 24|P#[0u+y`W?u{{暏d"jE$ݷ[6Ctqu@Ra 6@ +~,5A  ⎷ѐ YQ(|ڴSXkv3Nrn>C`c>a a1W !is~"9 +χi%旵T܂rZh_ҊxZ9 q𯀇T)tw}:\EhMiY)'BFt:"$c- -_r ky`VGDLgd"F- yǮ{5G=*8lCSP^9dMy+u2rJʌGZGA!JXWI윬 icc^XxK §bN1Nfg)ma奺tc +}!x;= +tu9 /nGTƦS+?m.>=nIIʷ8+qE**#ezoPaʻ'X'vǚZڏ"t;3Gn'Njy:9] :|8d܌3$m!'9+(Z Gť@ +a% + +kiuu"ʌUڊY5M\N&!vAT뱕 Z@̡aN s3U, oc:`ch/Yy:8*{*XYWDը[ţ4"7@mɈ^@Z-:ȺZf"4(΃/b;Pמb +A~[YJDU0\l,Iz-/*Rq*^#*!6+i, iu_p\D&Bf*"i%Cr&wn Z"tcL@MfST-פٝg[;N )wyׯbo'EsZng֥gHz-0{JIE8ԫ`)ZE:ѩpND{HߥݷbTf6(nښ]QUtЍp7"Rv`~dԅ8tm`n31?AϳmͱOoO +.. +)씼fm攼ljiU1iҥ{!~>5k~m`|ZprդlXխ U-Rfqru; _&٧yuHn uiXy᲏^cj rhyfNBAuLM|";pyKA6\macxkf dk5PqJ!urfS3Iύ,ˆ/oZ#s.<BraޥCiH :q.Tӧ;ȥh|CoQ2A +2z֭7A5[']&u2C>aq3c\L-_ zjv6/Ynj]ZDy vb4WnY0F"hԓ>|_ƣ# ZV7oL.c^y^Lڇ:uEߛH8o2 ;s)`$0JdfɈ]ntkGlN٥5i;6d0ԯd-w N`D T`V Z辷O-] {s0pߣBdU.Gs@Ʀjٝ䃦C-ޜR6}R;{S)4$)ybӷFyפ'Z ?ٔ-;1oԍϨz%:xwD3d|w!=-8 ò45 50VPs +>U'3GҸy(TT@'&=3jםG60~^Z~y03)#̲/ڝAdCU,=f4 ,?xUݷ)ƹyb9ׇk>i.9+\~Mrs&HFo:㒪փYEȢqAqίP19{c/RӒW ?jng(xʜ[/BF7ϾL2/#NU+OY #p:g@^E.M6ؙ\!}}ޔS&|t6Q7˳֛O 2a]Uk~]U) : =yzxHQ]v ZYs֧hCĭfڄ-{ KjRqu;VIe֡ܲKZ]unc^­fWU}O3.(νGZcWH;iagFRqd{{ۯ8%{a#]R +*&zoߋu lEb^͢A.,BOYzZO~q?x90*8dM\ourQ%ӼGvEg$2Nd-ӌS[㌓K͋{7jX `7;|a 4TWnЕdP!o}%UM;/#@3VMgڮ㾛#x>giة9iEzNH,!`IN܋v b>!~MygKʮᬍ k/0FEo^-l;y%CA"u na؇g}FlYF2!*=9{{{.d=^֣hY1'qm 4Neg.*C|*D\VsIBSc3TT YBFz2շ9㬎+ +endstream endobj 30 0 obj <>stream +G!ܡ]hW_~h1z]|S9=9:gh*混KR4-nѬv.C>0R6I4"ץEWҔr0:r˷g7ݹ%>+#9cdz +|ȚW&ڏ7b]N 4Jrϼsj0g՗~G[4 mgNTvHk 4dzġjt,#/Duiez yITkgߚ8$jΫ /5*Zwš0d+pJ2bόٮ [\ZH^^LDtr\O[j^prKc<: + +s W+;y%#_PQKfZykY7KS촲%cUٞ6 w  ! 45,k켖C/LK."Ջn=:o xݾ + /g^zk4pc$v?6Bۋz9=/)G̭!qs>RP3"߿m_䜌O)k +. ~%w/s +d-v!٘q$*fl{ +qD)m7[(㕷%!Ƒ u#Dr {ɰhdqUʘ46' wԂ:5郬ڱ 7@#,tו6aNi% +&xG"F#XP΂!HA&<^!xr? ^q+Pޑjz V,bIܴKޞ-4x9롎XdӤD d1L$gWQQ汵猃9E]!MJ3Ĭfy:5%5UQMBR>KWʪhJ+SVIEbsjpNO;xxO|n;kt2zo"ﵘ.c*Zug^)hmO}'}wuQN`~E {/*kUb7aۣwiơlkaEwѧ_|wY''J6w^ [):wds_DU'i8=Sǣgqгcw*yz4 ,LS[#SW)I PO@XP|=BDځs_NQ].d@qA:ר{110'Hߓ3bS0|d< ڔW\x: +ϣS.VRHBPA ΃xl$psX4ȆO￲gu$4wܢ^ ݍMyqY!};O,7s"W^Qs.02*vlf5&חZF4`'KdX%].býkSԢ6\(zc\G7j2*ad}26U\0d]j1(A &a^i l*,A}ON-wkBZS^CM9?xWϋxQJs]Vue9^Hm{P4fNT;M)E1Rha*iP K6`~3;]e|pT@IxD5]X9\j풥šS|P5dj.֣\OEqu3/IC.W" +j21kS%imgfFLUTXؐu˚IMk/m1EXӳmI"d_Q5k-f17/F|:7Jy{2ϝ)2S2)%kPoHD{nQD]=[rW>i?"j}s5+^ńG܄դ_ɆPcm hv:$ze|i5 {nRQc7ꓷa^I#Vgs Xԏ/|1y_[S1|yj^#3 ]0bzޢVR@G'V'Pѐ +F|錹W5{z W/ևUP.G_KC9@dH[4A遷d^CC/xkv׺c, 1efu}O܈ZIT'輠8˯oUl1aVq/&:Od*5^~HmQ3z$믪\@-O3=zAtwhA|W[Thx}g][%{$6Q zÂNm%ftL=I8*ш !ujGwRp̈́רA]Z.W0eA_0XҐYl״U̹ C_x?e5+ҳ两";%PS Y'3vjqiͤ#<o飀}(ic_G/~1-Ы a)٨O]Kj MEل_u*sY!),2p)#?_ytI ~T[d;UTj&k ]kY}-nO21~3ie ݋ʘdt8 k6^ 2>?aAȇ Zfˠr4j."fdVZA=7}C%.b9+LJ`΅/WխI>bd=iǍ'Y!𙞤W'ZZVeDxlXXߍ,xr?H S +K= *3~^i)BrYX/t]C V\;?C|!+/>û;+ +Y Zŧ5Sprv&Un-2D.(g3uqӑdʅ3B7PάKTyDLD 6wٙ |Բsc`7WD~+وOH85OuIvmisV\cy+Yd@#-6gW fl\-hףNY{kD Qޮ@oV9E/^"/+%E-}ozICcA2\hZ=J-3#XPXw0OHȨۚkwQQ$wYIuaL͐,$00oYP1豨V +J[>%ӊ. ++%r2]4 H2uFCukXdH޹6;s}kT--dG\ٚ`ڝb%V !!`;N,lt,xA^ &z=zi֮jEܪħAZS/pQv)C'*BgiI9* +Kz޲dcԫ!k J>anY} +9uœg +Gb*YžLa1Z)ⅼM?`Wn3mNn%f]CB_~SRaZH߆9n}a=xHI}̊Rpmd@Xp.}*gT)f|-kjA!o<^'dO*"i!àPs:?T_W\P΅T%`ntb[4߄-w_5-LXD#ݝ[^Yh5ߨBfKr͆zo#hhpvD!Ho7'ܤ?Jn/z +2\X! Ggy4 iNR6%#i|`ymTcAcG!Aq#FFS~Y{*̳x5'@a +٩9QIbRx1mV!}%,Or%gp=1!3= *zr+fZVEe<NڭsQ.rkxGI_~o&B܊yIڸh}Ttiw{wR²]T=-1r^qϮtɂl=A5H}1a]iezΞlǢE5I0pb?_ L6nq T'g81 ^_Av*P ++? ۈQODQ6GEg- ^1O z\XsI k_J.0!'3v\@ޙϢ״r{==i 1ޙlȽԢqos>QM4\TIGAO([\Cㄥ9Kjqgw78kvHRL6p?nў{Y:R *3 !r=Ocw#mCj}9d>1 +[p-eAދA<8j1QzߛJݽF׎uWTE OUk@%$5˻ޝbܝW /nfm ib:LsxzR8CC*y5m3ٶGP'%y^hwBpISӼ /i -ڏ*!V:Q1jTۓnIxˡ e @}OFF!LtE̾ܤB|uyv 2|,%Aw%1ͻ@ ,OI=*6$ldzvU%k{' +e'*A퇔WB,*._ +=^o +L@!=F`>P96*gNAY|y*f](D} 3 Pe0iY$MI86Yƅ +>/ DHLՄ_T{80D6Wa%7r1%/S]R+niCXzۦlY]FܽggVZ6 3]ȤOOTmG8$99d{);'ӴVM+023̬iޏoF[i' +׮$u +٣e .krܭ گiBY*| \V3Qq*;0%=˻lƑQ8,5#B }xkG;!Vi]!l*@j>2/kD%蜠h kоiѕ̬<=nJNiZ0)wg߰e܋K*1ĠЀV&H,ԣ&"zՔ{;;HF̂_ł0.iM2~8_M{aꩈezf5OVJϺz>Zc>Y& ؘg0'xwZ\Zx9@=0vg)lvbJK9=wkBӼ=! +dO֦wՍx?+΄bA$AIt,>zql/|/)}gbF sՖ_b^{9sr.UG~~Rt%5% +|:9/6^4~>=~` s?֞5|_p+Y9^:=>iP:;nƝhBUvM9Sȃ/?ZxEQgo?+cS4Po5|P"=K?EuҴ[ݙW$>SR,></P^Dui橬[LD(ǕC[ySM_Cퟌ~fZ{mV<[}*;Duq>ΡCw߮?_vk{lwXxnrEveBVFze{rywǵN/nJWݖo֞wMBO\X[}iA*u?מ7KLk;GU#1#Y{;A3o2̓ {Y{yΨ(1.9pÉ#'W؞G'kiy/cgC_'&DםGzvڣٙ2/?Y|$%v]VGˏ۾e%[Ü_P;> y2SNI}ͮO߮Kfѻ-mcQ쌬"FRK֑Ƚ=8! clmyg,HKO4^ |=?mkЗޡ> ?5qZW3)ŝ(4\ϫCܟ7oT,و8 [#۴MN,=m[2w7|yk`u?G|Qax87GI{i w4|csYzÁǼsXj9=H V'3&AO4]emXt.v'.=lu@՟7B?K^9Z:Q"e8{9~{䤸qƋ/U|vWwHqߞ[^ap`bLVWn)˖r\{ZUXx i>N%K row>zsЍ& ̬װFQ@ɿ-S^G NKOmsOy{j<.)oq.浲c+CSKN +/ygғ~80g<[䏾ڿLh/\شaIQ|Lrei7?KkՕf3uBUԤnғ/vAV}|̌ɛ6CiIӳ1"+\쿌 +/_ćS#5t'{vyl'pOnN-79%-”]'e|S`ˏNKm꾫%4Xut'''cUͧ/?*~oa'URyw?Ü*xsc{bIWy9<8oY?^7ߌɯ}[?g\:眛=svw %( + +bRn~>q|wl;n.|yޜe>#o !o#].yv[޺)”̄ĨkJ^.|K;4i;u,Ǎ4'sCŎ{8 oDŽjA[m}+SfFc]Es0I߄3`* +om"mv[r;K m\S/%nb}V ~ыHi>kZpgTxtB=8Fsf}Wrsi+;}yq|Ⳓh:Z -9Zb"Biv+Wd:UwE[[n:IJa޻B³\#=t{ pg(uu-teW0PqRҜpO8S·(ʰgVaynw8t1p]h,^XL}MCq6c8@[lx4eTqc |/<.QN͸6?6ڊ??vzK/6\{QW{>Wt6dWBJ5c,ØߩVc`V;?L-#2A+|R{()Q-~Pj\Ysw3:M\:& [,yrapuux1RDGJޑ^ee1M=EƾRߕ+ E_[`+-E +&PMٯ-o)1w9ޗ'8 ΍gM'3 @U|1NWxua.ߵ*q%)-V)g%(qȷT &,@}݁-i$7-* +xo6N/,b02~gCC?0]-w>dڒx؅ʤg/0C*8VSTvej|Ruޫl j]>`Sjg+I>f{dϳYϧ8wq72^ۧ)gݡzV'utEƋ nkyM?)F+:T%wu3\Џ;8J;14z,*t2|E֋z;5/8v;v_aqMzۋե LHяBϊܔǺJț^z_. c?acz1w/aCbï5]%2 ܴI}%MYκL3.Ӝnϊuවn9mKߚ~F㆜h3׳|wQ՞f <cEIu\-T "pBeWBobnzJ̃ȀU)8I֛Ar4'N'iف AFyJhI`XQJk䷥R.t4NK}Z`r0Sե}%][k!FΈ=( UV^L7e]iIy[=fOͮ"Ǘ+wvPu_ JAtWL7NOz2DJy5X, )z3CP <FyO۳_6&8'l2N(?/@IaӹhG[w `;@z)r[1ѶQl|eR]9'19Ŷ `(4eEYNpa#ٚ[mG[I7aRf( +-P2_1I.!.u}ӳwII;]`w +dۥߓ u/tnTܗcĘhg3"ή3`ؠ7uiԼ'cԸ]qh#GnwR~u!|.Coi+2?IZw0΁Ls^};JYmʳ)9O&iԌW_!ab\%(F@W fSgJuM*V:X%XUb*`xVl?g~0 RK<7P>A|e܏+XQ$({I9 pq{IlԑlRu@0{?K{%ݞ)K~dhG%4t2H3T6&ow$Xo[%>w1rJI'cӉqp:e1j/>Q py4%H))Ǧڥ4'm_ DcEUcj s7: +}su)/ qNtN?6d=91 +UT乍q28Srm2Z]V'\B!rwaDmA~f_MwL.S3Ѓ1x6W ;\Q7Wڊ?3 +yJ5,0 Zl1#b(+_}3{ ov 1rM4'RC{1XiAC;"Z!#e}ekkOfDe]ž*QPC)gw{٤e^L>V}*^~Rv,#(dl ۀlj6 ;ˈ@b:!XMUʫQZեS_8oV[>+@P//P.*KIOUc[=%㤴~\x:/boV8@x*ǽ[lܜ.EkJxq/lD>xrvõμO[E>[E߭c0!8#oezwyMGw-RDؾϞF_.uڤXqs 2nr O@QOL}h;!N!3c?Kʶi`&G>8RIH,<v Z$~,)?!A #tUMgs2u`иqB\1ɂ`p 5%0X]([^k-9v2?MY6<d$ls_ԃh|0boۀGHv2rs-N|cq^1Vm`c_Iо1m*p-tbc)8;q&j&F9uS_ysJ>VҐHS5)>Yv>_o2NHO{!ZLy֋Q[RfqVԓv 3\kW+)Ћ&&{ ;b(hН1EW J0wb8cbCiiig̣xuub/oьeSFѿڪlCowgTfXl*bQ2QS^ʸq22lw]KsYn5DgE0-s,!'cX'(~`#Id$ +.$F;vz +l{Z䨨=- fLq'E'ȑ۽?8aj)鯎ULQ퓕LVKRRV.m 6^F\&ؕR6J.7~6 a#l +\UM6O`3l\'ݛiF95X5"F}j+ |޺T +؛l4y8}g}oڒ_?į8T.Ȯ§UT=dOƆhI;}ȕnbH3.4_G2sך-C'12DNv(y%V d^ŶQ&>΄($#&'p!ARaތA?nw{qAFy[hŰ(ӸO,x|YmFG?!:Zix'`vzQ5i.#gW*>rLb0c-$r>߅Ess4bWO9i io7;IfYo<pdqmD<'\^h|ֺ _ZjWsP262$xa0wwm!i:c ~V:Qd(^sJRBY5+YF}äk2M!ԍ@:1I@6B۽C)r_ozz2C*YFF*^hڊHhbv?[SUZNPrZqkH0녩8`wfȎIV9 ޝ`Eߟ8ե&c{׽anW^h)bQ*~@ *z0eo7$Q Sx܃ô!cnhp2'9ؐ{%a6B_ G MI=?Q dxh\hdZ'GM8c,E!~+`f.?{XGjmXh":)QJzp4bt4p_Q>cwLUcdHKHvrv}0}i 8_K53>-z/*MVo3{J~Z"BxxIؔzk~+Gǜ. N+,^r?ں?3]Ս⨅樷]i,*t"ދ Y$OVR~tQn b/]HmkAηpyxӇgeTv7YD8jui=A2nkRbB/p/TeMF DL  (x:D3chc}v?7} =-ؒǕufReTx8)a׈Q3}=((sB[i6VY",ݕU2],兖ʬʲaer[dsÔAHёWPW?S#TP1!w*sbmS|mZDߖp{Q?>È_R7%Lۊ1!*~ӌȼՆǹrOts#%WAOף[@ox5/(:[ffziO}ܤd;WӡV%tG[@Ua„9q71Qws=o F O^Lz^ +W8` n|hٗ##@anNA.>>y z>Ƶ@/z]hS\5< b -_d:L->43;2,2BkV]@InoP Gw@Q߂?ݺvOy7P_յ9gKʇ@$%_ ۠OB_9?=ut ݿzX-8KR&e CψӏS +grG3/] +}vy9_?m(dGzpm_q"ĻNJ*8:.rQX( (CЇA޿zp&s_}Bw3OE{3|OGɮGW6 Qa#.fxy<?}z%({`^޽r}M勗@/KbdD>Pl +!MU%ڝ`Gҏ}sEi=BJ8'!~ܟ>} +zޝ+W@/x ֕ GAhsn7y+B^]d麈!U%jX}LK߾\ P|t 8@}'|q\'^耇e|x_9]!M˽ N“A}1_}/S2աJ_Om)ئeBegu`u%؋ %1Q҂A_^>}^n@?޿*'A_?_z /o\@q_@ϟ{|t篿@9޾s1rpV\5яYjZlN&  rw~} +ٍ~<}{ +zpwA.d;+E:>`ٟj|s7YSN^KZ,| ;(3e'C^p'7o3+Pnp_G5$^^qQhUV(Qj3Db@;_9M@,޽~8CoA]@a?/VB.u!nla*瘘uSVN6LUWI!>s u)BgO`o@./A7z~6@_<2jf=1"B{I>yf<\E3Ga]dk+ F0^@#rn`9}YUw|Wuk#+'ڀg+&˱>^h+3#U8+=\Sxsq܎FyMհĸbϭ\IUQ*p=E_S*B&ݫF侐Tc\$1QI|uHX7ЇZ~ +ry t~ނ{kiK1nI&E~XL~X1ú [lJ2 yw{wk;/\$] _r_Z6U94΅'#xzoF,4NUԃՅqB"ޥ #F07/PP+7@߂ Nbkc Zfu5[<4QVj(+jq6Ap%ի~=ʍLy1Kv]J I9QbW+Yf,ekܣqREÖT~){X1Fuu~89^w>A}@1?/$5:y/CXULds FXY3M/.zxYZP9aRy_ Lx+зwnr%&͈B ;:?RGqɢx'ahTU+*fp uW HP^d(?+o/sWoy> +C9+Q66nfs6ZCXfD4$؛ff;wkj[bI.XO)+{*4grZ?3ek}=ZX(PU(:&[3je55"_? FX.mMz}u듕46Or`;c7r`GYƄI AnJ_Pss)unVEwr_!}5AAENHE]yM[`k۝m9n;2,f$VZX=+z ?5DeeebFUI<ݭfs1*َ +uf Goce[K?Ro ax_r8%bgל5Nuݎ)6ڡfN &)pg?]WWp*>ޡ2Ow5"[.!FnH ja`{x)`dJumj5ݪBlrtͮ$^m|Y!U5[ku-] E {q4$UrcbO3=2y}SۮnܛfX"'vi,r3 cX4-1Eζ j&|s |xQrE4Mxgd+&ў+{*1kWJJ0z$%~kat,{gqiW7t8ꛬJf-fcg3FMWab5]Y9Dǧϴ:%dGmQSȑ2-t wU@]Us8US21;Ұy`Bp19xW()E`UE 4ZwJHWWna)>jNcЁuT2٢p?[v9soْ`7z^7U7&8-S!EMlr!FD k#8mw#he*zWƁ +1K Y6%tO-LV3+KR>Ǣ`*bU)11&iIQ L6nBY&`/iȹqJYRޕ06MLi~]nGM4{)!٪`XU<8&ܦ'ϧN^ +`;x/8Y*3tV*٘ߋ).vg i)qYYw6g>|fUIJ4`Sؤ~7!tC8s +2QVeR`S*O4(i(PG,SIkc#eymJdߛ擷 Y7t<&8VC-B6Gacp$9hKP U{s Σ5Q*sQTm}w>0J9r4BK>h!ݛ:9|](Hg2w]Z$ Q wFF=%݁܏MK57[_#~Q{AazGSF$'$ՄC51k_2 vzXٶj¾jGz?mc%hcs#IRdӳ7H91Va>X#F&E{SlYN9\CokˀHI3p :P9> Z\q8[Yu6Ci @4hG +FZ&]U!bVk׎]r|R&LߋW*k3< +U wڲHTP).?^ۛ|fGF8f@Σn `Ccӹ3 ͈S<]FH+wL2 LrB?)F{IU#|xq@2< "nVJՋ{C_C-.gc}kg=;ω+C5P'E֤>!E'g\-|'OQ +/+Ζ˸v =:fk-嶼kmwJ -1J,UOe؇=y:֡DDGJ\YvvSI#sejoMNa߫e?K<֡RAyDdYmY>nrK +"3y"?km<&C8 2R7EY%FpiஒOi_iD &مRJڞuh![Iw=N0n`N{ {^(ؔ}8}q?E~[;@Flp8܋Qb>-T*^U=Hz`/nfL n>ZI~o`sAJ#6>]0}%7SmQ߂O<&e*P"Zd\l.AR W2ML{GS5xqy:!X1Q{9AN56"Ll|<꘢ʉ%6A˴ٛd?z8[!<մ.TT$ٍQs`S~ϖWP3V92*XF[ CNus3wRHG+SFewXiy *:&($-l6%%(*{g gvdqODZ$ +o@1vƈrao֮kUf4#|כ=M%{oU +k8CPc͊ ?bg?-G=5"z9ߚi;Ԋ*Ny̓yͦ! V?t"aDJ;q<@N62XEU ekc:qlc`ny*A,ϭrl3jsABb8qYqAJ̒U|F%zhjuWq AG*a EO$c75zF|z_Iy0WhX q["/ٞh3J$XqJW8qx~8tJno=tmcpӷG?ӈ﬷|:1 ^J&9T-dl06dgJVoWYe9)[_m펜!N_R ;;>IFQ1“U:.ֶz0qGs</rZj?622#zT3xmyHz&hv2c4 <[YnW0``IZWRg'|TUق/Ry"t>2 Ha6"p +ot2aAY],SRw}.tP;=0iM` +وړQ|()šVmJY`M]qB]ufF|+1㓏y^,Tԍ4t~iv3Xtwdl6J@*@Qa}žۃowF8(x`$}Y}P8]`Dx> N]C+Ey ;N "/};,Wzٻ%0$!uy-ׂݎtL3}_iam7jC'(") 6@Re3Hou}LZp՘Rf|UᏝQ>B.uR#G}wG,ð߳ l_Y+1v6JasGsЈŮOΫ9,RR!A _g;fZ(paFݮ*vQ-J|iա"߶"4e!rV yd< +Kpni\:FHXbe8)e_[GGαG需g_ XKhGS# gY|iw2^+V)Xߍ 3 b#X>~gk7[q(u;[[2F=],cnKH1K5:a_DKrv{k)lUs]mYqsmeZk;NAaE\hij{l 2bg2ⳙ2oXʷ ,7&> \[n{xj`v8G:8ֆ>DHNe|KJw2d= #{h<̓yA ohY['Zzbczwg#) 4)YC s?ifVq耭^Tq[&+XZ>"-&詏${rF3 r}v'*qsrN/wP8ȡ̖9) H#j?Ғ,Co+iOiѷ 6DlK"hg.Q샦/7伟NGt̾ahem2Y3'3O/D0R6LpRzځU^M+Jz6͉7ҏ< +s2H{G<čܑ|:&>/C;KZ&joG0O2![cx4qR{@?461ɴkŧeAECr3k 7C=]mҬ`B4CV?w⡬\0)f 彶 !AllyҳzcƐ's|A-]Ɯ?}b鈿WؿWE\qy$T]s&T|MJr}{}}{2xd vI+6ڠ_DlM+0j+omyi k9rGR+k.෎Y1baBUۿ}5hn5jSK/Zǩ;C8mv'!|]dBFN +!oja7~71OL}Ԥa39۵)qiF>Ź%ZK so}F9:e!Tc^U:TGWO9I[}0#5JE㉎GSSryC5ooUo{WַYy_EgNDyk80.~8UV=96-?Wi(̶sftf:RRmqw " K!$4Jmg>9?"";{/ysv>4r~ f^b^*Z +Ήc #M8B,]r3VzQ7wy(s[1ѿX inWGYGk8&q^֧#w]5{쵩%s\yI$yfe\ T%.5_0)1%|f>pNWi9*A+w^/{8O97AM:X {^PprnNU0W# }ƙ!ܧ_-|Wh38kp945^%)GG-O{*VI$rG0!~ {[, uOEtOVe ~+?w*z*␚O15ޭu_j##;_̡t>cWGZ䲿ZC:|c_ K:22*ON O a잩zoٽteTp= MZ+{.9T\;t@m_ߜfh-Up~s®s~נgRIg~]"vnZ/,Ĩ8.wGG*:rS@I*3w)s |hpݓ?Eݣּk)&5l!G4`Zz{"M Tq;FnF@e=6ш%uٝoOaCwkn\BTx5EΜfd:ϿikGpJ')sp5): WQ˼3ŏVz-4}]zcHE(8Xg<><<>3?M#c]9teVTrssQ [ G?WF}R-#?x@ ߜ'=mcTU4,ҙsoᲔ|M]sAȋ=:\r٧ê؝gUzcj}a[HS{3߶'i&*\ߖu]۔pYxopu2 RI4#3PSuD 1iPD@ 0iQ2|[N.Ӌit⮥{^\us=M CeQ3Ī==v}:Sq]zWxկEygi>V5.ڻ߸TKUJ/PNkk[KS~U*^{&iE֞9<ਕG뮱GGfTP!Eܚ"peٔ=sLK}&i[C-p`n顡{,QՑ[CW1+.t﫝U <6i}ܧ MXR = ԄfXP>]!J*mmc~s2\5\8ʼ1^#TD,&pU2kGRVzs_ںs1^.1o=S +Fmo&<x_,ၙ0Ac 1ٗRZsbo-{MsoUSξǞiJiA)9@M1Q Z>i@*=0@9@ `bZAyx<̠E + 莰2!T8!>ZAO'zTI =5Tͥ/Z?ti Wµ%gRfvzg, >5!]x[8`f]ץG~ *=F'=-``"o 9Mw)90M0!{ls kc$ҋ|bWl;g]*s +n~/,zp5 +e[KpPVj ^gZ6y1E5 x0f>ogO -HXǥ w9jWo7GH@le:v bA(i7%;:>/'D  +d[ +rOalam +ךx ̾Q=Tjk/e]G&~P" V4Ģ3B@s_MKB%0|-3z>Ym%~d߳t!c#YőZna `Y)͎R;1%:2Kv4"OgY7'0^)ouk>q!FIӞZ,"/ȣE=2pIGK%(ܷ~o` J 1isA!.[7icq}}Zd򁜕JwBG%R1 +@(:fS۔B_5)_d[϶k]gpmCk螹%Zo4/ !Vnא T20&f䚹!{Q5//}XwG:'tB)_}h|k D>-ȭ ljW| |6)'f#,mI9CKoV`qL4<~KϜg=WC+sʩE52h=.1(j8cg{XAڧ&5o׺FkS\@-dڞǚ/ړ WӵD/~ϢZv:4 [hå\)Ou)!po^wģc[ђ3OV:\QxcNRGvh]z'<,;b'?r}{u1qL3| +BV@) GBɡapo#ylcb|qMk=49f}ŇR\GEڋoX;o}5c51loы6ԯ$ ,FӐvmNy9^ ytT +ԈԃZͿ5_=Ml̶^NHߝoh$s2zy tF#ӃɼTp҂KtßFbRϰ2gɥYvK>nV )~~`"!#K\ب=s}CKRcR}賥GA|A*梌u?.qb/qO[aC3ra}@yfq9GG[z:=S}&ՎKq^e 4-"j0`0pEHy{Cswp*kchCKɍ!TGI:*<2N }[]_` x΁Y45m79T̲Np`k(nh8Iz[dcf9ɹKݐ?5B]ѐ-6)h^(%˄U %,V՘, +%ۆA|*lX`߫-===LнE"j3b i=ACαJ*ibJp럥{Љm׍ 7ԄVh#SsuXFgf(g-e]SĴVSk.5*V~`i.55 +#1[STu}, kjHMao*}V#% ssyL@A+i~%.5 [-x6_{NE:Qlscp]md"5S, ?m +Dd]"15Xl+An9;#'+{襤o=G Tb/&~3݄$$:y9ɾádÞ.aSuV n/6OݳEesB*D8u^s0.5 P^9BKu@nߐ1'۰g46R]ӎ]k,lo؏,QsPIbk_Qz]O:_U?$epOb7ǐZl6+8@4@`ӤnNj%0tM5=cwd4- +\}o\OI1 ]W +v)Zu`~dIޞĦ\ 5^¼<9NzAJjzg쇽j' +&rHMPY;-iKte䞎92rH>@G7MPuI?4k%O'qić㌂x{RsU(%fDc\J_u";타&ӽ2 Q 26o} i% ;sLlHGtȊ߭K#3^ߜyY1ªXbZ1&_# oP,k,|23rlٶ")'z)hm!G `bDZIN5omǖVJM/&o|B]cxo#'˽:(ۮU( %>\ΫLZsem~ “vnBʅ/~;Pxc/ +Y\s.yykcHB2S>ԃ|盗H]$uZ85ms M9"o|hs7ܻkCCV&6G7@2_03̒pvZrsٵf>&8'0jqe7󴭻Pc PϮы(!dJMl;C^徹e*0w0ygjvq|slļ65>R0.k8\Bs+!C +gzn+{bRFqL~\PAw[YZ!cHt4 ylPT 4rOK,QrZdk6]K.uOflL31/KwWq 3Y.)(*rsu)z+XU5 *9+{쑃^8*^LQ ̑:4Sc+עҼ_Zj˞=΢j~ŵA0!uOP9<S򮚋4~}1?(GfL=X"U~3 _frl#X1uG#ip#ෳOٷ`vU]-R!ZK} +\b[N9<ڣokĀAޘUN`Aѳ6t +uR*|QZOL eIEVh/XPPc#|z.~Hx2\`o-؏ 8u$SG/.0!y7>&>V0Cd~[Ž?ZaZT&7'j5mnyX +=3܊1r`{<0Qb #WPm\PFH RsrT1G8L)gRYy`4NHs(:\\Se6BվYm器ч|ei=2 O[DE=#Oct.VxוP УqfAJ)KoC7į͏wrx&NPjzi:1Ret?P3t] 1/0r"/w۱9Fܚ>`^ѯ]^rҜv8d]oc҇k*ig\")p;`| ͥw]Y|m"˄;4dkT<́c(l+e}+I5L^t;I_ lcm?^=lE8?昐KaIran, +l"ȡ& +cơ/Xywi/LD`us}E8*ߙrn ҍ|ۅOOy{}HA,!Fb)2!V +4 +!}OR |3fȃ'\.XɎO[^z>{0 +[c$:Yr.teQg"NQ3/4|?ɾP_xc |rRSWW$477|JtKOۙg`j>/$j=Z4`ۇ*~ڵ6q +O$/;s ]&yfI`tK[JSFt##j$W1OJ^|3F=}bv$=337ڹŷs[#*hEy: #vPf<HgVQ*sBRH/flҊR|s q+sk֚ͣ_Q2k^x{JFY 窩!Z{uyf1V@ή̰1d\>$jcgF_S2:æLȾNyLXFdUȼm9.)I6@Y뛫:&y.S?iZI.oϠ>6.4P%,T}MR}IKSm{'ְjfg-t5{gI[M8U"eL݈؀ 51QK4$ r8.jݐWI)Y|ՂFI +j fQ\#% +nU(!ړ`K疎kZAY us#61!7AoK}ckͽ#W8gِ;?bĿMGKTchu OUEU;:qޝf~x0,\R|s [qɺN{3& @<%XJ=v3 IVbRӐ![M+mj`Ά-l&'>'/_ǜ +*}-?`I9 WX=2 ud& Jd[MoMski9?3aBJF9=I;]K:MvRtVQWzo{ar#A4eZQ?/4?ytk>A+r#p~dWp}m)Yvb}ɕy^9)1)B֩vd99IX|cI\t^[A8{QƺVH$" ddWF4e^9|kPDxkmS:Cٚ-ǧ4<Q]b稠\rs (*sZA&u }0uCO.7T45EF43nnt#y>e^pLpQ!aj->T%æGozry%8f%AT{-UasHAnS +s@T2=˃{-bTܡ[/2B;V[ +b}-wsT?k*{`ꂼjy+C|F@KiFŦblȸU3+](4gEƌR1㜹aPH|mVdҳC=az]=h;00> eV͊+/!h>\}Z\9{Qb> +=.o+ðm6o{RKrǁs(i5[Jtsъ7FswI(bm~w}YpyI]3~Ӭp{a~H+Tr-\A 5l⢕֪nF)^zc)F_==S+'1kcģeqþY,Y\GE).!D25uD,,=,]$$.V>HQsN +~Aܐ w@DT.U²{Ks/m>ᔵ:jGS%`QNGu3 17Gf|`N7wЗn rA>> )9귕N[rrR\%f"#=}[ >=ckRJ:Nx'kW'pcԴҷ{:*rWzi; +RV}93r;(=M/ ͕= 0G?R+BErѧV{,SjD`ЊO0 =@8fjbu]H:| 045NzjhHrij.$yn9`u~ob~X2qM!2d< uCԱof+*4[E-yGf%XRk/Q\TS ݓTOnl^Ry}gT|7^ ѳ͝k'AsSg6dG\d;'%k}۽C5/=3,d|b~(p90 +yԽw dCNcL]D%h&}T\e.`?2׼Լ7"^94Q6|0@rom$!Ղ[@ML`}2F`^jb/)NfjAF器8CxZJwRIf=M'5fP{ttCN_|ė$Ŀ t +6+4-2/_(? `c&&]Ҋ +&)8Lu>j4|d@kky;02J'<;9=XCimxf_}s_ӄ؟WG)YO6Axg9;38TIF?x"D:BN]#_^GM2tv|sx$90@RmfnTc&scZ_|[ƆxIX8>25?,~Mx2 |GD)EؔL2nk_= +(%c}ܔ웨0 W܅x +}5͒JC.,)b|*R"~p%u_Ve>p*k]אA_m b ~X}9Rh +5 16ǘe;su$1FNtU1^^ڇim7n{R^KΚs.$\S褀Y A~q8.5 # ՠӶRbfE7Jr:J/(UrsdכֿKr.n0=f>gsg+U~5;ǁo\41 Ǘ9e :jlc>[I: ģR #c7ejè@ˈSa_ 1Rss~ X +͸z%tv^RysQ|:Tx,CifC.Bʛnbl+2[f~a2i {盥Mu4=Mu.7 Y(=ߐsnC4&vp(&;חWN TRCM0 +?`N*л _ ?mcd)炊[Co.X,^셽;?'(}gQ$ݟW%VmG)p+P)ԓv)>_B+ +2{`]0FN$~P >儜q~7T}6 +y_u&!?4@؂mEu7c){GA[GV:]G&hc4D<<C&o #Xei"f i%!}^֧4 KEd˃Wڪ_8eꑵ f# {l0w9ĵV=kC!an0.䔼 ՘T+/1vWqJj!Pa\\PCkş,g 41j2LB S h S/W!@잖 + c#FMa&=!,dA&ɛ +R~`ṯo Ag17cka&}0|WM򯃸={ ĵc•ajʺ^Psa~պS -Bܥ¥1ˇx5,H٦(k̒-2pͲ=P%elM1ä$}/>jR %VwK {S*Nfԛ>ZucezEzE<2bƪ5EwnҊ󖺠/]зNjTr[ `k)-:aVL7R)$=s¥{K'+oW=$Q3kcdPvϜ5ՑG+K6iyaA޴bVr#'l%Z y)k@֊[Bۆ[*y.>N8&h 燑鈬?bvޛW=3ltk%󮑍.+RC>ҩñ5CUXOM3 ) j8RxiVT4eµ&B5SQOsiZK쀛GS z8ȥUϽInY?t6؋~kg#[O<ïVej8#ϣdrkI[J\0[Jpn >6_&J%φȩvU,U=ˬ̳3 gy]j[1mC0{Oèr)y[SM)pK΃-vcz2\WWrY`mJ}vU=!ݟW< 8Sz|6dRuc fyov[h=r[-P~m%.6yiDuiE;>jyp nwN³M 2>lK΅O*\J<4D/ A.¼ M-~X?ыY +fsDU\VD7Ÿ-#^yfi>@MڐҳW)) Qv[WϵJVܛL!,*&Hi95 +;(]Մxմtj8Ӹ>.jm-^YsXs}ZSA)\&gi) +̭͍z(\wUYhhXo#u >f6G~ {&dA`6'{f)UF@;f~nB}]v:TDK?=Axrt';arNƌ&:\"6'k4s7>܃y1I/X,X`x/'(9n PT4lGئVllDl 3|*[0j&]V%j8h枊s IW +tІix "u*0ܣ$d:`&5Ϫ1S2KČWfRLr!>=֭e6TȺj$źGr 3\3eBCz6j#t\Ԧ܋oL &]}CŃk?WrLRjc_m)!zU +s/ROƝ%H򎉆66w);xQfJԑah̡uL&!U|1O7!=ȯL 䖓 -}HUwmiEJH;ۯ"kd9T ;ܵ0T*v. Ṇf\* U]_b4֭Osc)v}Q:G*k)ag5O7m +z8f^ crCfQ?|$ݱ=zo Ḿom0Ӝ+VBߒ +np)i[rj閜 zc}ӆ zB˒6tiiU~ 5'>[ǶkI +1ԉCR˨>UiۏR .mmkE.vԾZ%B0hL($|X߆yi$}ry5[[1|TQG+7?|^cĩ6ORFjT[8Iv_-L +&k+۰oG%:Odg^}$ltN@\ gZlj@{ubgC +-sy0DNn@DȄH[%>gϮ=ӎc;vwXHI7 +R`ݭ̜}y}\<}_/6>L^V3 ԶbnDn֣~ْh=bѽ>8O6tձKyiY[[bZ + 愵A +DSP<ߞ +٭ɨ%lZTS능 ַ}ZLsz6fiM^iO0@-kIFzծn@uk3 [ey.)+CvlWnimi1)aQIom?vvF۹W긛arնmc~u欘Q+۴69;zW[-Ec nJہu;lK*bOke1ť ր:wp+ø=;3ڸeo"n;G=٦َzm`eNG-`钷h;) UoWliٞl Qv}sikLxkߤ&tJZiZmkNt}[] شk4@o9ZGS` fXЍFҒrrqk8uY=J%&Akh76paր1*.ͶeH@LX½b?ki)kwxJV1& ^V⸔]T{<Պ8s4S޿LxI*A&E~j{W4ⴴlJOPt] +ZƊ?m\0vM5>*zNƨXP6;J@t-zýk[S?K_֕MGuN̛Zv*tJ._52\rZ悖UЧ Nً=ifal-k=|uY9-'O|v1؛V̄uk=zpݍ >NPli۹i\7]|Dͺ_kgJRW{jMo7͘UC=tUO]Fl\hm7#]OӘLȘT_:pi-9c/j}VjCqie+q{S `|`C5jpF,keNSQ{Nd8ź pAvoSlh&zO lY{{=}'G?ڳ:@l;{ӝC3wuwIwk)Lh#yJǂZ-%%$m=6,[3-ɶYLf}#ZmmL]w X 8鸃ΡWnFIXP+]C{.vϾEwI9>aB'K LҦ?.:dwOj\ s| +x}=.JR?9{7%m=qފY>$o-lddj)ZP,)cdPQ`"vo4{ae){;FԢ%.1t[xI6, W7w'ڶդa >A_9{~8Cv^$͊bKB$"PozL! ^6Tb釸ZQ\f.B\]U2-{$em}Ѭ +#mY[ׁPt"u/z 3Wˆ ҫ۱ 쪙:rq$维@my'3={bp ۰E$3 [>am9]kƆq3KJ\dZ؆䓓]lcg7[IfجtHf %˦~0>U aQ*xz^S7 {QvArQM_6c%@.[[̺-K6@YZc*,7FUhb-P&_{_~RX|P\((SaVhCݼZ?ʽ}u4өq5ԯ;H=.K'ͪiDb2"N|Eă[/m5qE+ƥ!'du33֯v +z {S4{wfku[x0ظlb.zuvC3qZAv:C9skqٌͪk݉~XG笥nmi4aXsmeq誐N,$2H"׳L}F+kR\F>&lq;6E@6ih0B$jNZC""Fצ8CPKg_/+:AzcR#Y{Tz7BXW%MlwG8mlW-穑"+ٱmf¯9micSoI$r7*˻9|Pz^5$m51``w_C]zU4& k+2EO_]̅kŽ!V 4u}8jTE.C̉dMkގ tڒƪ0#iq|D`KuHjבi + +{ ('~GBMdHQpIyN +yr\YwllkpO]#niYt۲\:¦:Vjݭp3]JgRx]RT̹VL_zv pV|l4US^nnf5ĢYȮJ5c`@Z%M5*/,Bw<F +˩}[[HP {J/O.y,d7 t!*m: @L]d fڝ>x6n*%2+.5vr'j&H81:a{NP= H]-Hzi>n fF-Z ];wh.u:?'}n:o:fP ADŧ$ %{)q_?3#"׳*J㑘/%DI]3TA#Dހ!'eUR:ڔigO?\*hqA'iѴKޔ{~b ]+[iBTf=@Rc(|.-$#9(ڥWK=‰X*{dWh Nq46L&ƮB +S7xqTWD]ޥB=^JeOOK +?^+Lx,uvMl6ѧTJRݧU!G63)hUFEX?H?RRH⠷Rb{xSü!} GPB%ޅ0.D7\Ag&͙z:GZmVF'&Sh cR G3N=1=>V{Dҵ'] xuХ/kX*J%p딦}oפPȄ6Kw BCkW|1'豧Yb/'usxw>WK<'RKp"韑@xsջ +Ϸ<| ?+?O1YRyP^$kX%5<=5uac>QaDs KX +( ܮmDW #NtSt!m!ɜ)Fd4HGmK^»7O}_DUh`#2jʘj5d t Lxc |X ypQO>{ +y;kxGJVc5/T뗞&sW _5܆qYmEA^MU'RQf@ɞDev\mC0{P ]eyq~`& "K":ߌ')[=|[vs$rt^hF!krCѽ/$Kh9!AؿGgK Zzf5?7cҖ: uE`'qAHc68i E^_G1.j*C𴌒:-ȅnd؆WBe9gsB]Y'_nǰ$z-8XhPެ^P;44PdT`.C7@`cȞTҲ*MQ5Ct?_Iu% Bu)_ ^u^40 )yEwߌhlE/bWMHkoEO-magUQQbxM{٘Y6CSKd ]0"/n&"zQܡnh'ԚXWy8.9ZV:QL.K9eO'`fw>axe6}FZB{d|I%KIή<ˋ=!o|R'uy{E]lq+MiG[#NvyuOU 359ol=oܵ2Ĵ%ڱգf6isKOPw *G28T=۟,fE*EZVlUKiJ>hi $^TΟ@|K$s^0XaΞx!7}J'ر&v0qALܢ~A"HFt7PkM4WcaHӶAbNmI۳$șnAP֙x..0n,J?QJnS&U!ZOPsIz3vTÆ]  v0yn/3O'.|ũXgͫ.Ϟ5'8;m66mXiW, yCj[,↍I^RrҵL*tARhЩٽF)[4K\2T{"|D.2rpW vу-&IQѐi,1Sq[0*w\춳];xӌM?g~];Y[zܦzIX`3'>#nZQMB1(&*eAI-mdb;iI:rg?7gh.d^I]T2b0"jYQoN +ѲM34VJىXg^2#e%<#Lq CI~$b4ԸfLܔ9+mDkζ-3jYUeIṯCf63N8sl塲}S=x4j, N[oB ]EutKϪ +} |hÁl p=WW봲%:z; +xĔ:hj/;7:ukoЉ⪈C |q4J,]ִS' }F5]/f(*9`g) %)/ +75؅KkSFlΩ\!Nj*xZ z +}/"Tw3 1|4mr6ܵ(2ӕٕ=Xs:E/&騳Y*?-gYm]m4?h^->C~Ljc67ZJᆅVs4:9c v'YulFRsǺEs#byzUτ9hu_')3 ybƀ:pEV9#KWJ\2Yg*b}59{K^/bcYqUPӈ3ԣו9nM0&Ԃ?eڊ>lfd$8){,L{*g@&XGF†\93tdEo$ׁ=Z#–1JXz`o` K ++R]>wZP0~DϊMYLg݅܇}E^ ,˱Ɔ+CИ:lAMR%. +T¡Ux4ejy'NFi--wRGc,`|r7bL5~e݊U%2@B`qXUM$Б O'껃Tr:L^x&؟zIez +eCHt֦YGsWmIxPgAg]\>աf.~nāU~d2Mwˢ!3RX䦅:iMz:زl9u³ b偍Xo 6$L3p{p1 yY .)y1GX5&{O]pmU!WOZf0)PO̙((},){&'+{k>iX&wwаָ[VִC}jS ]_;WE.r'+%AӼ"`*|NmS;jMQ_gVR,#ڞ|;,Ƀ탅X#vHgK]-.2&DKC{sʍEEE heBΖ&bUIb$^!jӗ{#6[U~kp9#t-&5Bo?~jGZ0L ]srЀk":H;N<-K?Jn(r 7\.)que=u|%h\5~0/TG1SO?kV*C{svFT q>)=mMu} . "#OҰ+j34#3Č[pn)8bGS7ޓuɢoGIB.*>(yrL̦XWiه!XT_[k3<Ąatʑ.s[Hag}ĭ(sZe'#u)Ч"/{S!M+ۈ _LJyfăǂ~LsUQr3mWDi!>vͶ " ]UŬk֥\b-!e&eqE3-#Ś@O!b-92DDG潉kVF1Vڃu"aJ|,IB4VCCNs@ pPm jPYJRПjҧܴVTʮX0Gb; (=Ku̺[IƇŁܧSݠ'*=ߗtE|shc5-1߹씛+ʠrѲYߒ[PfKVDqyz}C:[RH|)*pd ė[9' +rRgvd*PkyڤI+w-y1x*|rlT{ @W9p`GMMU(V_~1/ݔH1w4Ƞ6zե0pM"t 5+&h:4eYw.Jz(~y>E+ +dܞ<5sN0ok _% +3\ w3eDP5)oWS>_-BKwx5Q,WiH9;jl[\gmH cW9G+c\ Оܱ")Q/ocԝalʮr0L  MiUyU hI{:֒|c[Q +uʦhc½9nuY *\vku}Jȁ+Sc 7-[Vzҭc3" +_fD(&dXw8@7\5у~RF{!,ܼB5AqΎ̗}oL<@;6xk˿ct1*l Tׄ頑=Cu,iʿC1 ;㡑{Q'6|2Yy^֌x% -Pm-dQ2ޓsy{[S]â:ף^sX_n:n89wK2X͂*-,0ɾ7ۖx}꽣Gd=SB S-ٷ&: +)٥ŵ{ ~rd@Ax2J}@C~V] +EeuOMfU^k\Nޣ2ٙt'垮:b!'gGkQ9'ry:vȍ!]7,{wS^n^+D'ꥭ1EESzzb”9ȃʰmy`RYm9;kRJ_ +:7c 10:u]EsJ?űސ"9yOm)\m ׭ !L%^ͪ +TvH͕S;6؉fV‹^Zպ +6DL!K|-WJ*} 72*d\V)ɷdk7[22 eEPKyص$CGXyO, s$IJ7Bx񽬁2՜h)텓|W]?n|͢b_UW'm,gC{Mg[Wv2Qk~h'TWY1YS0%m8hIfa ؆+;g0iGf_d/>93'&R!W+|gEU7d]#'(kg>Lr2X7܂gk2oNv^w1wWEP=5&B]Ѡ -Eq*B>0.0> :c_w.ȠE*t *y&EGoDBlJ'"9\F*>LW9637M9,lOEѡ+jE>srm rZHjm9SznAP0HC$\w\?pD^U'|vh5#Ζx\O;wtmE/J\֏Qlṭ.@_4ftyuydž:*>(#M~!j&p8qSfr,{Wykx= 2c߈H$+zǫ*x[BJ~2#*%qfT w bCUdqKEK|(ɨhmC=%9t_VDG7d_--2mCT5I}0ՖpdCQwluq__/r]-['PH&cS}`gǺoƖ {WѺң1|83o:ȺaQD`UК&)ØC] +8Yωpfhɹ2lԉ [BLu?+\_vJ`'#w>W3JVCCe> "׆6vD.NeaM1"@AS"3\ogFL֞6" B>KV|>1+*Rtw]T0Dv"CrnA-v5S;x]^. ?44q+KC!sB혛0blw{WI:t +6=a 65E%ͬo6Z $D_&ޙB>ǛY/fzJ*|6TkkÁY+>Z˼P Ƃoٯݒ~C6ĥUQ"_5-O@זYK!:_EK&bw]אl!C 1Nci]Ôć斜6'CKɛW(^VX|O)jxs{<1#39;|\1T;K{1ّz{قK7:vG5"HG9#Ueዢ-eqб*؎Ls[`GN>$3Oԕ"լ) "/%>PK\VՆ K儨'|m]M$Ib UH)4Ye4Mmh"ͱw&R6UE_Nd,<4p |Ӱ1^}lF̈r='r:RKӖt0BY(E(O uet_ڳ,ϹW#Ăal<{MR?]k\=^:R악^HwG3s׀R~Qb*t.@̽=^uEAٮ-IwGWUU6i :hPt`U`IR #vL ]DŞR+x(|SY"*U#וT2ŌЭa\P Zhﱞ—rt'fBM"a^X6)4S{h\ = r`.$ǹQ2JvDwY?giQpzx梤gMK.QjgX읒q"h L7~U^{"N6/:z 9p!s@L +?}lBߧi?pCKe`e~W; ;BӞmP#]#&J6֑mjz&>:"rre VL8Pp+S/,⪎tSC)X ky6ҐxГ9'Vbіk|jj=0QJ%eA񫱶'jBݩ4c(зrݤMD9pU$nIEĜn ^}VsǰNxu]w:6K,|-/],lo$Yi5 -.yH)^Wl{}{=!O33W1&yc|摎% >PcN- :qf#(A[rsKy +P]#NPj5;P y=@kZPi_-D6_>ZxWY7׶&dMVt4 c<7RXe7U+r4X[Ϋ3;dU_#.7l 9~ŕ~ZtڡR4T&dfob7ۚ:Zd0F2g7fCΞPf{%RԥÈ EMԚ*hS %4x徆pc(LE`tq6ACYHkzL[U<;~}1 kIM|ZSAÌJ & jөPoW;>s + Rˉ7t!kJe̬GZGgN`'> 唢 !W3.}#e<6e"{Y2j +OZ7!dcL|h>灇c'9aro܃e[M]d䢲ˢ"+0ՓxsMhUTbCNHW-rՄ==P}-,RcySx=+?^>zn"Ov|3$[JQx[˃Ea7uVdK;ڜs@GhŇxCU\k{_o !mY~'EA~Gk%9/x5zz="髃 =K,؜i{Wwm{CFdI7|xȎzhK?Jv4~@mi~L758\. ܐV}5٘ KkŽǺ%GЙ}QTƩtj9amU “7 Y5q^ב m.t1 +7YA.=ŹVeT7@ψa[3ߜĚ3,iGS<ٛޙ[_ -S]]rv6$0؁6~C^:С4Uc CKN࡙RylVIb)q]U^d)Nu_|oKaՎ{ +WqlL˼ GIUJ“kS/?aIgdשV\º~?͈-M9ЗT- bDXR4=[72ȭj=F ?nh+#ls ӌzֵtD1GeZЁ[wK!X=uIԣw34yRȟl?GCg[ڛϝSݗ!7twh1APW*j +!dOEe岸fHo sMO4_ri.=OnΐǎYzGIM_//,O6ί,/!H%PBj)䠜yg{'lgT$\,{|ۗYۼ;x.9qsZ] I:ТߞZ/؜CbkShF 51Z=6ǚ1%%aup$| ǕǷ^!.= k~)1hK'm7KSmɓ'Cb89n9z,so%IӃ;~tuQ=F-_ K`WF煥 1ZwY4_uGy7kO9$On"ȵB/$ OJd@0HX'每sƉԸ¡ǵ,k~]sW?~a1ّdafsQ+j}Ǭ~_i`Z)p#n.jM+\Wݹ;SiQMգ$O@:5Z5=m>e`SV smwӧ#Pj޵H3+9ͤܜB|ZHM/KN۞mx\,6v%Viǎ ܭoX(=q| 'tk >YV_`#_t^k!+Njl!Ҳk=[ ;3+BQ,\dw] rcXJ/ | K&z@+58Τ( +60 㝇Мi~^afM^ƣ$7 |zw'r]ȥD &}+wOn>{5u7O(O{S(oaE$= |s۪zxlp?97|쒻~ eg]js{;1؜셬Mn%LZH7F 7O۲h~sf5s~~ + ݳBo(>&euq= c^_#|̮'8:ά9;k&')Ex}nČXˎ\ʬTm4*`)ڍߩĥVJ9K:r&+5<.dZg+:C/W볎}J>Z7̬aA F7vtm^ս!kc@gx51+) ȐU]g35Lqʻ5_8zr=7OKl=*ێy)\a1x ΐQq Nwc۶:oߘwANm] ޕ:6n.]K7CArr '~:) H-)+Rһb*"cc\AO3IjD\KX" 5.wJ'ŔDPRk0ZH„MLl@Mn +)0{v8fdJ*dcq5wkW(}kZX~j ooNǵ{^9A3M,L.'Xnz.~7g-h-E ? Ķ_L}q }XǴ rrMO[Op O +#k[#+VO.oN˔Cm(U#.$䊨*.23Yo)719ڿuN.LĈFt-Pkv&!5Y W;o^I{{VT{>- 0ȼ +7%R82ogX22BYd6kx;`R4 +Ƚu g΄dB+#P 5&6I)55"5Tn~ŷDo6<>e[`mPRFwXI및260p Q*)\1]3n5s-mq4iZP7@Qkgt:bXE늛zE0WMO{N$ȹ ]\w-@o:bg𛳽殦44?x _[*\S1:p=k +z.e~DAOh9g;fUu|&oBYy_~RYO:.1CܙW4|([Elk94Y)ŝц/&/U^A_Wt9dgR4{8RUSIdi\'U})vlt!+6?-R3To> +@v?Cɰj>9Pc%g"ޝc*S:*f6E5\ %bYT9x2%MaPpEqŷoW> HzJNcfF]x$q͠jrOQ@h<]!Nwju͗/+ +,:)e|%oLbn&,J`TCo*qɖ3ko>.JGK]dlb/cwE5,2^$35y\AXŀ HpX +vgn~|V <ݔj,o;N7l?VSڳ2!>ɮ )kV+gӏ߻7"2L/ eʱ*į m lMB/Ք֌] z=rkZ| ;=ά}[pL:.o(F\-O +_ lފP7vDGީs߅ff-[C{vv_P(|9TaA]v c[ajjvmakP +N} q(ݴ1Je}V #jT,ooB?abRJCJ#HA &c k9'!/'6$ A% Ybwu!]_H.@G,crν✁m\2eJMDEk7coɎse<4HL!bG`lԻl + v' ~j>c:!ݳD*X6 { ǪeC'-[N&s Ċط5ovt\ Ik~?,rN>11-1)}}W99[\BY2A bUw;>' +%8Rp Ga;uSŏ@ɅAHh@mVpa +.% ڇO-swkzG܍CIP|뵰|-{gum{R5Q +n)IWǯq +\OI`y15" jg?Nvf lH̭1i0i?R)"85QHQX*kܥ b1ŨVHLBKkM E͍Qٕ[ӑ9㰋 %^"T$Z<`MIX)4JLτy% (dtl8Vuz4p{V0p~ U3PV" ֻyI-!nZ{,?5b6rU#F\Ћ;#]@FI Iu#cAluIȥI^[}]ʛS› +4yXc4ޑoGԃ C_\Ci Eí?,=v1avWDOxԴgn}KeTDǹ a ?L"={=8mPrFGXJ +,cK3WFZNgs)HrgԼ9sscMJ8m9F>ǂtAc//r$qb־*_ YIfJ@3x/nd{Yɨۓ7R&~.MzۮG994U:\y^X}0āy qHI|+bӃzhXLFlZ|lu[L^Do@]6o'bfߪ6ar2r-T@˅oU=f2bF#Bv8m%n4vm\=M*]d4:칒=P [ue}B >j^j8p}s}kãOzN8ƉY +xTShQȌlа +W_B\D^-12fk v˳>wU޿)-}rNwT^kuS ߹z.%=tAL'%Wfݘ 3x~~wPҐR6*b4?a 4SQ?o1!yו S2:[Ws0iЃ^jkcD/b\ +ott};71?r=i+]j5~zswQ&j43+dțDkj?'|-rה3ezwT-`n΋n36͍YXy!cS^aL%Y( +]m:=V03Fhjgu㷲򿬏¦.o> 00 q jۼj?>stream +5%r4[GڰkS¬ۖzBr*c{UYTL,s,2W'׶%rnJ# +Ru\Mj3LX $ej87{-l;bBv(k9Wq@{\[}曎aMXB:7  4-b組\f8Ʊ-t`>gS6&v!0S;>)Y1TqL~+A燝i|IGhIYilsW`I-6v`/]5  cӘ@|R0{f԰AQP["gI `{;3GkĢukD- +v + y4U׷ 1w݉YY˸c?5^{Ywzx;E_ ^̺p(e3¾,7>mjw_ًClNuNh66 ]w~j/{GqUy踖Қ4PZ#*LdqFD=!n%]WM1T +Z·@>2Q5ȷvƳqn԰\Z`IDGy%yĵ^u`P:*̿D>8;,i+'e"σJy=>0)f[\x=K(8[괠s{1!9Mk#=wqgRlJy5izYxI^ &S6יOhi!}/'\su}mq3NdsyzmH.$xiQ9!-m .nsCRvGL)Ļ& EOl8cJ" +tQP(q/tr|~NH;G_~_  i_Ll;ozeGBł~~80dp%gu?^7ߌ8לnsf{Q]"][Dٞw|#yYrPGU84/TڀPUP^V(;ɕY\AjE؛ +Q=VS%!tlT~*exoڷy{= c.&5(Tw( +t\)A53>j 31ѰE  iNpZo7 35Q)9`N!))0˯f6 9xX1s€ Wxhs|f鸙YazJ{`RTɣ,h]c+a.&-@33y  HMl*a>aRZ>.,e$4LHDAkiФ)- '9b6FU u/=Ih!VVzZ2 ^hZeX΅Wf~Zwkwڃ=Bl@G +EGo6РQʳؓZ6n`"C#{Ov9PP琀W6Fή,> I>[Ad;ZX-0Gϡnya@'a + +!1&:Q꾰>j☒XUfsp9bv@Z~j~ZYXN$-C^QPEo8舶 x/-%7FTKx}߯ A5'L +,S:\3Ԫ1jQ`QtL3j5~ln{ ~~gZd]a)=M.B䄕| $9Sb&:4&Lwu}]''7Msn{ yeIYqo|z/f#Al (~e?mﻓZ+Of!7fdcS9f`cu؊ݥ )'-*owUI?0 jsj0[͐sܬ2 ug/k\NpWߞ, )Ϭ\c6ȰAԗB*|ȁ}s`rRF.1-\nm7q9j؅U!?ia$jHSRZ,9avƁIy䴙OiAv@h˅]=ffc>Ԧ[헷\/5pN-4 /w2Apv6r5%wD54BLO .®^~}Tئ9VĵogbQ@hVOʁb+~U(CFlw [Y L 9<"펶_ʮ?1A r,1o[ >ntGI[zn49J,wL`a}sV%^%,ʡgVM Elw^Srqwgv/N܋*i-!))ޙ݈)HMϷN%{:$cb*Vg |ȓ 8"{%+ގMq-)mOgZ u'%VYv=[5zQsle~)G7OCJ5Kؐ:Zo^iu" +b}* <jSf8i`bRGlX[$ӰT3,U2lFjH|23OS60}w_]&׀9dbTNo=2JBp vL!WJo,R+2rUwX[DLjs@/oCφiMe./!VPEu_EEml= s  tPra%5m 7FCSe52&R6+x~?}. P͘P_2#mQ +lXշ+K?qb$lR plM] tR78=` 춃;?@E Ifi^&V&[ T* ggbjZkHjO遮VʷG[+1?[zI3uN>Ƕ5=(K{qqlWB,J[X866%ĿD̔1˕>aU}䅔Fqg[h}ӕ͞'ZogD穭мA|'ny&,TőZ<G@\@]мRbe@Ay;kqAl^ߕoǴ||LFB~ؿo Yet*`㲺1ݞ U%TL{3?VؤbzXU+o9! pI#K.SٸyC e' xemVo4}? /"ol{RT}۸9p>T`[E9/)Q- +{Zvpܚۂo^s{{kOÆi=;YW#FJ61nfu6/;/hza9~ UPk# ̆P2f|]Ҁ--:]1 +\?^>cTރ=X Ob 636c|3y-< [cx\J +)Sћz)cz > XLۉcN8TA_s63Ḙ e8́;Te-XD -mw#7E_dtLX`Ztcïs`e7 ^b{V)ZJRx牭\́ +rѕ=|-,cwƕ`XQS7훅}uߵH( *иݷx)~PF{d}/eJ,/;N-L Qf?ab~v@L <άEgr-" 10ܹqm}-joBM?ƻNЫ! ,;ޫ3K. ?c?7"k;皬@ HVPfޝe*?9 ;1q9 ~s]` +^g* V!M/*񇨆{NX!A p8{XČ ƣ +~'6^o̜/9r?뿉>ȑfG6;rّ#͎9lva#G9rȑfG6;rّ#͎9lva#G9rȑfG6;rّ#͎9lva#G9rȑfG6;rّ#͎9lva#G9rȑfG6;rّ#͎9lva#G9rȑfG6;rّ#͎9lva#G9rȑfG6;rj7?^BAY?h/F8f|A-x z*#Yx*˾wK5c'Vx,lBINg;vͽplKWrΟzұܫpZnW/^9FuW^^s׭.^̾y |+/d?s17꥜Kkq~?hkN<ޖuӜ_=uLK$t0,ج9x$vMGձv0]ٯȎqq2;.ͽr؅9r_Ɏ)#Ϗ.ȹq_:yp=ltz… H*>]qQ)շDoʩ-#m!5芐SQ"zFwħNзL/Qkc*"!%#*VWVvZ"9K0š%\qdWW+2k? +i |n<3 g nE)Uq)Ҋ룤J$>avȂT繰S4Z"R혊ܔ0PISS["rRuHNtN"s2Z{K__JFGOIY̨w/zrZP 9ZSlƑ\?}9!$|LJ'LC/oj=qA.n6} )QrF[\Ť IP}^{J萤"glm\Eɘ8hwPӊXqC/ۧ VyMJەcj.:aaJR}z[?JY9IXؔqQ4W56? 4q#'jĚܐ0Q1=%e2^aB„L\!yJ S2I3q`^?z+N Ul31c(b-n4m.mLؘ̤l똑ڙ01 ˩q-0yoow aa z\]܈kUA9Ľ=lby.*{lCfts'& `,mJMQ%2&d1JjcX,f`ސPщ1 cK2LOOjb~`Q'5蒄UU +Jc@ w`AN`K𼄌TVr5kL ?\Dƴ3QWlwq "g:!nz!%)Rz>>mB"TtHXUao(b29aC | 꿑21'!ΑSq)(&WET U~_fF!÷گJLQB-NIfFڐ`K[䘁G@ͬ <Ȭ$ մҚ:Fg@mϘi=)*cBzBKl)p#=6H)#2)PL/\XX%"MKp13qֳͅ2uv}b.~Zz3&=i20zRzR}L.X0)W +MF..0'4'Lƌ؜[#jl{v-b^[&ll@MѷJtaL>O SqA#jZBuHτeMlCL"HĢI@۳1Pb326!iR:j{\mΆG⾨A6KLtbYB۩ŎAbe#ofXutaEbE§ND$M<;޾E۳iI# ;K,ܕKj6ԫu- U~ }@HGؙl5}P|%,⾐sI` h{jGB-.r'O{!␐θƈsֈRSCۮÆOw&17*.ү/y;.E娪P wb6y2u"JL˂$t=+;֘Wհ T^G\%$TN\y?t_tN +=[I͸_i;m}YHgM_&5b2d_v>HH +\U` gRۅle -)G*@%a1;1sp!x*uDCPS c9iNI8XU1dcwocRi^(4G- jJ/'KnOG ˆYDE&kC-jZ!H;R٧yiάcvY3"娱!jjhZĜX30ya1!0ֵġ jF.u3-w[Iz4J5EBzV"iE r(A;8:g 2EiQLhNf~PAXm"!dҐYsO|r@/ - #>nQDѐY?4 OЀ?"pPQ53ܗ@Q)I9s;IτPrKb$Gwىƒq r:3s2JXYXU;VVePYhhkx=AJr. [ < y*i ƒ [=[In}Vv0h%):#grB:4j,|e g)Ih3 ғӣf g5aSmC3lfWtT7pBooôU0*#&fyH//UT2QrcvfEt2jn|4Է Sx!x5"|nP*)[cp\V aT !T3Jb`c}KEX_EԨUPoO BhPvHPM" +Y@%Siʯ􄔀M_8j-ujx6O8)7ag`1YD&Mu~8h!p:nӂzVGMN@fqصQ-𕥥7j{qa 1_ p6H2A*W'P!lS˅[ػΩa폼k7D&!%fy +,Du4K㛘yX_"OId"jy8)Vm|3+lb~ #6|@]kxM\ۺhǩ>~x5?by: +$i[Ӯw|ixAdگZ0Ut2'iƒIݍ꣰FH4(oSiw+([QN&J7 nD#a{܋@k2! `ٙ1jjT+Du~ȶ):<#Ⱥw{{+҇ڍ +&$fr5+/*I~y2w{o,o|p[|| R?j/FL/Mւ(YX-qA1=ݞ %},9(蟤fgA4,9J~\׈_JH?N|-*j}( iF.Cf̰ +[qs8s@O.$Prग़'Yu*G"FxiwV1Wie^y.yf$yu_'Lc=9T8D]%17R{,l6sa5\2Ʉn !9ъ81SS{ԨPgX`m`#yĂxP6UWR5s}͊%^. +4^P(ƭ [swV݀pW/gdjJX<&y[/` ]*j()isZ5!%aM ?)yAm]kZvN +J j?6# ?1sjj/;3u cq+9nyvw!h=Yw-8YÃGMbN( 24jB{y2-;Ax#kw\lDF-tw08D!,tX.:>'t|Bsһ܅}{1 ,~kCg oOAe QbF!8Ԁ n2 zJǘgm8jlށsHeVB8W%ʥnSHCH΀Z ~-p~$15bhhhkj!lx6d`#`q2@ëO+8gm~6 r9Ӓ@4Sz^҈Q&Hث-$8h9EK%{UIۆrv@)r>R[;u[5 ?j5#2R@~+1A=l[EˎعH%ASkrE,]E +Y *-QRKYqAeXGL5acum&ݙ +sZ7y2VR]}kVBJUNx>ZCM̋|',2ɮUBִtK.l}0^^S ^`=j(dB[Řޔ h亴ND ꛝS +0#%aiܙ'ܐOkZPbT&ZRtxQcή k44-}31me `OdIP]5QsJ6ǙYK=Ô$}' nbƎU2+ +uQsGJ[o1&뗠Q䚢e~\O Qꛡe ;G0;tbfco<57\b2GݞPfMḎYiQ, [xd4h`oaao4SGEs^WA%x;[$guß]Kc_+mkSG)G|ū,`nnMP )agFL LFz>=Lneh XR-ت[v-/O! ٳ=#$.Q[so>CruW]q+%gU"b`ZFk^$d A`{A[_AH_9:b:K٧̋%A'N bԭsj^s7Уb'9ҧ;p hl/==}cnlOAAΠF\BH/X&ĥ!^>H#dQ{uS^@Hv9I;^muObQ[c'oYĈY6|[kEY'\;5ҸM.̲1ңQ䙤̲8poX+c_kE$qV&xӝyYmlςsnO>>بaeCFiQģR=jBcj!,yHtХWlN<*Vd دWxbm/u`5KBp嵹E'#^dw?;=1S+uqPs]JV*:fy'hiʶd'k:R¦xet^IDɊ+&ԤQ9PKQFOD"SMX LDQ̭)r2bFM+XQ>7+N *s_mKaSKS)unaLfpYA-PEQ"$4Fir-B, \=7T scm 踸O"{@wgD-bG½{_I؛{}^}+Va!> (43;0# jE䈅[(dY&1CLZ!v +ꚀQ6H;Q\ bnԴAm'k傰#hmWLBWϩpM3纰7f5M~C]s&mU*ۄl ?oqJe!wE YEC#d}CK :{25-/4>>nyJi9#^( m2YZ6^<)l+>͋eQacjy \ȩم gRZkЦsHH1M˚Cv 9PGx?d'ZCG"$#ks̓=Hw/ǞLr*v+;-uMp z)wݣ"B>Q`@QA!R;'X)fkx; ,db.CUo/pV\Mkldo#7 2#7;3 #1kc d+CӐZP~-;$9Td*O;ëU[>m4u +5~nknTM?CIDYUij16g8Aϖ85qdC@g|Do˷F};Q^7 mPf..h`%lʠ9{4,5dl a3kA5Z_4z"6乀U*ry5e~ ~?Yܭ06)Ԫ0~k[Ӡ3:.oz6S1 Y42+iؠN<7:-gqS ?I-"2<kI30f$ e_xꇢ;f؅>D42SzYرp1b8ƃ샙gr(hc?[+<_r10,۵ʫJZV`S+UcξJO GM^՜dcu`QSFC#axV{!oZA=A@{1Kb& 7fEf!|JA'7&Qa%/jl_/ CLq10٧'y&*'&p>%=;Q  ,?[HEaڴ˭k_xuGW ճ}30ԛT-Za|gV"۱rQ#%/d ie6zYȀVӽj /j"}ȵC#c5GP9Uq3`6IHu$<@!LQ6s0 轹Y. 8A=4lTkćA14g=ӱ8ت1yw4C"kyTr;sjA|d=cgNߝsns}P+!eQ>0 rI!f 8Up*1W.>_,׼^;YKč$r,vy `Ր'-bΜXj:t.ni-9M%` w;!&B Ҁ}5|'sV`Z1 =ԼQ!̥doN&nyԌ4.U8>٠V&hae+B*zY$:G}qdY>;& JPKw#{NSܪj_=\Rs q$9Uf1rMүa5`gVYصsI-bzd + q;*LгBF +l"}bɆږ^&pQ9-55:ce€FD +V2KC&f;+@f2J'YށW*U06ȿFvXebV/k_ XiK4!&mM]q3J>!o~4e l{FP9*ܜ-on E~KE!# LD 9*G; "Yt[ @ 6Fm3!{&nI,6|ZnL,H#v!7h"?"~aߋ5B&jQ̬)e(KU7\Ӕ4Y"< f>DgYm.ʀX5Qs"6" +qDE;!KՅ@KFc!,Rr.lT~y_6 (HsbY.5G[#WQL SQr*!~06<1+j!7c{+/&tȧJ&$B`S`?j2`s?=z&!foTCMA.coM]F+Ⱞ9bi!%!9nytOTT%$Q# \&wYXdȚB̨ VLiQңw};/i}^?:5|S(q`;|dD451MKgXUQ27F01B1cc_5+c:j^ٸ tĮ9~dפYY9n[%)n=!% 53&DԊX4>Е}zzaTJj)bG%b滔{tp(^+9k$gzĔ!Þ$OP;Ku]E<EDa"6ާ51O̘UhywA(uHz5ʫ!=yHAKm[tmt;d&9lɡ>V.#wixN킧! !% kuc.޵1+ ƇMc/RG ?'B +;ĄE74%5"Bz:䔈Z>iߞ95%4bĄKn伍)qk!bfZo{9^uc3շeZO!fJ!;ʗ{0͹t-E'z!/`BG$\ZH- hKϭs&Y;0;GF>b1qZ*L5514 wQGKȍv^fi2bªx31ǥBM uYā MѹrxdL+ry>'E&^dM/g~S $ rQ+hHC#V䬚+hm +Xj6$hqf9 گW bz,B6El4xj)rEhF) ؖODM|r<ГMMK; C"C6y!;)!dsàoqKuCoypcZ%粰Nqč1fg3U h/NKèiF^L-ճ/l0J:8fУ7`aȡt첥!vsJBGtTPM|Nj 0A-5Ŵ9jkM;>ۣ!$#{4{pH} +˯ܟ0]]_ H~-r2fy26Fk̂ 0~)dА0?2.daW!k<7[D+-?"b f0!|,G)1uV^Eg,XA;vIJ//813;آibQS<Yn]R͋A5M? [Z& c@2~ԢA +}6p2W? @E12熊OHH۪R6W7W=ϫ/1rJТs_k7A`$LLԶ=蘥fehdX!𣶸E@OXYa34cs(ZF6mkޔJ6D{=L =>0#ut9HcamxUS +f">n ωHQs=JF_lM3s)+[c垦ems7hɮqit6ܭd\1riE흑w +O> W8dPk +9V^? e@lLH()niC|XE h(Q%'l$ftI& D*ZMOGpjyB@/Ǭ!0X :5Q"&d{%dd 2Ⱥ2 nĩg!k0!9ݝ%gx05ik|-țc "ֆ9ӨMܙ>+fd hvd](vjہ=\XY%/d56da$y`m!# VsʼZ+6׽.>da N韏zL-1a\ݻ謬֧c,j. r"WABpԶƬ~\2 ]؈SC6~*`5,<4 $_8|?L(ya$hfm!Sm[4N6vYy䘅Q#Y<ևKԉ`dx'(=Q՞s+]eG: +ĘYp"|3t =3aEu\wSZ);qJ>;u"}2S ktwkp{k2H{6SzG^k9F{]!}WAģsMT\ y,3->A>Ԑ'4b9i{=v<ȧ^.<8=-0hC?eDR]" hkiԅOw5Ϣ?|uys y3agc#FF#?BOI 6z2 !#P#v);n>)a#25k#U ,-d#"98\(ȾN6lhGM\B!%`?9hv.%\/Ykq{MK!MHfam8=0.Q+CX0P5?l"!`IZ_<9x七K}^hY%J^0=ٯo6'X˽K ~Frg4dR-dGm\bʮj[06K=Q/vktc.Ae|~%^PMNc{wf{7 ~ {V,N9yTR_]#(I i}XfCN5>=Uv5Qu 搠4fJFkYx?'^=Qujzoxy }lz7z=ix>]S5JI>Z7ẳ`vosuBXo>f!}Uu鏹oˏ'*o+nIɛ*׸ +5FIZ_\@CVb~~eC?]rtCe>cusƿ;K$Et{ܒ([dM)n:nE!2}Pn%+5I|ԋ:9=H]=^|O9Mp!Ia5iwecyG{ٯ'/k 횠:w6HwJA ~w sIՐyQg7⻊ ʏ.E]?G}C}Zڈg -soq=r|=ZߞDVɥQfCo c\#]UV{< Ana@) "87{UZYOcD=tD*i>j|Rqg g?.ե.յZӼ[%K*Vzq#[cLO~-9jn8rVzWˏ؞lm)=D~VsP{ۃ +LcֈlLfm+90%Irϊ랔}K~wƎT5X|zujj6륎Jz^ G#o)˽K0ߔNcjq {wOy9DH9j +h9̽ؒgsQV|b{1Y㌬cs9?kt3s?uqII3wq= jkiSKQѣRoc }5q 7yY KS}9vIaGv'szxRoo+έ]<-5$ٷ裦ƌMi4e17dk/9<"ثo}V~xKLefߘ[o-v`o&$t0lkK }viXRߔ;c5qwk--\bs*;dl*T.am 3ס6pV׀m:N_ѷdiH:{a xߵ-uT^E<wz{m =e jspeEUmMHcRFHDwhxrJZQWW,kcKɁĤ=Pgv!=9?(~?o-'4g +u3fE"(+7#gtKe I_L-y?-Nʦ/KKV.="{k[,)8b _K̋onͿC?I߫kNfZ+Umޏ-_4{]ã) r6% ݄|*Y/ItM?k3(3~1H˄4Ƿ^J7@L{Wߖ%K'CuҗۚZW#Rз+sm%g[QuuksۈF胦 +D//ßf%ϵ_VFY/=Nv9GVjj7̩ ){UZ_0Y^Ү,}ޜ{SuRZvHXWbKSGߜ=!|R{â VrGŷ{Q +Yx?IVsd|Vud5ioA<5SQghLm%?[ 5]{ES+)0u/iqm}G}gƜ4[|LףϾ\ַOHJ^OO+I# ?>NR44hy^vds_EʚjN?tO'c} [;Du^zwԴ=_Ѯ}=bw~BRPS[7%o n|6){[콶֒_쯫NMs(!3NNZ܎>^q򶥝;,=bhE +"_WC}aS埩n V%eK)7ޣOX7MݣK3,>mi`}tK?0/{D&\\ -J?>Wşs="rqO4i_ s}>[)IxyUޖjh*~?Mr([|E;Y66Npk̯h^yJrszㄥIt/k$}NM550RkWǗ?/,vt⟀VZ@C䔰j}sxLZ-ȝm'^5f{Q~l|;"s-ȟɇ̴5s 0껔Kٗ6)i%GÌ'd 3ISF>PL;Nv, ٣W:0.YJX}9m~>gyW7%KWm/ +}Q_xũ?}F|w tF׈ڧmqes?sSH 5 9t꣦GY^--/V\)-R )gioɏVֻJ/+$&-`o`|AI=';UhSS>ۓ,O2sn}5@{6Ƙt 2quCS0'5*iZ`mwVJzS|8 u`.aI/2̌C/Iz+IӒ%m5'{k+ e˯6 +DP.GӒJiM/.?wxinl¥urj/웊cogot e;yY|xOyzE[Gݿ<~ƕWz1EW %g=-ݓ?~'sZ;:̝/ZqY[{g/K곾 \lsm׻Y1CMkg{71:}RrxmXQ|rWI1{ՏV`qqi/۫n|dgϽ!t[j%[Y'X'7k)[Qq!n?-[iRdKo܌`Mus/ 7?Eg9zGv\,onN)'oonr#}+փvC.{ms1p^Ke?-/uV +m#&9e=h%_鮮4nhOkk +QdSWZ'(;G݆kI7UJ{<;syW>rҍSs>}$X@F&$\f\۲=,\̻=BMv (IqF 'G׊6^]kXœi,>v/Jŝ/gJg5$4ߖsZ)3x()+ o2k~xw84#aQ-%&_zvM?[[;ii_Ny$ ;46kkwo}£;B^(i?fsևZtlM宊24丽tmd (|x{8$ak[9-pM*a.ˎ~<tuBuZ\/9Or@SR{\#Uɾ)گe `.r|>o_9@{~&~k+Nm3SҖ:.qw7%$Kb$i;3|' +Ws{[vEK6Ɏ=Xku_n)F[pu!lec} '/|b́|}Ys1^5 jEŸeg[~`.觑)yc|ОZV6 *b08po(%/ x0-[߻N [h- ?]s1U|k*|Une3YSЏI83_]3`#C`>s/e%[$bǟhxwxww8` f+ykᢴA!~ nnV|v+i xh!*k]z!s{{T5L˳ eKُwFq_N.+)t˝p *.,50q 1zUϏ8\pmyCE 7 ^S6DJtJyrnIZ3V+^8b1 +ۓTex vN/{LWzo|scMUޫqVʃ**d0e!’CZx.v~Fo Dw!}u%(ɏP OIeGsYOZ:Hcۡ|؇rWe.Xk=tV̳NP[K_vNrFw0ǜF=8SQJRlyb,^ZƎ>HvxsEml5K?29)&X$'iBCG.pؘbt*8h^z _H>=dg]<'G "k'$Z|8.z}ߌ~mVy\=I9В +J7?Z9wvĜg[Y/SȤ]91kNҲ7hü+e̵AlG*ߑ #暒 'W;Q_~FY$MԠ>6TDWQ?C-!9].xԕz7&*dgNÔT}e1b)=#Z) = F*eCFI\h%xknG ukdJHt^p(GŹ蘍aLsYb#&hk4A-bEX^=P1 cH54R27{ oL wuU皋^9e,'sԻ2vXbdoOМlc5BrLqJB3*ȳ4ǰUrJrs*EFHRN%fW: n/|#GD(%;3CwDWAŏ1B='&޾׋TTсXڥčW<}sɧAlR:obR+,4C_n#JL]NNz&eB75uUBQ6^+2Jaϯ`_vUMf9yԑx?|{]Scʳ_< jGN56(h]%bW,SIQ=L):k`-7c?blwv).®c O{2&1F/pNKbccatc kh˄8@*_-ccLOaCFmv.f_(~+磶3wFIq7'iԼ p31#u ؼgEECzyո٦띴dKO8~uywmt<Ђ E\. kZڕc,/ HJ>.w_'aN-Բ63*ŁG.GH'0Bc cMM86ë3рG_*R\U* iZsӢo(p)m=v)(žQD@>DĞG1Ֆ-|X݋r.5b߳S "сI(ؑⷆ?̵hS϶eMK~M M -S;ۖ^(2ӭf=z.ѥ`^Ӌz5󓌘X?c}cQRS^ô+|A^#Tb.?b|;R%ihSkv-3`}6F/! +tsm;Q fcdQ,3<6S$l1x `oVZ&v9hr(Ǝg; +teVpmUN| # HP? \¿'Ÿw_(??,"E Cž) X*]^IؔKWi Kf⧵vzJ3#\/¿~?Ϻ4X.fL)XA=Xcv% LUx;ӂT֭1 +̀XSC0f[kM(A5o-4W|M;#DnV~ ;{1JNߕ.MK%f8Ԃ*^͕6^j#f2gm`H`'c&AK򈑎!Az/ZoqKS)s޹G24m) BK.o,* fzTMZmw(s7=I'̹Y3Wӻ='y2j排Ux]9 9h/{;;PaqNisEݰ"bw;) lB>t +fgJCA/+yi>߭cLDY`Ŷ竽%1q%WZtIߏcUgN9MzD珎7gݮ%T +}$8d ҉ `gvreBb@7~]q +\=9$"ٰMeO"OżxrBLi\jqn휢\.}c)EoJ`An43ͤ`]5$nYyGq$_~zrۣ) ߯cI89+=Vb<@>oK[BKBz CCΙ( P oOWEOyIg +>=V!&")\B䤈O>u,-iDl蹪ܸӛDGpL vj"d, +!&-3X V.sOSRc +xr_ە3A.} mWU5\ +5ǿ8&aE`(1ƻbݒWI`y54LXxuV*g7h䜌+}_+ YxJ.$坦,=qtykWA]y7sgAr5] +HN462ȡJzT^qizNɒoǾb(9(]+@/= :s()_GelDAOoNU"η1vOXrʱP_8 z:;~W@:.~ +; `OH; +Q1RƉQ^7Z0 ̔_?.( C`>? g}sEސ!"ZD@c#*jѶ'qsȐc < (]Ы[W@/o\]<''A/'ߩ+ӍEwqLR;BӘ\]^pw,+(+P'AO.]=|Х?>y877O(Z`FX61mǾiD"#~CGD | +z%PݻǏy{+:y6p7 Zf%m-ڐ=*v6:JOSCJD p`NBE?~[Ν: k3~_ +F~M,|{Wk]T/ ++RF(+ԍUTC+ `/jJr.b"O$}up;@L|KZ^;?zlgw 0+D?j@.y'1I'^:vEe`n] +zr.(姓Ԭ }P +Zre[2;"*Uu pe'D>5-` }`~*(cO]jG +- /j+M (Ӏ_B":'g׮.]ߙ /*'XP +]ĭ1L\Ic W CT^tF88э@qc~/w7@^Y|#QhQ +_ۋ^ZqvT#n +Qs"sЇw@@/nй~=|u?Pt1ߜ,HІ (#ȵl|eEK~S uAΞ<(cYޟae8=F6ΩeG:ܛ*xUo'޾%r2˗? -`ޯ.utw@w=69T-r'<$ ݤ.JJ. K +?w_@^\=rwo5 PaX*pnX*uY%q[SS, yȇ/ż| M (]_~:s8M۷@Lz9+d⫮!O?J&FaD64VD C@GL.H-ϨUTt7[J|juFD+9cm*ʫ.&o5`8ϩ8ҋ3ؤ$"PSH_/wC^o b-JRL[ύ4tP!xZXqpbivy!6|C]ILN +]X`TsC5u QG]Т͸w#|NBɃ@{c3YM+L\ޖrJSbت,S䖜 1U&0s0];3b8!\vrK}u}XU2lJZUrʻF-u36d"R73q[[Wn,==$I]c⨰.F󯆀/4#&+EiC xjWP滧8Xۛ0w*YbpsL[ګSYmmԄy}n͐6%8bQd=dUQE*yHU5NK_J/I_U<'骚.t̔&zpvDkev4YvM X rE^-1X‡op21XS83ԅ Z$ŬUugqnxeijKۄ^qѢfV4lj>a}^ߟVMFԦ9t| VB=DY 뻲B5֍5b$ab>tɩP2j a{kfmh{umuYUI!N^[yޝⒷ ))&z{ iWdNzGͮpnz-ƺvƬa#!D:BRexļirbN7&j.`VP2ё. ,eȫ8%UibAI͙+2.cխΊmZ\leB;_aUӊK6(Kw6%;]ۺ܇nj)x< 1 `Vt䶆OҊxIqWCoPpz8g ,HWK ui+9AiQiG֕l+xbj H8?2M*tM6[@gQ)Y@C -9/z +_9b04\cN3 +\0`雟=]SKR8M]S2jb^ӝMe#8.5E)ti996ѣ5} gZ&/l`[OؖwUS$?=cCK-fؤDH;v sm 3vӥih8'AqrEgdT &jc+k^CuΔ,[[hk4]lc%9 bӊJz[̡ D| Ӳt i*bSRym cʁ_R@~sJ`NXp8$_k톺vv[I-*Hv5=%2)ոݛ#F<:H,+-?e:T +ت]5){  ܑ2{٪- е ["U6R*%ynk7ψLå> 8{z01TџtOOPK]1}@5qɪS/+s5]$,hTvdlf\rdzov@=*s誒//u<`R +dݟjB +J,hf!'fؤu):incӐ*y5kR󴸺g@ +BGMq*1[lo6 3S➭pV!6Q1=Rh¢Y:lB'3wwm>2qi>qTv?rOiZyT_9Ax`b8\R7q76{`? [Adb VV).ۡBw|ꖢ.lHJy%mWS*dCH+B>}MJ͜}ٺ_9f Y%gۣyS }kXwŧѮd|*ܡ&Ӯ ?W\pL#Htvʙsuv 5.vF̵ >fxLڔ__ng{u#cu>PXoY8_/pRg3f_ |Y(i+ j@OɜS򭱂ɲ{&bpt9cѡcs!8{zTriI7WsR|UO;jl} +5R*뵨]v4áP zlrgڝAa=|wG&&:^7Twf~[ń!6a; +bwMpEnCeQ]. 9aC/cB]jr'>v_/`yt&zgD?V~vRZbtm)9%W(]oU:AGV{m0Zs|m֭WQLԀ01?jޡSq"S HL4o:2crlEKtjq){Z|[FGn ʶz9Qr[JI`#!qg 6_z3ESs qF8)muڏq +w'e&*r85.I B8&2IbY$3؀9btURrC'˂wЯ[ķx6cCJ!3]]1a.]]rl|?*~sUp8SݺgsI5"( 8L lvrzHa xK|%mcjk;Ջn 6A."!&/uTrп[a@a.seI+Y(_(pfugeJu m ȑ|߸_}80)nlMSUm((u}iՋjKm +vWÂ{4Tmܓ2^7$98]]-ĩ&y:D6Xq[&zv @`{*rSpii;2l(&l0&Q +IX*V +-~ț@y' ɇZjپלC +';hm{}jjbm阭Irе3KC)Y.1IɲU!gBE=Smެ*'&[G-+{c`KK+xܑS2LMED5뫙(j9eyM]-4*+5Z2jGإ8$)6u((9*RYꇆ\@tnsn`NԴ*lEFJ & h[M 1}{Zhnj,xkyj}Zm.|mB'I9˽ PcIPwb`dU}?^fmJlW_leGK֟V Ŭi{fs B ~0à8t8s|pbG+$1}aahdnMmW'﫩N5xgjH1u_(Zo+ya- \j/x^VTe%M]jnK(`ٙ@=-ܖeUOz)G:X)}hQdZ?T^Xy܉M6c[SjV%(ێqLy{qNʧr."A7$X8bwڃx?DyFhW+=21h_鈹;ږ#['9^s?tVp9#ЭA Vb7 odUČ a71\m}i. yڛ'Tx4 mĽSAo!bKT.4t Ff9%wi3n}U Sjd|Y<ʚAץ&!he7RW1 ;)2!}` "Wpi[~Tl7k56ն۵l:0+jQlm6n}ҊDu)@W2[_>].y#Fx_:Mٟ3؂=*խ8&Z"#]S @}3_lӜzʡaVzҠlgWQn-{آ;\ٛcljt8&jcޏs(]O6rK1ᚪui(ճ )!CEt 㮮v]j.}cowAouTo/hWzj2^_>N4STv%is9Ta_B6A ̏[yZj!l]30;oܲcC~Y*ej̻L&a&k}mXd}/?7K`a.%8CF], \+WQf+9OgsKc5ih?G~K;#Ą!Rz/*h_׊4S T~¼;Rrz~EmHIivdlҒ/Ƣp8b;LKRg)!ss_c-^`V;Gg +:&IW>LL6 +~E)ۙ~o;@#$^|!gbTDh4qhs~A ԫ!fze*R~k=޾`r +=!t}g&l "7z.}*0; eL؝CgUihS+JmWsRxخ =TV'1ۜt, sQb2whGlrX0;[Oi&ztĥ$Z'1{|{N\Pٸ7_6\j`-@7$ȑQ;JBkZx ω\j>u_'=X Li~K-϶>Ʉ& fjn1 +7 L/'~xKҧ;㤼9.}SB]X( yUfe:ͼMKzq#71 ͹wnN3o2 +_|u؅rP6I̳AÖ:r$Gvi!gGJ#=,@.@>.4%$~9QQT[6*Lr;0./f{0oRR s!Zބ oG]nkvORӮH䴜Z~텆܀.D(5'㤤7}j/I}a*ycELs9=w%e;%oүOQbΨ(5f?Rrgaq9ANzaků¸KͥsBnx(qxq-e='iV8& lc%N G*ۓBQ3J:J7XqFPO ߝdؖg2̎yЙpI8h;4(ℝo|g#vUAoSL&j;K(<:ͥ@e9uDJՀg_#|&eW;g:ܪwuʵa y}g!.< +P!tte۾Zr^@c8Fg[Άc}~{l kD#a7GߘGQ- ,A}}(TyXIZIbN#?sYd!-6=[k/~eBk3WJ0TVYƑ-yO:ۊK??oS3nwAf +-e[jμ r0!P]p V0˶!k=O +A]Iğ cY#|Kbq~Ԑysw4~/sf92u1XVԀFR +|儬^-!jI)~OMߝĦovCW fjt Go_otYGiyQ5Fw`6PI<ϿoWN+D]4d<) 9KA8$ U54SMʷIіT"* 0H׹ɯOa#gUV6z_n|Sl2Y@ӌP,֏$`ޛ桂W[CoMlK˧Zi.%3:Q??=N8ښPCX`+ A?D_~oib ـ% % + rN+5?[/W|@9"/W{:fpV;ASS1B`쩱ZGSXQk<6 +^,dەUd olBCc|})7ީ +(Xl۴gE%3\ͭ$m Э'-sWk Egp@ǥNnrʉg[JrT3$2N.9Ћ8QlJKG𛥆at{^ya]M4 ̣cz aZ/mP36$]mqLy,~H6&F^4d=%DA c" yFq Ba@愵, zJL})NƵ;x]jjEwk4`MM? NHkc52Q᫳~\毙_3lO6ȈH3漝imkqwilG-Z#OQ;̀/ zqEE{g*Te܇&JM'`lSR{O'd7978P){8ڦClnac$Pj`vLP55{g *-`wВSL^V7G>eb^~cy7Yfu_\+*GH\~Y`'|YVN =Op0<RE5cS}Vwu\KA@~X(_Y +"ED̶=^E'Y\\+-b5[y]''_Ri^tbɹQjB{[SM]@Ibk΋{Ȕ=>g})}#4ǡ̲n/[Ugv%4ڦ^um8@YJCcC^Kk=lT+*JKi.yO%N1@rDBO۩ʜ{zprf>}lv6/?f &z,.=% QRr{S + u3!A\Lps˥bcW +aM$&CnRʭaj9IAOPx. 9vgK9GNh&g>DXB*yxGyF| +I6ܪQ◆Ib֮ #2E2hF$Hۛgj;f^2%0q7F)rnnLvh3%!1fYwZD8syU6qۣO.%U +~FTE@,V]ЭG65K CQ2QcAQ^d>zsoig9Sdj2d2I$FMbwAw"]4iJk3|c`*7֣"; }똨o|V²ĬQTr>5xH!-I ,udԸZ}3qdc1#Tc =ﴒ\HNjlwZBVqg3 n1j̀_hM)4֛S} {,$1TOJv p^xk?T'u)^q +[_fja}2h*et2{)!A5qEL[ر]aV#^O'Iϋwb:֦Z_lNcJ5 wM\֞}hvL|T o@Ŕܠ28} pCswe0k +`խd- z5[:u l1<ǔ1֧pA%h{EgR~9:5jw +hKBcX,Zȵ=_l΁Rp ?Ϭcwȇa-/W4Ć3!>6:^{$X{!yDMS7Em/GZtdt L<5V4%G2Z2/^WDЂ3)Jˑ|%A'fai`Lgs-HFXFհ̈\%ir~_5&|t!=u[ VcLdPa*buwl⾱KѰ1aHp{i-(,>팣9+sw$~Y]*a :At5VqQ=|d6Zu{f` Pv*[p o=t`m> 7ܱ5?teФs2FjUP {9LK[z#%NbOeR c w;[b3hMzN'iag}pqzvL$=`V0%#S2%DςMU]Фx`vtg;tc+tDLG !w켞KWSkw|֑iibKB̒ |Rlm[^b;c:x_36Xqů@xel[BilkХXA@ Jے产jF}圦[D7^偁g+qXc3ugL{&`GK /S;U&`_:謝%|qT+ /v[/*/;Gi}M#\_]>>=諽XD=TS:W#pjj> {;Aѥi=a†#7_}%T&|˻.)DEU +X?/O >\j%/{F[_:7׼o7ފZ}_8Y}EkrlѾ=L13YkK5A9n?5\)^+-w1XFP&xMdV베S }x*&Tnx!-&@ƴTđA۱}c@7Euvzcf6em흫Sh+дhe}w{o^o{(4'3)DOP[ ];F:zl +xBpnJYT"ip5G&h#sK$(mH8cZN4LD)?k'vf[뢪{D/s LgSvQyCOˣ97?]]1n2*_u<\jNM,Cڐ VRmJu.{zlOV+)M/$ntRq;<8f?щi9BbHw 5dg37E|,\6EXȦps2Ϯ +{N2"-5@?׮G/-7W{j_'לmz{l=<,]-UM=xccnT@5ppIHV[/}ͅIk8:N8Y#;Tm~ĨN>V!m!SLEqGIjUKkZJIb`b+lZX~P{5 ،gd#W{[ʫx5>DYC~9֏jX;@MSO<`8@g? Jy|혚; Nm6^(l^0 +.jеꁺ-7>U?DGaI>ݵA=sl2:=P[PܵpV#t}$:$`͂nS-:hoEXtuK02&w2zC3rdŶLqP) XM~GDT̿= G+z T]i=_կ>zU}ҏ }cV-X"Vy,#"oj\-.2AB~=<\{9dW}G LġSU9<ͿK5$kS 6isomg>׬Mڒ@Ru#Ѐؖa+--&f(K"hwW9 ć۞ [EbzfsW9dWm>$}=-:HV{[Fڒ*.xsC5tWxv__,CYg'/SV~H "#`/T8UD՞ajG,y6W[ +t챆ړ˷&rzm'`?J!9!9x#<όQ2/BT] EiCIDSL ͍P;Ox@ZEr2Ůxh&unMCߘxYߜ#~ۘ'ZYw71+mu۰mHNա%)Ef#c:w1HA[Cwnx׾坟e#nM\OFK0տ@)gYe)O7[23{ؚgƁ}*ds^lK3z3Q u=qξQ}}p'@ +5?I_zknMv>qKdsʖwɾߘw\g77_PoeZX'p/oK>E䄥F^UKW፰^L]Ȋ9Ye2; ic3^&HM +|YdTaieSЛO 6[14G#\GRLCjkL%M!8yP<<@D>jodbbrxVD')xdPg<X4JOe^-Ko5 +9Fܯa2b6N:'~-3Y={shCFmov1-uu5#4EXkJ?dw?dr-Wǟ>j +sݑ0su_=c +jKaµ/w xY⛫&*Q5[r택5 2? }6x+K^|˾`ݛO7fAicKSJJ=m`>iˋ== [B{Wسc IWM fJ*iٸڼ5 kT]02~YD@,baW^q+~ T>kN MwfG;_UW<}-h1 .8>'{KxݿUgVh-=X#84=< JU I;"m92{OK3a>4@ϰ=UWf_@^¿Y*>k\HKծ''3Sffޕ`_hg}t螎C_N6> Y;lݞ-bhBp -5vϞٜoµةxT0aU/7&XEOF<~ v~e}=+dv<"`=Y,SUZ޲ <1\ݓGV&)#6zT)U2z^3{f Isoǚ|>[}{G՞s<  xG'V2 +qd"Z:¯ 7*wW3;#:D,0GqKX^G߻@Ujx-YXec^qdcP5Wx/C־wr=*hM*26,Ayow{ޯZ|wŖkes8Klͻ\yTǫ8Ua֞oEW^oFZ +-⪯Z{9[n@RD}Rr-H(%%d`CF ٨}+2a^=;+jуKrh9t]>oOZF,?=Nl)¿/Nzgv5c#0с%Zo9#pOVGQ?yDФ:4EȘ֑q!5/C@OZ|Î:4ء=Q{6e[@kH-ZVŕdJjh͘dt8a[ڒ2:TqX ̶{z4,ǖk$V{o=;4OEhRZ7Fb NC0Ƣ[ yRJO @~GmW/;o>IVnGѾF)ucflxv`u ޅYh*p1#RvV=3gp(A:DQ} w 3ڟ(_B.˩[^~>K\_ٵ7lC4E{F͛/W|84{91]u& jzڟ&:]B6n8*}>sCwU1.~|ko*V&A'?OrrR{qww>uWwkct_s_Ra=#RBS5Q}SNNquaPJ+8'ۊݢ՞Q`-o̜}M>Hy^TiOV/Ȉ?8Zghڳ<'((,@ >a> 'VlU>YhήH? WT{¦\5v[P&mӄ­YTe&}s2.F Iem-uV&qg[jK;-$,&9tD}SW%\ˠ &) ek3V2%tKԞXlO F!s?78v +2L 1+qbg1,t̾)qb}tp'+ <'x v1A;C$>l]rosG2pz#fWFabZl{ZU L=h}+|""ZtغǎW{-lM>YgzXCߘ$t%4֌/4+kc^iTFAS텡O Hs$u$r[ê +<,3"#Uvrӭcm#L:{'Ә !|Y?شYbYvٛOI9NT/1/ᖥ4/H=ŮN:5M^~tw/EM387 JhG +,g#O,,f`!>?/551C(iJ{p8T|Bl=b]xiIQ߬ +u~K<.vT,OvSuoHzo}&g8 +[467HQ\w%98Kzwqk8>yEA*9ޙBWgak@PJnlMtoYx ,c__,n[Fm K1AP2W|ڕLS8&@gQm~IٳPԐ UqʮnIYQX!ek奖znsNL [9ࡷ<((CT?>ؚF=- )`5J#ј:輿<,Gsʤk{9Q-O'7H_= 5^?:mN8[-Yr2\`6fYk_d)؏~A8虑Wp]tV?Ẍim;z6}Xg"DrDwb&ټ#3vḻ(8i\pKwpǓM&3+:1M ){Un;CeV/lL5>je=yM8/yD/W6f)U{&fn.B*6>QC2JӦlaH)~S,".q!7%+ ZsATk3F^Õ)Rezᳯf;3c敒|rtMCR ?=<͏xOcЫP8Ў +s!hMZUa*Y Ir5iXwMm3¤\ast[W ;W?zsJl2HKkzSFk;j$/7曪*,:fd|UwSn ιwRf2~#6Lc_xΞ{-/HgBbJVW yfZx=5 eR +_|X wRXYP 2 ^eHgs_-Z_US5w6&ʮWzK QUD ])lGfIШ^lN&Mj_=RqwA~Z1Sz}[n̺=+9 ܘjO2btفQ[PrB*FONoc߄쎈 +ЈKx@߃z*ʨſ;3q7?h`}_p HX(vyHC/Q*WgJyS߽*|~Oq%;2dWrwT 8L.93wߨ?8z drO!Rvƨ[NA|pP;ROY魹间tQXɂDT,;Mˮ4{ej`$44=TbJc+$oڼ2a|fՅ[s<-I e~'F[x3 =3K,wM᳼2bOC^vwEO>ө1 ~h';LöYo6 }Goynq''TxGǀ{p=W<{ݺ)cRPQ{FrUs̡zlPxE5sYɐKYSk +L35FGu`E4"7!!pY+"b <НR+%{> `!J{>ɉɾEwHR-~'!Yḏ䒀ݾ@[!G Q؋buV2N)@;+ +hM@i^s]- 8d$x<#Zk&swgҖQjz4]qݘeW[$Go.we/Tk6T|ܖ2 8AWAe&"ev +_%f;sΣ~YDU\THAo(A xLPXŬr 9sGGn3P&:C7e1xnC녠놮[kL5>I:ry#<~BCՄzX#h޵ÕG] mYW +"Fc\y]5aC{W&;ue"8zدֆ4dP@k=Ԉ<EjgTĄ)uMnV I)1tB`-+jJM;\ٳs'P p$WhH4Б&%c V1(m*B_%#X72 Zk"[G-xH@Gh4OXTg|{O=u-\^|ϵOr3" wH|KH}=:tmcC>mw{(fz]>=\V!Ƽm[^fP5<5rH#$;!i*jٕf>?b )gtY^E5qx61g]|:u3Jp hiU:3h$&Ү2v{So7Ѳ7i{f*l"n-:CF:O/nИ/f'6!rpꆤ%3h-cKfHUgOHؔ@lGxӒc@|.Pj3: +{IFy[Z6ʫ~ DaP ~5t`?Yx!EeTPTGGR\[Eͯgn̷VA#^h9 ]V3;f^ׁoo&_~J mS £VTa ygbSzuK[Wqѫn}!i!YqBs:K.h +ظmD]l޶quOEׄ;k]4P`JR}PhzP@l\*ȍF**`dֹm Y'W[ {+I zf- )5Ezk_6qٻ6NjD=w)q[:RspPK}WA}H{`YmIrsߢA}=#3A9%^f[, z*Z{ڧ?ߑˠԧ 2Q`dfulPM׶$4ꮹg8fvLxc[]5aRW +ޒ55. ,^]B.ؒwa%ʙ&qǡk"i<\-9avN*ϵΌCkŽG0pf H3.PO#"ہN%\tG,.S/rG$ܱ<v]QrvHjF4]UOZ槻'ZG U#KHӬn0*I9o%\#TnWϢe:]pw`g1b Bbv S'CEk2zk)'Ԅu12m_u+cB?p:RYNN+lcHX&,Խ,`8etkW_ZX]`闖 +`닄=;ih6^W.9Oӹ|E0eW]FuU9&XK"*{pΥ>Q$yR8۬*ӍA$Ҫq*EP.A_͆TsNwV1ftc3ѕ \HыY*xndS4EP4C<颩m*y\WB<[_BMwJbڧyں)_+]ATD͘Z~w,v<0!4J G&.[&ٽx=A&8-_;hWvoB@cP!Eg឵[;g%S|~4g8O?)J||L`ot%Q~ Ot}E}o A{v[`8'%9JuusQ|q;g(+V Xihm,~K/ᱢu%%9igoQ|ÒTsn \T-ȋK>C/Q +y$Y" ꜿPU+ѕ+gʺH1jGSzfh٨G [&!-#?eLMiWa.TQϡz*9zD}YkY13k c۱@;@A[gVxO#}_ps唊wVܨPVDs[c(hk281dGJ'sdo'X+PN#pv睴_=oަ8DFpũ^6L!-}kۜ3%dUڪ|rٲ-}Y[fNmPVzfu_)k^~8vKnv=:-vQ]M[W2Guj]jYX uT' +Vcjgy%Rΰ723WǗ~?|~Hudy# +ʼ|Di-[7iՈrk5Ihnƴvlטc5*ʏydB 8!SB2;}I,;!THm){{ǘFbU4VlAɼYo(R 7i9R@|r8g)ړǁ>{q~1)z[rSxƋ棹SVVK#Rud7Sڷ]Y\=@b(3Bk\!g7Xc"6T])qxܭ +RHs2Lx+A8(qI?D^y@z.Ջћ~_y5:>|E:5;z9 `,vR}+<'`ý`kl.kQ?| +(^zjWM[ܢ~i0QZ]Y )0Nx ~ +On-6.n?TsD_o8xޏp%Wm*M&1,)Ѷ)eCW^mBx]6dN1D_AQ{im׃"˯$5rhO'cz:ZvԦJ2+&ө55Ā~ +d)r-<懨?>rLٟt- w3%q-`z\;?ުi;m"BI 4,yM[o?H;е׮wHw O%?'wS>q*f2z XPŔ`Y)5U/eud`sjز@^~#:Gto?:y~H0Boh*WGȱ/K/lv 7*(qu-4<=v'6_n~ykቕ?EPnҨoNڲ)u zI-s`#/yR[`,w_Sr[w8Po?$gWk. VT5i17a\IԉKS0MݓXA>V<G>ǍO'dA}'7^wf-eѻ\DMS1K2VV(E_YL_WSBK]2IzR*wK!&z(OI?f@=&|kK6U&mhjyUQ(D'mw6u[]:dI.I KY?횋73%MKfk:l)8$ k{<)H_?y;-*zDvӃ؂z' [)Q슦;U!81+Yby`W69>ng9뜘W6.1) ^G%#~``WFډ3I+7mYLbě%LaSMLW{v{p~Y؏Q"(=S`/;s}vK(zxVpP,;!,PTLFEy)+iA TwՕ3fT:*20Nx(dFG{;wԵb^8AlF}6z7u62ZGɆZGÍ"%/hjT5U@KO_GgE{^t- ūƸC5]W)/uq,̗ m=IИ]>5mmA=QmN(eYF{Z񤀾%-qӪvbgT1X#ZZCK(  (| +O!,Pd蘤k*6LdwV讉kmmKZ- Zя׹4KkD̤U1P_^g(!D#y;\%5mH@MnTUzmfNVTV䬹Vaf(+ΌSLZh( 6b5WF޺1If\&H0"-#M{ھCCU񉑜~0 +. +ZBF5cbU-U͒LHwgv ֖} 3X`|dU֋[{ڒg=c趦|}wjn&Nt>iZީ;*a/Eإ&5Эno$rfQj<z *=- t- rf.!/@j+c3`b:1;ZYŏtB,>AIQT[gxXbe㙥bDp:IБ3̢#=oIH]067U]5 2TmÞvP1|;wUYR]]K:ui5+#--9F\* \"?8oˍ ؊_0#&Yvpz@_JSBFNZ5ib.h˱2LMr&ϗW[O[/O|8>)5cȐ\Z+QRրLD\UtyE Mz:њ,}Q +2_LS"$5 /oyu)q42\7 +mM֎&!V>|w,$I8i:N:|mr0FM;6 + l芺eh}:)a, +#yv ŔmGhًĐn$,IY+2Zʊa_͐ֆW_/Z#,yiC %;4z̄hWGbuLZ +Bz\?-{y>Յℸ 3_ &mumkw5YGvl,>뼜i?3e& lʑhb{ YU3rԍU[^R Q5|V䥈Ѳm%,JC td(;z["7ߒ!b/)f~oAxNwx+M7ؕC|qdbBFA#iƚRެ\0B~kH-rb֬1-e\,Wn+po:jjƩ`BTU/Vd]-,B8OY| ŒK酧sJlicu)tS@,{Z{0'-pV |[(kU嬊X/tYEADiek0Gs GKcG5=Se- 6/%EJ[Mkm9~m1*@y)"h)s3-ral'i_J?ZL}ow$-ym*"/(U iKJKZlۆ)):j5?8Se%&(mIևޤ<!Ʈ# !]IVYת0m أU >hMJ9O L]UbcVH˺u_EϜA7_II }1;rRԶ{1rK泥ZDKCZeQj⁁XML fGꢨg/k7V<qv lUCv(HQMKJSc +lbK>6Ql} r,)g +endstream endobj 32 0 obj <>stream ++/j,C )!PW/#Dd(&DyoHp!JzMi M +Yc嶔}_V:2ޯe8{_mñc-EG:Ȅϸ):‚wT)jʷR4ߓ?ӕb 7 xϋ:l/Kt`w`m:r$e70a6=oU ʚÅ ,lė~ۖyj(MÁ++ +Dd}>lìQfR7uaMsa}6S(6̗#E QD:꾹,TuҳABM/ܖc7.OG!IdRO\gNHS~jn-= Oʡ69HG˲q1B_(p|UTf9BWt'c;6/NW%=$ݐQBnMV<3V&]Bh[!A=ب'*̦`dH0!Y.3 qȇUwf(55 Cl3P)FKvbnZzqNTU또uOۃi Fbҩ{d]pזT?'3l̡ߌ1R쩑u[~9P C3Mi,@dM ҟ.#}l䷉R(9ѦDF Vqώ 7vu汔 ‡>[EF6ܮ孋s;r^u^αrx =\jd멹NaY0NDRo6rʦbJqa׎'G':t'DK,mc0P[,YyA QBgәI=6r'fB݀V@,5!L>2@k"ؗY +=Ƭ2G⒳ol$zPp4ע(Aq\Ʀ:yG xu<ţP࢏- |e_e[D=k%xc˕^מn$Ft"l2N֖-Us϶?+AWqgnx"%iɩR|w.tDKpsv2F}ڗl;Hz| ¼YtTIR汾0lKroL~4_`0KmA~C1ˆ- &hK^hm30>Q73o7@죸m%>b*өy*]O}fRzo4Nj)r QD`>&ZwMIJ8uk(tSLHّ1 +bRkҳC=1a_Y"&wFgu1[ro)+ݙfA/%^|R{֫7yM屷G!wқXpo];c >#V`n;ǩ'b}w +j8k3@!s>?zF]N9ANs gFB"PkYua#Ŏ$bil$R\q"N5=]Kw@!BԁF@84T6OwKs^#m85 ΦHyFbޑ}0W{[3ߜ駦+BK;#/u:ԑ4}%1jO滙j#B$ζc<_A'30gK/oG 6?X쀹X%=iQ/i!dm~{~` +Vjo}9-n_ە=u!m48^}^Cxl^€j,d<ĄX@(X{rj/M$Xs{_"?\S2sF99!ᡮ,('춱20t9^&+( a`{beo +Gy$4檤nJAC@.Nj[<\ǹ< Cc󎴱lkB-.t1TLks'.N:ޟeQ +ǃ$;=O#WW%SL8g@v!z-J(Ř_6{!PҗAWu@(yKa9~/GV95I|j]*gZfMt<yQb﯋6UQx]ڻ3lp E^dc)+񑞜"~kI~nC=hMQm 1)ˉK>ˑA~vFPAm)]e?S8]XrM<%=1Z,.?PBBD)y>`o,X +iGr޿ObXmҟTkŒߛ >U8f S3~n`@)YV_jntЋ , +m$RpAE!o z)M{ݛ!j+R(I [BRUz4 joGxT]]9sFhC~s+oM&&tCu ,qiL9HU QvIɉ;ׅ,-I৿ZGM5:j44dGl]7U`=e|])&j{0Hߖw Z' R^[:Q'滯v|퉡Q~7mԒJ {ԇ=U.}7rNu.Ws9MZj%DK d^ gҝ{@ӓOSXߵ^JN?6ٗܙ8rّP;#BS#qJg暑nڝ<lj͍rr'i=eԚq%Ux5?-k6RDWLVdR8qM&p3`VLM >~GAI F20 _ҫѡO8?^9Ӟ9ʍxq .N9îofign# gEQt,RGRkJkfO~ړw<2As{#چ%dm>+Cpq.BޖcC5:@< Nύf Ռ̫=1smce0aK9.Wx&s*޻#1DKƓjȯĠueP_,"z{XPk=E 5e_M%ݟix4v\cu{ ,p Y/{2\xKk-ׅF0'X~1獔|(\ kEBRcL y Z>QB6=Ɨ!#oW#+S@cI@L7oIy)ywD!>fd s)y?L _kܝj"E>%/5me9٤`OKGLC;Cy#UU1DCդt}+A*ܜZ[JD}} +@xBK:f/u[ä-<uy5Sv6oz!:Y +X*‡5dM?SsG_pc6m6dȊAFGNg|Ԗżk|J'ǦnɨĪاzrwCmxj@ ['&6"B9K v0U. 3 bR,륮,e9'p7s" 69cAL|<[|"tM}yΗ[ "L&Hz!GmIW,gC#&|[UN&?W 02HO2mR;Z໫ +?,wg:hbMEI82*EIz( hX]@z.t;YĈ}*ǮKaS ` 16a\\ktM^++#m!< h]AJRU>Y+ڐ1%wi7wH~7(?iw70!6%7gjNў Z!n-Mo6Ep+@t]C=%l1s]BoCq&\뙾R=ߖ`d\ ރ\9.vfk|gWE㪁}Bxro}oZ-zIV<)U1w"n/&? +yٛq_ +97HƮB:Dm .~%\}Õۥ΂OSڼ.?!#n^QXjwʇaN1 T]槱L&:.)2 !$/?NUkЅ.b'0> +BMO$d3SgQ䍖Mw!+|gSZBNoW:.*CRZDh>djdbHic);\{{+#Xs3T;!ڗ<ߐt6RkK} 1Ӛt&%_夛#Q֧зM N{ +BԞ1VRRLHօsё5N4E2xǶHKSm0Wo 6 +ڮǥt%o)CM)n6z4N'M3ȗ3dȖG&|@ߦƟ9aJ]Eߕ'{ 1gZz;sML ; +׋+`'SmsY}!6do}#<ε<]EH!ioa}`g(rOÃjr24}\LJ؇RBLs醬ׇjJځ9.NB u. m/n]ʘk{n+˃t!K{fӾujdoI`^["T𡪂AKk@8JӞw܈;2➶2OVg=ĝH- Wd=+Жf?&m ћC(&+. m}܇$.L +{P'G)'],x/gGw- 96m@` IgzLm 6lJI1f4<<^}[݁96 hWy01'gE.rVdť#l؂SC4>I)rj!.Z> şO󯲊2^fSf{Q_^w?Vs&fKxgiC*b} ZWGc;2bd^E5UaNӭ/3>s=ysgᎴ]Dž8}s6䖒j[Ye+MxrdƉ3BJPVex5֓4^R~4ۘmgz! +~J澦(zS YBBwGME³_@;o3>Yyv}IM^yiOZ|ⱉ=f{&Rxd^LZȐ~|CI;S e5{⊒?r]a\<{ nkblK] smX}w!z?M^}O[V+dd`*oLEO=R2vrjک Qbg _lK+BB*Rk __S](C%=sK ]끻Or0aUrhS1\U4QrgGpf@o-&`S ;+kx wNtLU"Tc3w]8^tfdlHIѫBU摁mۏ򲏐՜0ݸԮ<7W^).>3RbKUAJ_Pp=\1']C $H0>: ۔mBO%!1y 3߁ hY. I- Χ `sK˅vha9:r_S9<E%^^}rށR|:٫b0u0[raЋI>d?tQJE_:Dl|^pAŅc葆)A-@?(ihsu!>iRD4ġ mU"6(﫼5eO %ώ4E )g }K`$s$e!#qT}d,gEPmiq +jXb3vQ 8$J\ebfbV_Wٖ{}I7rZ%=eI +cKH:j[RhbW= NbgW]ۃS55󛑞wudGɱw Mo6vQ+HwD :2]*y +*$vnׂo2mB>x ]0ܗWgC ekbWn܌Q~>Fg:j0:x]T2ӜXMMH0)S[0ׅ $jgVj #r}51[bU:0/ ][oDfᑹu\6prǝ'7l1!}\D){G]7s-w:i6#N(:0`73zƮg:mA.\%;Ŀi&̀SO%36=nyrGC[. +83 X'&G<t]Iy򴷪 C-ulN t, FIJJwύ4?4䱎3s톸X +N۳uظ)6||^rUOp6->vG2eS +ƪ==64,R ##Ѕ\7*@H>_,?+.1{NX@U Y.nf %!|()~L?17(k%y2}t 8|5D|Hr9Q!#-#'شv@JWaBk=ϷDGṟN(F,RV%m1~K \Wz?*S, nH)I0:s%^/.L}۾/~b&߱a.񋽩[2u1@Q=S;VrHOO3Vz-&뒟X6%:DGL<1JFƺ.8ar_$XEklWӑgK{*l>PK{ähCECY !{Hʺfu,t_s5W&7>2_luğJ]8]U}}>#&Jè!ȗ- k[0ȰĿs!b_QҗlK~-1/bCU"vFk}eai5Afl 8Wv5wsq0JL}KUs(Wrp豖_϶d<_ܒC<:dȟ \KsŪfk|җ?zu]F =lYӖr45Q#s('f!9mTLY0=eh-i/5^{$/KkqBAֺp9->SZFzlS2ׇc|;ȷY:r)KxwKq |ȁR}X xrΡj^#w[Yv)Fz8 7 ||)m(xg7ߕq9yh˪OƙPy5r,0-c7G[jZj65 5ji&=\K˫B~Ҝ2FlAG -%mmd%hQj7>܆~sҞOXb7Ņ~690]65|EP`"!b7$Ą!R~1*ڑ k㟮Іo['Zfޕ&;1REM:2 d&SSҢ]a,|[ +U>o{xt"k(eO'DOkw:Ͷ8Ͷ{ + ǰߧ .f.S!DOHZd0og04.Ä_ifJ]-nN}vGڊ!\ؑ}D3O] ǰWgB7F٧U-+RjTgߒ1יﵯ^ X RZʢr<.O1Ǫ@⏌t=%A\y$*L_+W}A<ђRcp*{e7W[fz)Woov3/'4,p9c_T7r~ҋ1֒?-e ,o$gM e, Og9˹yӗZR±vBС ݑxؔKs)uW]*BnovB?}Y&'f>ΦdnpsMoDۃny@m s$5aQ*P=9*/JXB,ҺZ–9H +BfZAWg\6;am˪5+8)3}'d).hۀГ>ʦa ߔ[eyK);< ze)%qСɦ)'|gWanKy{JrֆjC9*i'F6rO Q&Ž깈e13X܅=mzA-䦩<2U:rcMPw]e8y0 +n"i+?LЖfc&{q̄|#t>'_NHG:RE Ujfz1acIos¤O3@"vGa¤͡χf8g i)/0!X]K.gl@{$AoT 8՘fG}`籖j`.g˫+jה\Њ^MA\ք*һI6Y&:_ށ\1 iQ69nV$؈c)~lXol,WCOq )4XB>^LPf,4o tn$Z %. O'̢C39d~eA xdBֆPt V;ϧlJ排#Gxwe#yGx~D1eOIO^"mɉr] ++/G>5~1^3#Wa˝n'Ð7MwIXV@}ͩog:=TeEVyI_C(oME\CU5PZ7E"= lӗ8c (Hz;:%'"G!*r܋\;mKz&r掊%5Ef^ѾhKsƽ;{iiGVMSU]̱0{c5Ia01fi$"GFjGA:5pJbއapj(g 5"vmCMbơLȽ0?Q~SF˱ѳ[{H.;i6.2'FZ q]VYy2]rf\HQy.?J+DEM˥\ZxƄD=SQօG+/N|hn!umte ﳥ '&ZliɊ0 +s;=_V&*zdm0WYsix':|81„Kfr)' MEYNgtUt\t6N?9,sܦc{^sYf[R_)q1v=!_EpH'z\]c%l >.5e<8j(AxM4 ZfHδ8sq/O Hυ(YaFL;XL_z-xb:OI[[jAЯ;3 s\OV;"lKv%Sg:%tg}]C#M}g5DWr8`t|BLtƮ0bo77d={r\Tk{5^6?qZ觩6t๞0}8'؈31}_̖teQpυ}>53`'hI yp6Nȱi9*B}x8F;32/8 !vgddj*6>?{G ORkZ#fvt'By/f(o{vݛ/v7P0{w/2Q\ba$p^ ԠJߚ^\z^[z<;8h{o Ph˞@]~V'U_pI ٜT.⯦Ҿ[67:Zbhrp>t48KrU*^OEoc{W +jePٚ&^ذ SJkB'O;I3kҮ+3:Njc{t5 9^ צ鋣vGOo#T0y)vc^Нu\XPCkX@_E9X6duѨ<6͹CYݱ3Pᩮskz=%]W~wK|#?xr]w+v#MW.*:.򕗰aQ9Awݴrq}zkIִ ~ } ^5τ`ޣ.,e@j|%0k'A ?B*V$;7{A bGu6 F\ 'IUc=glxu$s{QD06{O@ߩ%EŒ@mjKG{w:n !N#ʏ%p768=ce |헢zjKU`Wush5$:nq&rRN>;jfJz=^(hCbE`SA&4Q[p8ؿ0kY`4}Xu8oa6_N86Z{x/۲ǹE!CAsDM|+owL)`NY1oW~91mٜlK1aJ^:As x-l5*0#&M2BZ pxk\м5%lgUnSoOnjԆ޸=/Zy ?z^|o11Ʈb+B922zr}PqsltLLJCDU) >8懭G 3#f%-3abuCwI cc~pڄm&ePXacwltDCiN FJSq&2* L/f\_9pF[WqoHFg_yr!6}VD}kVJya3w t?o=:)߁&?T + S&Kڍ~?eKadU%NuIYYT11u}30:t ]wb& ǯuBg-bF\*)5yBDmǠ9v]*z7Km]_]~s*oQ3.>kMM3>G,MqQS*F@DR~7^}& :ʩ>%Fo%1Ѻ6}%cc,;W /z_z:ְQ*ZC I c#,lTŧ]| ] +8i 3,T (x09;KB_V9˜Pl- %RNñ=lx*Z=lH %o8]!ÀۙJ S `sk}[V6NV^/-91 +?] $F {>jH#Nj@r[_>;\]t=r+ +ķj휴J81 9,EE?%'z t<ګ?mP{ +vSX'A.i81w~;?]OEԴ{!IzY"lLoL pWFw21W8 ؋;zjSD`kclHegɺ5AA!.Wμxac^RJ)*$me}Uw;kWE%Ps{ݣW9I@- ܒHv0*\$OdCR>3Aq{\1z2.66b /O 4АWٌ|X/O=i3; C.OZ$ {J^NQ煰)B} g$px6iM!%ܯTUu>q&ah +~_)AmA,4Ox^ᝦWuBbR 9]~R}s",z{X +}rcPgԃj^ŽE S*>o#/Ɯ!O+Yq62:/kąKؘ`N\b^)$LjAG%urdѵ+*ZC^5 +򁓳 {NmtҳoU]z0P)ty&X ͛cGg%q;'@Uq;6=P_ܸBp?m.rzlYMݣ66hg6J. j327gūks긝%[esꄞ40|8،EDA2O'C%'cZRmE nc +]xʛ#)3!破]) uoG:x1'8Ooؚ&y9N+8O(~'*N“ItqYqPksh"EQVKyӽo=Oھ ͱ/Ӽ>k1=%xJZ]pֺ:N,ƫ#mس2iX=#; + UF(7 ]޷..*E-iI=<`->Pfg41=E]{GSaIǥ߮<:j0Wn"6.ԑUHJٸݗRFgxݶ1B(;a3qr{P )k< +(iC/AnvU"%qRG7nOl3TO+->iv&m C~-'av԰a0bGi팑HH1 -iK΁;[ +P\|)8{-LXU .M;J8gI _->i8row}7Ǖ'>lJxQsKK-H.>7kaӤGS W2{#ec"\<'~xɼr[ qI#=mtҵѶ9p 7sWygz.+Zֿ)RU`Z`zLI`Our԰3 $asiU:0ML pc58:=0ZN&#FFY](y] 5J.yde׉_J*tw$Giuϳ,7Nƣ- =zU,÷#5K,>jj\'oMIP֟ޱ + ƯW$[Aoъ>s<<>A+ Ag>'75ưVƍYiZ$z-Q,`DttLKnh ˸w"a!d4|L 'ڥW]G:zg)`nth1Ua=3)n 7Q;NPxy o ]xp=)%0+"?E| f-qKzC*b࡭) 9W뮫975;C#-ǵu[qәOo"/XA,h Q=pBqBZX]ޚ]M]@}llBo )ա9vcCf"bTnK8ّ0i3ѲbvW@EkiPA ka w렂Zp)2 $Ō @=0 4 : CJVgLC?l8d;aj !cFRrT'Et7[ _S/xMZ8}~t<Ou{mpsmu CAޠ'=?yu|4T߁"X)ZMp +{7: _H(Q8|s{| 罦//Mhqq-C'i:NQUai]& XA3 elŘ95 +م^`Xυ590Zff-$c6u/mn-|sD<8]Պ &`+A5)ac! BA6t?jn> t+rk t4O/Zi=&$Rk.u-KQTѻ2Y7qYYä]"HXyKKXaj{tĉwtms [=EmxnYesStrz5bEnVR3{sNâcx'# +zF7#Z]˞|H cbEDG*σرK ?c7 K[ym[w=DvpauC3,bD2F.2 9at'څ]DKYa FHn%ذG5BT(fT明՞4riny\Zo0jySpZ|1JA7Xc!tj̣"V|jh-q 6n;k:9~$@'In?)i͎g,l7 +Xh@Oz5=>hZ?~s).gZZ;UR z7&%soZ: uk hܵE@HyȐڰӰ)3z7 Z>2,8HvTX3ڸO9P8/o㛄y)c%7]BnD/"n2kCj)1d5 U?XrsmY{@&fb~>t0!%i(] = ]~[.X[3r2z>"Er+nЃ>Z(&L2i-~Xy ,hݻbq VUk*jcF9בW^[ +kh /hn +,m {A,E"~~m9W2t;F,' WFZW$'t\@l0$qiM UI#4i'e]. ]Tv{~îG[Hv%ⴍ_NYI569[IX3[+ q+7e2::df)ui|qP-K۹ϙ;JFSPCkJؘcmZN[Մ4)󈑏M@P ۵$,r>S.kY3YdQD,ʹ;K,O 9? <+8zL }Ij +uy7 $,|L[Bl O^*|Nz,I;n6&FvO:t3ғzwǥ7_!D҄#oadΠobӌ: =C9v~UfzWw=Q`ykՋ O9>q|sq%a 踘IH*IV}B+4SY习 +#r/eEy|(JBCm ^P#si~q%>iA?Ls?[zz4c"l,xHMڜ_* +عW?lwƁV]#^]|rRIH( !['b/(p+ :|,bD. *u 5 p1˭Gy)wq-xلԒu20Y7{M"/%"n@Y@N/EIi;a[lچR =ޥև-_u^ko҉ŦGƱ;+wQ{uyfJxݕGi:{jk_1pi)럇_@ +ԕG,H5qzf6>H.%#4 [xMIܥmwkw>=ӡ][=_f~Q61 i#6G,͛Y=3s Pkj ާ#z + +Ye]Ćy`Ll #g~PTMO2qk=*~n;,g:nw?I'@]N&^+! -eFfL|tXE[|?Pf>>mQL;4c~\yoM_%7l6Nv^ϋP[^O$k:89PsY7 +x;ddo A~k/0WRSS65N* +*H7f&i!@_|}h87@Q* ~}Uy.[~k ϱ{ +l߭m<=/Q=A. ΰ:!棗.J<+)j5!6 m #`w,o~r᫅g tI;*s{Nf9v[Ua%z\뺨UDϹӺp#f$.K;&P"R%,uXPRsg%FVZxRS~YvooE0¶&)U`&fw (P&1EA 1{q{`ނjb}' MI(m Ik5zRcn\Q@C~ze\tǍ|J30rӷgI%yZ눤OsY>nN+D^ؙ2o$LkS?&@}+Y->:-;csqnDTl JUh[xZZuqy@w1!ղڳZsLu*l=G\ +3"Z֫h\Q3P姝S}q<A@ڒsY*W|~VȌ Q #z11 +YZ}RǥM@+Bqpױ0΂NQIX4K(v>)CI[Yy}tuqDa"J:)V17VC8sz#Soy|3nnH V6~%:6$B΢lhgQ~? 33 0/ lYv=,";7&//5)g4+ |ʌ,|/5qћGV_7 +eLRG~;ic>voI6s0*O18̮ ڰ(`XRA +h픑ޱ=}b]7%_LdhQtko[M.ߵʸ{v1ۯ"WMa/DBB"$LZ2}dmn_xI-7cmtY-;v !@RZ"ivRaly8R }%2:^후Z~ꫮvoYڟ[BfU 8ŁEL[ +Lw}1a2S.-}ҝe`H[l뭑ca-bĀ{aVrvkfPs~785ZgӒ_-x%kvq^Tf{_W~36FoNA-kEZy+\A0*$ҿ,Hd9:tqՃW~7P{ B.t=$FQ9+?1fV''Kq|wP'?ֿ q1Ν:sS#aQ⡳` ?!S`?ʆCϝ>}$E'Q'iPc )Xm~5+fdteWQ+bzZSMD̰ս5K(SsNEABi5һwmN_˶9bilXԒ*IHnߋ2^47- MC  +zMR)DdRj(1n۳c'J|MFm)7:ZKŦbfBh5zss!bv92f.& "z!\WA.]'3^LȜ“Ah395ˆ/RjV[Z+g"8`7άi>4*>4etbjDhI)?c2WgX0;sV 2ZjJmTnu1-eݘ<1Qfi!lnd{\0JIPjJbYQf="~" n('z.jZjc-2N>5S6.!c`bzbe\C,OI5Ia26.&ieV) +;ecr.' IO9[,/R6&n&6$ĖPV˼ +bnyc\iX;(KԸw"4mQ9ddMљ1:fzK\%ҜrV f>.kR3V-c2Y +iȨNJNeܴK"L]Hˀ8r!`='grRG*-oCMN0ca3fjcˆ+99%b_ ס&vI3[S6jsIi9h1=;pyg;;oRv!'Ըk~-8aw+ʸyd@yg$8lcfr}H9Ԥɣ9gM.M̼*sqi11:*;1j]JXmEَۊca=U8W܆YOj,jpDA9DGO9贍Ok'qHyr1ۓZyHCM̞7ޑ˳F{601ѻG[k>>Sy_$ n͐L11FWJO!/͑+#& }cZy|-ZxSRedpck}^wQ2ۼӽg}]gjlM' $ȝ8xأemCw2IJOڒwh!CkOXq2av%ub|JNr\;忱n::)%qjo|-8JT*ǜOjX|QW' i>AdMڬs=m&5@XvRG$HY 7iŊ[7szSF.b"f} +){vj_s`*3 +VW48kBs¼C@H] Bf'RNYHL$r_dne.17S7 +?+ Gn͝%ݜk>=FLohI(nB]hBHA'$lxIIY`4DQ;o<3qa;w$,,DCRYŧ., ynIV%e'g䦼ɸX_ӒN< +_D¿) #n6z׮ _6`]YC*5ґfZwBi )u[Bo_rIf\`p=gav֜ KYYTS'aScZNWJˇg>"W6awg8a!– +O‹ذmc6'IWS nݚS21i栓v)oy_ҵWk#<18K$gȥ1 9advzF[( ?ALXX4SzkX0"@\$r.2n•5¨P7PSۣzVGH+KjU`};s,09T7ǐ1ڍ8vUOq5#kV)ocRлy~%H7&ھ̣*JU5azNw*dRюlnBm<\JyEHʃܱRN\eʊ( +(: bm} +~&4.DJr%"j("&A -Iw.!+,^n s13$.D!7gwqE%C "rOY;sgG:YȰR*j7C7f!=ofFG҈2{ބtrvjB7 IPb6VoEE,E;+OstDT/kܚRZ>d,ONQKsΡC.9D8PsS=Wv>egaQ3r~ =u e[ *ush-4DfM&P;&V_E*۞t5ò^BIhq $0?1+ϱ#!~]A,s=mcĤY@-QzbETGOm9Օ肸ڳ d,\t@ iaf{t;E.!Gn^PI9Zud{u hW݇C +z5f7 8s`L€QuND%JāoYS=#w$8nA%(\pWW᧧c~cF/c4`UW+/Xyw_2-'}rٮI.Y @44rp#v GDjes<bΘIY*堶_pvXUJӌ{KlXSRXsX9L J}lYT(_. +;KB~rtmf~Q}o*鿷$4Si+ +)c9!n`\ LULk iII1p!-6s &3+"к|nzQ(ہ&rsy~Up2^t>'Bfi5\QxS'Ie̥TczJc.5j,r`WRcygGj~N,̮NR+a%,jiMa%tkǕW-WG.|z+|0JR@xދ֜2sP{!\- <:C*$ꈊXX3 8{B:Ă + 7 >6:a&ՄY7Cͻ7N:cgwltp&f$U씖8uzKX&JXQPre@\ `ؽe< ʃ%IߎGK- /Y& M_% Ii40+"чu魽@ɄG2iRo.&̎$(Y b``ޓSƍjiM9H$YT[Hw>!:"-H%1?Y_uE'_軙nf8pA|s$@+3:mr0@rGE]I 2;s`\-e 5nKF hyemտ΢.u%C˃#q-QJzw^5sn-ҫWDY):ۏ!1x㋛KotvoCCk>jzm] 5`'7޵^iԁbZ49;qPQP&7;qU.jGP^VQ}3~Z@kXX=q#yjm"a& )ۣm" | ǽ'jj)$ Τc2F);oKV=F@C]w!ѹ +itʂHY@Q^U&.|r IlJAƈZܐu1;,{j~! X뎈53}gL ,pHy!i'mδK*4D9WC9جy +p;|vnts 0@]q2+FPCZӀPS&[E(xw=cecR`o N6nwE,/ +-a⓳BazA"Iɸ%&j(i%5]cFxaBN8my;_, wͧ;ۯwe +֐skеIZ^-~Դֱ:Ӓ,b Df -&Ʋ97v2{n&"trpI'B lhOx𮘁7riKЯkѲGO|jMLۅg>Yu&]Gsz| 5/f:$A5.aQBX/}E[OYtM񛕿q >]3 >9Yq~qޟJ8qa3KvMC'm"Z%e}q4ɅIӠQ3۠&;QKҶiìNh01u >(LO!0.FoI/0QIoױn{߳Ɇ$;$Nb;13e13K-Q dbff1KjFsGƐg߬ -'+Fb. AM/ן, %!qaK'⺀AR典pO%5l<'BAsdZ諚6gES8^ve:s_Zbz!:0o}oRl j&ЧrJtui@ťAXlQ2 ytLTx% cT-^uC_/ 0IpZk[`e"^9ᑩ#l %8YrA$ifC^]kW|=N5#cRQƞzysi>^=ORfWUYa[Ӭ삠VL8G$:vPҝ +`{u &Xc`%tY[M)XE>Η3Aﱂz=}Z!p?C<ݙ Ʈu; 3sؐZc JZZ_2J䘵ӈ󰚅ξUppS|pRr('0@dnMΡc@LC:G&9z{PU %͡2M%w(ޅcpaRI9@1)d[*D=qq.y P> ĭ"Nݟ$UE]F~(C6Q2E1ݵ~-02q^aR`s`1|!AF/A@'d-:H}z>h+↠sQ"G*{"T[ǫʫdEMEuBޮ6 ޸Fȣ,LWC+<&W_fUЋ.gY =R3K[҂zƧP2F k:IE,8^+ +.5 KuKUUT *\ZVg&>ksۈo~حl+fw(䟘8ThMKݖX́km#塝#:գJFGC"Q\O]Ug]S7'aSy*f,[û2%%gwe!d CyJGt.{2/af1#SzV"qis(ԍ!I|p{jo|lBL :u S5M\iO+%}lTP!d4֩ǫݩzK߶_4Ɯj{ 2CJ8\,yQ`=ZJ=R:O7P:WK+ޛAٝ@)8e<ʏ^-Rz䁇34E}9Ee9*vc7-I3Wty2`wŐ8ͩҗsT? >mO_ѭ-qAޡat<as7K*xc"is]X 3*k=2fs./lKW.+b=Q1so 5~S@ -l%h0Iwy fM>-ڀER}",="[<<&cq3_^4T<~Uև,mAsMoR1pJ*ٮߒVr6$$R"8Zj?v)poSsxRx7X+|ݭbm RS?^VVYTpE¥<jZdc݇K)rAxIRPީ@Ydz4 vrM*ٟ'%:lY2z[*qJy(Ug>7K5tK:jwJgM>)=j>JK +*zJ=d+9WP sDis¼='I{6.58ȯ/y{8wp`oa69D.ۗ!#< +>#٫d#'4\UKA,A 8PnZS,kY\`HQӯ~}8) V)ҏ}ec4k5豍!"99P +.%"4WLE73!*8K7n7Wwꀶ]zɩH)+H3ZofqU$94 V8-%d+T\W3C&;Y_п/#m#}Eҽ-0).%!=c r|fcL5se@G<'O$Β<;F7{\s8GMs.2 +lsa[45O2qt0 QԠVEb_`[JmX9O)x݁N/]Ⱦh.yѠ GrёV"t-3] к3.#/yaRs$xSJVs$P:Zʅ>yԫivʙ%`-݄kA\Ps)۠܊Aҭe/]rt[XnSUV<7k[mNYqDc.:x4.]}3}M['LvG0o&Aw*ELέnk` ZJ1࠰Z"cW} +RnX^FU]7@E<^b`f«@dv8KsCjY(/RU!sk0cg@Y!J>oZRAF" L䵃E3jڭo߻l[*U7A x ̭Gçyu-VHN /U4Ax:{kHE!SUU)dKla8`y}UXi#36*6`r+|Ɏ^l?ެ7\ IGzI%؏GqE,֛+\vBAT%蠅E +.eQKFx[-`z#Agм*lwκ@LvC\$51z jͱҡv&R&ݗ{qtL)B9ţac#SKGz(w@`I)>7ݛ#C϶Gr?,P +OL"GJLȈ).)`~) If?w8Vpr|POդlU<5ςPV/ئa7YG:H%-ߩ`cAmuD5AADzTh!2jdRK.9gfp,ȯgM|Vֈؐv9xH璢s%'z&(0WsxT77֒r޴߮vjjZ~]Gpa-P]2rԛ[/ MA~_x/<6QA>ӧE'['fROJ>T` +>3h-C6ٯ&zĬy!gz=`.%.ǥGB^07T6- +^P +ZbKKޝ-{3E5e~'`~?5' .7-UZk#W0d0'z +ub_ZIŕ6=1/.ecFe/d +TuVv;^uR3Xd-.#hBеXDЙoW|wdtȩ$Ζ>eеK9`HK.(a/mY7.Y'_y 9- 6Tԉ%IY=,s'˂r,.XX iW$ ` h%lZURφ<ޟl+ +tKQ`>|0V&.e#cM[H';dC?Oٟ+} +jkdK..qKX8DSMlKEj%AW\ FBv`-A L2Y\4׫ج jkd?pya?}zB@) Y 6/lDV@5%a¦{M2ᕊP#> T(Rzh +lpO~=0/ WledMxv%*` `~NP/Kw^9PIúqͥemsl|:ȧHd}V9MыAؗ"nYG'(iBWj +䂽k,ősj Rϯ. ʫנs):B(h:‰a2-t͹Hh4X d޹CƧy՘ĠVP9^^dSOVV% aUϭ +Ʈ%!eCOXWQSJ]͖>iyYV 3;dBC@^{bSۤ\뎌nbKh|]9^ָ|JuxsiH9^=1Gf1)'ذC02r!R>Sy6dyjT7l2 ^£/ok*HFBMhٴjewwpN.š{,4:V?ި?Z=ިsE!pnК(r)A= 2P&&qx'K6TN%!ewOC+P@`|X\ .W:uL[Be _%A~ߦbj6 +xd!;aa*lԄ-BɉX\phOS!\z*c{πZv3ؘ\sd( ʫ Z/4dWEqIqDVwD4Rİ-p%s<`bj*bmx()D[ԲpY\! d1,<%&{Ӿ\[Z "d d,rO/۝*(d2m7Z!TWu\KIyד/PK{piBdg,҇͡ܛ~ CD|MA,􁒒{ai;sc0 uLT@ϡf;GRRZV * Qmy57t*[AnoglL`WJM*;YcR+ *C{ \:!P 8hhpn"=32qi^-g +)xĐ.hl>2kX4܃˭R;7~=6íB@!cOWײ)(^G`|z6s +j**}FZܟ#gl3#Z!PQqZU|q){ +/Ȟ%- h5?,֟Lz@G,!.z^7VčFʏ$'*O5sǕ~ceSϧ9KM?Z{uBV(.K\ƪfqcl[$a~ ,1(+yvCyΡkU :UU\vdWFq]Ӧ۽A?UCYޣJv)2֣, 3+An~|dd&j@.Ba vԮ̳R;@ЖϓmS5 :SsYBO*MG㸷&0,+z6KNq)9f'\nTs0zΉT +AW3:LQzHIߜobfQ>%>վHL=2fqY!vunc!rsp5"^@GGț~':SĢXa^!sslfOAJ?11 3ad/9!ԧ"g{YL{Qp S_Ղ ,'{aR=jz_/@{91ОpSQ 5|W-@^h VX('dxx׫ AL*t2ېς€ה $ȑuop8;LqoMTL0UwWK4* +i!-); 4;¢khzhhD- Y x@UQQ3ϡaë|VDEtR^4Ի͋~Ke od|FrGJ,ôC0 8z+R\VbM[t\NPѫKM!SE[) l2,D@K. ꀧ c x~hz,.i9^z\דZR>ЬW4M v\`A/3|5{уz#';oi̛{[W7s.US  ?d$SRsjFsX*ͧ2R9OͰNC} d.6}{0~}0KO'쌣huSg0궔]ٗv'8=i)*6W̧&d.RS#%ȢG@} +'< .p>zW2O,LO̰(Dy >O?X5MM(T}?-|WNp̖=s/=dcKycA]ā{*9-%fpΉlLzӳ>1&-}JZ;v ;CMu*I~dBꉑi~5`o zZ>Z7d :wP  JzLdža} +BuơBE- |/2AYBK<[eJ!+t !h'E=!˯#ygC|Txwf8TC{Rf$)έsk%sa䣀~rc|2O; z0⢽JL_O )iRyZ /Wv1h8XvHi%6fPeOCUC=0lS77mSAC&>CY)bni;w ̺M'!;fp1>%9ڹ@ǿWMPpq|F7m (^xy {U⓷'o=/2l[NHNwGIQƏYljq9''xG%ӈ~9>+%gOޭu#昅ۃ7s.fё~9%5t/bc]1|g,p`~9e;X{cDyCŷvGa w6֮(@ 1z&zG˧AAnHǧT̲#5QEBk) b#2!խ YU0s+ %$n ob^XA.q,S:/5{jn$A jx"=OL0/v͐s4 pS앳Rfs20EJWzA=y\0]FyC. "T^IN$% dฃ)IÅ9+삐 +T"I@ެFqw׻QVV%d/;{;BZʪuK9([;QR1bch+?>B} Jzg\KbK,6n`Jl3~>!sRʬгS49 G{W +m)9U%ٓ'b-ws)~hk]SpP@2]B72\34\X,j(}g $ca- 2 BkJG>˯fx\al =AN&ƮQR] \$А($>:AF>_(mfk&{H I̛Q9R]f_H^~vCU zWk{혇OvFYfmJ'`O[FpOSS硳U"Acy3AL" ئkl!9ɠ9) ql⩦)1c + iGC:""hkP>Tqz1xuwT`7F-Yg,s/ X'gաbmtiJ +="++];khO+ɹ37.61%x3GC8$[(ڟemA=F<-el*U]F7-r` ``qkb#n?01 +j \\@@<6ҝԜsXpRz'>QBk~8F<@=67C]~+Z@K%{΀s#;]ڊh~g.^?jGѕ;ۺr~wr~_7z0LmӼgx**9X 1#Q[p O7Owƈ3_,YSwG0 BZ.Q_{vq" 'qn Zڊ35䜳O +zq8N/qjj؅=(͸g &ȑ_j̽Ͽۉ<_،9ϻ7RtkgV%yEܷy{%u eo"ZKotZm/].I:<ݏx`lE>Ž04_4]XkC7_|3Lxr3mn`3S׺64Y?**2O/#tz>@?-c +ow!ngɽ^C_lkJ;H[]$HPrP|j#?bai.S|cFO5}SE(;CC;èW݈9>>,<mc_>{UzXRSxw0#u`=('G,},IW}FZ IR.1䳭Ak=7,mW4 )?+~\jKp8jytxw ^ KSѥېGv#^Ӌ~'G?)ciɽ D&I~{q0Gp +JʖN&f0k8*'0[]C6L)Pwo49g&(c?D:L܎{Oxo,pkE8~);/JV.$7 [) ݥ7 ?SZ}--#< ]W)V)n vmhgC9K{Up??8bbsUVnԵٿL}җ__?˝ovF^Ԝvֵ|瘃)F{8MMqDG2[Z7-r7d](!Hksog *=%~s0@%KS⩵KJF aLf(jW5M}iu]wدgϿ͹^[S{incOI-2'G~>~ل(k۳ +Ro6bk3(*RNI%)ΰ GsNyx[In9>פ,1ύv$+K|#5pSV7Js妢ʬӖf̣iW}e ׺Pq+V]K4_[=8j F_֬_?Z(ό'}+[ ƦKʚsQ'|ч~5D]dd'} IQU}G#ӃԈӇ\84x/eU)M]O@O"q܄ 9jfwN{E>\^{e;7(Zh&%5¯ߗ~[ [>8hf?1B\vMQFX|y3H8kQz/⡾ vE00}uUU%W]gޟ.KT]Xn?4Nik Λ[Pyq?E!Ek:C'n96u.R'k#ds%rN0)aBYfW#^-z>{}oUVTxK~aiNҐvܔ ~k*ִ}V8H,.j`vk䚩5pykc:cRqETt#'eڒuv-7mUeY-0&ٹۣ˵^ Ӈ3ʊS>mcsM}=陼~EWhj,{o@w65Lg>iS"?4~οX{_g?JK|5F~;S$Izc_v~z'*qIJ?^,M[3nO? p3N=YocΗgSTd]VUi+:R/S.wSc~Gmq؜}nE?nmu!6BeKqmˮo aWz0O `N]೯vG(}7;CКOq 3wAvr橮wsK.)qybS.YG)2ϕѧuR ~c#$>ܛ:INlayRvyY>3įÈlxEܯċ\롥Qg c.}ً|dl.hl̿^zgl)}' C/r$/&b̏͘@g ӨkΫ3L0㾪+xFR4\i p;?ST'-{-Q*_~.E|m,}ԀM:'(xB.f{Wًz_p}+粩%O--Ǧ=宒~ԋ_7zQ5/~R_g %p:GCm-<&js ɗ`GkΛSNO_}y0F{Y>roF[>:^W>frHLHQׄ|Z..Vfg2-]$_ZnfyK](eCO;O *~׀Usʬ3JqWeV|}@R3fj Gj{{r{ɵvҫsܔՅz߿~-cz1_61 C|5\[[Nk{欟s+3ΰY%хzQY&d$_j6"ˀ,U?t|:Mvj#V#~\jH[^c&moc +5x7VtWUylRwswփVrkx{mtj05iz-m6Vz>5g# ې:Oy٧'ߘ +~O^q i3BW%{^pz*k=ׇ>Fݐylڍy]rwp<⹴:R'u;=vr!R88#)vW̤))X7W%1?{˷A xҖ)}61)Ԭǟ=o %$?*AE=y=dYWjѯfcGQ Ӽ﨑csL(&nhu 7xoOaf A]gqioV{kߧռ8oaz/&ٻC΢}Gl,}3'ڦk}Lm7t&_sc䘠Jy#"ԅnlͽ`hHQ*~Y'Xa6I_?R#:h:QgseeO<٧- ܽCmҳvG9fuE֏s'iߎ3/5am Jt۪s2q7ꊴvz`wifKusS<>}i[%ͳ,>TUe^'V>b  `_la_Ҋ\s,uU*.}| +䪗GEJȼS8$.>rΒ&ԳYII>EVwiR/{O[.L>ц~2|P|NL_%x|>~d=K3/d|2`\E]Ar!1[UCεлKħ;ļ+[CansZHpøh5@+ghȺJ h3r7F)16|pNDEؠgm 8^XKl]t+$-{ o O0uuy5C]So=K5zF/!s}Mɍ~R1bs|@>K;}~1 ssrQ]1VFU;$IO>XvrILJ<x-p % 5TY܍1Zuo# ~:ꧧM7f]&ǂ뾾(vTsNHi\K/׻BSg٣4PC)_6{po3ά_@<%psٗ&YIslrѵ}@8FȠvqk}::8(YMQƛ3.-T%_0]w14 Wv♓0[ +.~rkׇ>BڼHِ[?-)Qܯˆ1TFqggȅ@_6}#ա҇Cx0/-wQӜ*#RrkΤ ajė;7jWE-򵮫S('nc_l_AGO}d}Ĩzd9qw[K\j*PAޗ2>.s=s7xo.y3R8rWrJp]٫r- +{c-V&Hqk+q^$#-l nqgvf٫=%wv[r~_ϼ\&ڦ.=Z`% rUMۀlu.z챪 u/)F?wgi*>!Hn6S~;ese,35%rLqGl}ٟaOS6 (CKˋ[i%>ENz +vi5Q7Qc~,i>2 goYpؒ񋱭mZ[<ԥ8J??/ʿohDTE!~/H=VAE{wo #vlj)^99OJ6]\ig%mO5Ld8,{ߎckU~ E|[Sꫀg&-/y5{h,99ґRfw[3ˇ>Ç~x0Thw1ᴪ6G19_1v0>ZeyqR4!v{oU-iC֌9JK]A>FYgw oc^`""F71%2 5_v~{RVV咝q\5BM%mk";IU6_(jׁ3[eOw<].Zg8E ; /'9_Oc~V5^ݟ, aZt-wo#ZvmyQK]yWIYqnv#q +ʥ ,CAF +@OV֏61[irW'Ye |01pV;YM?T<;EC,㑮xkcTxmy_ba?XXC ~wkZ7]AYXzYv3c3GvV^I-yt7 +1V0c=a.ꈸtsW`~e x9'&_P'}Zp:4 Szc-a*H*"'3r:v8oч~?LOMօ\`k*6'J*J_m$X+͍̗kfQf:HEAQHJWX9:uu]Vl*Bu7#o ~YE<"f}|u R$6@ V6;ى쳀S\Z߮XSعkŠY^ᢐ^mӼ~ՏmX=&(iF|ډJZ[Ip9'%G_Fn[RwJqww $X>G\ =}G23l#LfgRKlRbW5t̞ښ, ^,2ߖ[zS[}=$ڝ؝bVʺƶx 7#ߚbw6tkle-So)ѻ34r2x$"|&^jE&~4ˑWoA_ݽrtqߙ@o_:pJGF5ˤgR, +bN܈{3U|:Ɂ!o#K/ $D8Œ:R39$1:6%Xػ(G3nCnxk}x ԉ Z`Mw|n<^+JUA)jbqXhO0BsCNb#?xHG{An>;NNK*$b\nTUG(;݈ ҫ#8Գ~N/ZCQOGݼ +{(ᝣ?u 7;3dHZdC{[Yu1BɎFYM0n*. `B^7ƞ&88QXȗS'1ǸdCEE8l&v]]|tSyQ`j&h +ntm^Nإw'~|;o%܎Jx8 +Xfrys1u*p+Y3%/[*{2'tާwG~:8 |tv7}q|*;z?>ޡ*>y} 2 ׷BBmȏS-hs VsOx?]˧O_:qNntSLxi}7K!JQ|ܶVlrxcj^rwt  +zu2 '8Ӡ[?;Q[zYX< Y-yo@E,u>!eNcc2?Ex zy K@.]OGsys㘌ūPLJ9$Tl)PE=M# +<27dXA/\=tp(#`/;z t?AǏ%qQ]2+؜hm)z=VEEUe*ΠN~zx>g_}ƹz]`uP rF "[䔼xl{ 4UbkhqQǂ^>޿ } +M`Oe?Х3AO"~:ʼsmm1){m2mC~6 ;sy!G?Ž} |&5лgxqHF/2JȡpnPWqڲ:̛*hɕߏJxK@._$7y +5`Ooݹrw=7tbeU-b+<ijɫs݄HS)Tۉ j%܀$~uA~^:'A\=C. b`!OژgUx}RjB`w/AA> p4%$hA|Ifyɽ!&l]QIL2 R&̫U5.gVVC5%u <,vaz߿?-(г@<z4: ͠~P{k(VI}8Y`be_nC)ڹ#UķudTQ圈IG_r@O={ T|YYe +s޹yagVи`@py/-AxЄc]gd^@+KJ>?=y + 5h\`Џ_KKlȖ%Y$̒QZMYK눔S_ޟ w6%4wA>;}9>&\zL R^.y}s2vvX\@fo+XZ,[߫q+Ȭ߼?5(G(7"x䗯'^?J|t +U~E +C7l[@Lކi0uZl%Bیy?…<_hkt0׆dLHHxMخVX`QfY,KِE27YhaVxqW4ɞh.ՕR CSIۖQDrd]C5jQծJxu&`K޺ewcz+!5Ə;)geaS]P5Թ\ѳ0RU2!f27 (W':smMuQڈI> }_T&jK +aSe*UƁ[ Jb'u \؎EXA.0!fr=PcepKKXksfƨ'hbp(s%KCܜ- &٦:Ѧo5jёS LⅤ2@Bd6Ķp_Z l&FX3Ϫڝ1|(]i 9%g~O7~fƺtե.bv4D tp/lMVƨ8 SH{{-IQD6tmc f'.וAB]UagGM HTWKΏ5R[E*їֆ +>NFޖr.qEψ*ҞV~TsMCWW!`j3ca|6x١bb qskf­o:Jhq\]]s;bҥb7'pI*rsn*%eT ؎QX`V8@ZE^CĞ;#1+M)1}q:\@gZPs.y=bK6-9ĥoڞ:ejOZhbhl}:+^#D +OzUZ{wieRZE*aUTZ)8h*mkf6be a"lRV<)ȳI{5vjMN,Ky2D,_hWqV2TLu=UUK{EVK$FDՈ c" <恑_uVMI̵k猠|_=tўXt`JjYDϓTC?9KaTeŜ5+,ِnuwZظy+[wZRh..-*:ءbIi 2إm]C0=^PKR*|Sɥn^nڣa, QIUbv6Qah]L*Y9?e HW ɷu)KY_wtZ0*+ ڔѰ&^ tih nyiem $pYmj Hp`_=s-Y/fz_9f,|018N=c Tt1\iue~Gu;=uSKE+uH1\LS- 6MYQTlsc8U|ewr ݮEkh iQ6%ظM&vKJȒ7e>F>jz +!m[7U|=nS03#av!dW_V7v: 69 1מx 1MRQ"3ŕd h{FjWɲ̴Gp*1^}uӖGvBn+p(+i.9tm!x- l[B)˨n 0zڦz2Lh::2l} 4Ǥ= 6)~%rR۟mOX 56}]vSF.J 6ܭcv }5n=:*k"sw | &ΰv9̫R2 [":أpMWm(9^gv環?l6*r^"Qذk{> X`=4SO[{֟ģ@WFH ]q|GOCaނɪ!燑)rm +v#}5iڛuc0У!X"CcmMU⥅G.%*.V"ugaK5v >m[NX!fQJB,fVd ~IdY&ť(Y*vctkMQQ"m[ɨ1U뺷UKٞf,9R"Do˘йNzZ5gO]|`dS|}~Ş +~ec}s(%2 #*>l wN""e$=Z:'vq§; \6Z+ 5+ljR.1IxCEP4cC1{ ?<[oE@XEL v i UIT*0d\MMv9""6|ےbSWDKݝiߒ0!ۓ8`;h+ +m-z3 j[|Эm2ZMA5O"B2t?*>]7[Ys3b}lCBG ؔL$ȮBUDY`}<-CzvՐJ {Z`Jd@Cc3(&fz :R:EO3ɿ|i!Sv;Tw#ho_dj81mwѮa s!rwdeRٯDdgUS$ +5Jwg*($K90&Rؙٞr{`OK*w8a|]uCxMR?4p:YnI9^ jq;_]7/3]G;\_Oql;z&k.U\ֹ\;bp6d,Ȗ%KT-oSg 5=аۿꟀ~vOVnf|!+I?5l)<&)jI{CCZdW)P``jLGtYa^F/->JwH)tf:>CG_/wfܱrj?.9A+ٜ , Öa|ԥìr/ ճHH5O&Pa)2abW ]UT|A{["p4`KJ)0l2>eGW]!N]tl?"zconZB]?&:nq8(嗅\ Cw]m@;}=UD$4̩>6 Ns j\t1)kN)2_Xb?a@.}i0Yc]u@D_:hS O7a^lwXT0vNMХbBvԴ] t{-`a?UBWJ/R]cص"; br?{.,;E)J@g3]㮊yKe-Up@;Y,0Aqw?  bJNd6Ve2R%lte+$$7ٟ'6d[B 莒\= [Ij( RrtŽ +EకOşr&ΥmR݂NW2=rbCIs*q)[bt(*Dטwei-[*S-ceo%ɥZO_G+kvm l,he.5$j赩-[dy|E3Hv r@g\ c\91QO +Wۊ{.=/)gLUF)w -ෛcQ5ɂx|K'a3UɏWz`I:Xݖp< LSucKfևNtTR.( L2o'Prz;yțGYIo$lEBAe)M-~ۓKCe?¤.)/@hɂOgKQ74g۲)E)xw󡆅Whv 1ks1JZ_qU3|?q!=_B/<_~a.~џb7ٞW' Rb8,3-[ w94T "k`aa[H4p4POzdxSsfWxL|kUIWC@y`}UU2T؝l+]+U}0-lեݟ|["x] Qn 쓴V䘔AHr?"dANy6Bź65 + +.5oMvcVqN@ԯhyom#w[cO+>Y'I& +kBydWsWWkwio+x9Lqh^1i +TSH؞B9l]F4|f3Cm+ Axj?,.'Mw?ۈ NuǤSUWTn99׫ewtԕ\ÏUn䍥CS3s'SAdܽSMCdLXJ.k[g8|1BBk髙{uO̜NJwx~lm1箬2=l+$|uL|< qJEN brbg۹gr2l?뉊yF=И6~_I*C lmc|!fu^׊lA|QsK>ns ~m1씖u1^y{Hqg'cψ9!g[TmP5t'<5-tf?G1K=5S[j(5Luợj~!|G‚{zne=7邈t?o@6hykȭ!B]BG9pn <ꗑ 7А^o~ E{zbWO>6Ti.F{]2&b-B6aILu1 _}Ue>Yh+n!>\ m>1H*Y+xE >gçb# +cg&ag׻J~yQt–I8!cGVjhO9 5]thmR@l"l]T :<:aøh3 o6IKCd)7OJO$^Ur`-;ʿ()#ħˍ_~1} )~rxVW6 +^o 0:|,$4RoWmOCHѧ3 }؈e[,bo +-E[urRRbr8DC]; +jw#5$Ul":l(*)^W&*4ߜ$$.~ғc3(*-gxU}-VchҦ\SFlM[AX|fGXw*S^7$LM%'w+yO_ۣe+ye̠.qEwᵾk`_ߡ]쟅ͩw)چ[R:>ݦۙkxyu@<.&˄w+qZ, s0hQ + +pCWe>ݐsTeo-=eEG.|h(xАz:qUl W|vN"cyt()E(o* pKOE7 ϻω _=*2pk(y#'fm7zߖ0A6W1?lWY!apv{?B9{{X#',#6tT5|=6$)kM]x `GFi0ֱ7/mQl$'o}mZ.4OQa4~=V_tDΎ`VN1+ŧ:f[L~рR_#G%^/}Qaym2tY ;:W{+>B~lObRR|6JS[dsn{k U*k/Z2o Bo\ xL c=+LΞ[%* 2qH @|=ͭZ o' 5fG-tȯjİ*Vՙ[m +Vr)Ps5oeJk[?a1ofZ^A`u𷅁ܗ^=p$5w[B/r+L ݜX ;zBE6O}V]6֩d!j 5 W4 l¦ +-"SIvL+%l1]z%#\ &^T3*rwJ̹wƚ;ցYϧ3OÓ}gQj~y W&#"b=*zW'eALwu)gщR~ *C,vb䬏sJkkQՐlRxrOۍ^HZo{_.s8b`u<cKwp2vON-ޑР+E)ڒ]_җhu LS‿p` =&& pndfWMCeUme]mr]J[}|~T̎ +sϰ_w=ts iDXƉɋ:K ~M)w쐋3 )wW "l !$Xi|,lwx/5U +ڟs>x?gi*®E&8 lC&$&gmԫ yoe:&%],|a'&qݤC`Qr;Z|ή%|A72hs Jy3}؅!|y +Rya'5O,{=0 )k3 F&ީĤ[',%!6)!f${ݨ̇[ꋃ ᢮N 38(UoQQ{ vq%n}9Z)+ +^n-b{սN¥'仵TcqJ*jfn1qC룸BS"6.MƃNpNb,nDXWJ/4iGIwaqኯx k +j<.7g[zֻQaĻ]/uĊ]#:X| 9]u`M\ƞX,*Z:J2 + dƜѳ>+Yoj-;\%$\j\%~=csUOI}YB['1qk#Ȱ-1>uij({1A) j=ZRS^&)MAblWgx |[}[ރ\W?|p4eP?*J72~|s$=ttwԎKD"hm6\ѩF\$ Y.Tu [z0`;\txnW|`}?n`c)twR6A3wo-Z&E{к6jP34EcqMᇝY~Φ$fZm9|0).7xKrі 35Z,^HW0 #̇}n)yLRԳ V 1ER0!h0ƺ+MJ1ֺ_>.@c6Xjx8)+bwmQ MQ~}TƜ)xqTUL̒1{&pMza? +C~-p*Wq=؈-%sIlu.5,jmK\rn~`nt$ab +9|[hθܑ\?߄BWZP4S-gYiO581I#DTJȶ uKrf؅=KW^Yɳg [)ŀ`z UkR4l3![Z[&:9r`en`#5|xksʩ[bL`y>|/<*!r7~DSx г0V9 +inT 7T1{:vO_(ԭV9,Ėؖyn㢝1mk alLκ7F +o(:ۏ f<'@\ ]m{jj*^͵c*>"Cwtllm(((/C1)|񎡦UO0>h+[mǣbV5rS'bl]K +RKyF I[:aƽ5gPq`Ov(P8B;RH䮞iBnSr-,ⓠ8J^ӂ禫>7#:tB.-a#F9Kݥ'I7UOz_uЏ3=mU nM +zWϦp{܎sqv%6ݡkvf=4Y*Vp*P Vxx<1ʙkF]l-zQr"oj)(iKgvևsFW]S԰ϻT\DMĒ*tpf;8b{ydRmWnG_* M65["B, +z\/:x}~~T؏Lq+Y.-3;3j65 bږ iepju''N v ]ǴiH!mmݴ*毌rt3ע_m֥e@Y쫸cॽOo)I<q! *?Ĺs}M?s9 +h{a\ +3'87Kzzݦ]2C +'/}GGȍ{STQa|O~K@]7RˎШyIã qQ1Q?r]ß9CZDw>?[pQQl޼< +hZSƍS3^ؖvhW~?#X0R +W M9r:9$Nu#ۚZ)ל+@G+_KᵠaV^j͊0rLP?=XnWܟȄq7 w?a#\]*?cT +—/*VuYztMC-~0׏^PR✠*AX q} {ژ}ۑ%iicٚuH_zJ7e[ظ<K2F@| `_SoSD nm`G-Gr0Bk:vy9ӔSAc +gT6};`UuQb¥Q~(bN(wjM |ӊʛ}=YuoNY,dG9UN*v{K_47=(|C|aϩАT|/s I[ :^" ot4ց*`[bcȌ)^C6=Lذyԏׁt&QގcQ ơCnl8⦀BNjÊtߚ){V]dEO)٢.s%{ +4 .ZxIۜ\5ZYƧNv zɿ6ŝ#oh(l#%Es܎ mA42?.^I(y>D%LI{'(=VBFkI:׉=Rg%.jI^ɕ5"aNd}:N㤁JlaI3CKrBꟓ}OX][𬁔迋m`߇L@+gkΥEUU ?7Ro@݄}'`ۂ B?Nt9Zu!bs/nMt#zP }an’W'>Qm,ew_k*ח*4".e>!Yf^ +0@޶]Ŏ]ذQ*>foDG97vJ{Wdž'~;#g9 9`ӯ0aɂj@)fn߫&P?Ӏѻc y~ώQ8?ZA+xxvy͏m\DŽ _\惿-t/4w3֡pP!jD0YpiH.XʦaCo @ ~') &5†{*Oη=^n}G0fO!SswK@uhkXP|4StwiV~L{vOG8g[l-;~J`5p}l쪂]6 +zǤs J;؅W\[<즛 +I!#"yu3$NѰ?k2%֮وs +ȇe 4qE(<چ脗]ԓn3ZocO4wBO76ŔFC;lK{yW$钿;¼:b9miswBQY?{Ct 9g1*sRƻk >ώ8#B2_4О['yOlT@5@3̤ڇmx˂ڶm]N?(k6¦Zn +taw<$?ž}zgaaCԮ\{UO#vN_=O䨤X@k?I%.7u$~uaB\2W#"ន[jNUq#rȻ<OZws"Ed]D7Ɯp8)~ w>0豅W௰gMoA`j9o -eupMmQl>MB}bP}xPix2'iQAy>nYVaAZfB.*p@,i]G_~JctF q~ՠ@K8tgSU5*cМ>\=߶<:f::oqGp.JݮXi[u/z@g% K?rno 5l[%A-4{YKp|ng_23SxExMOtqfdڦ]P`R + +}?+RپMw !9oܣÂ's2%--ce\7ROtW?C7Ŵ.t6d=X7Ocm 7_Fhã3N&TԔz*(LSP_¯/~Xpr3~v [p즕vQ4&q5ݙ,KͫxŨ6Շڰ}]w,j/Ϗ|8_vJ ӠW73cQ]U 8f詋zc*zlmni`A%()*~\rqsvԼ߲Aќ,јqZO2i6hjp킺ٓC`0N-Ikf\ΪT`s6i*RpVK/+ޝf^U=[T RU4ǥMqgi/j*_^ +2`y_93]g?0y?f\fݟYi*p[em;.v')k\&}u'_3 +endstream endobj 7 0 obj [6 0 R] endobj 33 0 obj <> endobj xref +0 34 +0000000000 65535 f +0000000016 00000 n +0000000144 00000 n +0000054295 00000 n +0000000000 00000 f +0000057475 00000 n +0000057288 00000 n +0000782276 00000 n +0000054346 00000 n +0000054760 00000 n +0000064866 00000 n +0000064753 00000 n +0000056248 00000 n +0000056726 00000 n +0000056774 00000 n +0000057359 00000 n +0000057390 00000 n +0000057770 00000 n +0000058035 00000 n +0000064940 00000 n +0000065338 00000 n +0000066749 00000 n +0000078834 00000 n +0000144423 00000 n +0000210012 00000 n +0000257564 00000 n +0000323153 00000 n +0000388742 00000 n +0000454331 00000 n +0000519920 00000 n +0000585509 00000 n +0000651098 00000 n +0000716687 00000 n +0000782299 00000 n +trailer +<<8BA9DAF07DE9404DBE8006EB6C528446>]>> +startxref +782489 +%%EOF diff --git a/static/images/logo_re2o.pdf b/static/images/logo_re2o.pdf new file mode 100755 index 00000000..cf417ce9 --- /dev/null +++ b/static/images/logo_re2o.pdf @@ -0,0 +1,3597 @@ +%PDF-1.5 % +1 0 obj <>/OCGs[6 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + logo Re2o + + + 2018-06-22T15:34:16+02:00 + 2018-06-22T15:34:16+02:00 + 2018-06-22T15:34:16+02:00 + Adobe Illustrator CC 22.0 (Windows) + + + + 256 + 236 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA7AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYqt lljijaWVgkaDk7saAAdycjOYiCSaATGJkaHNiGqfmJbxOY9Og9em3rSVVT8lG5/DOY1ftNGJrFHi 8zy+X9ju9P2LIi8hryCVL+Yuth6tFbsv8vFx9x5ZrR7Tai9xD5H9bmHsXDXOX2fqT/RvPen3siwX afVJ22Viaxk/621PpzdaH2hxZSIzHBL7Pm63VdkTxi4+ofayfOhdS7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXnnnzXpLi8OmQtS3tyPWp+3J139l/XnD +0PaBnk8GP0x5+Z/Z9703ZGkEY+Ifqly937WJ5zTuXYq7FXoXkLXpLqB9OuW5S268oGPUx9OP+xz t/Z3tE5InFM+qPL3fsea7X0ggfEjyPP3stzpnSvP/wA5de80aBoVpqmhXptQtx6N2vpxSclkUlG/ eo9OJSm3jmHrMk4AGJp6P2a0mn1GaWPNHi9Njcjl7iO/7Hjv/K6PzL/6vH/Tta/9Us1/5zL3/c9r /oZ0H+p/7Kf/ABTv+V0fmX/1eP8Ap2tf+qWP5zL3/cv+hnQf6n/sp/8AFO/5XR+Zf/V4/wCna1/6 pY/nMvf9y/6GdB/qf+yn/wAU7/ldH5l/9Xj/AKdrX/qlj+cy9/3L/oZ0H+p/7Kf/ABTv+V0fmX/1 eP8Ap2tf+qWP5zL3/cv+hnQf6n/sp/8AFO/5XR+Zf/V4/wCna1/6pY/nMvf9y/6GdB/qf+yn/wAU 7/ldH5l/9Xj/AKdrX/qlj+cy9/3L/oZ0H+p/7Kf/ABTv+V0fmX/1eP8Ap2tf+qWP5zL3/cv+hnQf 6n/sp/8AFO/5XR+Zf/V4/wCna1/6pY/nMvf9y/6GdB/qf+yn/wAU7/ldH5l/9Xj/AKdrX/qlj+cy 9/3L/oZ0H+p/7Kf/ABSdeXfz8812d0g1oR6nZk0loiQzAeKGMKn0FfuycNdMHfcODrPZLTzifCuE vfY+3f7XvukatYavplvqVhJ6tpdIJIn6bdCCOxB2I8c20JiQscnzvUaeeHIccxUoovJtLsVdirsV dirsVdirsVdirsVdirsVdirxa8kaW8nkc1Z5HZj7liTnk+eRlkkT1Je8xxAiAO5Rypm7FXYqnfky Vo/Mlpx6OXVh4goc2/YUzHVwrrf3FwO043gl+Or1TPRnj2DfnXCj/lvqjN1ia3dPmbiNf1McxdaL xl3/ALMSI10PPi/3JfMOaR9WdirsVdirsVdirsVdirsVdirsVfQv/OPN1PL5QvIHblHb3rCIeAeN GI+XKp+nNr2efSR5vm/thjA1MSOZhv8AMvUs2DyTsVdirsVdirsVdirsVdirsVdirsVdiryPzJpz 2Gs3MBFEZzJEfFHNR93TPMu1NMcOolHpdj3F7XRZhkxRPz96WZr3KdirsVZJ5Ighjvp9Wu5FgsdN ieSa4kIVEqpBLMdgAnIk9s6L2b0xnn8TpAfadvut1HbGYRxcPWX6HpSsrKGUgqRUEbgg53by7CPz kstWv/JUthpdpLeXF1PCrRQqXIRG9QsQO1UGYetBMKAvd3/s3lx49UJ5JCMYxPP5fpeB/wDKufPf /Vhvf+RLZqvCn/NPyL6H/LOj/wBVh83f8q589/8AVhvf+RLY+FP+afkV/lnR/wCqw+bv+Vc+e/8A qw3v/IlsfCn/ADT8iv8ALOj/ANVh83f8q589/wDVhvf+RLY+FP8Amn5Ff5Z0f+qw+bv+Vc+e/wDq w3v/ACJbHwp/zT8iv8s6P/VYfN3/ACrnz3/1Yb3/AJEtj4U/5p+RX+WdH/qsPm7/AJVz57/6sN7/ AMiWx8Kf80/Ir/LOj/1WHzULvyL5ztIjLcaJepEN2f0JCoA7kgGn04DikNyD8mzH2rpZmo5IX/WC RkEGh65Bz3Yq7FX0B/zjr/yjGp/8xv8AzKTNp2fyL517Zf4xD+p+kvV82Lx7sVdirsVdirsVdirs VdirsVdirsVdiqT+ZfLkGs2oFRHdxV9GU9N/2Wp2P4Zq+1OzI6qHdMcj+g+TnaHWnBLvieYeZ6jp OoadKYryFozWit1Vv9Vhsc4DVaPLglWSNfd83q8OohlFxNoTMVuTTRvLep6rIBDGUg/auHBCAe38 x9hmx0PZebUH0io/zjy/a4mp1uPCNzv3PNfz5/NjSINIf8v/AClOJ4C3+5zUozUOyneBGGzVIHMg 024+OehaPRw0+MQh/ae95PUZ5Zp8UlD8gvz9bRWt/Knmu4J0YkR6bqUhqbUnYRSk/wC6f5W/Y/1f s5TQQ+q1ZWUMpBUioI3BBxQ3irsVdirsVdirsVdirsVeQfnn5BsJNKfzRYQrDeWzKNQCAASxuQod gP21Yjfw69M1utwADjHxe09le1pjJ+XmbjL6fI93uLwfNY+guxV9Af8AOOv/ACjGp/8AMb/zKTNp 2fyL517Zf4xD+p+kvV82Lx7sVdirsVdirsVdirsVdirsVdirsVdirsVadEdSrqGU9VYVH44JRBFF IJG4Qy6RpSvzWygV/wCYRID99Mxxo8INiEb/AKobTqchFcUvmWIfnD5M8x+a/J0+n+XtVl06+Sri 3RhHFdLTeCVwOSg9t+P823TJaXwvqGn32nX09hfwPbXls5iuLeUFXR1NCrA4skPir338gvz9bRWt /Knmu4J0YkR6bqUhqbUnYRSk/wC6f5W/Y/1fsqCH1WrKyhlIKkVBG4IOKG8VdirsVdirsVdirsVY v+aH/kv9c/5hm/WMxtZ/dH8dXbdhf45j/rPlDNG+vuxV9Af846/8oxqf/Mb/AMykzadn8i+de2X+ MQ/qfpL1fNi8e7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqtkkjijaSRgkaAs7HYAAVJOAmhaYxJNDmo WGpadqEAnsLqK7hPSSF1kXf3UnBGcZcjbZlwTxmpxMT5ikTkmpaJYzIYw4MigFkqOQB6EjBYuk8J q+jyr87/AMkLHzzYtqmlqlt5ptkpFKaKl0ijaGY/zfyP26HboUPjXUNPvtOvp7C/ge2vLZzFcW8o KujqaFWBxZIfFXvv5Bfn62itb+VPNdwToxIj03UpDU2pOwilJ/3T/K37H+r9lQQ+qJbm3hhM0sqR wgVMrsFWnjyO2CUgBZTGBkaAspRJ528oRuUbWbPkOtJkI+8EjMc6zEP4g5g7N1JF+HL5JjY6tpeo LzsLyG7UdTDIslPnxJy2GWMvpILjZcGTH9cTH3ikVljU7FXYq7FWL/mh/wCS/wBc/wCYZv1jMbWf 3R/HV23YX+OY/wCs+UM0b6+7FX0B/wA46/8AKMan/wAxv/MpM2nZ/IvnXtl/jEP6n6S9XzYvHuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KoLXP+OLqH/MNN/wAmzleb6Je4t+l/vY/1h9744hnngkEkEjRS Do6EqfvGc8+2SgJCiLCMbX9dZAjaldFBWimaQgV67csNtI0mG74I/IPV/wDnHFma/wBeZiWZo7cs x3JJaTc5n9n/AFH3PIe2YqGL3y/Q9xzavAvKPzv/ACQsfPNi2qaWqW3mm2SkUpoqXSKNoZj/ADfy P26Hboq+ObnSNUttUfSbi1lj1OOX6u9mykSiXlx4ceta4snvflbyJoP5b2cF9rNvFq3nuZVljs5a PbaaGFV5KCVkm/V2p1bXa3XjF6Y7y+53XZXY8tT6penH9/u/Wt1nzBrOtXJuNTu5Ll61UMfgX2RB 8K/QM57LmlM3I29vp9JjwxqEQEvytyF8FxPbzLNbyPDMhqkkbFWB8QRQjCCQbDGUBIURYeoeRvze uY5otP8AMcnqwOQseonZkPb1afaX/K6+Nc2+k7TIPDk3He8v2n7PxIM8Io/zf1fqewKyuoZSGVhV WG4IPQjN8Dbx5FN4odirF/zQ/wDJf65/zDN+sZjaz+6P46u27C/xzH/WfKGaN9fdir6A/wCcdf8A lGNT/wCY3/mUmbTs/kXzr2y/xiH9T9Jer5sXj3Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FUFrn/ABxd Q/5hpv8Ak2crzfRL3Fv0v97H+sPvfGuc8+3OxV7L/wA43/73a7/xit/+JSZsOz/qPueI9tPoxe+X 6HuWbV4F2KsC8/8Alvydp9/H+YN1Yo/mDSozHZSdFlmccITKv7ZirVT1A+Qpj6rP4WMyc3s/SHUZ ow6Hn7nht3dXF3cy3VzIZbiZi8sjblmY1JOclKRJs830uEIwiIxFAKWBm7FXYq7FXtH5Meapb2xm 0K6fnNYqJLQnqYK8Sv8AsGIp7H2zf9lagyBgenL3PFe0ehEJDLHlLn7/ANr0zNu8y7FWL/mh/wCS /wBc/wCYZv1jMbWf3R/HV23YX+OY/wCs+UM0b6+7FX0B/wA46/8AKMan/wAxv/MpM2nZ/IvnXtl/ jEP6n6S9XzYvHuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KoLXP+OLqH/MNN/wAmzleb6Je4t+l/vY/1 h9741znn252KvZf+cb/97td/4xW//EpM2HZ/1H3PEe2n0YvfL9D3LNq8C7FXlv573kiafpNmCfTn lllYdiYVVR/ydOabtiRqI971PsvjBnOXcAPn/Y8dzRPZOxV2KuxV2Ksq/K+9e188aaVrxmZ4XA7i RCB9zUOZmgnw5ouq7bxieln5b/IvorOqfOXYqxf80P8AyX+uf8wzfrGY2s/uj+Ortuwv8cx/1nyh mjfX3Yq+gP8AnHX/AJRjU/8AmN/5lJm07P5F869sv8Yh/U/SXq+bF492KuxV2KuxV2KuxV2KuxV2 KuxV2KuxVBa5/wAcXUP+Yab/AJNnK830S9xb9L/ex/rD73xrnPPtzsVey/8AON/+92u/8Yrf/iUm bDs/6j7niPbT6MXvl+h7lm1eBdiry7897N30/Sb0A8IJZYmPasyqw/5NZpu2I7RPv/H2PU+y+QCc 494B+X9rxzNE9k7FXYq7FXYqyr8r7J7rzxpoWvGFnmcjsI0JH3tQZmaCHFmi6rtvIIaWfnt8y+is 6p85dirF/wA0P/Jf65/zDN+sZjaz+6P46u27C/xzH/WfKGaN9fdir6A/5x1/5RjU/wDmN/5lJm07 P5F869sv8Yh/U/SXq+bF492KuxV2KuxV2KuxV2KuxV2KuxV2KuxVBa5/xxdQ/wCYab/k2crzfRL3 Fv0v97H+sPvfGuc8+3OxV7L/AM43/wC92u/8Yrf/AIlJmw7P+o+54j20+jF75foe5ZtXgXYqk/m7 y/Hr/l+70xiFklXlA5/ZlQ8kP37H2zH1WDxcZi5mg1Z0+aM+g5+580XdrcWl1La3MZiuIGMcsbbF WU0IzkpRINHm+mY5icRKJsFSwM3Yq7FXYq9E8j6z5Z8hwWOreaLkWVx5kl+qabzH2IFHJp5O6xs/ Acug2PTcb/srTmIMz15e54r2i1wnMYo8o8/f+x7erKyhlIKkVBG4IObd5lvFWL/mh/5L/XP+YZv1 jMbWf3R/HV23YX+OY/6z5QzRvr7sVfQH/OOv/KMan/zG/wDMpM2nZ/IvnXtl/jEP6n6S9XzYvHux V2KuxV2KuxV2KuxV2KuxV2KuxV2KoLXP+OLqH/MNN/ybOV5vol7i36X+9j/WH3vjXOefbnYq9l/5 xv8A97td/wCMVv8A8SkzYdn/AFH3PEe2n0YvfL9D3LNq8C7FXYqwn8wPy2tfMa/XbNlttXQU9Qj4 JgOiyU7js3+Y12t0Ay+qO0vvd32V2xLTemXqx/d7v1PEdZ8vazotwYNTtJLd60VmHwN7o4+FvoOc /lwzxmpCnt9Pq8WYXCQKX5U5Kpb21xczLBbRPNM5okUal2J9lFScIBJoMZzjEXI0GQXdn5d8j2aa z55lUTkc9P8ALcbBrq5cbr6iivpx16k/2Hb6Tswk8WTYdzy/afb8QDDDuf536v1vB/PXnjWvOevy 6xqrKGIEdrax7RQQL9iKMeA/E75vQHkHrn5Bfn62itb+VPNdwToxIj03UpDU2pOwilJ/3T/K37H+ r9koIfVasrKGUgqRUEbgg4oYx+aH/kv9c/5hm/WMxtZ/dH8dXbdhf45j/rPmK18s+ZLsA2ulXlwG +yYreVwdq7cVOaWMTLkLfVcmuwQ+qcB75BTvNB12yUteaddWyrXkZoZIwKda8lGAxI5sserwz+mc Ze4gvcv+cdf+UY1P/mN/5lJmz7P5F4L2y/xiH9T9Jer5sXj3Yq7FXYq7FXYq7FXYq7FXYq7FXYq7 FUFrn/HF1D/mGm/5NnK830S9xb9L/ex/rD73xrnPPtzsVey/843/AO92u/8AGK3/AOJSZsOz/qPu eI9tPoxe+X6HuWbV4F2KuxV2KrJoIZ42imjWWNvtI4DKfmDglEEUWUZGJsGilEnkryhI5d9Gs+R6 0hRfwAGY50eI/wAIcuPaWoArxJfMpjZaXplgpWxtIbVT1WCNIwf+BAy6GOMfpADj5M88n1yMvebe Y/nf+SNl56sW1TS1S2802qUilNFS6RRtDKf5v5H7dDt0m1PjXUNPvtOvp7C/ge2vLZzFcW8oKujq aFWBxZIfFXvv5Bfn62itb+VPNdwToxIj03UpDU2pOwilJ/3T/K37H+r9lQQ+qxwdARRkahB6gjqD igFvFXddjiqjbWNla+p9Vt44PVbnL6SKnJqU5NxAqaDIxgI8hTZPLOdcRJrvVsk1uxV2KuxV2Kux V2KuxV2KuxV2KuxV2KoLXP8Aji6h/wAw03/Js5Xm+iXuLfpf72P9Yfe+Nc559udir2X/AJxv/wB7 td/4xW//ABKTNh2f9R9zxHtp9GL3y/Q9yzavAuxV2KuxV2KuxV2KuxV5R+d/5IWPnmxbVNLVLbzT bJSKU0VLpFG0Mx/m/kft0O3RV8a6hp99p19PYX8D215bOYri3lBV0dTQqwOLJD4q+nv+cXPPvnW9 iby3e2FxqPl+1UraavT4bQgVEDu5HNCPsBasvSnH7KgvoG51bTLVitxdwxOP2HdQ33E1zGy6zDj2 nOMT5kNsNPkn9MSfguttR0+6/wB5rmKY9SI3ViPmAcli1OLJ9Eoy9xBRkwTh9USPgiMvanYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYqgtc/44uof8w03/ACbOV5vol7i36X+9j/WH3vjXOefbnYqzT8p/ OcPlbzOJrw0069T6vdsN+AJBWSg3PEjf2Jy/TZvDnZ5Oj9oOzDq9PUfribHn5fF9PWt1bXdvHc2s qT28o5RTRsGRge4I2Ob2MgRYfKcmOUJGMhRHRVwsHYq7FXYq7FXYq7FXYq8o/O/8kLHzzYtqmlql t5ptkpFKaKl0ijaGY/zfyP26Hboq+dfyo/KDU/NnnWfSdXil0/T9GbnrzOCjpxagg3+y8nE79gCe 2Amtyy58n0hfa5bWVnHonluFNN0W0HpwpbjhyA6nbcA/ee+cN2r27PLIwxHhh39T+x6bQ9lxgOKY uX3JD1znHbto7IwZCVZTVWBoQfY4RIg2OakXzZr5U85zGZLDU35hyFhuW+0GPRXPevjnWdj9uyMh izG75S/X+t0PaHZgozxj3j9TOc7B552KuxV2KuxV2KuxV2KuxV2KuxV2KuxVBa5/xxdQ/wCYab/k 2crzfRL3Fv0v97H+sPvfGuc8+3OxV2Ko/TvMGvaahTTtSurJG3ZbeeSIE+4RlyUZmPI04+bR4cpu cIy94B+9Gf4486/9TBqX/SZP/wA15Pxp/wA4/Np/kvS/6lj/ANJH9Tv8cedf+pg1L/pMn/5rx8af 84/Nf5L0v+pY/wDSR/U7/HHnX/qYNS/6TJ/+a8fGn/OPzX+S9L/qWP8A0kf1O/xx51/6mDUv+kyf /mvHxp/zj81/kvS/6lj/ANJH9Tv8cedf+pg1L/pMn/5rx8af84/Nf5L0v+pY/wDSR/U7/HHnX/qY NS/6TJ/+a8fGn/OPzX+S9L/qWP8A0kf1O/xx51/6mDUv+kyf/mvHxp/zj81/kvS/6lj/ANJH9T0L 8j9a8zav5wkW/wBWvbu1trSSVoZ7iaSMsWSNaqzFSfjJGZWjnKWTcl5v2p02DDphwQhGUpAWIgHq f0Pes2z54xfztJb6fpdxJbxJFd6m6RXEyKFd1RTu5G7UUcd+2aL2h1Jx6ehzma+HX9TtOycInms/ w7vOM8/erdirsVdir1vyxqDX+h2txIeUvHhIT1LIeNT86Vz0zsrUnNp4yPPkfhs8Zr8Ix5pRHL9a aZsXDdirsVdirsVdirsVdirsVdirsVdiqG1SCSfTLuCMVklhkRB/lMhAyGQXEgdzbgkI5Ik8gQ+M nR0dkdSrqSGUihBGxBBznX3AEEWGsVdirsVdirsVdirsVdirsVdir1X/AJx2njXzZqEJNHksWZOl DwljqPn8WZug/vPh+p5H2xiTpoHun+gvoLNw+cMR/MeJ2021lAqqTEN7clNP1ZzPtRAnDE90v0O6 7EkPEkPJ59nEPSuxV2KuxV6h5FhePy7CW29R3dflyp/DPQ/Z+BjpY31JP2vJdrSBznypP83TrXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXkX5jfki+rahNrHl2SOG6uGL3VlKSqO53Z42APEseoO1d65rd RoiTxR+T2fY3tQMMBizgmI5SHd3F54/5LfmUrEDSAwHRhc21D98oOYv5PL3fc9IPabQ/6p/sZf8A Erf+VL/mX/1Z/wDp5tf+quP5PL3fcn/RNoP9U/2M/wDiXf8AKl/zL/6s/wD082v/AFVx/J5e77l/ 0TaD/VP9jP8A4l3/ACpf8y/+rP8A9PNr/wBVcfyeXu+5f9E2g/1T/Yz/AOJd/wAqX/Mv/qz/APTz a/8AVXH8nl7vuX/RNoP9U/2M/wDiXf8AKl/zL/6s/wD082v/AFVx/J5e77l/0TaD/VP9jP8A4l3/ ACpf8y/+rP8A9PNr/wBVcfyeXu+5f9E2g/1T/Yz/AOJd/wAqX/Mv/qz/APTza/8AVXH8nl7vuX/R NoP9U/2M/wDiXf8AKl/zL/6s/wD082v/AFVx/J5e77l/0TaD/VP9jP8A4l3/ACpf8y/+rP8A9PNr /wBVcfyeXu+5f9E2g/1T/Yz/AOJZT+Wf5efmF5d842Wo3elenY/HFdv69s1I5FIrRZSxo1DsMuwa fJCYNfc6ntztjRanSyhGdz2I9MuY+D3nNs+eoPWNNi1LTprOQ0Eg+Fv5WG6n78xdbpRnxSxnr97f ps5xZBMdHkd7ZXNldSW1yhSaM0YfxHiDnmWowTxTMJipB7TFljkiJR5FQylsdiqO0bSLrVb1LaAb HeWTsid2OZmh0U9RkEI/E9wcfU6mOGHFL+167bW8Vtbx28I4xRKEQeyimem4sUccRGPICni8kzOR keZVMsYOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KpdrG gabq0QW6j/eKKRzJs6/I+Hscwdb2di1IqY36HqHK02syYT6Tt3dGJXP5b3gY/VbuN17eqGQ/8Lzz mcvsvkB9Ewfft+t3OPtuH8UT8PwFSz/LaYuDeXihB1WEEk/7JqU+7J4PZeV/vJ7eX7f1McvbYr0R +bL9M0mw0y39CziEa9XbqzHxY986fS6PHgjw4xX6fe6XPqJ5ZXIovMpodirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVU7i5t7aFpriVIYUpykkYKoqaCrGg6nFVO01HT7zn9 Tuobn06c/RkWTjWtK8SaVpiqIxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux Vjn5heSbPzr5WufL15cSWsNy0TmeEKWBikEg2bbfjTFXxj5h/LiLTPzbHkKG/Z4pdQtLGPUHiHJV vPTIZowwDFBN/MOVO1cWT13/AKE1/wC/v/7l3/Z1ii2N+ZtG/Nj8jb+x1Cx1xtR0GZ/QiBMhtmKg kQzWzsyoWQErwbxo2KvpvyL5tsvN3lPTvMNovpx30XJ4SamOVSUljJ78XUivfrihPcVdirsVYt+Z vnm38keTb7X5IxPNCFjtLcmgknkPFFJH7I+03sDir528kfln52/Oh5vNXmzXpoNK9Z47ZQDIWZft LbxFhHDGpNK03NdupxSiPzC/5x31XyHo7ebPKOuXE0ml0lulP7i4jjB3likjIrx25LTpvXtitvWv +cfvzOvPPPlKUaowfW9JdYL2VQF9VHUmKYgdGbiwbtUVHhih6hirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdir5B88f+tV23/bc0f9Vtil9fYoeIf85Ya/pVt5Cg0WSVW1O/u4pb e3BBcRQ8i8pHZa/DXxPzxSGRf8446Rf6Z+U2lLexmKS7ea7ijbYiKaQmM/7JaMPY4oVPzo/OWx/L zTYYoIVvfMF8paytHJEaIpoZpuJB412ABqx7ihOKvLrGz/5yu8z2S65FqB0+C5HO2tGaC1YxndSs QSqg1oPUPI99qHFKa/lp+fPm6184r5J/MmBYdQklFvHfFEhkSd6emkqx0iZJK/C6AdR1BqFXrf5j flzovn7RYNH1i4ure1guVu1azeNHMiI8YDGSOUcaSHtihMfJvlPTPKXluy8vaW0j2ViHETzlWkb1 JGkYuUVFJLOei4qkn5y+YLDQ/wAsvMNzeMtLmzmsreNv92TXUZiRad/tVPsDiryz/nD7Q7yDR/MO tSqVtb6a3traooGNsJGkYeI/fgV8a4pLOvzr/Oe0/L3Tobe0iS88xXylrO2kr6ccYJHrS8aEryFA oI5eO2KHmOm2v/OVvmqzTW4tROnW10OdrA7W9rWJviUrEqFgu+xf4iPvxSjPJn5+ed/LXmtfKf5q W/pszLGdRKRxywlz8Dv6P7mWI7Dmnzq2Kvo8EEVG4OKHYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq+LvzfsdSv/APnIe9sdLuPqmp3eoafBY3XN4/SnkhgWKTmgLrxcg8lFR2xSGe/8qS/5 yR/6n7/ubap/1SxW3nOueVPMX5bedLHUvzA0mPzLZzNyWV7iWSKf06DaU8W5pseEq0I7UxV9keWt e0vX9AsdZ0puen3sSy2+3EgdCpHYqQVI8Rih8c/m15oT/leuoapqVt+krPSb6KMWBf01kis+I9Lk Veisynl8J6nFIeif9Dlf9+h/3Mf+zXFaeS/mv+Z6efPMtpr9vpf6GurWBIG4T+uztG7OknMRw0K8 qdMU0+6LGV5rK3mf7ckaO1PFlBOLFZqWpWGmWFxqGoTpa2VqhluLiQ0VEUVJJxV8p69qnmT8/PzC i0rSRJaeVNMYsJHHwxRE0a4lHQyyUoiV/wCNjil9SeXfL+l+XtEs9F0qL0bCxjEUKVqaDcsx7sx3 J8cUPlbzFEnm/wD5yiGn6gPVs49RjtvRP2fRso+TJv2YxsT8zino+ugABQbAYofPH/OYOh2raNoO uhALuK4exeQdWjkQyqp/1WjanzOKQ9U/JrV7jV/yu8uX1y5kna0WGSRtyxt2MNSe5Pp74oZnirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdir5B88f+tV23/bc0f9Vtil9fYoeO/wDOVVvFL+Vh keMM8F/bvG5G6kh0JH0NTFQi/wDnGGR3/KPT1ZiwjubpVBPQesWoPpauKl4x+YDS+Rf+cj0129Sl hJfQ6isgBAa3nAWZhtuUPMfMYpfXVtc291bxXNtIs1vMiyQyoQysjCqspHUEYoWzXtnBNBBNPHFN dMUtondVaVlUuyxqTViFUsQO2Kr5poYIXmmdYoYlLySOQqqqipZidgAOpxV8tfmD5z8xfnP5yh8k +TuS+XLeTnPcmojl4GjXU5G4iT/da9z7kUUvoTyB5B0LyR5eh0bSY9hR7u6YD1bialGkc/qHQDbF CT+Xfzm8ra/57v8AyXZW96uqac9xHNcSxxC3JtH9OTgyys5+LpVBirwHz4zeRP8AnJOLXb5CunT3 kOoLKARW3uF9OZh48GL/AHYpfW8E8M8Mc8DrLDKoeKRCGVlYVVlI6gjFD5w/5y98z2bxaJ5Xhf1L xJGv7qNTXgvExQhh4tyc/wC3ikPZ/wAqNBudB/Lny/pV0np3MFojTx91klJldT7qz0OKGV4q7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWO/mBpvm/UvK91Z+Ub+LTNclaP0LyckIqBwZBURzEEp UCi4q+fLv/nGz86LzzCPMVz5g0qXW1ljuFvzPc+oJYePpvta0qvBafLFNvdfyw0X8wdI0Ke188at Bq+om4Z7a4gJYLAUWiMzRQEnmGPQ/PFCYefvJtj5y8p3/l68cwx3ij051HIxyxsHjcCorRlFRXcb Yq83/Jj8pvzM8h63JDf63aXPlRlmP6PgeVmMz8QkvCSFVQ0Tfi/34pLMvzS/KjQPzC0hLW+Y2mo2 3I2GpxqGeIt1VlJXmjU3Wo9iMUPHLH8n/wDnIzyxEdM8u+ZIm0tSWhWO5ZUUEnYRzRnge5C7e+KU 98mfkB54l81WXmvz35okudQspVuLaG2mkmkDAhwrTShVjUNUNGiFSNgaYq9I/N/yhr/m/wAj3Wg6 HdxWd5dSRc5J5JIo2iVqujGJZGIbw40xQ8N0b/nGz87tE9X9C+aLPTPXp631O/v7fnx6cvTgWtK9 8U2mX/Kkv+ckf+p+/wC5tqn/AFSxW07/ACd/Inzx5P8APj+ZNe1GxvUlgnSZoJriWd5ZiGLsZYY6 1IJJLVxUvQvzT/KjQfzC0hLW9Y2mo2tTp+pRqGeIt1VlJXnG1N1qPYjFDx6z/KL/AJyQ8tw/ovQP Mkb6VGSbcR3TBVUkgAJNHWPbcqvw+5xSyL8t/wDnG2ew15fM/nvUl1vV0k9eO2VpJozMDUSTzTAP Kw2NKAV7sMVt7tih2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV/9k= + + + + uuid:4811b30d-e39a-404c-8b66-f3a0ed7d4cdb + xmp.did:2fe69120-97d9-2a4d-a769-0a8b78a1c96b + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + xmp.iid:3ada2a4e-e16a-6442-b91d-4d4951a1ab85 + xmp.did:3ada2a4e-e16a-6442-b91d-4d4951a1ab85 + uuid:5D20892493BFDB11914A8590D31508C8 + proof:pdf + + + + + saved + xmp.iid:3ada2a4e-e16a-6442-b91d-4d4951a1ab85 + 2018-06-22T15:33:35+02:00 + Adobe Illustrator CC 22.0 (Windows) + / + + + saved + xmp.iid:2fe69120-97d9-2a4d-a769-0a8b78a1c96b + 2018-06-22T15:34:12+02:00 + Adobe Illustrator CC 22.0 (Windows) + / + + + + Print + False + False + 1 + + 297.000000 + 210.000000 + Millimeters + + + + + RobotoSlab-Regular + Roboto Slab + Regular + TrueType + Version 1.100263; 2013; ttfautohint (v0.94.20-1c74) -l 8 -r 12 -G 200 -x 14 -w "" -W + False + RobotoSlab-Regular.ttf + + + + + + Cyan + Magenta + Yellow + Black + + + + + + Groupe de nuances par défaut + 0 + + + + Blanc + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 0.000000 + + + Noir + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + Rouge CMJN + CMYK + PROCESS + 0.000000 + 100.000000 + 100.000000 + 0.000000 + + + Jaune CMJN + CMYK + PROCESS + 0.000000 + 0.000000 + 100.000000 + 0.000000 + + + Vert CMJN + CMYK + PROCESS + 100.000000 + 0.000000 + 100.000000 + 0.000000 + + + Cyan CMJN + CMYK + PROCESS + 100.000000 + 0.000000 + 0.000000 + 0.000000 + + + Bleu CMJN + CMYK + PROCESS + 100.000000 + 100.000000 + 0.000000 + 0.000000 + + + Magenta CMJN + CMYK + PROCESS + 0.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=15 M=100 J=90 N=10 + CMYK + PROCESS + 15.000000 + 100.000000 + 90.000000 + 10.000000 + + + C=0 M=90 J=85 N=0 + CMYK + PROCESS + 0.000000 + 90.000000 + 85.000000 + 0.000000 + + + C=0 M=80 J=95 N=0 + CMYK + PROCESS + 0.000000 + 80.000000 + 95.000000 + 0.000000 + + + C=0 M=50 J=100 N=0 + CMYK + PROCESS + 0.000000 + 50.000000 + 100.000000 + 0.000000 + + + C=0 M=35 J=85 N=0 + CMYK + PROCESS + 0.000000 + 35.000000 + 85.000000 + 0.000000 + + + C=5 M=0 J=90 N=0 + CMYK + PROCESS + 5.000000 + 0.000000 + 90.000000 + 0.000000 + + + C=20 M=0 J=100 N=0 + CMYK + PROCESS + 20.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=50 M=0 J=100 N=0 + CMYK + PROCESS + 50.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=75 M=0 J=100 N=0 + CMYK + PROCESS + 75.000000 + 0.000000 + 100.000000 + 0.000000 + + + C=85 M=10 J=100 N=10 + CMYK + PROCESS + 85.000000 + 10.000000 + 100.000000 + 10.000000 + + + C=90 M=30 J=95 N=30 + CMYK + PROCESS + 90.000000 + 30.000000 + 95.000000 + 30.000000 + + + C=75 M=0 J=75 N=0 + CMYK + PROCESS + 75.000000 + 0.000000 + 75.000000 + 0.000000 + + + C=80 M=10 J=45 N=0 + CMYK + PROCESS + 80.000000 + 10.000000 + 45.000000 + 0.000000 + + + C=70 M=15 J=0 N=0 + CMYK + PROCESS + 70.000000 + 15.000000 + 0.000000 + 0.000000 + + + C=85 M=50 J=0 N=0 + CMYK + PROCESS + 85.000000 + 50.000000 + 0.000000 + 0.000000 + + + C=100 M=95 J=5 N=0 + CMYK + PROCESS + 100.000000 + 95.000000 + 5.000000 + 0.000000 + + + C=100 M=100 J=25 N=25 + CMYK + PROCESS + 100.000000 + 100.000000 + 25.000000 + 25.000000 + + + C=75 M=100 J=0 N=0 + CMYK + PROCESS + 75.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=50 M=100 J=0 N=0 + CMYK + PROCESS + 50.000000 + 100.000000 + 0.000000 + 0.000000 + + + C=35 M=100 J=35 N=10 + CMYK + PROCESS + 35.000000 + 100.000000 + 35.000000 + 10.000000 + + + C=10 M=100 J=50 N=0 + CMYK + PROCESS + 10.000000 + 100.000000 + 50.000000 + 0.000000 + + + C=0 M=95 J=20 N=0 + CMYK + PROCESS + 0.000000 + 95.000000 + 20.000000 + 0.000000 + + + C=25 M=25 J=40 N=0 + CMYK + PROCESS + 25.000000 + 25.000000 + 40.000000 + 0.000000 + + + C=40 M=45 J=50 N=5 + CMYK + PROCESS + 40.000000 + 45.000000 + 50.000000 + 5.000000 + + + C=50 M=50 J=60 N=25 + CMYK + PROCESS + 50.000000 + 50.000000 + 60.000000 + 25.000000 + + + C=55 M=60 J=65 N=40 + CMYK + PROCESS + 55.000000 + 60.000000 + 65.000000 + 40.000000 + + + C=25 M=40 J=65 N=0 + CMYK + PROCESS + 25.000000 + 40.000000 + 65.000000 + 0.000000 + + + C=30 M=50 J=75 N=10 + CMYK + PROCESS + 30.000000 + 50.000000 + 75.000000 + 10.000000 + + + C=35 M=60 J=80 N=25 + CMYK + PROCESS + 35.000000 + 60.000000 + 80.000000 + 25.000000 + + + C=40 M=65 J=90 N=35 + CMYK + PROCESS + 40.000000 + 65.000000 + 90.000000 + 35.000000 + + + C=40 M=70 J=100 N=50 + CMYK + PROCESS + 40.000000 + 70.000000 + 100.000000 + 50.000000 + + + C=50 M=70 J=80 N=70 + CMYK + PROCESS + 50.000000 + 70.000000 + 80.000000 + 70.000000 + + + + + + Gris + 1 + + + + C=0 M=0 J=0 N=100 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 100.000000 + + + C=0 M=0 J=0 N=90 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 89.999400 + + + C=0 M=0 J=0 N=80 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 79.998800 + + + C=0 M=0 J=0 N=70 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 69.999700 + + + C=0 M=0 J=0 N=60 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 59.999100 + + + C=0 M=0 J=0 N=50 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 50.000000 + + + C=0 M=0 J=0 N=40 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 39.999400 + + + C=0 M=0 J=0 N=30 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 29.998800 + + + C=0 M=0 J=0 N=20 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 19.999700 + + + C=0 M=0 J=0 N=10 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 9.999100 + + + C=0 M=0 J=0 N=5 + CMYK + PROCESS + 0.000000 + 0.000000 + 0.000000 + 4.998800 + + + + + + Couleurs vives + 1 + + + + C=0 M=100 J=100 N=0 + CMYK + PROCESS + 0.000000 + 100.000000 + 100.000000 + 0.000000 + + + C=0 M=75 J=100 N=0 + CMYK + PROCESS + 0.000000 + 75.000000 + 100.000000 + 0.000000 + + + C=0 M=10 J=95 N=0 + CMYK + PROCESS + 0.000000 + 10.000000 + 95.000000 + 0.000000 + + + C=85 M=10 J=100 N=0 + CMYK + PROCESS + 85.000000 + 10.000000 + 100.000000 + 0.000000 + + + C=100 M=90 J=0 N=0 + CMYK + PROCESS + 100.000000 + 90.000000 + 0.000000 + 0.000000 + + + C=60 M=90 J=0 N=0 + CMYK + PROCESS + 60.000000 + 90.000000 + 0.003100 + 0.003100 + + + + + + + Adobe PDF library 15.00 + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 12 0 R/TrimBox[0.0 0.0 841.89 595.276]/Type/Page>> endobj 9 0 obj <>stream +HWˎD+z @r%>` (TuAnW:|{sݫoy"Us>ܾm?_1 λݷo׌ebMJmӶG~x1-qq; R5QD>Q #I>diRZJ1WL߰quFAg%!sHdD;\.3}>եAJt)X$x}ꯡNw~URT$e*|:']cR ,GX 2'5fݾFi!>ޙg0^a'RQH@"$\ԘӐ + UIZTfe%XW7aطP)ݰs킏kB`OۇDUU|W @,p2B5g|6&D, >Nˮ$Q\(n$xHf (5 KP5%!w O|i.<*0qS/4K٨ZNs1?/J=4TgARI~] O(dJ2!d+cr +X-ɪd :,D`qejs=*#=wCjesY?VMkm:M`5Zss +[&#M2]7c#3 [r$R2ұ 卆d9)5SP 3Z}fͮ ,9U)XħyQG +NBb֥vH:wתGwp}i Px(EJ:CZQڀ`![ȕ(m!M5"ɊJ/ h"\FW%vş1>stream +8;Z]!0b/gi$q54S[To+Im(EL"VCZ9Cm-E/EOqQ9<;Un"=q@;HA#U+m! +0P`i_OJ3e?^#lDNYs=n,X4N/8VB4-6/r3&uY5!B2Ak>.*123%^StO,K5Xf3dOXVF! +(.)OlnJnBgqunRE;)_]NAa9[YMshOp:aE:dCE]+[L:+bUC.j=pY"Jh.W~> +endstream endobj 13 0 obj [/Indexed/DeviceRGB 255 14 0 R] endobj 14 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 6 0 obj <> endobj 15 0 obj [/View/Design] endobj 16 0 obj <>>> endobj 5 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <>stream +Hytǿ7! !{LHH +! b- k&;M@He_,ZXRrڞ=P"JMX +–"v;}|g{7yO=^Ҟ:owꗶT/\`]N U}>nCXXmVm]R{=@L5k*ן׮j#_X~5u <' ާ^R~˯.ntt~d]V2t@U _7Ϋl moc#W]-'PŸŰQvy196YW;|!t;@؉ ;w|U|);FgnFBW=HD!18#= >xNٹF!)TaґLd!9A` Ab##P},a< +Q xML#b| b +xF jham@#mZKi~C1KpZj6z?\4|]k簅*jjh6ߧEF,9TO *AMa];xU,.` +uin{uWё{u>q|.(JCShU3.E + + eQ3 HDH4F*'rTI9mM)2Mi0KZs|`U9"1Nrvq^r;odYqr[)Vk[VZfnau9\1xەrt;vv;Rwee pds]-OqhJTHQq'S7i |~UT5dUi7ͼ;b~꼾*K5J{[Sd~{VJlFa]TF9`|]3;{`%V)"]JX%r+a-)RlbqӗrߥKh=SyO3y˸+,Wq5lsV\$ϳ+x%ᵼejL㝼w^y#7eE$KI'ݱ_!Dg8 Q-1+q/ $1qf`?I8)eS2@d4>'ɒlɑ2Hre0>Y"ysUdܻK2%_F] +pEFt&+d<PfHrP 2b))AJ+RL1&8F(t ʤ,ITeil1&D)4HUʥ4h( *&52D.7h8ME#FCha#2GJ-&D8opa"PBY,KITDKE҃4Qy5q|vyLO@MrI D*GV;T3)S}hZ+ɕ\bK\1D7̮ x,_X—j7Ê,_]ɱG*.f -.)~jZ^ibI!I򡸤qqLW_\s$jm:9;OBHlC7NJ|m҄@LI<@؁;J#4y-nu[Z@U7i?IS5!];nLچ~;wN΍*| Œ!ƣoN3cŌZzZOL WǓԚDH\G_'}UH S9ѐ84ԁAtD}H9L"]Cu &; 9%L$9t/zp̽\`fR,R&t]Zˈ&TG!Ud?0H?CH[I=c!Ul.g3QJB\:/P_aK Xk㙒 GUQ0R<O("hxaep)i+-5 L#ǒX%-c7rOXdWTՓhRh4̔ʠ12$N T3HNrHVAJef$fIcf +HN73$g _B3/&YID$go7I}o~M@$kL=b@DI‚&-~n55U yud1~TU+RL֓U]b;9zSo xaKO&7#h3Febd@֐ +aO$ŕB\,zXä1#;'>ݍ{9̘4{ +nI ]֣pΆtPtu}Ա::5:ժQxB6ƶKs Y͸y"NEZ +qhtc Ӎѣm)>pI\SI{]xDx _E\FJ1"fVإm>{>FՁxX1Mq:,_GKs5d*|U jGkIYLT~iaJϧH"e-խg?T ]hGitLk;VHmlR/،aܜIu,$Ո{%,'l,}F>|-\39* K`*8j(,MVOƣ{&vc9lؚY`q,'!CV*%iC8C8:XOqHg!@Cj,c4PmQ 58hATMA!{T&_Mj#nQy6ueuT[Vӻ~XTy1\i(xJ 4Mq0)Ke'jcLsV:y^wZhjt*N4؇6~;\2W>z@ r#g㻾w {+$d/ cu!$8fV͘"עL %9SP:jtwyYdn m3+|-uMF;잯kD*d+L{ُ|ǫs߽hvjHxzd|0{(VfQQ5^Xf \-_Ղ=ڻgFdՓ/_cY^;"8t@  + +``PMKs vk7w;/>|f-_{=ϻݼy;9y?6E@q}1|CVgbLUhK &m|g(wB#1[m̻jhrh"0q%l0m˸zƫax2N[ֶsƃ(gNbIdL>,{5fӜQ(U9~ eYO=7CMA3DϺL~6~s;T 1JCXPo>9_7'S˿xg=cC;19JC0ٹv<5`|>L=$};=gXZ*{6m*ݷ0n)3Z*BJL%M#=_wa1ǡCah"X'{9w?y?E>b{v:ح6bk(6>Cy5 L2H,YH]|\y4t/f9(փI^?Œm(vrϟb:ZtiE وł5(&mSqgV4x?QOebc f.FVrP:ܟs`5!bcщk%Zk* P?c(KuRK)3(̙O0 )dr7#ʁR ' +C5ÇA|?fsUQąͨV{fvs `01dvks&aV11jzMꛉJ]sy8`lbz8$swOOR{g1M ;khOš_*hw=Mk'2X%讝"u3UnR EKQ (Mk~Z[<)Q l#=+P3"<<-R 5wh:ʚ#~}ҵ={Qc*t& 'N1;E[oÕj[yt|%'] Ρ90n8Г6,s`ݘ& 1!}T9|{尾-IlRS'r!V/ (X]|\h{9_Bz> nߒO%f/ڌ j c\³ȱ4"ҜQbSx)0_Sk^%#8Lbw4™}iw}S OGS/Ic𢀟 & L.!\]rx=ypbZ[zReO p%DX7#= O^ 5 KGR8IvQacȻE炵5'=?k:59/Ŷv|G߯_<Ẏf􈭻bJO0NKSqLusB{I@|c͇Y){I^b__|{~;N@xp:p5c뺒fDz[om ؊P&>,!O8(\E_lZ~YB9t}_] G34TGST};o> endobj 10 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 17.0 +%%AI8_CreatorVersion: 22.0.1 +%%For: (Gwena\753l LE HIR) () +%%Title: (logo Re2o.svg) +%%CreationDate: 6/22/2018 3:34 PM +%%Canvassize: 16383 +%%BoundingBox: 263 -429 551 -164 +%%HiResBoundingBox: 263.856947902714 -428.016690471995 550.412066012963 -164.258911847263 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%AI5_FileFormat 13.0 +%AI12_BuildNumber: 249 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%CMYKProcessColor: 1 1 1 1 ([Repérage]) +%AI3_Cropmarks: 0 -595.2755905512 841.8897637795 0 +%AI3_TemplateBox: 421.5 -298.5 421.5 -298.5 +%AI3_TileBox: -0.000003364156328 -595.275582140836 841.919979546001 0.044425183384192 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 1 +%AI9_ColorModel: 2 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI17_Begin_Content_if_version_gt:17 1 +%AI9_OpenToView: -60 16 1.46 1420 902 18 0 0 116 123 0 0 0 1 1 0 1 1 0 0 +%AI17_Alternate_Content +%AI9_OpenToView: -60 16 1.46 1420 902 18 0 0 116 123 0 0 0 1 1 0 1 1 0 0 +%AI17_End_Versioned_Content +%AI5_OpenViewLayers: 7 +%%PageOrigin:115 -694 +%AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MO +%%EndComments + +endstream endobj 21 0 obj <>stream +%%BoundingBox: 263 -429 551 -164 +%%HiResBoundingBox: 263.856947902714 -428.016690471995 550.412066012963 -164.258911847263 +%AI7_Thumbnail: 128 120 8 +%%BeginData: 11839 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C45FDA2FFCAC9C8C9C8C9CAFD78FFC8C7C0C1C0C1C0C1C2CFFD74FFCA +%C0C19EC1C0C19EC1C0C19EC9FD72FFCFC1C1C0C7C0C1C0C7C0C1C0C7C1C9 +%FD70FFCF9EC1C0C19EC1C0C19EC1C0C19EC1C0C9FD08FF93B593B593B593 +%B593B593B593B593B593B593B593B593B593B593B593B593B593B593B593 +%B593B593B593BBA0FD3AFFC2C1C0C7C0C1C0C7C0C1C0C7C0C1C0C1C1FD08 +%FFC28CB5B0B58CB5B0B58CB5B0B58CB5B0B58CB5B0B58CB5B0B58CB5B0B5 +%8CB5B0B58CB5B0B58CB5B0B58CB5B0B5BBFD38FFC9C1C0C19EC1C0C19EC1 +%C0C19EC1C0C19EC1C9FD07FFC3B58CB58CB58CB58CB58CB58CB58CB58CB5 +%8CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB599FD +%37FFC9C1C1C0C7C0C1C0C7C0C1C0C7C0C1C0C7C1C8FD07FFCA8DB5B5B58D +%B5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5 +%B58DB5B5B58DB5B5B58DB5C9FD36FFC1C1C0C19EC1C0C19EC1C0C19EC1C0 +%C19EC1C0FD07FFCAB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58C +%B58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CC2FD36FFC8C0 +%C7C0C1C0C7C0C1C0C7C0C1C0C7C0C1C0C7CFFD07FFB5B58CB5B5B58CB5B5 +%B58CB5B5B58CB5B5B58CB5B5B58CB5B5B58CB5B5B58CB5B5B58CB5B5B58C +%B5B5B58CB5B5B5BCFD36FFC1C19EC1C0C19EC1C0C19EC1C0C19EC1C0C19E +%CFFD06FFCAB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB5 +%8CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CC2FD36FFC8C0C7C0C1 +%C0C7C0C1C0C7C0C1C0C7C0C1C0C7CFFD07FFB5B58DB5B5B58DB5B5B58DB5 +%B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B5 +%8DB5B5B5BCFD36FFC8C19EC1C0C19EC1C0C19EC1C0C19EC1C0C1C1FD07FF +%C9B58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB5 +%8CB58CB58CB58CB58CB58CB58CB58CB58CC2FD36FFCFC0C1C0C7C0C1C0C7 +%C0C1C0C7C0C1C0C7C0C9FD07FFC98CB5B0B58CB5B0B58CB5B0B58CB5B0B5 +%8CB5B0B58CB5B0B58CB5B0B58CB5B0B58CB5B5B58CB5B5B58CB5B5B58CB5 +%BCFD37FFC7C0C19EC1C0C19EC1C0C19EC1C0C19EC1CAFFA8FD05FFC3BC99 +%C29AC299C29AC299C29AC299C29AC299C29AC299C29AC299C29AC299C299 +%B58CB58CB58CB58CB58CB58CB58CC2FD37FFCAC1C0C7C0C1C0C7C0C1C0C7 +%C0C1C0C1C9FF527DFD27FFC9B5B58DB5B5B58DB5B5B58DB5C2FD38FFC9C1 +%9EC1C0C19EC1C0C19EC1C0C1C2FF7D27F87DFD27FFCA8CB58CB58CB58CB5 +%8CB58CC2FD39FFC9C1C0C1C0C1C0C7C0C1C0C1C8FFA8272727F87DFD27FF +%C9B0B58CB5B5B58CB5B5B5BCFD3AFFC9C89EC1C0C19EC1C0C1C9FFA827F8 +%27F827F87DFD26FFCAB58CB58CB58CB58CB58CC2FD3CFFCFC9C8C1C8C8CF +%FFFF7D27202727272027277DFD26FFBBB58DB5B5B58DB5B5B5BCFD44FF52 +%27F827F827F827F827F87DFD25FFBC8CB58CB58CB58CB58CC2FD45FFFD04 +%27F8272727F827277DFD24FFBBB5B5B58CB5B5B58CB5BCFD46FF2727F827 +%F827F827F827F87DFD23FFBC8CB58CB58CB58CB58CC2FD47FF2727202727 +%272027272720A8FD22FFBBB5B5B58DB5B5B58DB5C2FD48FF2727F827F827 +%F827F827F87DFD21FFBC8CB58CB58CB58CB58CC2FD49FF2727F8272727F8 +%272727F8A8FD20FFBBB58CB5B5B58CB5B5B5BCFD3AFFCAFD0FFF2727F827 +%F827F827F827F87DFD04FFCACAA7CACAFD16FFBC8CB58CB58CB58CB58CC2 +%FD39FFC9B5BBC3C3CACACAC9C3BCFD07FFFD042720272727202752FFCAC9 +%BBBB93BB93BB99C3CAFD13FFBBB58DB5B5B58DB5B5B5BCFD39FFCA8CB58C +%B58CB58CB58CB5CAFD06FFA82727F827F827F8277DFFA0BB92B592BB92BB +%92B592BB99CAFD11FFBC8CB58CB58CB58CB58CC2FD39FFC9B5B0B58CB5B0 +%B58CB5B5CFFD07FFAFFD0427F827A8CA99B593BB92BB93BB92BB93BB92BB +%99C9FD10FFBBB5B5B58CB5B5B58CB5BCFD39FFC98CB58CB58CB58CB58CB5 +%CAFD08FFA8F827F8277DCA92B592BB92BB92BB92BB92BB92BB92BB92C3FD +%0FFFBC8CB58CB58CB58CB58CC2FD39FFC9B5B5B58DB5B5B58DB5B5CFFD0A +%FF27277DFFBBBB93BB93BB93BB93BB93BB93BB93BBBBBB93CAFD0EFFBBB5 +%B5B58DB5B5B58DB5C2FD39FFC98CB58CB58CB58CB58CB5CAFD0AFFA852FF +%99B592BB92BB92BB92BB92BB92BB92BB92BB92B592CFFD0DFFBC8CB58CB5 +%8CB58CB58CC2FD39FFC9B58CB5B5B58CB5B5B58CCFFD0CFFC3B592BB93BB +%92BB93BB92BB93BB92BB93BB92BB93B599FD0DFFBBB58CB5B5B58CB5B5B5 +%BCFD39FFCA8CB58CB58CB58CB58CB5A7FD0BFFCABB92BB92BB92BB92BB92 +%BB92BB92BB92BB92BB92BB92B5A7FD0CFFBC8CB58CB58CB58CB58CC2FD39 +%FFC9B58DB5B5B58DB5B5B593CFFD0BFFCA93BB93BB93BB93BB93BB93BB93 +%BB93BB93BB93BB93BB93C3FD0CFFBBB58DB5B5B58DB5B5B5BCFD39FFCA8C +%B58CB58CB58CB58CB5CAFD0BFF9AB592BB92BB92BB92BB92BB92BB92BB92 +%BB92BB92BB92B599FD0CFFBC8CB58CB58CB58CB58CC2FD39FFC9B5B0B58C +%B5B5B58CB5B5CFFD0BFFBC92BB93BB92BB93BB92BB93BB92BB93BB92BB93 +%BB92BB93BBCAFD0BFFBBB5B5B58CB5B5B58CB5BCFD39FFC98CB58CB58CB5 +%8CB58CB5CAFD0BFF93B592BB92BB92BB92BB92BB92BB92BB92BB92BB92BB +%92BB92CAFD0BFFBC8CB58CB58CB58CB58CC2FD39FFC9B5B5B58DB5B5B58D +%B5B5CFFD0BFFBB93BB93BB93BB93BB93BB93BB93BB93BB93BB93BB93BB93 +%BBC9FD0BFFBBB5B5B58DB5B5B58DB5C2FD39FFC98CB58CB58CB58CB58CB5 +%CAFD0BFF93BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92C9 +%FD0BFFBC8CB58CB58CB58CB58CC2FD39FFC9B58CB5B5B58CB5B5B58CCFFD +%0BFFBC93BB92BB93BB92BB93BB92BB93BB92BB93BB92BB93BB92BBCAFD0B +%FFBBB58CB5B5B58CB5B5B5BCFD39FFCA8CB58CB58CB58CB58CB5A7FD0BFF +%99B592BB92BB92BB92BB92BB92BB92BB92BB92BB92BB92B592FD0CFFBC8C +%B58CB58CB58CB58CC2FD39FFC9B58DB5B5B58DB5B5B593CFFD0BFFC993BB +%93BB93BB93BB93BB93BB93BB93BB93BB93BB93BB93C2FD0CFFBBB58DB5B5 +%B58DB5B5B5BCFD39FFCA8CB58CB58CB58CB58CB5CAFD0BFFCABB92BB92BB +%92BB92BB92BB92BB92BB92BB92BB92BB92B5A1FD0CFFBC8CB58CB58CB58C +%B58CC2FD39FFC9B5B0B58CB5B5B58CB5B5CFFD0CFFA0BB93BB92BB93BB92 +%BB93BB92BB93BB92BB93BB92BBBBFD0DFFBBB5B5B58CB5B5B58CB5BCFD39 +%FFC98CB58CB58CB58CB58CB5CAFD0CFFCF92B592BB92BB92BB92BB92BB92 +%BB92BB92BB92BB92C97DA8FD0BFFBC8CB58CB58CB58CB58CC2FD39FFC9B5 +%B5B58DB5B5B58DB5B5CFFD0DFFC993BB93BB93BB93BB93BB93BB93BB93BB +%93BB93C3A82727FD0BFFBBB5B5B58DB5B5B58DB5C2FD39FFC98CB58CB58C +%B58CB58CB5CAFD0EFFC392B592BB92BB92BB92BB92BB92BB92BB92C2FF52 +%F82727FD0AFFBC8CB58CB58CB58CB58CC2FD39FFC9B58CB5B5B58CB5B5B5 +%8CCFFD0FFFC993B592BB93BB92BB93BB92BB93BB92C2FF52F8FD0427FD09 +%FFBBB58CB5B5B58CB5B5B5BCFD39FFCA8CB58CB58CB58CB58CB5A7FD10FF +%CA99B592BB92BB92BB92B592B592C3A852F827F827F82727FD08FFBC8CB5 +%8CB58CB58CB58CC2FD39FFC9B58DB5B5B58DB5B5B593CFFD12FFC3C2BBBB +%93BB93B593C2C2FF7D52272720272727202727FD07FFBCBCC2C9C9C9C2C2 +%BBB5BCFD39FFCA8CB58CB58CB58CB58CB5CAFD14FFCFC3C3A0C3C3CAFFFF +%FF7DF827F827F827F827F82727FD0FFFCACAFD39FFC9B5B0B58CB5B5B58C +%B5B5CFFD1FFF7DF8272727F8272727F82727FD49FFC98CB58CB58CB58CB5 +%8CB5CAFD20FF7DF827F827F827F827F82727FD48FFC9B5B5B58DB5B5B58D +%B5B5CFFD21FF7D27272027272720FD0427FD47FFC98CB58CB58CB58CB58C +%B5CAFD22FF7DF827F827F827F827F82727FD46FFC9B58CB5B5B58CB5B5B5 +%8CCFFD23FF7D2727F8272727F827272728FD45FFCA8CB58CB58CB58CB58C +%B5A8FD24FF7DF827F827F827F827F82727FD44FFC9B58DB5B5B58DB5B5B5 +%93CFFD25FF7D2027272720FD0427A8FFFFC9C9C8C9C9CFFD3CFFCA8CB58C +%B58CB58CB58CB5C3FD26FF7DF827F827F82752FFCAC9C1C19EC1C0C19EC8 +%C9FD3AFFC9B5B0B58CB5B5B58CB5B0C2FD27FF7DF827272752FFCAC7C0C1 +%C0C1C0C7C0C1C0C1C8FD39FFC98CB58CB58CB58CB58CB58CC9FD27FF7DF8 +%2727FFC9C1C0C19EC1C0C19EC1C0C19EC1C2FD38FFC9B5B5B58DB5B5B58D +%FD04B5CAFD27FF7D27A8CFC7C1C1C0C7C0C1C0C7C0C1C0C7C0C1C9FD37FF +%C98CB58CB58CB58CB58CB58CB58CBCC2C3A0C3C2C3A0C3C2C3A0C3C2C3A0 +%C3C2C3A0C3C2C3A0C3C2C3A0C3C2C3A0C3C3FD06FFA8FFC89EC1C0C19EC1 +%C0C19EC1C0C19EC1C0C1CAFD36FFC9B58CB5B5B58CB5B5B58CB5B5B58CB5 +%B0B58CB5B0B58CB5B0B58CB5B0B58CB5B0B58CB5B0B58CB5B0B58CB5B0B5 +%8CBCFD08FFC0C1C0C7C0C1C0C7C0C1C0C7C0C1C0C7C0C9FD36FFCA8CB58C +%B58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58C +%B58CB58CB58CB58CB58CB58CB59AFD07FFC8C1C0C19EC1C0C19EC1C0C19E +%C1C0C19EC1C1FD36FFC9B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5 +%B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DC9FD07FF +%C9C1C1C0C7C0C1C0C7C0C1C0C7C0C1C0C7C0C1CAFD35FFCA8CB58CB58CB5 +%8CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB5 +%8CB58CB58CB58CB58CB5A1FD07FFC1C1C0C19EC1C0C19EC1C0C19EC1C0C1 +%9EC1C0CAFD35FFC9B5B0B58CB5B5B58CB5B5B58CB5B5B58CB5B5B58CB5B5 +%B58CB5B5B58CB5B5B58CB5B5B58CB5B5B58CB5B5B58CB5B0C9FD07FFC8C0 +%C7C0C1C0C7C0C1C0C7C0C1C0C7C0C1C0C1CAFD35FFC98CB58CB58CB58CB5 +%8CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB5 +%8CB58CB58CB58CB5C2FD07FFC2C19EC1C0C19EC1C0C19EC1C0C19EC1C0C1 +%9ECFFD35FFCFB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58D +%B5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5B58DB5B5C3FD07FFC9C0C7C0 +%C1C0C7C0C1C0C7C0C1C0C7C0C1C0C7FD37FF9AB58CB58CB58CB58CB58CB5 +%8CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB5 +%8CB58CB599FD07FFCAC19EC1C0C19EC1C0C19EC1C0C19EC1C0C1C2FD38FF +%BBB5B0B58CB5B5B58CB5B5B58CB5B5B58CB5B5B58CB5B5B58CB5B5B58CB5 +%B5B58CB5B5B58CB5B5B58CB5B5B58CBBFD08FFC8C1C0C7C0C1C0C7C0C1C0 +%C7C0C1C0C1C0CFFD39FF9AB58CB58CB58CB58CB58CB58CB58CB58CB58CB5 +%8CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CB58CCAFD07FFCF +%C0C19EC1C0C19EC1C0C19EC1C0C19EC8FD3CFFCAC9CAC9CAC9CAC9CAC9CA +%C9CAC9CAC9CAC9CAC9CAC9CAC9CAC9CAC9CAC9CAC9CAC9CAC9CAC9CAC9CA +%C9CACAFD08FFCFC0C7C1C1C0C7C0C1C0C7C0C1C0C8FD72FFC99EC1C0C19E +%C1C0C19EC1C0C8CFFD73FFCFC2C1C0C1C0C1C0C1C1CEFD77FFC9C9C2C19F +%C8C9FDFCFFFDFCFFFDC7FFA87D527D527D527D527D7DA8A8FD16FFA85252 +%275252A8FD56FFA9F8272727F8272727F8272752A8FD14FF7D2727F82727 +%27F8A8FD56FFA87D27F852FD047D5227F8277DFD12FF7DF82752A8A8A827 +%27F8A8FD57FF27277DFD05FFA8522052FD12FF20277DFD05FF272752FD56 +%FFA827F87DFD06FF7D27F8A8FD10FF7D27F8FD06FF7DF827A8FD56FF2727 +%7DFD06FFA82727A8FD06FFA85252527DA8FD04FF7D2752FD06FF7D27F8FD +%06FFA85252527DA8FD4AFFA827F87DFD06FF7D27F8A8FD04FFA852F827F8 +%27F8277DFFFFFFA8FFA8FD06FF7DF827A8FFFFFFA852F827F827F82752FD +%4AFF27277DFD06FF7D2752FD05FF5227277DA8A8522027A8FD0BFF272752 +%FD04FF5227277DA8A87D20277DFD48FFA827F87DFFFFA8FFA87DF8277DFD +%04FF7DF827A8FD04FF52F852FD0AFF5227F8A8FFFFFF7DF827A8FD04FF7D +%F827A8FD48FF2727274CFD052728A8FD05FF27277DFD05FF7D2727FD09FF +%A827F87DFD04FF272752FD06FF27F87DFD47FFA827F827F827F827F82727 +%7DFD04FF7D27F853FD067DF827A8FD07FFA827F852FD04FF8427F8A8FD06 +%FF522727FD48FF27277DFFA8FFA8FF522720A8FFFFFFA827272027272720 +%27272720FD07FFAF522752FD05FFA82727A8FD06FF7D2052FD47FFA827F8 +%7DFD06FF522727FFFFFF7D27F852527D527D527D527DA8FD06FF52F827A8 +%FD05FF7D27F8A8FD06FF532727FD48FF27277DFD06FFA82727A8FFFFA8F8 +%27A8FD0EFF522727A8FD06FFA8F827A8FD06FF7D2752FD47FFA827F87DFD +%06FF7D27F8A8FFFFA827F87DFD0DFF7DF827A8FD07FFA827F8A8FD06FF27 +%2752FD48FF27277DFD06FFA82727A8FFFFFF272752FD0CFF7D2027A8FD04 +%FFA8277DFFFF272752FD05FFA827277EFD47FFA827F87DFD06FF7D27F8A8 +%FFFFFF7DF8277DFD04FFA952FD04FF84F8277DFD05FF522752FFFF7DF827 +%7DFD04FF52F827A8FD46FF7D7D2727527DA8FD05FF272728A8FFFFFF7DF8 +%27527D7D7D272753FFFFA8F82727522752525228272759FFFFFF7DF82752 +%7D5352272784FD46FFA827F827F827F87DFD05FF7DF82727FD04FF7DF827 +%F827F82752A8FFFF7D27F827F827F827F827F82752FD04FF7DF827F827F8 +%527DFD48FFA8A9FD05A8FD07FFA8FD07FF7D7D7DA8A8FD05FFA8A9A8A8A8 +%AFA8A8A8AFA8FD07FF7D7D7DA8FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFC +%FFFDFCFFFDC2FFFF +%%EndData + +endstream endobj 22 0 obj <>stream +\3ዝӜ·Ќ~. }C<7hgi3)6OC˪.^=IP^? N]&h\ܞOٰJV5褐? UiGSo?Moݬ6J7'%{@k5^fjhQYEY/55;nd枋pQMm#" [udm١fTJӦ W8hZ57E̠\08g چ0f^vrE(hyF%!(?){wvl7㲒8U& C2aӀH\ى%v@{!n*hO*FՁNQՃ!T9bF(YR5, dz'(ye%V`sOzqvRb&W8̸v^R4'곗<* A҈K*JgC?Gu&%%7] .NƝ%#Q/tvmmChbb=I\LG7:d7F?Ů}Cgu U<ڴ7%|4/=>+tFH 4WhnI,:HvjTRijPdO;OkɃ>xôW?( I6DzfzMm$ +I)&ű!+v֝ŞH`]?9D{PٗZ&lţ;,(j߬i*HԎ_cbFrٔj%2_Wa@޶[!4Ā jam5k+ƩO{ 6'>hѮ'^HڪK]r ZT(u'q(!=!(}iM'Pk-g L.T]Q7QX?="+$*JPنY`dĞu/*%]78ᬂܫ!mӍ*[4ƮZ+6b_``}ˑJ^G$Wm^(28]ix3(hҲj +B澛\k +`.aݭaV_6FyX; !9N=ېsEO(;&?)ixRޭPف ֌9iJ,X1SEbyN6bhO>#lyU#xZ1M~H/&r_ S_]j^qqa *4$UzBwN|LgS;뺇pNW?Ig܂i/ ++ ::k8K`AEś)im6 sVbE*/ >PxH' +d91"xbf>8H|K[efr_W]mzHS:Nbwv\C99$r̞QT}М覩SW 1e]s0pg @e9fqDQz4|]_(ć>}+:1p :J0iӁ.>SP?fY 0&wC^4K|IHO,XPb!R`cW4(jM9U2X̊Qmm6aG fՅL9(bIab v'=?b' :^xaFZhیc&p䆝Xln0NhCȌs`f|Q cO,P~rI+h#5-K:RTmEcQǹSmƗ1ic.h١yQ]wJvG yݱ1K/ +.7%##G[KӽE.)U~{b!, 1jX ~aѷL䚝P3=[(j rLDG3亚wAcD)~ z9݅ֆ'N] Ʀi&J:N}>\޵3Q#GuhӽoT:jCg71FE=&oܢO)a$9K|_tY}x[sVEʸ,~{JUM?ZJ=8Dʣ{A pZ9wSٗK JT .YoW]Qr;:_xߝԽـ=37HȡV%\{dˀ )FHܖ꓎}K\:QU/^2 b UiY8 7kӊOrd5lkÖԈ9 @9h7O^TKXVӪ6Lu.wJB'^#&9D&>Lտri{~:`ȝ6}NxEw5ȴq)Rjxd'^Yxm>߃/[RC><{w'VMȻƗjhWd8.z,M;mg)w#1}`ӿLXxYl9Lq3m$Vv=/Ț. +jΒZ;,dصA5>m~dWe92vVIvbb>nx[ 炿5[}yEOvRv\掟/D%dM7X6WGC;s,9^U-xNEȚ聿p*o.4YRf{yWU5 Y醹9&]tk+6|A,_ffVh2 pY2nAT٪=򗌔5L%~d[d9:JZOF44;:S}7ՅI"cUq+f=yo +L҂Z4`sf1֋퀦ic\U׿ȫN+z>lZHUnSV/\Y1j6-1{ޖrh쩞Ƹ*D]uܘ\3ӕ -,y%|Ʉ|}sX'Y+T84Mw*+O]Rhz|#* wbrOQ߼dg.k40ɱ)qs-uۧw{^:tʁ/ȡ N~>Ї鹏i g+^^pr;#>'6E#zEVXHW!BY :]r?A;ƏAyك@уgwO98FU3ԗ<-q}\֏qR`[.dц>o3t285+muVE {a6nxړAB޳%54uQ i)lс_bdXMA3.Џn6oh$z\\rDϿ&21ڧS=ujg/OC~ 0^vH+Ps꒣uB#m&هBՖc8xi:@z?jN8c#&lyRVfFqk\$ 4MG! $oۅ^[9My"6͝aMuFLs (H*X̌dnRaz2jD_Pq,֣C^\:z}OGzБ!+(6ɅG)S8% QKW-{.:ݲjd.鉅KVirKSG.TY}/wQKYhպ4cV+7k^@~:#-z7 r31s&V`ͣmrkNRŪ WlCeL+#VM=7xՉΟ1 t~yN0Ѫ7,m/ +p1u}Dҫ-c,ʗ WhRb%,뉹KZESC:lxݜ.}<}m^~k,;# (頃=geSdtxe€{`ҷG(m9j6ܽQb-τ9}HJްf orhTL*񎋅־s'<|ڜZrC:x<"HĚ^20*feĔE 9wz6*#'O ҋW"攆R@[0SVXV5&kqGkPwftttgA!e.:xŀ瀼2bKVMM'*d%/%)m@Q_\gmelrt̰ + qT7EۖM3pBl˺CLGGin&UmZLY-&@-5F>z$D\bBt̪ARF"u1#oV0eG4jb9asE`"Ҥw5etdj@<-Տǻ^bVY47\z_s7IՁWҬU?7I w&iXՓ/3-eo]}vMC? l9 elŪ_<\wКv&E=.#hb}"Hأ^%9A;fo^{FYΞa2xMCI_栂VC+F&n:[ fլ)esF6tƞwtz[%nҨ -0_eA#tNÉ޽OutiM;yh-?:@8%gV\,Q~}L[q fR +6RXl7m}ck>QۢѸoM:D芋T ~ˉSG3W=f[g;fZ}?mhȈP'y z!l%6%Ahl;&iS!vCm:g]-Af`5*K fRKYMvGQ65h^Cы| UDru+O +cOvFʬ^"nBE-[4 1L>aV \e'pknvZϞ&n寺Z١amut2p{L8'Z &.$rJ#KzFpgA8mx֎n÷#U38qQ9j|5 he S )eO03Ō^ګͶR rfR4bGgϿMQQ\Y?W\ݲEg"D/څK93(T 5Z4`l4ЖZ "헰i8?wwQ~p$6xGT+Nua.˛S`Ct I $HhuT qJXl-l,1W{y;ajYPɄQзB/l޶ 8.acG۟tlMscV\~gNܝW=4ļR"M&19ʼhq>cE\Pk7t̊]ք O=hP5yRj6,$R_ 9XqcFl"\swy-[cE>g%/(⢍X47}8<:>.~t;; fNS@A͘68BPYo&k+`mYU3f +`T˕WO온؃ i`/1ʤ^䗳r<vO% +ϵ֥_0>q{‹FvݔJT헷T8{()g D\ld֯IvBCkڡ 5g܂5J8sv4"E ޸^+0N܆A Ndz?Fy o{ל!rV9LoP\ + QsLl𲥍6)'jlZhkl[w1A;qr=S$:0Ρoa|Ɋ\w.ZN-˫n,ڻkNxhwKգ3t&-h6~͝ަDKφK A+>h! G=^X]3wrGcZA쑭=igMySɪ,46&Ū ζwg[:`SzFƨ7IAlb΄ka_ML*ekwR(I/&%.spggRaLX3%q.t&gnt0e`%'a@Z"a—9Qx* 6Y_}o,QWD3ҧ&eXx*O|%JZ;BvBSjv]Gĺ2%.;:N1եe]j~͜Hۜ^_uHU #?I]7G{t36ޤp*G@uN8;ᬏsIso:il%̭4^83,bL8Kزi=84,XG[N>jb6(W.Ctqym4{1FtJT1 y= m) .ܢtU]lKG[耠`AߊZ]c>qPڬ`2W5ԯe4MYd"ti53miCyze:*֞5rNM eR'׃ )I"xYTUvAvzR,ԕ<!Fe){'%'fF7`.0:rM# +(h^/l;9;anM_@nfMTw4 \,+T^{.XrAxy;9a !P덮q^LMc['+|fL%=̼i\.l +o'}7',=O~=E8/Ee3ҟ&m Xdawqa_AM4B,/v*>%%͡"%=~},OhYV]]/&~zؕagy$ɻawnP]v3&O.+ {8w[U \3wq.oP]r"oOc(aoyT8=)Mawa)cIOOg*Jfvma / [:Y:p:"q">ԜV= :)sl72~mJFQvs֬uY$c6fp9P5US\ChDެi4+9q"kaO«? +x=(qByhADm(k|R.${t OoQ?]e'okÞ%WYNf9Q]au|yTZm:e{ ھRLG@ {u`γ/߁O\Wvֳ{ a^ԇ?"y"*[z"|J{k w!6;6$33=rB\H+^[b6|[=.}c" a4}\:lXx0vOSQ^P"T;E*uH-r)kzʴֶ2xM oLީF_/ϥfw,y$c.%~Lީ ey]/v&" zk2}`,%RJЕޯѩI/<=vWaw^F?] 0q*R2FUL +WT6!VW2~EkUB72@.<;,@p*LkLd:"NTy7AzGNF;E&mαB,CԪ.N ]'8'R 4H;hA`mN 6:mviyK L31xSnooYEa=PsÂ1caW5]rԋDaX|T1|rUE[gC^yJz+X5ލz&FEm/. z$KH؍Uax8-:QP$># (3*l};IL-}رeT O +k%j[)WFBOGŽ%O&_HjDzړ}'dj2ZG!C$2*[EȞRXʗpAI̊;i̻Y%05 +̴}D0M<*FV9PVwsu9#!/ 1 +iP F♊0uNmߍ茶GQ~ث8?a7( +PQۢLiYӃuBVl0wдZC[CHGjɢ8s>;za]);}E3S_ 㑩qE-or` S2i bՠ'Ww9Jb[o0Oj[Ʌ?&a/foՀ{qtNk%Ѿ7>(bDǫkIW2/EWDYfZFY8* +E*nbh>w0Oޥ5/X{^bbÎYҖ i AzHʋݚNs1ĒHL#,AV ċ%;zBK\0Q6]"ҁ #t踵e[jvau?GOжG)E>N6u22s|>S ed7*΃ ?nXoiUn4hǖm-?21NT ӺR[8fB剄ӜADLK]&~C2LQ9oTGѾH'ə +ȻTcT-DhNPhz՝Ka׀V,Ք ®4Z; LPk)lG9XVU_6ϳW5%3ɤL&w5{ot#kbo(,AM{>AuQ<}[jk?4o5,sӃ\T&N&zK{G>vf!}CŽc*DƞjBĵŦww9Aݍݙfq]^~c' `?t + xʼnX=dЙa2 6Y\}8g"kd|V5?cZػ1)5[iv 'nPWT>iZ5W+;%υ^odlcaY&㼹3K/^cqKdT5U U[FG:%}3@hm:َ(;:\qFUS7685u5Imfd*d%ȧG&>fZZJTS8|yG󞳫je5XCc)^/gݵJ9Bft#8󞬛-XWf;ZQSDh dP[d/0/X'g:Y@[SGݕ`7D>̢nD+V~H5ϗ(oKkGsjeat#vmÇY)CrVdڑYqGª8Է?Yf81Y =wz a!h 5nC` &s9dlp,E)~[Ũt+#}] R#vtAX΄`CRYԱzWfP nL?3VÌ'-p]x7:Oc# qhd`ZZ4=o]թu7xZ۝vM סmkyYSΖē%9O-#Ʈ#Ʃ M4M5N28C&[ &`7GĨu!7k&ݧ ghl聞q+(\2d#-">hm:B-ٚ %,#CQQz⊴ DFy드l|߰uաd,Uorxdx>r3dZ&QEٯoj/459z\(P|w^pl.wd<i~M-xcu.t{`7 O;Y&W\sS:Y +=X |˼ RiSAٛD[g\&RbLS7^YeHمBnֻ![htW-( yꛣk ),o.n+9q nmHkZ}{@Cy.JSZg΂[ʗ+tv{Gi#-#퉨=H{k& ʖ/-xul\n,~hʾ?]-'zU<_HͰ Ӹ'UjRm"t{Gۓhzd`Wh]/än"BzOvqo\rZ ⵡt""RbR] +[uNJ[c,w&yfkդm!CSؘ%GH߹%AsR:#严dY0\6]s/8Gdk? 9P|sx$/tJ@-yM:yl.{VSKTjY'1)>%:|c(Ԟ3΢()ib,%˭-bbV@@YR/'_4׭z`M BkGS*( :!'f%))ǧڤm!2&Lwq̂a=s:rWDH@]ӄd4&#ŤXFa}ģ`/LԙYu8O:\[`{^mǰY~ O% !GU̕zKF^,4zD2DvJp8&ή֚[\WQՔ-2^ Q9&س[׵+†B^؃st氩_?]?oEE}7.~C=foQ9|j<|[[K]7/}7uM㖛~7Avbs5mSO)D=It B=Rzc;R؞~GӐtМJG-Q#XTzf qk**ͼڇ<O|b?>ZhK1_;U2\RzBLfΓ5Ŧȳ># HY +|[ zi̿az +K4\AYzo&#̀cl’׎i|s>xc=i}=^zOMiY0Z3^9Pzgj_U*EMB쒪C XM)@j͡L鲠#p1Xc)9qP*:d{2@I,w M}E/U;C/]Sc bw"bޑ h9=!߫A&ڥ8=G)%~-2}uBF8_y5,ꇢXO_[wR_{Ÿ,!'MnF3*oUpH11K\ʎ ).ů$W(Z6bRhBwCG說PU` &HN-uwfg ~: ./%]P&]04d_:ǧ:BDK5_h51%gnvQ2Ol[U'v4iJWvQ\c?X +^_ =qw0w&x^J˻_sM/ tCZ=EKzJ1N!l7YGZlΞZWeEG/{MLjZ!N4M#%#{S/OQ_~#(]c g}/$F'JAME}e%?ۻUk [F%FoX6#Pw-^>geBE]44VIR}E9qKÈAB7 a@͖OOymd쌟V/Du7ꈥ;_k[ +OВN >`]4Tɮ)B[B/pN)82Rzr[#)jMs2ϜB em)bw~3 ov: }a1Wq7Fvf!%B;Bn /7;gkrwp91R*o.W|gCD:f(]@PgRW/5[*,<\x_pSQ%Ugj@6>=|ѝ6VКwmr%*%78 +P8* x cI:g$>!%gS3.6M" xΥ@է +xֆ@0QO~6ڇyDsoKc{]Mc⯶`01[@AzH8?Yث,}WMekt񚴛>@W S'JJoR 2Rߗ項vӅƼk=[nk};l˭?룾]jMxi|??">R6^>kڛdO02IE|(˟#~߃@ǂǑbvE!>f{C(41 Ͱ ƲG5 ſ,t,qN^$T[y&KKqoҔۂ rK-՟f4 g_W卤`&"ҧE'Ő2db 賩ͧ#$h\}f$WV@ۣY4TBmGN82?bդ9  +fv!뽕Mèg6!15LJoOvDؘЧK;BL6 .fur֖!kuSƯ_w!n19DHI+iz' 5; -1RwS)9)?c=2N,/RpNS*7 ȅnΪ[qR ~b=9~^|}j?OFXN7G&}`D9`3Xb/Wtw#۫_K9a|;`_aߘ>Y.{{z5ޚ $ѳH ͩ?.%^ɹjl:%$m?u<4rsw]K^;K֊U)OH{\G);xgorJ(>ψ&~JRuo󂢧:+.=IJkcļK{,z?FCs[J᳀:]x܇Mty| ULBĒ`MWs/ǫ#LÈp 3ٗEV?=[!>"^9fٶkYWWZ mnB0ƞ{9Rq0']_[%8Ƌu^̼rZ|]BBK?&RmݱqZn#.,^}Q >m2?M,ƧurW+0g]7t%\Nc#<@9ZUYלk{"nu1Tu)dhٰ} 9+؟0N{y0GH=RJ3"cĕʛF@t.F11.cGc%po"|[ ˭a}Tp+kG!+>;E/rƮG7}s|gٙD]?ӴU=Yxuv!{BlkW`#DG`/+;~rIIɇZF$4to v=U}izOs DR@^kqM]zϢՂk˯+K~J9Bu + p3lTE{_ c~p.my頳LQK4@;W D/d?sU-L)N=<0>om7_ss. ZȑTݟ}k1FG]`As :)8{w8,b5^9.О}}& ;횲B\"w'jLfw핖o MW>=p+jGj5'Ѓ ^/vAӾs9npX*;3^ZgXu!>HHҷ@GK'>%o$"H/5YEG2^OocO? E_X!+ן8J| +;c%-e\kQ-etL\4k\WӁ&kg=W4[I؀/?6>ݷ ASL_FxUé!/>`bqoإ1t|}O=YxfT8fH Z+Zs~c~]Ⱦsf j`R^rKMc-C_x>PH!ȼSxH=Xmm1«z4LLM:EU::h:R*SQ'LF+8[gSw+#7z o6\`M2Vk&] +\{뽨g!Jw޵Ihe J۔r{ƥC-qѶjg]=zDsC[ @_!O`ޘ#HfRRå%"Jim.u _6:!aK /va>hO ž/jrZPE>V1@^9xV`V%򟹶('绤$ rn*4^[(fw&/W*Z iU"R$!>PKlAzgHپ9vcWr@訵\GRU6#!&2ڤu)>/{"d_ʹpTMsSlSxaĜN^tB4Zp8p<0å.Գ"xMX:Rzw_6#x'ϵAޣ\Cgz$ƤF +˟Y )F0ٚ|2};K2j;ү-(uPT(Z`|恎I>1Ylm"7SSFtcmysaOF䁆V~p{Rb02$|㙫vـ-8RAPt|e4c?VVt2V5I?ZbWwZ1=x4e4>ա"j}[*_t" z ]3gd[C9ިZ[ Q5Zwdopk [#O'^=5qqYRKO<^2vI1Rc|9}(`{S{p/*O>կ!bZGI+=01. )%G&Zs~E!')9v91cO2Ÿ+jr/vX'+ m忍S%j|_%"$Jn9??T=80Cywov1ly: +oȽWSKt$d;Ŷ+)XGV@E6pGLϴ5*vM.#Ky^r< ++uj)!hW4 vGM!VhI',OńUCoxoʼoUېzq+Ʊqï"U?Oܟ$Ș)Idk&9ǭRw#咑sCK1 7\OC?9>@_!!2xc`deP7mS59>5UWG)J0Ybnp"?&Oo(Aq%oGEt9z'9TzOW;Ӎ.VXݘKkOD_5u[lEK͵dd@x$|gz6)eW r))'Ɔ] -wTԗMVCǩ̒In1/ޙg.q㏍ -_vZG\CM.ڑP2M<; +tTiv&aI<\۸ )ֽ<6 :-|;IFOD/Kw&J{dc-8gp>8$G+]YwxԢ\KYvƠ׺vFi:bn1IJz/bK/3oK +\颀#nƬWGYi1zuhG2~MʹC=P-Sh5ۭE\kͺ܉|tMrxQLUkܗ=iFTit$1f{;I̴N2RM6duL" WMO}h[k=%"4ܝ񲨕δw2yW}JW +sOAȸ_ 7Z + +oڧ {SeON1:":+6\6C]/SzoCѪH<|?_~8]WBjjByܥD$Z% *l?ޙF'=;N?Pp{+})%ݟ)mSxRWX#C1LZZsID^FlW*C]R|މ ,E܍I|l&E˱~- tDɯ;]ml6d_Nb +EMсG'x%JWԸ7WO{VM`<\aNWS{X}ݭ"V\pd5\Ŀ̣76zhWWNW[?7u=ޫ$ex:9]8GF8S1+Ak_V?ۦ+ow+^,*3DD}Nxc#£$fm@mTD:e5Ż<]޾e!2LCXh˺Җ~. 9-!#KZtvڅ5?ijwƴMlӸd m0 Ԫf:t%ZeA7oL +pP~Ϋ?7DL! 4:/ӻfQ2bxZэaR7Äe)vPKvh9;S=11% /'˟o|Lk}a$Fj*HogX-aK +yʻm|7`m*@fئa +A+=eO|wWF8LG]ҵ-w_ǐٚ#]p.2!5ur&2gjxCC#! Ͻ +lZ@ź5YYPs׵u/Lz}MdvΓ2,{b>jsclCJL>԰1n1)Gp}}y@E<4qVMK1bOF*9Ntb7eV=NSK=; + +.5)Y.>Q!Zj:Bts [Sw&qlv}z86ARģO0 :n.\CXr0%'qm]@sC|(c/UvVיF1Q+=gYϵsTl$8!le^ddHx%s?f.@85KOtPɓ`smW|h<Ey@MQyѣb"࡫=7V;eTP/W#tyUO}6sofgm,ңxX&~MM[[>ڧ5|.y5l98yrWs&?Bi[*+ ol|'Usq16 -kOB^.>ǏF#HhUI^WF ogzɾܗrQ՞pU_!9fj{SD]g!ZSկw*5fF\BSܨ.q-$qHnN_4E Wic`3t"+ȭѪ'{bʽ=y78YdWRbE;]kY|d,y8{p٥lye39@XUG&r_Jp*9RW˄8dU~1@,L><ǩgM=;ܵg+E@/dP7brƸEVlՔJ">CV>g]UGߩe>pp5\Yi BaiϾY%WڍHdeoboWi*%g-G :qΦ,ѐN%9X x]c4t,*3 {Gfy"h,4 LbVR]Aߧ cw>~֓*,D!~}g3mnIl*ag .U"XSGCd26GPlrf}WC uds8] >2 +2NSR-Llcb= aKEp96MJt9EnML˰ 2pӑ g01;gJ~Em?-CeM3в!9] y9TE{9z;E|:*: ;ղ`S 1+' g?vL8ň%=OHuZ:xV/l2&Vzw*f.s^Mu.-zu:2!8eȷg “E* aay[ IDzS۟ƖC# r. E7,lo%'Gs3}H\Y昭I;3ֱk0S%O'UrzhMYp,h81*ti쩢9sEuT H聁K<.9(x=r-HM8P} +lMRa/}jcj]- ]rR$42^*tYդ܅ax Yzn葃:zCәWZ3"Fv:N͇,+*=_l֟mtHZi~URK:r_Gwj>9^0lkxLG|`6C@oh%64%Km}טּcm]p^6Jpnp +#7>.ۯڧj>7 +.acc-ťyNŞg֤XŤ9zi4Z&Fx(4, ^=2yhG諺Yq{6I 2@Gg. .;_ "* ԠgQU1ʎ0!u,m"}*WIъ;&_7,27no U=H_) JT[c3 ʯ+<Uo{P@ĺUso<.6`KK{m),l[p:t?Qm@]g:F6#-6߯|)5M:30_, ]\.Oe[\bS3!"rKI摿vK "ycy=[U)&ޥurB^PSuA,r0~LLSS_.PWEUz"qzﯕ/k'| +{RL{ +@7`,>[wEw|Jl[IL*)y<n66,P BJ@vx*9BOA<)#鸸/k Z=­#-yt_Nڗcȗ61GA= +~fy ٦ qTHcu_56)!٣fsIm{|mrlUK*%RHWw`W%wމ^66)sHVrL2~L8py`i bYW66Fg "! i%Zm-5vsU9(YeH7eMH9߃vs«Ca- ~p^7,x`E!TW1 +\5Q##i23BɮGKaqՠVJ>t`hP"Qy1ж+oIwYIQH#Jy"fd]N@9ZioࢆY3~|ߦ̀~g"<>kMoͿ$E_CLNDA!".8EeIwN^{CtVvAwrZzV Aڌއg\JI=bFd5QQ..uO$9kaifI%_w,xӸ+/'x@gB&eŰZ^Y&c5#?ԲEP[&WWǺ\*?[|]Jȸu9)i# +i шZ3qZF뷤b>h89ڕ7sb6AWܧښ564ߌc h)͊}Ms+AW&5{7M\ͼf. S +Ali ['v+9azjݴP5m dSս:ů}C><,prL(Cj=N%`-)j3'ϰ+^¦b~l5TL+jE NfVdѨp8.&1 V!ku䒈ALN{T)Ow@ͬ \٧fsX#z2L-oMRU><('sZ `o]6y1pYBI;mD='opjäv_nxĬS" [][:v]wu^KZu]X~vxkSXT +{}} +8, n`5/f!^NX)eSi W߯n18[ՁkM~O7b.1̼| s3n#nߩbcZIS%_-mtp:vW6B8n? j>-h48nM2^!=me5^+ +>teUG?ĝXA ̊څ0;GljghBSSx2w> ޘ;˂ ϫ~>(>A|}nD]"Ƹ 1fipp~k>Q@0+q7>}_гq=C1ɘ ic?81eIR6p1f$dɘQŔ3kAK8b FihOiZa.d_ MüsO?[}SC+ؗ“Zر<,p?:KyP׭ސۑ[QKd$..8|:emviKM*Lۙ;^0}rzنxɺ{/gp|PjJ=i_w+⦽w\ ) ذ|ecH +dsz~-!ocQ7*_ kc23Yƹy$mVr2nXl Y851cοl?{EZ6Ewj=fE Y聜S!vE):NΟ⓺^EҜ[@%۳r) uCÓ]'#jل]89a7#sN 32fncXGZ9!{YQ1!쐆[3pIw/sMtxnkT/$)~֨q-sU8W[b^lS +KM8$]˂ں/ںI˵[jfQ_fV|5z&ec6nyE82ή +޻U@;zfHg)k-u7#/N~Trj୷q&611 q! beKʿIZ]IW֋p1 v<ԕlʏi8K첸[}FΛQw*eUg=A(lLrBZ%u9?nvS庴qiL:oB^.y)6̸J6#xwgdf}۳Bv7)H5ɇf1+f*I¢Td2eu|45od '61kA5ʴ׵3.f[@\zΜb(c>?⛕g!G:O%j3lB-ERQv1+ kvmCUl8չ2u`gV&I;Ĕ|@! ( < R9?o J~ghq,e4ܚ 'Ml!\L-kcM|OkYf}ObttV.>;dq~&nU_?4*k3Gӄxgwjk(ҖVN |Į=2>vܓ+[c(b}x?.OYx) .8?ʧ_'O ̪AFޜ-y8n|M:]^UehMD yu-]ǵi;?M.ٚWռƈFAFQx?MnE1^GjX>ʯ\}%mz"0v',ҤMBOJ 16-X|A/^}M:9îa׬ +zrQfVx{! 'n%v +IqR~PG(Djv^j誚]1>i65GL7KC~WxH,>o;8b9Y KghMLK:~M9UadsXIܙw&5-mcٹw̤Ԫv5rifn&"L @%XiOg껍2\~jisOZOoN2nAFLENUz?j{q{3yԜz䄙ג ѱ*6XhdZБ.emSHNZ]]LCAEbtyČ/Iٙ Гr~ oM}qpEwϛ,Rq{qsy5kcW7'1M7 ̛NWeɿ0nuМW5̍קQ}zqmᆃkgqGߵA[$) nc[Ћ1zc$xPCދ9u5BpTw6c`yBS'6#6UڕaS׭ֿ q\RjymiiW&Hgaczbq`ܳW_uO+SwsooP/!,{ybYiDM)J!-+#ؽ1-u 4rYuՔ 5jc[3 +1Kc &f6%ne.N!N `൬t:NF%hg^2:zЇзmO[ߩ98l\ /&[7|7?L(-PGM2K¹t%R{N`i$8b0?~ʯioOn?1y6)ɢ~[#e}bE%' ʸ\6!>`u4쪭Q7Ju?n*?2{P=Iyڡ/Cf1';KY$diMS +Vn[X1Z9ik | +uK:Τ=ݑqhY[o_Lͩie !tF'i ʿ6+ZjI)fݪ߾ :OnBMS.!.iS#QWXü:@`ZZE$*[n5~aHT^U<9x?#\5$*Q+_^ x$WK{ e};̿5hk6i<-*1~L9aj kG}I++ /i^Kxo?+Sn*ݳ RSN>44rAW)$ .1=ma23+Vf0JfqIy$`$yxqGZn[KA96&MK KձO~5fk]0vfy_wX])'am򳎟S،#8A&\tݯB҃A?7o{B"|H/i:k:Q8a_襄M +reG]o6a'kM%V\G.^zYOW_~L( ̀$bQN2Zz+6G:'aloYQmI:(_ <\t^|$L3%㓣FN}D#hLYW(/Aw. 5+q'6~}m5^qP,ξ"OЋF);.osѶG +Ye12HSNhT ~ZH-̸ +.Lݏ[DZ$VFڏ.naUӏky)qU'2AP(p$eEgK:"a@8~5$cT V +7ͩn!6OoLP/%Rj*$x ]^Z}V*q)\:::+Vb-T% +mžS ѷb>xO_SKĢ%ү&\=qDk7zLz?jd?Y_Ҳf~qve-aoиWQK'z@Fj NgMB\oxmi3!m%Vu&ig/%签ֆ4Cʌ[ݙYJevkԂI=#!ix]Wme +F.LS +.etu\G){v_=.#}q:,C>_䴓\VX;RY%as+ޏٕ9q*͌F"Ziny$|ʢmTDyeGHUרlV0Nn_afFEnN{,ɸ$xհ1[ῳݸYDž٥c]~YS3ڷJSkhW'F 9eВN}T([|9궋 kAE5fD/jKY-1# t?&甋r.$ >E+ ULιdk“ϖ5}v ; ̬'paGzoeTC1LSɮ F;ν&ۺE_HۖoOZ'#&R޳#Bc}ҌK|oL=/xi\p~D\:X''Ni:6y4\{E]|M[mga!WuV̀ +;Oq,=+`C2Nה=zk(=<Pkfe\ǵWucM_; 'U%b/{Kd^"-mnDv[%b/{Kd^"-mnDv[%b/{Kd^"-mnDv[%b/{Kd^"-mnDv[%b/{Kd^"-mnDv[%b/{Kd^"-mnDv[%b/{;}/d +:XGTwDÏ:~ +xIa?;ӑc~&v2}W,a A~>о}QGO8z'rcNSG~?<ؾNuj#oGQoArFL'Ԃ4ίe7즴QW"jRQȬYymC Jp]0P䬘N3ZQZW֮OFY IoIiJAlRWI5]1_5dfmq֕1B^h/@8b"jIGʬο`TMac柣jR)`ԤK &iP0bZFYD(Y{?h8;UHm rqssVt!<.Oe̘VL)o%툦W|^ᏬjfigI-KI)2q|agW_]~Qmh3rJd])EI'J攨?mEm==p>] 1cRAIY]ˢ:^}Pþ3pfpGRzU*ndC.@`O7i% Bؔ€^WS +#F)IEqW^6ĨI@ +iTSLE % %rnj⸎r9i"&ZŎ^%asvn{H51PRv-TʓV! 3Q6ïljHf^um%w;YRzU! :(]A!;iӴ]Dx$lunN:xsZv5bS[I$Yeoǭ +NYȥa-psRQ> S&8fbk8rkQ*73kzrIȨFBzv8$ jGIBܪjĢ&,Έ\֐ +:ajۃX{{:_b:iD,L q#2cUM%ŝ#3O[|;Kjei+f w_nЋY[y}OU &ʕUC-2b1sBrv*&ZImMy\+vjC3ڤI؁@& g_UwV9-QKZ\xP? jńz%g\φϑAg.pf~EI=bRO.@kP8628nO5v x{g ȩj8 5&m5mƌݘj~c,&ꄎr%cZiK)Br$rnH/E +bU +P\ :z!{[~~4SNN̬6'KR6^{ʨL3.RYCX H7.$sb&Vmθ>f$_ޜĝĬSHie[Zy0I۳}w)}~}i1+TӁz)oF_Ib>6zAJ%}2QB"*$RHn)  QpZ&J>]}M6+y9GoojZySo:A+#%RuG,b 0iMI#?;48bV'Op_χD15jBG-̐/tbQ7sQs6ێm 7k i1k8aMΤE%$ 1HIys]k_EGycv>zQS6G~6Gݚ/ZO& +ؿ9N8DŴZ6/Vj6 ysnl''m sXxq+-itl2{dnI(8p(>mJ[zC:JihuY;>oʁ[IXEU^[%EHI7`7==K{dGXSS+#31[칓WxnAQ+6!ܙB@t4obD`vnV 莓#F5㴫z"" 樑Րq;fagƫP+ x H8{zv1=餖Oy䄝Tu +g_祒- !ngmJ3l`_i}ĥu kfɎtꄙ{~x5x\trZzyʨBm:֌0&c&.J 3-°3/j M$`{mi )Ne` }ɸ:@` կ^}M:ge^ +˖krf9/mWWq:q׶Fï<Ցo3]g #$č]O;Ҝ8[:CHLXMUؕIYX˜^u3;JPɮ3۠/VP15a2f)[X5#fTYĨW }1t +1+ԂO۞̬Dٞx(UVs>7rrBVŅ24UĪPV.aVvb&\J9mY]e)`#V1 9mqk{Qu'3'AfXQ#k>.)df,R.1 +2F%Ίy\HUXˡqҹSDE==)Oڋ~ |̨ι̼fpzw,)a5./maT7 n_C-ܘ7uʐQNO9qb`(1?ͫ$)JaPj*&G8H)I nkpnyFԹMa#Mr9l`nQm}oqD緬?'FNM3K"3sKo{ּ?4Ū\$uӠS1 S鈦᧨駈6nᷯkcБ)1& c⹥#}zǔQɋ5~5_l,zapۢ32vZxꐎ|yKK3D?@{Dz [r>1))Z,^$}v$L,275ċw$wfr,i9R5.솔C@ȸ܌[)C}Cc bP "laV%\δOL{%\Lw nU_)e +BnAѻ='%zj9L;尿7Dzy43'⠰בIsB Mg$̚zq(D#g\V/;{(鈏ٔ^ 98O\nIu40bt:0_ϭ{:@sJ%+[fNCTGQ +cfո՜,@݃Rkbv(d>VmNiU%̃700?bQѵ^fev*`|vy籨U6gDM +g_Xx[>Sb#4838n"DǗ^V}VClTǮs`}7':O,>o?h[-SKOKqIfixx&ⳚHVtC=vk;€@x Y;0\M?jHK+h( (hO4{FvęEuξ,'u%0ŷ nM0˲`J999=mbԒ^qp9ɴk!b'˹Q$V21C+A#Α W!X˻s>8-;膇2SN : "3/WGh#̬B)Ӟ'^O9c0 *Ưc6Ђgr+&6ƭ|<1e+h;UM,oEL֘ I{5lYxwv/as_kXQwb]\/lha5|su}0ҶW&YboNJ/їGZlM56L4k1@gk 5v p~q ze{ڮU,;*݊^ݶpi3 iyuW_c9EIؕq +)i3 +<>qdu;?9#u\Ji +l +I#b`Wc(jwRְӾǙEկS̎5-4aVe=1=5^Oyh1_r1<YA-JU`ZZS.1#bveG-W_Ρv?E8aVD8y镸bmD}p=vP|"EnGNCuՉ#WQN 8I/ ӊP-޴*/qǡ?- OuAmMP/R:N&"txD,L[S9xT>!5$4V5 ؗii!m9:?,j[U(`Rޘ8j3P%IBD"_w2bH/_%MRF;bBjWXu ^HYjʥI `\ة1cӑ=/f#$\,`nnlYw?<<מf<&>`2U/v6]x0G@˼3v^q[#&Zius^NG +'"n>~SUHQIUҪ~ב 64IFjN130E7 O+V_#r6h)#`C)F"kcV޶ L3J8e돃kADtvRTM8[#“|D'\eu۱EBK%\򫅇WskV)-aш)Twc棈["RHۑg26$TN ur&Nc kbv!z11RSj>0~N!nE& ; uIYi5O2TJfry`T"g*U@kK8|c+'-fͧ'RYؓ\ZۜLu +m 1 k >yx{1Ջ3򬫻'lקm൰Tv{8IFFpKlZFywSK"NOza;b TFܒ+i\NC?Wuc2]Ls[^Yd&eSVPsTŸӲhz{SO;IR҉o'G ǙŋGl<̚\a׶ǵA 0ŧu_mn):E("r\}[xI!5fY0b,xusjW;"qFY!a=5 z$l䵩oOs"6N 9lJa"g%o_n_S|x%nu-&%W|j&-솅[Ji>x7bd~1yFud(xYTݸQNGBB-<Jn^},_ .=Trx(R8빎aq)ecͫnZԂ/Ĵ-j% +:ba;|ɾAJ; yź2n?5ddV|Jf^@G +9z06)pWW¸) ƬBhK^)$M +n`F܅Twu} qn^ ;1EM{2s}2CRyg\2/M>1 +6쿓tL{e,wέx$\욖A -ש5'3uZ:$܄M·%l p }i\hUܕ vI;=-I71+Čbaٸsݺ3 ;:ȘQܳ!5luP4,($~lBB$舘[37B۳cO6_Sʷ=JiӸQ1rv??܇ٍA-rE T'&-FLvXxZC>,q]{_݆sHXǣ!5k +z +z |%VS3QDžu#CM~Mz|=ye/"J͈w M@54近?H{arpZ瞷A*n\K=Gxa=usZ#zIi͂Mq_9í,+!b&9-,b-Mtpu`ݒ1),{tN$!Þ] "ܖU1r4G Qe$/X[~ya~U7 7&7 OүflRv*GxWs>E`6oew&nkT,mVtPTn,מ9Ww7MBɍL,k@0ig,&'tlRVD+_&Mh4`_KX71uĦQv[&yu@/gͿ Ú]J=!G zl BL'"$b3#f%?fs{6 ǻ.0%{zVvRӮne<܆۰iԯeKc!8;BtQuvUo)aEm|\P˪I85!n0^^y7U < +E+NEKcGߕ|S =L׷|e`iG95 ݍz(13: %I8WLxz%=CS{On݂LZmCpe" ]D(L׊xUa1Kɛ:fpQʅuDwq31h$%4ʭ F!h jcuxz9hD#hy !5*ՂŷK*x?'a:: |7mW􄵂[r(hѨW4;vǟ}شQWcI hmݛQvg=ʘ]bםi #lAܜj<dw+i'L2Fz +g{^ܙ琷}|v +*[vi(mY|)ib5fܽXPkDY5h} E$KQe:eOeX֛Ogy4*@`tl _h%L4Ʉ,odKھ[BGI&K$G 9 槚pĄF7_iN|g$4Oٓs0XEK t$ȇK9`RX`&S-g+ k]PǽQj/({OL'E@`}gwC9~?ɀffw& Q-ֆ B܉=`ݝ@nO +}9wO?Q*xJwrxLˈ3CC!HKT\ı`~g2htC'U,euO„C`bKH%1Τ 'Z5-]yaŮ +x*:ҌCo&UPWvp|sFS@)  +LO)9@ߚĆN +XGL>!r(KHqf% Bh۞Z7[ *x`5f%P0kޫJt{ +F| 'kCp`M;1O}TʀNlڪh:de-Ϭ Ya6AzY >ۉu3X= h 7Tg};gϰ{S踅xZ5[>Z<єlNg9SۓOj"GRje CrlP˞uCLiA}cPQ~pf9;eY+?eeYִT+:V8L=?0Ou)>?s?L? q2cs$H'h86|[Ƙ5'ce`g5Al63 +!oS&boiR7}w ,4i,8P@名RJ쾂=ePQ& 1[;=ReAE' YTY:+挥aoO'^"c @H`C'KG;\V/58@ޟ9| cgz'`p&()6+s +^e01A':broMNфs,̞;FM8h2-k66S'gRTm12!j_ =R;RbRQiC5'(Ϝ 9S/a#R +t颟dcU tY{,)ifWؑbt)Kطo' o./D`&w-k`:8>RQ@pjT"g?\i.ǒb끜fC~up5G3yuG3M`Z.ͤ2E F" RzGA6aSmv.39ֲp`3yяʓ9!G>g|x|2,k&){:[q2Ux):UBeҿt ldLo["D4{ܬee4|'.r/Ea呂7am&X0t=\ lcBZ#] XMJ2#Cיƨ'+u)_N"ѱ28TdOէOUGJ!{(!?B9T/%:xgGiK1Oe%o\֞ʂ,I!`&ٔP7u9#eu'GJڬN9TKWH!DqojQI{lYS`[;MU(:x؋ mNwygVTlФ)QULu9<ܦ6kSZJ0Duvgdm;k}(ױ +;|ak~Lk +wU|pem2-Ysݗ +hq6$eM +>@%o20ɖT3Nږ#!/ ja1Oi?^BsUp3A|;d[η;v9P&dlOȝl构 %=]ӑ +oO:VO~N;LG%L,17)`lf)((HfE&D[ tmᡥiZ <|!L0FW˚ĂK=Pg]D!jijJ鬒m%=c[4lQ;OPBEl920#pC?)`gkҿ !E | C%d {Y@ò͠FoC'h IZ۲n+bw<9'DH9r2=k236ǨK.r @B#EncIAL\g|[LIrE|(CJܙw؟,g3BGY@ >ȃIr/-\ #zI8V3Ib64L>Q}k6MxU<1zOB:R=#P)8\`ݛ %kBkNxdrc_-:~aO#k\rVǂO=Rc +*<}(x]){sub gYd(#-s+ypjoEifmAli:)p+ Q +r)l,k^s>zp՞L?Ʋe hdnT:5HKC(iۓ] ZUʤ);U&@CISdQc`GUҶt!ټ\vuO-{2e!<&ݘeL Kv$GULw +s0I~0N\O B,90yȨIL1PJ6d ۗSqKHI?Z6@AN:bbtĮ bNp~',4|$y)mOޟ/ci'񡛃P]s;D!)8*c6ڙM9qg="qSam#6`FS>7z9Ǫ|NZ# | ЅXmE~\h@دWZ]f\-z Io[{ČsVjEE$yoթvB-IZΖZ-1[[K1 Lcn!\ƀa \ ~-hǥf엵vˡx,aJg67K;3/u'o/5BN,>xW);vVG8\4XH&nk(>N.KKM{ڍt:2Ou3B503GZ֔N~:mK5b #؀ŎTnѽRBF758C |Dj+tm˹K^jk{!>F)sÓ.d|(~8# Pn;_zv {=SuuʼnSc%u@{L4Zr7gk[%=L7 @k >#wF( {b.|߲WyY#UiÝ~lM #BiRHc.ݵ%ߠĢ.rũG;;`yrY } EV@W|Xv|ڎ0 0 ?6 OUf#[){򡄒54B +rž yidxqC(N׍䧥&,,?bw0S4_P4[_n$T!Zp.$M+#_葛ݴbSƻY4io[&/]qN3IOWh,5y.V(nb/-p1n/؇yԊF"zI-vtGC⋶~03rcOlɥ$֔=H^ԵO ^mG|1 0<ƀ0c=[KvBӖXץ;񾻃$/ՐwXX֧@! 2+$5iG |8?}-Oxzц^vz+ryA^ww27j:m37v+=x1Ht~Ԕ$?^Mx6#z.ZQ=鉡W2 ׺Q3uת꼈𛳵p+y1u+O{ԘfҜfؘFUt\sK]lЀtX)=Ԡo5@KʋB@}v0#(^=9ؕ6aR {*干(ឲ(8/~0f9b F7y +|c:F^q_Rtw:zk3vGik8{-teV,ـjjc rswU$Z>ҁ z k؀'G3#Mf%ZcgP@Vcnt:m)KxK ؂؈Ί5UwYh!zJSmx~˻_G2}U'<cp`}5d!㭢$ވ (?8'n>v\=}M $&5x;=,I [GɊ}~"_7d.s3OmyCggtOǝ81(A\)Jxa I~1 M4*C܆q+ +zxV,9}<̍)Ύ1 K0,}PG +}Xr-xH(4^ЍyEU]5Csos}]nΖCgR_Ictl3U^ף?lтfkujߪ'FznNXiC^lΰ_hLU=, :k*IND$ZS\RhH +{puNUCe]͎+-x3sߪm5CR{I#oʋ^0-n!~^StUk6 &rݯ/v! 9tpa3_j +K[:Ytlmf2@YbÌ謱k MHGUFh;VxGk33> I +,4Q35/ (TXVSZy7{[=[d?xW4?Rl6zN \hqjܗooV:s)STg䐻ЛC$Rm׻0~5_P|zqD<$j DWO$sQ;Cx&اZ|mme"pM-&Oc(Kߛ -n"BuKE~ {CBiW ;;"A SM {j)hi +nԌЈ,4bhD8ZZ'5rڎwmMAn!l3S,K{5Uf8WqϊxL +\E y]T<\fz^[Gj(z-O*^SB.5d^w q=AϨO/7#eC3n,7d|^jB}֔'?ՔBdSW>h*2> e7zɋMX'uyc]Eu;=J~‡s}eE3 +idzYAW`;,I)!=<ΝNbv?5r4GMߍb%Gd[N~Ry%v>ᅶ"U'E]E̛:tE-B#{>o:_ }؄vO{ {[ApK4K0R75' +!yu=chUQo5"W6Iۃ|z/;ikHZ[qN6[dsѓrWYF^kΞkG*KS<?ȄY7SßTF4?II=iI,桮,B-i Y~˟U0UXPIA#y^w30/U~̽4&ԧl%VǿEґi&\ 賌ü[FVm[3MFZ򴏿ud][Gex^)CˊOoYͥL~>ytm}3Z >XShD-nN?8t[N}/}1ZvJzɂ7\gWP_VZ1_@ nN@wWj˭_9=㗄 +|b Qux^fumI>.h$3 +D>ܮ׈0j25gFV)M>T%s Xنu@#]q5g5Kd=̰+mԈ;E-==%'7 ;lNtOe!VgF\l( x;\PG׆_/?]Yl:n[~ws^e|ҡ" T% [4gg2(Jn9;c,f6h`މt,yvus4 v=kLU||(X?JS6a\U57{Yk԰Tەf蛍δ۪2v +HfAmUShp$dO:Ev!lࢩLVD nw3.!Ja)aOfht:veI^=iqVJԗ^>4G/6">lv1ֺX r,70?v+F#tg-,'J Isg_FZmGOd_wF6a>†Z_D&N@;DߕǾXne)ːUXVj+uFO5 vFVƗWsKƨ n }xA%|-+C;e'2 I[IYW< Xq<( }is(R&НQBFi&< +ũO(~~ߵOWjN7&|VCك^lMx( +=Sn]5TFv]Ŀ]jIwO|#+xN +%)jq U- 촙6P^n~[PI!fF?30̃ρMYi\Uj'L}7Q9ہ?D=XM +w7#ILZi}EvM˪tZ;{2הq +\-j)HȗOkN^@f>vث.akiI}<&Ƚ6N'yr4ly(=^aLě'%\Sg37zHK8ץv;-4[5n/77k}9>^#(!& ~\@ޑqqB0'oQt/G*l~5e#|_o$wSC>%S[u\jBl3bfZH>C|j'[Yz|p:Zdo;h6q9R{bjf.`jxb끌_%l <|3b"7Ar'Q/v5NMi%ܡ{xoN Fy!fBwʇ!t85\$j ~G;-TA[=zb3c˃tтE!wepNZr'{؝n ss]8MIa~U?Eɾ=/y,O}O<0_tSOu1%Q副( ؍J;3V]،u YkcO2༷xAfU?,l ˝?] BCdA„Ԃq7B0ɟ>(~lyY9Uz5dVVzy䯭'xՙYk=Ĉ*;u9v1D _ 'x~akmLQVֱ>^4̅ʹcz1H8I )@}5L- Z;mu٦اGWf($*P9B4I + Ði祭1辚zbȽ1(J*'} }]B8;L o7i>Ky"ov0.|]"扦:a ЈuG=cG?A?K13ȗRKI'b~zGBKl+{?!G)ʢְVKN8+!ۍD]}ȗ2U}0y2o ,Ow^9Nե]ClM1KYC-y=(@-ٞy-彺4JZWMjjY~@~ml _+=䠕b)X?Fn*j%˃.zL#ydYށԁukF|oz7dk]ib)(dGHu=o$/J73(3rW{A OJhasEevGOAINUcq_:p1[#|D&M?M=I[Os^_ܗDZfz@o}k73BW E8"6]dAoW H[`8iel/m&sKUKdsm)u7EB];)@v8%zGc \NtR2`>@IW +q&RZjuA +.\+`, U?@*>짣6|ʛnƦt:-JvG^儨+П[1ΚF:@.u3+]P53Uo]9k".+l#&dn63f&FwdY$;Cg!e3+c^9\m ]zgw8$ݘL~NUgFN14E49G1;,QYܴ,׏蒲䷊0Bedfڄtl'lpkYPY!i<;VB3890*meQXu8ϊYgleMc"ao!Ue(az[^XȣyWeSt)WP(/,ߕfo rYY[=q~~&J>#jR껾B«^q+𰊐q='%"ܓqF0&wAFoH߼[Cm-E>(AF5CW0]-[WCvoD+j!94:Iy %ONX9TǏg^D(~žws+{3U[SUЕlZg7 -NZVTčd)ך۩Mxԣli1W<ϾwGg^ZYO07J cb)*PaNzxh͇eaތgaGh9p߼8'b\09%>r|ktR7?E^Nw/d8e1?t6uى7`ϧy|=>ͫg2=nVCu +uQ6B?&oz^dE-tR|ܮDHe+FL?L>&^:?sr؍ tVrd_okskW@^޾yr! nc Ipv8S*Ή{h'mJX0Y+Y ޔ.Ң.p#|x~r!$5$#Ϳ!~O!^>\pWg|/IK{iwrq/U e'}8&yNaBDە iSMdһRl-o1 vnA^ݸq~95ȣ+W!6@n^9w7{a bҧœ,t'rJ1q?M!.O@}<7nC.-N^xQәF]) 2+5ju=Dm?NVGq,Dh _4o`>{ 'yru!o_C^Ha)j+pouєKxV΄a/2RϥWAn>q #sث%Xԓ +qs  qL=/}((ө9&,& 2L{wx +0o܂=cg5z>~?$!.$-b}s"~'cȷpAm@e.䙽-WC^yM+Vo ؀Yg˃a6TیsQUڮ Уt݂zn`[ch['뇐 7 !nއ*?dzBo+^k̄vL3]UI,}mrr)W^g>;8@Cܿy݋A<@[@7+/gb>^im3vd"Rߒ +țb.b4X 6~+\P;[PVoq=ې~u!ѭ!nnSL5 +˲ׇ ut?y-kZH:n b{ +5>?/ +yjʟ;0vBl=${-H tq *ؒrkY\hQTO6M{K -[{GKܻݻA\|u5BQt{^H|(m* {T|41.ww%\#q-)bu}.R6ۘ,_+ʛ% 5 ú*9̷<}>sE(a%_KOLB + _:st͔:\ ky$0uRŨL"t΢"o 33k;ȋ;@.߁<~rW%}/ɎRհ9YL -$|^4Ps<y*7k;ۏg>:8tAH*UU6Fr˽AvW]`&G_ֵCmO9i4MC sq33l,e1%,f2$mO{}Ȼu>!ל֜ST/, r1<|{{7/|^փ@*Atu6l-=\g6$Wym>bEGlj&E/3y?{?koW7xQq<+ǶEu˨n 20b`4j*<|=E_Bc.UT~/+ TTGڭ<|^^CrGQ>uw)q'%aR+;iRf7N2F5d}S)u҇w\z7^[U~Ng9y ֵ|N1bv7I-^_ګ`\n,tc!_#*y}{կ2ޫ{{ +^>|V]a&1<σ8,hXM ]>4t>z/2Cp&?F AGM4p~7}Ʈ K ޓ;2غمZki foge:ɲ, @ls}mGs옔 tR2rGHo lu$S.E_< b>6MߝUYgZӃM9lf7K$ov>B/:%{Kl+$ ɻ9a3QRuw( ܛ%F:l]7ǻeұ,qoo&lI1[&+a3 +~О薱an)پA.ݙ?paJELmzGW/1ϗ;,TW}YSt=0-:۲ĩH>55h=>]W7810#5;E tdW1ma(` wz{1b` nѓmk\jF Ztw1d%M4]N^gk L]M[kS]V!M@+$:x!nv6Q'"~715z +O]¼>\a80D8~>UzWYzvyeX45 e+gkdtUpL?Rã96 XpRVǖC:Y9 Gds} f}Fʷ,2 Ti@%9lu +رM~wԳ֏I"I)$xm`_Hz[|3!L:O䪔XRѡۣ`@F1Ʊo<%q*0PM:XCfm*tjU]]ZsL-)#TCNP:l whAqYs;󄬣!!pvA{P+9ROn*yT8C0">4XPMyb_aևU)ب-z<Ѻ_Cg8E:6-efI~O:# +o,ud8e>9/e- gbc2!df}HȰ,svp5R.ȡF3Qѧ$5 tp`~:6QXCh:5R`A%)I!O]Qn,bJîubfW;GQ}=VEݥVE8ubmWFzGw#u, Ȍ])Pr(v56)jY@NZC14'"nK R!~12dB#rFljhJ듣;}%Ww'Gt^2"kIvȨ< B*|w\ڙW8O=S$ۑ5ylz6 THկ[3w[,f`wïcb#&.;"bSH)HeГŖ{oxQ\P61CS!5 ;װ[Cw<LnvcDUW嗠#jJ[XIq7↡Doq.!9\_%)d=f ++;WZڟ% +iUо({ɠr`'g­L7ܶ/B^7e +endstream endobj 23 0 obj <>stream +nxQw٤DO]^oJ.D7C<*谰QwFԐz ˶ ;&.7sA^ /59Q>ЃgerET30֑Gkm!I@>k0AiGΙ8uP +'!q|mƽ^} +z[X4_GDۨ gDm܀05!Ţp/))c`}wM]cv%>hFw{ +Y찁ؾVs;l4ŌI5v +Nls@l1|hWvTwpZTKlSd:4"6+/>Rx2=3u("DSԘL%ƗQ -4/j +&"Vzb Qty-CAOw{V\W*8" +!Y^%=na +:A4sf҈P!skṂW¦; +WIoFivK%MJ}o/c@ Jͱw"'7੎yس +^W[Urk2Z7g3eNxQ- 9V +\EHEj8\gϵ~g =~)$V8fאY*/Øqtp[=V0a^1 ]闓:Bj.E w t)0>9,/gε)t_H*ߚAr9o!Q#aZGtuj +SmgT# Vrq>ѧ :72TA?𞤿eqslkc2S#@N Hh𳭾o2׫rSQ OcKBLeLCl=5tkq+ M 7]suĖ}>WvlbY9<#%CwT6zUԈk:';LSBi8X'͝~ |bűMQ#cZDiD^$ҫbVJ= +TOʏ f] +1OMLҩ:֢w&K..~e\9B*6h&zݐ1Ĺё;y5L=Xm_{ ka}gw0NlǯablԠPXdǵ\zDåE \?^ iI-A5%n1Msv쑑%%bڥw;{> +A>?IN~ fKb͵ ފƚ8W ʫ'_VH5'N[ sEx ++IVʮn$w$6!C"F2-A$]Uc*2T}ƱmRX[A;P *9|woGZKTu0nP[D<&ݻά!% ꖐwb\8tM\"Թ-8@D$ 4ٯ𣺮S-Tȏ*Z<Ž5h}䑒dG{8u0ѿK*Óza۝םGƮ_W@I y٠@iqs|?SEMsmB҃Z%T;y +xV +]r8<(4p /'_gg`i+]'mM6ݏж`HF9%+s7HT_i{dmo_fҢ* 芩*B^zK[ŦqΪY!(9ķYvS+0G"jSP=pګ;u?GO3vBG[15l[Վd .5#f7j"Ip7_YАHP;"Fb0Q uq +\6(ykM`7r(lxAZXщ NxXǤ>1.AHG]Hpۣax[Z"B|ih {8tb`P7Iæ*e[\yPӶPwsk +Ƈ1n{qwnmsȑŦGW'i)s2>:zS}U__{oPվYh52Q!%Q뮍֤Ȉh!59 GDTRt/=ٛn~3!GAt D M9,ĖxĨ,*2M7X22_3 +ʳM5? 5+<{1DMjk }<1ro{لg<x8PvڸI*^ "('E +:쐔J ܨw,jw%B[p0~~^E:"&6 +:LDD4G(ve^9+Q3w?¢nj֐#-n{a_m{xހ&_]GgĪr|s cx2 5BiT[[(@|rTK/oC@5\cTn{`쪺?ZfDYs [fiQ#!Fe/]g[vhXcjy6wDmjLxPH ڟok1Q=bbRMT_h6M;NԺ+ӏ0}ᰲ3 +R]@Anl`sD{ƿ+cͷmuds +N'ʻHH})Grͳ9bQְ3{--UW."SY? n-"a"o?+7^ ʿw_߶EtA. "WZHMT]YD| "!,ƴuNߞhhmŻL)}qȣeti?w9͔ ^B2?lꭿ﮼^}iL5(:֓: +͔k-IԘ +XSsM.Ӳlݳ:hp¹_?EԴ֢?휑eF/ڔ { +>1JL2R~#@CZ&-4n*8g50cO-W!JRxE@v-D>P6]bdQH9q~ QB~2vb +&ԷNq`m7Լ˞Rs ,]C.16!at-kcjD&!Ȅ-dj=*"##w֠%Ds/"c +6/D𣈜xYSu-Bk`s7Suemc] H5d}X^@oUJ&ױL*=U0VSZcu?oU^ MB}nr4~Z˰S)᧾8U>e'p~?@)M>Q[AF ăswت38%b`=|fuFW%؊15 6$갊*!h;^wS{ywBǫ{8ŽJqraulnpw4/Pvhz/9:%"Cr񅡧Lk[3~g +Z| +#ZBsZ"ӵUs1S-ƛoYwJ63,U6Xl~@Eհ?h4+x޵Xs`RR#TsH ryP$ƉOgF+( Y93+N-}/- +.FU7?P^180P [|o~8@\A<d7ےJ.쎖\TwGtUY~zɝq#Pc^E5L*3}caNl\PLov!_;fꮹg[62} +")IPy_k~VN$W7!5Wa+zXAPۚ8↎RtjHߔ꓏#'6=pֽNu~d6\`i ?eZg̃/?Z'}~-dTK[#ľ*H YkzcCE"kxYCЩTs :aĞ{5\Xʩ QKQnΠ^!};ӑ=L+V(iWx}o[@qek}(澳qڗ9W Jzke"z#TdЉ݄&e}5\6jr㟶ɶL q>)ѵ@-쒛s +C_ۋGD@33a: GGTڀ"sr)%]}BГ+#-i`3߶n ]kȬ WSN,LX)h E!DmI'F&g* TK2O8] EڃY &)}\~kuσmoɺ2F!q{e\َT;Cq}srrv't&נsmrkJX?΄+!y;^BEnZD:$U]2BjtߵAh>UTHʟ] l?9aqxr&"8O% x52qvmDžTHp#uy>Oͷ?Hس#_pMDN!ga/ɦ1s1e +h _N)t_mʾ@"rbcO2<e@ǡ:Fխ̯u?ߤ0,ŔǍl1;3OOތXUt{Bm:4Źyɮ UtNi9p1o#gh0_?;ŴWXoK_1_}LN4(ks4ѿ""G4=o}Uaά 6>,譎gWv6]@|] v`%e/ #fo._pA61)h>`0 aks^@hiPLWG%f!bήc+Q⪂7w-u$!ҿЫR7%&$diw4Yuh:(qG=xp\0auTce_:T2`}T83ϟZ,wVxFqƶ-•&qJA-@/Z^'eheѼ`zl8XzpomvLOhxIJhMaP2 ML_\2xsUҰ0A%VNnk; Or퇛,(9:@0w"H5n +T*+jnM`?WIƞ ϷGn.9+oaEQ=`v96pqsŤ0rDeO֑U|blX;&~ |o|@Y/g Qx#Mu,BT"T4 Zhiyꬺ%уsJnMc=;8b8אs}/.0 Oq + GUޠ܋<1/y|A97*Js"&ƤwI5%٤74&7t> ~y80Q9בA+r+[ԮoH嗜7Q"XNiH퉒O |ã*,]*űܜ ``̳om;{jj{WqI;p8_=Πy&R铽 \7 }ԇ{Ȝ ohDw=ձt.3\D C%?Yi_n \:? +P$C/`j̸3 R1Q3qS(}k_M{kpf +ܯE j_C}Y&U9RJ7u﫺7)! duBa7L(i45$cc"J6. ZӈdqK[s\.)U@^`m@[ٜS_9qSI32pA%ٜܽlI U1pT$a^FV<ޑdۛG;^ߜ6| 2,/-3A[p'$KBow _"JZT_Czdb2V񳌙NL-| SP-ZfTn- +k@^(XuRShS@0E5c:ԱMJ5UQ2>>8w)Lc5I!u䖶'Vr+o|\}߫7؅tqahKwg*.tƃ86Y!ֱpq-|bRpVdwp`+=i;9a='fTlWh$bD.yK@g4\&j5q. Wpv<:Fo +/Mkw-HǾFT%չ2 0a ;ujLq̄\*j~zR2 +Md:LFzdVܳZvIH.24jW{IsOƋ>ѳ1=5a-wb NL^o}ThB 6pJYK+ydiD@+ܢ yM+ zɇevwf뚎[#=%qOxޅYpţ$tUtqͱO%z+Q)1HXxqϧ$Tĸbqd)MlEHG%#EBLOv'R \GBt +9r/'z:&-#7,[E:֏@^,s`q}Rrs~8lo xo1ۄݰ7Īv{E)汬o CY_t5"X{Νud|[LZzgO-$'Leܣ؝˘< &ãdSZZ'ڥaCjhd=:* d\vکousWl_؆+.MT_M@0 B> . #v"zO9U7>d]pۣb>'rb-3-pXDYt&8cAyka|Hjŭ^}*>mwLlCUU?/:̷+ ɕA"|bF[;G9+Rӷ +ɭ"RXWҞs:?R= tWBI砊Kh{}2.< +MA|1 +<6\G\mxsD(k; y:f/xD-WtN+*j{܀oa=KT_Km谨k(:e`-jNFoGZf僰BVUzkR='ga/3Ӗ49-<[*L4޲L7:JP{!33I/'mZJ0VPovx Wǵ}cA9#F-%i/o’Rӱmk-𜠞ˏ3n9 N n]J ^wf(Ur2rgZh_ǗZJ|ې(%aG\cpOt_Eؖi-$;2lW(tJmj򈩓cgTj~qTMNh&PHC[x}QCgﱾUa4hX+ +*pJyxױ b_D(3%Uc7O9_WhE?. sm ]was5w㨜GrIiE[zFAKAn3I>ZCȺ/E戡g8-{go̲oIUO?$>9 %\U\mKݞ(|-%?xw*HUNPqyg𹉺FtF݀Yӿzc""PJ`~D +ΌiN"8Xc\d"5Oo{yc~ͫ]M?r2&)LAa2=և]׬3>RWw+(zl;6-TcJLy@E8]lz.mw 8 mT t7C˪p}Yc츷LrB Zvy\ӘT?eU=̵@=A x>׆t]o"؄)JO g;=1ˠ(rt= +8/Ö!;|sn{56M^k[OAC2̽tCO5`g~!]`5ru/p"/Mlc-7fokoױ?@ils@;R/}!-ubD\u3OUk]7Gbz/kK.MSCwkw=^m;YÏp/]&_ܙlzj{ӞuV_ŇeڸVRAFU=**bf2?#xgⲏdmtUT.%J/S*^+Z+^|QȪΪzmHK <\"bpz"J~wHNEUFrSFkJPF+4۝RX6:YcoָZAZ*:sg +>G*r)qGmI3oy?x^ּvg%9ċ&؈XHNJS"#N׌[!Dlh@Ʀ7uepk-Ϸ\f^]`Jd4"e Kfzl.)z*O zk(ȵ "V.?u7a N]ט`L^ 3#Jx&۴]bQbF.!Bsn?w54xXfBZWq ϏZ#˟I*Uty{FoMpilwl+Hhɠ'eq3TBJ>ճANowB ^Q~}Zmsڵ/ o;V̂/mcMf [_鐐GPB;r/6R I?wbtLrBwoPf:[jR(%tceA<6Bn)M+-ל +达{r;uˈ@#'W!i -WheJ.}AuR뙎<30^ <ǹzUbBTF*Йw%`kC}Lewji,VD:g-~k7+T~{MI8Vi{Gu7k8Ŕ홎1GK7FČ 3+ rj%BJXGܑbǴ'DDhTrT"cߛaf:֐ŋ_ %W1ǯܙE$O,4‰=1 q)bƷ4;.|F{)YlNH`盟u]ٟn{"JRW{4~k|bTuqݹ_InޫbZ.`Ss96 +uHGi]r5 ylŹG]~2*O,c~5TtODGV_ _-g)kwph +7N͡:5\d)\ _@po0YkG3>H"K2ao[A9 I +1*;7 =Z&qis_Pв>5<< 4uV۳,cU׶G[F˯Nu<j66Ӱ~5sXـXLN2$.&0i,v{ [_yU.;=yXfDql 2<9l2&9}]ޱo-!΂_-C#JBM\Q^!0zhUqrs#E+nLĽG?&3k./S>x1h++VcXGrGAL +V/v#o #_6b^}d,>z8x]\:$]/b.Y.VލQ'[l5ߐ?s1-URC"boRika-b6mxgU/=B-]$DJ +h AU'%%6)΂o6_lYAf3mgo6uw-ww@H{ @݃N}r<IZ Hl|壶!&fܴ7nM@}f`? r?$xep#G^^ݐެzH +9䢻=uG%ÐO!h.5AqbٛG!x͆]諿=%dF+y*Q4Wǩ~JN0pF%׿|sffŦر@pU/[;: %քqijAtm@IQ5('({fgԿrQ^ᜁ\eu~S]ża`PNJ/,`kvL UU7)"x{F2Ί_ +.j,`窍peay;~S-xuQ`ybo"=Lv#<gDQ@|Ls{>N1XSḋ0f~׋aZU-kL&qU0ɿٰe>^ťAXgGuĢ3?!gCl}: 9!XϾc,i)97%ʲ'^hѧyB|oK\sQ궽l^KpW e2i +ૈ-gfCܶFmtUx)YxJd!9Ux}NmZR[:Ȼ Gk E ;xΞ!!۰VXg?rC7äMdдkozXNqfX_(aTqs^vAV=%p~]x{ +z?F%:)A?ӟ|gߞn{¯y~{~:;2/hoWܕ_l|)}",Y3FBeV} $(2Cmظ-iIOT^b13OQOIo36l_!v0bSꚦ#sYz_ymFdD6r?V?]dmNՑn20M[Wwm, ;2kGmâ6|ɊReՏ*'3~V1a B5lz}ğe^[mGrw6jCRHRvk^|Ϝр_{tTJTBVд.q̲E{AdQ]0 BGUu%9.VMBO~퇤6ދ3Wl7"rF(lƔzxwšg;~T'֯IuRݢb&W. V^Kl@,h! zDMѹg"{;.pϵsFrqs%ǟxķIy">CئXvܺF;-Ɖ~D΢jYzkyģkXnqD_Ԡ 7JKltw 3bw} O SOZW3S{tXk0uٳAKʫnAUt{3s Θ:EgüV\@:_#)aA=;.1X5~3ib o? AC_ ?,vV [;36hZ'il{Q]s‚1~ԞŔxADaf K0 k+*keyy}N4̼T饴mze! 1L#{Q[A|&ܨ[`˗y5*i^ > &zJ$E}z9}a"_ԠQ@VLm'qɭ =mɸ57qنȟUb|a:>Ѓ0bS6 侇c_"s~sRKNOlyG YK:pҦ1&qg%l!{V{H#=`qpge}U2kƂ/xՎ/fK38e0 7Dhg#`F nL9b| 1! +*UaGq:qǃ/[5ayWvr AcTĂHONj9EEmePO3JveX-%,snGUm׬U4}B[0$oz?fl>ꡁ6} N?wi[6FmiR݂b@9{?HZҏ{hMfE#b{ *̐-j{F jNy 0@x{KyXuׁfelH;M1|CbH><&k~8\ɼd"lĽګoDT,QR#GP)O`R^䖦1O9ŮJ8!d_=لNŌK<'FspAy;X@I>XԴՈ -1!icb;'%u+/O}oA%ɵjՈ˽eA/[vw[&RQnrGaK`s> LӨM{k|IN0j{?y'39HE:Rw]e,ePJ ; ?*-he/(6jS0)#S.SQSO ^l1){!*`a&uM8ח ̰Vi~c[?\ԁWXԴ:+t^ڌYDYw{JufA30|raT~nņt$)*o uQBOAKe\$%$1º6дpg;/GAO9-FdgG7wHܿiḰ𬛑kgݣAA/(5)JcF/CDG?q~ q~#FFٳWOIy/m'c^ Iq|O-{ĈK<33PPy}_gy=_&) t N9Ȳgs]~Z *۱*+o-/ i~pWrtck[*|r`gûlƷ0%f [~x醳)/TՃ7לxܗniV]f~A%6|薞{Z\E$cA _6ҷ=҃"_!lbEݾ4{гZtAّqrٲ4ܟm|r!7~"~Q_"4 =gT Ny5nnO߶wlȼA\Bx8)$^r龦?jړO)Mo䨓V# [~lu ڣ6Xβ\VAOם,Ȧ?|Ӽ:mmXU/ 50Ҍ0mg,:1%#$HKmu<װjùKzBt& z2~Q"ύ{ĵ瀿UeSj|漍XAVfüV;"~s; +nDڢfҼ7JCLqysr咓Z7z]Ɗ%tL*Qc҃νΪ;*m&dsӊo/*zp?'?ɛs }цΝ53ؒ;iBXý-W-}ƻk(^UYWVrEx#eq*ޮyQeަaiéW +lƸ"o-s:xƪ Ue=9f57YGլb LKfGUO*]223s uV?H-e6^%2?v7m]wWcG.1;.{H ?=YpE?xU@MHI* _;^aBEbmJ;Q 'G.uDE-;iyJ,>POYe]F|\я+;=SLU+*gь/Yt ++>qr@&rJYkD͘ Fbȥu O-&z =11 dOiy=okV1&1®ի~L =n]ASUhڂH *l}7qFp붇(<ڸZl;c>MsO|'xɌ/X4Pʖ X匒l@ǁ=w ܼ޺J]}{3LCQj~YiHpSF2ɐ\Q?DaC2A0dgܬ +zوHp!r#JȫP ?~؃{jǘ6[mLВi %1y*cDm,(t}&,.\. k}=g!BzV匕Zni?,UhG]v-؂9dV|Nk^Il|w׻69Ƅ 5ޝ !0!H鶣=}ӎ(Ysf]aw!L{77}baD%2n NЂV`"l|2KVl^;%dGq9ՂX: Pg4Z@q6Z#c7;.vǜ[@uJi˨VA %FvhWG’ 6#r]~ݐKW5";Jo: .>nZpV Z2+>fGI]s͠2Dirѹ6-7o)~hMkw2A~>o{߹b`B>'az;@.p=vn AuwGk?Q7F-Ь ?it=e5yo^w"OܛFj_ 7gQQߜK&R0&OSbNՇmRQ|vP;.o}5#s>{AtW51U;lbLzZFm +D?@r{G}}H;jƯx+ +l=@h]vbkepjLeKqq{@܈S5TϛMHeRdZsZHb8&k k>mwg{XqJ;6.xCMXΎn %&9jg-UWlkCdyH53(_ 4u"I!(ȩ[nH)5 +︺/5;EŅ3:`}ĦOao#&X)#6oRN"~=]w1ʪ 0{teXMtIR6Mi-6jE֞$#>yK>6j\\(ya.+PIJQ^AXbZn[S@Ý=:LXHKl ` .:]eWqis..zօ3>$Q'lZQeM% p;HoXA6ncCٟlMycͩ.֬м3+PNA +lI =&"s@9mWr7yacZb!Z(gL?i~I00{\.aa2ϴ>WC_wÜ.1-IM#, _pX9?Fz|n㼝Q'f85$A zNm><͆Y}*F% ~&}0.dG0QKCJF~Pk٠ߺn.hQQ0I.X֒Xd7 aK +ĐdXeY9cc aIZjY Jw.j1}ϟwӧLE{1-&+&>~#O.}Q3ajR5dَ+AobjVz^ܟG7%Iڸ+` *R6fIm*/|(hGiMMI&O+ekc[y0)4`h|(R^iI|~ӛPEc%/t7 r:()~P!mfru=ԨUʘT1194aJm<^澮lS7;"/추K&Zy d"U-]-Ά_Jm?]8W_G^Y{V%w]mG6roV̓VPnabe^9lk߃|FUzmZXYdwy??LKm=Εt@*F*+X^u~ЀV0>ؙcg:Ik\\w]&sR`v+Cpw YuY|%Kr'ej0gS;~xp;Ē$EnvC:B$49pA7?•hӺK uyr~}ܑ̋T7b?U9~Y/R*(fiyjRG-zCx'cKgk[pݿWz7bBb~Ts35kνϠy, +@mtD$ٟ_bSMc3zpo"”*8Td6k@opA]]υ'񿦧6Rx]ɬ:9f1( ~{=M4U&4·T?'d{=Ҙ|sVa̫$r̭sb2ixCD_v8yNT`9}F +ߪϤu}-$]*hf.)Oc~uFĨ簘#w_[=Jt.e9ҐkшeDi( +3~9s1ȋWu9t ]q^A~T_Pw5W)܋Ǟy$)45xw]/:{DR̅[U1Gjs}tP"zJciDYLj4,^)`MBpEݧl=vF+bnz D yZqAwObyy9z ֡ccbuG U?f7.mRޖUs6uȘK*q}/_%d&K'-kuŊVoy<<}p䷿b~푤ΉSASz%} r* DlzmI T.9S|xl*ӷ +Әk{+QH, As;ZR2 +tju?uTx* "ћby'r*?%䉎?JFQy ׈Y/>+; +Ū`+n=V8HGN~dO_|6w,9u,{qbYB+zBf{ 2#$YDQ˫eVHk |)0]??Oax +}~,#oAj3ZD/7׊rȕMx](J{Vm*LvJ}k͐咹I!U9%>85f +%qkX,S0QNV.gftG` peek RS}jI7c7&sьqNltz |P,ʥ2&߅"E7;h/KJzR2}OeI~ D,{ᅳN*$[ 7vtww%=DFNzic]?HBKC}T=Dreׯy-?Zq'!p[7Hԍpu[!&i+ƫR4K5K+ь`\}CG.^+yqMdio(DqC2v&Ĝ eN7j\䨉WQ^ }nD:ho U"e2_ϤH8(:$Ĕ9zeG^:Gk)<Ʌ.l5v:~L#Tzz7̥jb'}u Z:<Ԓ>_r׆>k+M]->broy[2-tqʛ-T{QE8Ku:pwn{T(Q*>m.ӻ1Lj[q薽NޔԷ4ңZ b@!0S#` ֈ.$So׳BnqHqLfX\k'2f >ƯxTݵ.kP3(2 ՚SW﫚TK[BȎWm3\Pg17tؤZplRJYLHrLBZ/J).5g2蔳"E}ZG qY#Q:!/VXi>bBENv!&JvY/v vm#&ZQHMY^c/~"-QKicǻq1o]ǭذQ +rMOS!`h_`[$=KPרL[N&Gݟ6(U]Acg-Y;źÙnpΨGZ}T "Ur\ت50 %c6V#IgES%tۇ> oԋQ٠U+?&֧Љ cqבlr|YPR!w9OJyQ=JjGl}4I6k f#{PoUQ9!>gu+ WwچvZߣ]ȔE=5g7#KFFEVSdУ-LqT<%DïUuuVФ :gֈ o6g{>Avܨm7`Z \ƕpa/B_loe aRꢷ~ɰ/cM7lZ KԠg9:ΈLk{HZ Is(۟O+`Y5"sσ,98> =ùCTֲhUM0Jt٬4&oy6&V!lT+nQ 5wb%{ES훅;ƒ!xg׈PTkx#9Q&{͍[pa+\"B):bhZw0غ%{{U@W`z6c_cا)WoSLᆽ|AS7̻:z%gik{+V} nFޟl1i+Bä"iƄPʞ n?);Z>ٔ/C USŋmoS5@ϛ=/vY&"*>&,ckzEk^526i 95[NTjOo,qɦvTȮUjmM\CSWm;^xj[6=&!PUp),h{{ 8uɟ7;2| "-SG c-ZbzHSW{` A߆Yˊsŷŷw6I$ڠ}eZ%^y \l {|dжɁWyI%L}CnZoXb'5wk>$Wyf)Sײ5UngߛI^MOuWTLo6LᾦGS6baǂ/sg[ YT5_ր_Du1Iˣ Y}+򏟍-G!^x6t9;N +h _VW_VUw?zN6' MUc1H-b-) m_8>t fqG/^̻:&)<%N}EIC߅ЉtoO? ͉^ipNrÎ[oK*KG̔3#܌EeW%m{"pGGź|Yۚf[iϳn{|N;3B)@@i)m ₻$Zk{|`B:c%灏fPr`konϭ=4^KB{8ud b,p.stV_U}4̯vL*}rR}@ՃW{~)vx_6Q~ulfh)61 5 >Ls{kC!쓃IBKC8LFOٕweV*.(F "`nzSK*FG :P -ܣf]~8NL0 "YFall@+x^9ALKJ*~`x` !hZW5V,hx\TS~X}1Jfa`9Y9<:zMu4"֥/HyzupݽZvRc=8oz= Ќ)b[A*Y=N^ӿ,Ջ}dF([]0`du~`t-▪V_.&.5˭O5<&¥썓b{wJ;,9}iLqrQ7jNh`TS=*Lhŝ՗?#F_nSqØQ\Z'rG0;k ;ijRQ [zQxWq9CL7KIIz?CsއI/η%I^_Ar8+?ւ+6j=)^wszORSFareMQ +ƹIGљKEɲ8eݔnLҟ+5dWb$on_\`l7ޖ\+<mH~#ʷ{jZ~@GxèG;}7-eO D~ē1A)FO/;UD aHm{sBso̿-( 5lPk%!coҰXDWF\(/55_V4l".)LL 4T΃sm*|皀aUm~&"G~%}Aο\_{8YP?o4d|Vh^*㗭«5ɩg)vR7kZ>Y0$f7R[ڙ?wzJʸ!äs΀u0cc͙?ᢁ^ghήw=>*(~aYN5c# JRwo_,EL 6@h L㓳#԰ߧsNWlS LacXIӮHa\쿍0)AD ,W+`_@vkE7W;k}OyoMFDT:,nJ.W2QSS{Xo+2zFO+ڧ/3ύsϺUg+s3 W?8F09\$>C}mJ6ޗlb34:FՐyfMރv&>/J~4?ZQ4o*M ~ 9kRXP% ~?sQd>w v^Kmvpw蒢&[(2o9DqE7 hiC^5GJ+m=fm픠#yk֍h,$+8Zyyl4柳KY{j32x|B[C ify ҙ~JJSoPq_~+OnJ7xm)Qŭ~l+K/.hZΏRy>!.1‹?S~8KB81:/ +\f?%nwi ,[yoy2:\}_Q%Pm@m.8OD䉆YSr*7t vF'96INT=ZlϿ^xmz{Pg #v{鉖~lc캱fWɕw,.2-h_V_ LfJZPb 􊡭E%6)>M+\[[~gmuFgMӊZx *k(ҋŒ@dEcZ[,uAtb22-S!f{?Ij>vN0 cߠ s2BgIEi?)ETSHPw䛇rvi>#aϋNӔ\e<&lSJnƻʻ%w:W"s8n b]4:184DžM< 1_M9s./n=cE&LsKfY54?ϬtipfIC):;O|ܪosiIT[E/cS?^WTEJ!;77{xLxPCs9# .|UM6$_ӽ(xUuw} y؅7%6auKHͫ0Vֳh~iM;ZƁ_rkIH9:jIzSF<7x%R4xwUjKolCi[N9v~{-A@!D9e1begxQfil aꖲs_ڡv{8>N[(^r5K/˘⳽Q\n0&E+oIÍQ 9j`-lSSy0 +t0uy+kʺ_&ر? +~)VE#}*)9mg@.j3Ucos5u')Yrq Q~ok sگt>OvC9qɡwX)?HJ{Ía³joR[)ΐR'[}O,㕑&Σ! bP3*\O;!885Mz}`;AYﭺ7N0Jz(e"~}4O>kB_i4MMg_e]7O@t̥>x$"'M݀iZ>2nBOѭ#.[ƙ9^]ɇm#ӤT<''Z%蘕9{ +^sqL.=?t,%fuu)77c]&#XϬ6ȭ jcYjqC{,8?DIuH[ak~74g<'oEMiV0#c6,0/lSA+II9>eega]AJrP+@{ܓy,"㸘MH=z0"g#22`awJdoԤxzf))mR? e\G'fI:Q 'OkBޑIp<0k =Zhq)D(pN@ +,4Bֻ!G鏿2D.ɣ/_ Z2RKov_hd;%ʹdXp,ԭb$_dߓ7'\[LГ*ZR뻽4Kt+(RpEDUw7o‚)~ .BVti.ڛ OyUe%mʿ(o+ +wջ$؟_\9S*Vy^Dܔ4&'`q%zn~, Sμ&G q3X$iOI (9?\3U<βJĤdE9zm \&CE.,4E>Xҷ]k8UԝQrBh[,5ۏ~䜦fP˄2%V{QyKS5>o|0v7iZ6%@wʄH-:JLvNRMc8&=;7%|i(wK\]΋^=Jnq=} kg>߉7*0O`\sjeEG jOîr(DX+]C{E) pZ}yti&)*8~ zKQ_6WxZ#D炀(9^|Kxm*j,y!|}XQ,*bƁIa>ħ?T<¥NwۃW-5y5:'c_o}eMl;-:s3G юi|_IH;ђC=e"&:uԕ.}׻GYF Cb5.1S̟v!a& :buN0+Kj*)VJהb wao~A/G-Ĭuw_gO>2P< +Bn~z.|F.#et<_ͫ+EIlP՝Ӛ8f9@m+( =%*Th3#PG,ӴF,Ȏa\i( gd uB~xn]_$8^^fIYZxq3G:eak/U~-mIH65 Lm0}U{Tkw\s2j?eyC,:Zj|u +tMUˌ_ߔySdӠk=(NjtwRMǮilSJIs eE.^5"!/ 9S>txho#t1K˱K9w &2Q2˖{`w=Z.fvmՃۊVf9аjewAw(H); RE)DUq^阰⬺=QaAM#׺LxX{[uV+!Wqs'1bM.dSF:1Ryi1+B=ywo9# w>F _@o*xeH,)ͭ-VC*.655&řF*n`~-mymbT r35(\{ݭ7MygU?@ Ĕqz[u}[oCz?/)ҋ2No| +g{ÈABv?9u=&b>[ńj[믳OϷ3!RlWIv+9&)hO26J~iW~EV\cDs:YXe%$5UXtN]@ŭ1㕮[^ $ȣ\[Y酤~]]S)]CϚSr\_]KZ&>U6{u8Mc`Fяl3 묰J Oh#I)BV_b }Iu`F&ۤԓEâ h+.h.xکe'IJ^hypO\7@= +!iwtuo!$N%*㚀 |Jc$-h4ŪXy jm7_- y[1*,o%KFYG 8R]햡O{PhQы&&C +vQ+D("c ANkA.؛ۍ/Ovkf$n}ߥ .7O썔^wHQOVY@ϭN;fITjwя@'|٬s +fqh_K`APi 8ewuQڀeCޞo==JZ.H9{f(ge5N60CeS=Pr⢽ +z)f{cנj[ϾBi}w§Z"q==BD8f*-NmkK 4HRcLZy +(*Fߚ{]A6}:ܫ@C̫ G-J'{ݜ($#9N=zl'G?_B/Ys-i.Ǫ߱N[%a|LC/fiFjwβko* T=u O95 +s{P?ux(\U l +Tqi/r}{+t`Eˋ~}pUh,:k#&Re{BY[㌜.B%imԋCc83o}ы= bB'n \`U~44oLr(å~ +ث9pYhĩkj8Tuv/ғ{wo:atdC$.2ѾehE;ZzR.圷+)j_~ܮq9v5>ϦE6|Korr{Tu$Q\2luleCJ<1H;ԍqo=ADDck_>D!G*ΡnoۜiN5&EeB``=IBmv'[aq?L[ݣuw؋|`B= FL +uQ}pn~o i㔋9jkqizo+E}4*C{&nӓWT/_9$>q%ԡd6zORZ7_ۆv8.jx(hBGڲ-e7WFT0'[Z~wWp83mCO_M_= ~3?Dd%Z{ЈpAN֏ڗwJ5`юTZ=;liR+ڶ^\\S2\^`Cu<X} n=(iͻ`?5㝳ĂhY#[w 1O^n|Qp+}Z>huW*ؒ "؝3Z,}8CJ7B{z,_]EڟD9V[$Zv&`y4>Z\@O͓D8b=Vocȇu.9Ȭ-|ZcQ +4e >zKG+.ёN-"&;7CGy 6ϭ]fc22-djw>꣯7Eg",h[ܽ1jl 8ǫV[5tI%lvUy'agR&9UDёy]`ViC?7Y~%{.p:_N!!BUƅ8T= +CRqE#9}8~䙡e}ٶi|M&F7{!7p,2Fx= 6-{voU $:,pk^ y P!W85sw}0II$Em QblRLQR|j>.[%H{7_$]NV(Y>uϩni|n)?H)rI':ryPK-ܔqYc.vXxfrM\f^T&ts{ 1H5G|OG̲M2NV/;u׆;Yѣ,ڔ_g㿷L}XB/c(ɾ +2w CM +ثeVjQ˝0 j} 9cXdx۝VG9Ь=?BWInֿ ZNǍE>Z,:UJLsȅTXT"?rB`ŭW% ԳIx'[Z>o>TiH+v@D"^xd*"&ٹKoiZ+.(.?t'UcMIV☯ԍ?,_(pZ 3 +RpEL ]imU=uY=&{>!.fBmׇ|ȩgOwboҙqQߒchW o4yD| +6RG}ZbR'+Uy>֧cýjf껊R~i\12rs횣d5d-3$]ն4a VޙmȺO5OcFx4_+Ƕb}P +NoFe_qq*kmZg&_!_ʅ́;]ɺeԓv%swZ[aٯgAbyv_9,97lS1v9E3:[Ov*yU~=}($Z8,5өVH^-Tan9%XO)H'Hِ.̜νrj?4l]} #6)Ÿq^꠰(moʕ o`oKoZ$8nMQ^5f siIt8[G/YSgQ@2N?n4h)Ek/ MZ^p> fIYؗu)`]J6¦Bv$bMwD(Uf$Yg0~x۫g)~M蹶ZezܙjG- hz] &~ N%&yLxZ-1qɱIc#Տz!x7/gy5 *(9.9!4 * ]tR[x&w~ZQO,gCLsQFRzĻP7ojlb8'Wh7W}YVJFq2dMYSwrʮoWFEmֵTR^R JZIV8GIGlԇu>x[ |`d`[So%^A/9fy0̜;†}ġD-cW(Vr +¾vfyPqn%- ֥i9Ub7KaR æ9@%ԌYv@Ui:ҊI. zK^j[Q9doUuyk-(%A*v.994ԫ%;@1QvP9NS) Y}u8s4{<)';fY>.rk8;릉Vu>K D^Sb"Mӥ*$1\qrhY7)Ft",<"6קƦV|z2IC$s+Yp kR8\nn3bdhNeFz6ۭ&ut_|-ŭW>4MN+W(Y%)ǣuB豬˛Uaf)#W2B։UyYV=g" gWR \њn/V>ǩ`BlҩgL!L#m -=7 ߿zeӖ +*,,!x[ߡ| +5~ykG(&zclSP n>_-wDU&PKڛ'T,Gˍ3N%PFiU'lg^wc:$lGUVӏ y.HǬz円O E1pO%.܊F'tN14pF etT0?,_6|hh.05@[HIvs˜4<*gkOX9jWR\ۜ~(gʈۃ& !!g䃿GrJ&r9iw_u-f,7Ի ,e"8To0`<&iɫtڤM/?vYD $$lo}y ƫzuLѼd%ozaڳ|gR*q]{m/=KΪ+I> 8>~{Է%ḍ5:q`^@JGtTH{JZeV +qOc 02[|Mٔyfg]nzsy(ܣ^p<%ByrYvōfSC/ Uɭ0U~ 8vɆw~|r e]f,xqrS2t J 1i_BN8eWX,?l2;&CG5@4p'"/T+rRYBH +gWbM> )?E8* +4^)7\qh\qRy =Z$ţ}Xcb=J~SN/Hiv9>)_ub`%lu +7E.khn;̲FD E8+c9fO5ud%x~-9G+ݗS- XdU{3L |sT@Ze@lqhkz,tk8C˴}5ݧub{*rf!ZW+Zf{Z,)ŧ13 j(϶_wjLMdp>R\P gGz-gF  v{GC<8=ZhdCA+Udz~ f[)"m HHi9¶v B {l,8?Ŋ;KkSSY jcaG)}̒AJRcIvkU5iE(mjFojӋԒ}jtq:6, 75[f' ^-,7K,s 6y`'R|fwQvOA/ܕy/sKߪ~w-'-q:g㊗\,t(%e|f[MT-32~9z1ͽN Njrj/nC K,|2UaW3UQ'Ktg-Ӥ,e0y=,gal @K|j>GJH\*: |@J tα +AJ0yZ5&kA΃*plU-~b1i4=GȰN3lJ~徼%4JPN{*omB5Yz,Ȯh~®z1Sׅ3Լr^#0ϲKzgz5C^摁VUG"AA@:s^YlnvpOÄZ&9#dl $am_0022SUF -u=:ܫAM`qBSE/ +,z!ȓX{mӉf)9Ŧ}X>9Ymh +jכ;0'\꿯:;tj]'|ևXXNV"'dU?:ub$%'чrGsܣEty9H{ z.dlYq׶cX'bDWǨ G&trog9/ڛcc@ ZU1dI@4I I;C7ˮFU؜k\M˖XtźAu2tG hE.29T|X>h VR\vS%ƺ5\\ݫ4ۥd򠁋8^Q<r.Ms{1_Oςy5~[.~Hٓ3lmlKV{Ɓ9}?ܖKҧ7w`M7w?^Hױ K|c+/,?>~k9eYr{w-8}` ]S{f}zʷung߂s=;[}|S}+ھckjCzrk:;n~u̿wy[u~ƕG?^8鱾״L]}oѥsNoM{7|r>;㛺g<5nj~pH҉ח ^~'.Ds?jm If{dS +q~6寷okf13J^5ɞU.Yؖ{z]sc7οgWw|vYg7v[7Y?Mu?wgo.lw/<_]tq_ܽ}w+T⫋>»NoZzrc#OwmԃGmp/>^#~>yKojwi}#/o>_ȴ|qEU}g_[}0xj+Ԗj.-_O0Žͽ?o<7n?K_zݽk۳4r˒G/ydɇ^jtS./>X{(d(?|fNd9^_d'9g>Y#{yKv*n]Kgoڹ/αˉoos/u.3v"ޙƅ/퓷.?=ku+}3{qθמWV?|?zC}۞zxܡOdww<^ /5n}qNJV8m{ػ~>?B7 +;l/̾x~ʞzz~w>=>.7̦˻zg_3qn-Yx^|'7wuy;=s׺P{ryڲ$Zez^S<7V=_yr(}dg4|yޭgvǧw?#[3w,]thxʙK26ыswnho9ͽX~W'5~c)q蕾{?|ipk󫬵_L㭟)v/{lI_nUC6g:ai+isvcݼu~Owv},zL-ַmܩ}½~8[_nKo,^޻Ħ]9̎އO\=뉟~E? ~f3;r/\ܗvչ sm1s֥o6Z~rGߜ3; \EtL;cꉝw dl\pdCޏ_Ȇobu|1[Ƕ/|`v,8StNsqח.]}oj=qEPTs}S?ٗwi˻{6tPxk/Ɵɤɍ/]~v}뿼Ϗtv~y/^qrKCǐq՟Myu]w۴sV\8cp ݓ<5#r9~~E;elA;rp+}u~;C/,l]=xfc+{ad]ڷtɥ7 RzYs|%W=t]^ݗ|{ɢrt]΁m `^ 8CMFpZ7.:aE/K&_)>mvGk'wW;I^igSf x3oPCS>̱Kܼx]qbo{u^xZ?;obuG_D^܀+\ړ./\ܽ}枿w|ߴ{'^^vbغ$d)g7fx1e+Z39r<'WEGv-}nR-'_]sʮ[_K;/qrkg]ةMwܻj+?7?Y7 r]Gׯ|v_^t/ts`z+~rSW]買oXZ7.i]V}mviI;=w};w]vOןymy]w\7ĺY7=tٹTъw,=~6uM=si'V}嬲m\˙rgv{5_. _?-ŝ;?xq y_tsnK_=NŴ~ɴybۖt+泽g2տgʳ;?.%}6㩎m2-{.[ux}ۤ7}ߟ=8>yj[K?ٰ|7>~icϔ vOT:;f~n۟\3_]9>pqg]wfn;u-^:n3mxbեח/BӎloӾyKV-~/.@䧜ZwJ]ړz~W]Gֶ|t]~](Ήn}?OPC¿;mGB}{q=xߍﭹ/3?ۿlŽK{1SS<{ug}}Eϥ=+lY<]Ǘ='w/8}k߻ce7W>{k/˜XyuV׾#JtXR{ws>灏~럞޶hg{9תtટ|ѥ9j>ZE#3.+h/}Gn> >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >@ >󏎑ϔu61ݟYw]{u'T}lky7/OestaYf͖l+u\RWr8=ސ׎?^c̔Zv5MoYͶA`X)?f5l6\òSݼʶqWAa9*mah7VwU;k{&L]Cjyw5rBasZ_Q ϛVz:tҿLC8}w亸67cIn5uJ-9~iwWc`!`?eS^Hǯt +^an?GӿWVzR7ߓ˨=WK?ʞt\H|@˪вi0lqE7;|6~Ҽ]yf̵KG.1,f'zT'G` %Ck'TUe7XT=Kl@W 7~zd=S3l _zh7Еd\ 3#pՒZQS a.He(dAMV%˺xfgTI%#ũ%IR\5ᇓsyU_$96H~+ɉcQi`lMK`uDjFQ]~մYۧmxF*j4.'l:]|[SR7/JgKIS7/hEZVS1|H5ؾ$ H)18no;,MEuKZ2lwrU(7fs XuAStUV7PhOgk,Uvh5c[}O֞tO ,Nf5pvǬu|_Hypzy{(ZZtJ.I-5@ +1[rb_fCZ虉YOzKzta@FMj(MK{=Z;V\Pyg% +()h~g +ࡒpICKFiIa$i[FtphQ`:ârFd7ĈjF007e#rFoD5;F l Fcaޕ럖΍d"'2.dr ܱAdr ZFFE\grfɕ-M@5h(\U[/3L-Wo !U!_zr6Y|٨ kt6=jlcm[h7I;U>"+9st1qHשTttczN+T(s*ۨ n䪏&h3_`'J5ơQmpdLFX*l]W}nnm!0=[#WJ[۷R 3ktݖ4ZNe= 5)#Pؠ;̈́%BP!gJ0kḜ:Whx|sU*q#B'nY2'wub\%I'/ؙ:Xd`u\>|0֣ +1PX0ХX{CGFcGrj1u}U\54YuURY:z!EW0lMibpKrmGkh'͛#ߓy畉r}@#; FIxI}l*2>jX]nkAطaD5QcP/?i|V1#md&U^%4b<(`..V{..VhƵŚ,C}OQ۸A|QfM U7j4i\RI,.b1%UW[zJ\4ׯ_k8)=[zW@o0U2}9 H_jg#cV +]*I>rc D>8DI :lamePN#J/_ޖ+f5J%fYM{ݘ{0I=#qSX 'ߌ)o4K7cSÈMI7_@-WI7c3 +nj1X2Ϟ8oƴ_˜q޲lUL +. +P945idښ_IiӺ1M>Sz(Oj&G% zzM Ժ᠉׍dni+ls4oJgz +k6 َ\O_fJ<Ǒ?N_ֽ ߥtg@Q ^cf-^3/ff-ïշmIIMN͞c}&jIYvA[xauI}1A[aKn)TOa^hg"u6^5FMe4[o,7T_,r K.3C7\ٞjr73l@}q}#0L4 L^i&9@=մm>d6;imו@Mm2fVANUF^2f{)WTv`Lw05SC/_h9bj@^xꦧ dW5Xf +siRo-,GMS 0,ٲo2<ױSCa]=W̨j~jTĘU먇u P[qۖw<o9 դ%TMhr[u>kfZ.yPiPoZw|۰}\.28ZIMoZ!h0TEmꋅI)R]QBij=H\N&EQa6˵B4bF[-"ǵз<6^q8&EGerbՠEdf5늸÷lYQP"1Ӵm̎zm^Cm"E5JP}Q/0C>!1IR&5 SMUkn@'\ 6Q]8l_P>cU6լa{j0{+"oEL slEc1b*Av8BA-Ig$Ƒ\l9j#nP LzjڲH,8!&yv!$5XJ# su FJ 3?Y8:$4|3Hv.YxiA;XTj${-ahXx0v}R/bẺ"f(}^h_zVH:S#5acɔ|21Vp+MdA.~SB): D`.mM CM| ,=hYؘ'EF d8uU99Ǎ=|ЎcCa'(6Gr=t=Z{S] ݒN~To .jѷ|:$*^)˨a &< @/<0e+FpS8Br\uoa PLE'LW(r4E1Szusja1'XuPW*g)~!j(GuGmjyUP).1tKl? ԠWzWP, OnPn+%և {bV`D0HFVjh1XǖQˁIKf_ MI5\Fd K_Ʀe$UͰbu36)kk.h H2el/#$8bz<[1T+կA⭁! $Y^яMUkh|>\Qꘅh48lCAB7*Z1ؐ3Baù˔OISR +nwk9jžKkFAє7lZKBOª`z_kٰ=j6SkJ|@m>)kT;JN(Ev`d20~] `!a@+!U=AY'7"a#E=Π +ʰEkΞ bgR]29MxҸDDc&d4Jh-F}m.+5EJz۰X 1a۠@(>(|+3T0 6݄TQӂ_Hly_p(,TS,Yu U & sybU9Cbd性J +_ +AY7͚`n/nڡ,CEQө=`FloUc8Ufఇp4"D-y c|0#zhuӉSRۅ ̴z3po9/u0Ζj(peBP`ExS,CvA/񎌤V9݆q˕2&Ϙ.?Ӏ[ʠdBa0hx茦h?LJ nDȲk XQjG.QojiYC{U{`UUS_M42Y]ja-@cEB -K$C[,(,mXqܷBDe +0~P{ eL`wEmܥ-mCaړj+nA1p_~/ mϩD Eh~lMtz5U8sIߘObl^*fbz3%qg}C!L-ɳ,;W;ޅTap G?́;HZ.uVxqk*9Ja o7MBSV /$hk +MϮ{.J}Q؄]`URa͵^0F:ȋb^ +z.%"5,"Qȅ:3XVX sǝwzM!ģAP67;VH_-OK8nޫ^}oE_0fiG'nӣ+7"j@/W}2*}J (YP+55q;zXׁUz,ԮQe2TO}hg|R ̀D^~8Ǡ51—tC5[^$vG0JD02U<, -:) j>wTBCKYjhĘA3)P7)E0A)pR+עEM7t`RQ9)T@Ƣؼ +iS_NFg}(v(k3\񶋮#^ЛpJW~ɻh&S;iM".ţK!uP@E+|c,:~QVAX1.@҉ѲBGM@EA,SLEJGf^n[=[L@b~u#S:#)HW{(?:OrŊzv\Kq5 [BTNJ[  +vIVCg2cP<=2F#"'0 ʹxFb3\qA"1HW,`rRʂƃ̃bŢ+_! R4 XX8U#F/+dtOa6(%H瓣\N̖EG:JҋBp*h[׊ 7 –EsEWD3?c}<ƟCTb +@"m ]L>ipPXK XZ3:[o4G)5TRKų2?bHaqPB؅xyPUQu<''` n;bA{d/ +BSA-n[-kB:Rb>=fo!S/NBυ:aHETV!\SM7EhI-#Y>bF4:[_"1lAG| H#OZ Gv#ũE#l -IU,nFK8^#@ +hTBb8>K!|%{,>mo)RgQַaM=N,kʂ2LD" I @lCzjĖ:CU[MP !4: @-T6_<'H-"'h'ڄ]D!2vca4--iD2F`ubkObVPH%uTbT0%a$n]K9ñ1DWD$xAW~UexygI璑6DZ:C©eMe`c@'^AS駂ɰe8ZM+w܍`0`&a0┎b4(ETkb+b +xJ Ò c63P5( !-"V!):, . bg:`4f@yE]JpD7E(UJF4kTMb0AJ"H8|B hD;fjρ(mG.]W 1yE **VWAM+CSǛ M#%#n񅍭&_DB4=1̒FĀMЧZ(]IׅF7h=X +54mA<:(q0 MHBHh7LC~d3U: DXfrp-)ezI|1uG@FP3W"ѰР\ +b3Ck0Ba$3+ *{ X7+SGgjN1aj)idn~I1S +jxQ+( ;>Y׫&ګRmLmD'M!]ꈼMױB::` !PܘN)[{_-X\ RGAyĊgg ?A-#8.+ѵT"S:8Q#IbP؍F*>3 Ng|+_4BpdD&țYpe8!B& AmKV$(ѹBxd O@7H8/5hh{.ȂE.6]FQ(\::R+qDa+ 1hK+7}Q$dƧ #xC!, 4( 9=-`{,pr0` -R9W#`\b7'Um:/8!_ +G[PL)7>emڄ(J<z 19~ B $|NC\B =8鵮.-+Xe(0??s퀞> a*4gj`c`4CU`*oėhkhИwU*K1$Q(rQ ޸Vq R&^ѠRGpTϩ  T?2Td(J$InB[66irTG.Tv +Q:>F[0Awи@ze"U 5iPQY2v[ߍtT6.nXK"1l8UxQb~HHiYE?CK5KmQF@ A7Q ١yZl͗P.V@]sJp(dfWzE)6CԄH˔4:'d"& +CS-tIqe" + + +:xdb2Gl(%«9RE)iXzoKZ{иM#\6Ŝnl +#wv,%M{%7FW9C7Fu]E6&/Y/LbX]=uI7`<2$Yk L/Jk:YvЕW7+ڑJ1&N Jt&^K锶{5ý5Ԣĝcjx(. -YܛʶۋWbl3[zH%ceQխ"%!$.k ]gL[Hm)#; mPSt)1Z+Eh潺;݈;Trw$zr4:[C^e&\枖YTzktYa^{c&ȽZr]d4Fq* Jvq[ZysĆX;c<հLI7Zr%L ڦfR臢u]X|Op/o'addVk +du'[eM:/1 7F)mHjh꼪֒ -s[LK2W,[\H3S߯wBy桜2 jꊼ靜ϵәlj0r}rZTGuu|MkbFM{XK0a3=p;5C^t[0#!`0Nl +Eq<Ѝ@3t#kUeO(9gSITpX0&:E}?w4:%NgLzЖ|W(A'J BXrףN+C4%El A}W + P)eF!4YaԀ-z*Y8C&P̍T(0!Hiզbl@5*&TT||_bjKp9K1 da>[oD8.E([yRʓ nHUhm?|/ *ִt)2O^5вm +V$]jr9;59:%@gcItxAj 5pKE|LyD@~L]҃%,q4xJΗzTP׻ &)LfDG/%8r3g+"Z4/ 02Gaړ?#.ajgڞt&4k4G 6zGϵ%mƃJ a ?r,.Ybrl|(ݬAtNjo*x0 07!IqkU)3T.ql7/9M.Jj'oke' +endstream endobj 24 0 obj <>stream + +;p&%Q<#uQ>E>B0DU!5 &l(W=5,؁y h%]u}h5١u2C1ž4=Agp1t=C = {.Ocʁ-p8t| . Ĝ~30 Ր,q(A'I0PjMO#Bd;r6&L[uG2U&Fw«AtL`=83`lԕT`a;KlRC̈́,7!7EEK.E$ɝWejȞ#5ZPRl6 2DBTÄ@v-Hh& %)9p݁YF(ҵjM!=%K(G }P!w9@yܘv37 6%9+ls{}Y6iZ~brByGl -Gn,WW !SCU*$G Ap, ͌|>ؤLE(lC8ڎ(XJ+ɍKe~C+|V^:ɖJFmZ-Ex4Y yF7$? .Ј"*L ^e~wHeDM_<Σ@#שBhQ uZUGP3cp iMaL,XT<|P! +3Kޓmj LA2bF +mhߑMl0xD3GD0(ꆠ`EL."t%_4%s]tیb#Z +0Eq#هC+?,++?reA|1/ZO/aRf-[JQ͟DߌJ81>0̍f*sH/e6sU/4sڜА +EHbQusƈv@ + pJz/Tçsq'-ꨄgJV72pI觤.엠Ip#WrD~5hx\\~ȒA&7 ($I,h'j!R\&Nj&%C8”u%VX06@mTQ@#\cfjf4#.*j}.oF U]f8wQ08Ẹ Cu(;gӻXVsNp"`ռR-Dh( +QNy YS +@'. Sjm= lH  RЧ#UPL$g#УY+Xf]d[!D!޶(RS'ڇ~`#)fGź^CC\3 ++(sr ãF ~i#rR5]Oߌ߹:<tU9J-f"2 G*VXCNĕR>L? 6se}6=^ +@#C(jbN)>hq0Bӗ2"Y?cigbL)_ ,+$Ge{(m>4RJ" d7968W꒳-TKQ$ +o7XCoDO"WÓ8]b~A18Jne@ 2hsIvH>mA=%7@fSlQ&)&c E>+ $.l_أ;< 9prp3]8SMJG{erP]=dyۂWBKw-񘄧npeVRV,GqeaZ+!~:Eo F2x+M}0c Fz[<~P`.<1s-E񵮐ɀ-&_-QeP tAOVFPPl/MHWdjd*>^|8}iQUz#޹x~j 9eG.y.nbDҷkr'BTCHAA Jr4C@ *RxT:[RrM w8m|5ؖ纔d ;yKZ*7TxUE-.-"$Lŗ!B!lٻZtY_tK[j7O'aX%B}D7HQ=cZMzS{=mto6՝oސ.~ǘCۗ 3Fp+/ۑ/+ HfbXkdž<@yr)17ݗMwMNrKӻrL+qg!vOv~qB>iٮiB{6/{ 8T^s@-W>a=T@w';d_ ]6ףS}BF"E )iG*X릦MoHxMZD2f(/BVa_4a{zٶTG!ݖ*s8A!t (SbCfc}>;Q+fA5aęk-_ Zjnlp=W/zarڷD /+:܃kG4z9fq„F0d#l^d/晊L@OTh"W@+Jd 4UM8{ +gm-jCv37clNZ;%5SZȄcoF4K0zkncLJ~(p Jhc*H6g#ډn~gռ +EQ{LRAÐe=ƨm\)5PNy{ǰo Fiؗ4U%QwQ,YXܫ%bhW-R+e;' 1)~J)MKZFTGi9V-LoOh6LQ;5P#@Xu=qΧ&_;֙v22^Der7CUurԍ5ur&C5'3BRUeگ)YY]t[!71lW8Fx*$Y`69s؅ ,ktı@.Q4t;r5HϷB*MD&>XO69jZħF^nf~Z? + rcȔ +;&Z2JR2F4c">΅ +ȕ,M$ǢIl;cjI\sB`Օ/onA;cLy鹮ܯd[:uad&mHUdC65vG\=/- +[-=f9: iRQ}; z +B +oㄡq1{#Y?3 )Rӑ0Vܦ3⮯y0ó&Vq=+yA +:(:C @t3uMRx%1B(F#xPHtj,ǬWC2Կg2]vʢ MX!$Q`گ13/Cpgq"\I&y4!Hb#ph<t3FLͦTCͣÈtjb&!.I3t1wd(%YD"V h1ŠOsE#5#"pPXzk!M%VQӧאFy9B@V|mL1uq5d!h6\)aʃ$$ +]|zfh3WTbr(̩\ +3,+&s\ +<#n5\!j9.8a@HQ'yX}P-;z;كluZM`=ls*ˁBoJoY!!%"w# P* xTP#%I;Z,Ae!<_CXf-[d*bv@c.AVt&#T(&4l^c5eUH'iaFF|]| Y03t m21Ss)YI.s!X7gm2LQ;^]&Ibz,%Ŕ+(PG:REjs7ٟoR21/7$0U9: %wc"UHV-͘=hrD۔Bz<E@~Ot^XϤveG;#!}:]nq8CFI\'G/3Ȭz(.UQޢMZD j +D_RMdR'sy.{RNBڒl +nA ŊMoc#ZyFJCyrC_ 4yt4E9CG)Ʊ3毫@q)=KՙXDÑ3]a\~тiT ,99TEaå' E1Z+M(GMáxG BNWZkhteLg<\`.)dTAf#9E Lˡ>3a!=d/)lsXp5Z}C]:^aD^>ZD2yhB˓%\S,0Q(n3xY*& @6~Իp>34$\!,8wuUGj\(#Alʋ6LF$+49V8cX jDn| r-_C]rG/Lj(>`f1X݉ iN!@!rj\v c48L@3PhO6h $RdNJ . \3)X4lē5eJhu.]D5 +qԋ:I3@dgVt-r)UW/e u@3Q2YV`$LbѕӠ&MW3nV1Ӵ#JDm hW6qP=$go(łp6xT:d/*hblVL0X@J +DD%_Lg6k 8dF"ESICш\L% T)2}p3o%,(MR{tn$]}_P4YR|* FЧSdrn,m?|>Ӓks/qQ4kǤ/;^ۍI}s`yCKނ@  LK-x7V?v3#}d4-mQi##g&v"=@r0yk*0Yz4LGR8:b݇l"J#T9N+oÅ/Moy>FjucxuE(WIz'71?7yZih"@,c{) _a2m9&qÍ8w?$kQm<(n,.o&6hPGU8L.~' ۪SHWu'EZ%0!&AЀPXׄ{1]8H9D3 v=)1h|UicC=V3Il 8tWEpҸixKȣ`Y^A~xM]INgeRF KǭRNUTmנ:RC,|3S>$ޡ?;[*Wzg0hV)"I;o]ߦ '&>&6I ibA(#۸A|m8nȿ6nA]oiEbAS۸Mץ5ヘ;ZDۺr{o.,-[շQptWٷUZ5u1V1WvIc*- X:A(<߸$}=1oy.7ѡ7l5 ~+JT%9&2 NJ uXU\nI.@ Vn ę 1B@dU8WR +.ג|-<.o +ScJ=((@❤K +_DEŴetS~=ʍ"<"F%3~=!Ĉ↣^$$d 2"Bʂ"$EI"yH{IQNlmIGfְ2aaTVM,@#zD㺞 +-i[i K|B\/t&c*rU(f J@$ B˄[HR;u&s CX2Bqn9T# S%1SX0 Q"̅1Iö}:cHFr!hp/߾Wdo@Յ8Hf'dt&,5H=F(3=#PxMU9P+<\;/ EPΤH::(C25Y5&(d+Lh%+ +7Ҧ_ V{&2Pd}XTq 3QZx* ‡CäM%!@-8 x"P˅$zcB,3[o\/tWo}9d!]i "9^Io^H,&"27>I:qԂ剻 #I՘-d'IPUu1\ɋv/X\CiP <2`a /I@iP wI\R#CDP)ʂJuA]` <*PEmx^"oU5ȢE״{ 鐥NrI',l 1%,{-RW)ayPb/N.!0>qA#ۦ-Le} 4+r0D,e )p٪I A^Gb2U%z`4Μ 3k|uW0ɡP20tVaY pP"{J\X1 +A {p*D&UH2Ȼ'GaL%4 +cD"(т:˯"@,+-yQ͑-OØ\#Ic0 ΂\[#^L[SPCn>)r o=ٓ`MwO(p8 C!+<kC.kMHʂ,jN"Gꖴyx ZvE}IS ̍bD p I~ij,rwX#8hHK+bz ,pY[B)P]lE*bcډ\#{_ +Pә7UK2z$9lR8LGgRUW GJyN>woV|v%cM!&2p|O9c='#+}L4]Y9VF0pD̅+N0Hޗӂ<52j -8H@p,3BMpkB'H^ Nk`PꆳSruxV턤h +03]`n,遃e5lSxhH0/<\)KDpB!Lqbj ?*'%g(m;Sli:gӇ1i6@5k PAh84_SLá ^6_@Ы|NѦF!-_JL~D -#Sd!;ѢMJ50iꦲpƽk+;}0F[~ Eux'>DjE t',COs¯ +V9ty1oT)NS\)@&MP0%]Kx8TJ?F% +<B: !d(w6 KR 3a.{ȅPB4F6NR9O0ijR&$&OT H:5rm  icDF60aGrpGȎe5xj[r#7O'2 $_IR(خTPag ^h{1l&I@j>+_ޚfK"&5bgYt񃘡N +^@$2O([~䆏0 + F1#WkKbp@ baBʙRz,UZLаeEu\jE4ɫ2W0\WI.Iu1K ɋ0͎"KbRGv̧#)0=&@o;f_I +JDQF&cP!&m8B8Pڅc͙LFte,){ +CEb*%V>3 +c6K6JIp 6jl*$u Y=kYUZixl?> (%@|.}qp:E 9+US:lJu,M9+bؑÎv\ΊasV ;bq9+jA OY1츜Îv$gŰrV ;blaRY1AhbؑÎY1HΊasV!gŰ#9+Y1츜CQYl ;bؑÎv\ΊaGrV ;bq9+Y1HΊa(IΊaGrV ;.gŰ#9+Y1 +V8gŰrV +bXRrVr,gŰ"9+rV$gŰ"9+^ʬHΊaV$gŰ"9+ (I +wH +OaV$gŰ9+bXÊ$gŰ"9+Xty9$V\ΊaErV +bXq9+Y1HΊa(IҰ"9+|YΊaErV +bXq9+Y1HΊav$gŰ#9+bؑÎv\ΊaGrV ;bĜZg3蜰|a-mX,&' Z;* +2АeDZ Z ZJub+<<bKKf49 c lI,s2ֈYJ˜˜k! Вb3_jG.!ܰ#9sX9,s,B9x"9,sجeAQ>2 Z T&2@#9Z0ĈesQ-sj!\4%av2VY $[*yP3e.JtPT#yx2`+&Zl2%Q-sfܨ|aFM Qv6= A(⁡*)$΍mLܞ'@b *ɻ'"DnQnW=0Ȍ@Q.AQ869LQ S4) hN%nxmc`ZJ[5T;P.rAx;CO\EݔR==yjH Pu?Hq]&ᙬeqlUH8 xI8#lἜ="J[8t6xX&M 5>f)FLz@^н)B%oɷpo/rrt?._En2Cx%^\0$' +(Nj(wM{ +5jTH6q$PT~PӦ˗@9q +,s#Cf (#r4 DYUN5E2.SQ3 +5ۑ +m*DFN)E(BrC/H"Nt%R2 +eL7B*jFر(Ȅ SRSI($w^ۼؑn2|J +6wr-B͋+_EK,͗@MQ!t邊Őz>/._Ų <)!WKl#u4T$t蕜kPA2qDfMKʄJ؎mpx|mzj:n5btB0OB{T.#rN(L3d( u*oUeVw _e8jh 'kj8RPTB]O0IA#eEG)% +Kǡ)UǷT#Q>w%bȚ +[AXI'4- Jby$:ª;#9joWɔ5zJGܕ% rԂCEԂ&[)N  d,V^BuP7;p(YHQ ݡ@Za"29 ޚPRtʌn1k=$iLf(G3I% F0d'NiZhJejg+lǞ)He*,MɳS³,@gY@=v\G֡Cʍ(B=ǍCI#\A1T8'R9”oYd߲ Te1tٷLϧkghy6ϟyIq #D2 J_YC]N7!Ry }P3\(PΪL"k"pa5@.R {_"TPnu6j:s vTEKbd  ,^`WM(|muR!’:U"w/qB\pދ}o꓉i`aWa !&//ضyHS䰯&Y46`l`R1k>=ž<հIJ9qD,EϞCuO20ʼn>v#rO@oLa<+BB`P m9\r@d(g4BR)KbL+צMUkY܃PyD€ +(eF w2,uLv nȉ_ AMcͤ`z==r +~\?{"wkj9y٥) SR!ieѦn$KWS"zɜrp,0s1[$]+U 5`!:4if}H֚5Iz,-A].Y%!4xŜSFrm07cåKw S,9f>3%n-x u,iĚNh gF'_1 H<̈́Zi:eX/'aKNVfה$j[QZv* (QKotKP^K}$#'4`cIJbP HӇ[bϮg"϶_*kqZI _&kՔC}R z**#OT{"Y2:a֏˜Jgo `I/L +5ۢNH*Od?Dy_-`"=Y1/.r=Y.?M&uBTr _BcˆY4DHY$K4ȗS/SSp aDqdl"'j,ߣdjE]4 ӴR =6_ +6~.\D`,2M(FLCq Pt3hQ6, TVk(*=dWm(:e>TtquNP"xt^#!ciJ6n∴l^,t[ǘFmJz JuT*\>[)ҏ[S'MQJ=G C -ep"_:9]XK-vvUPIѭS<Kvzq+<՟@p#5:KoA%̧T]X@d/.{O3C??$$Q0^3!N<} ǧa:Zty}W.i96Z2 C*q򑮶2C "&Usq` af9){AP5LNʵ( +Gfvʴ))vL' jJ]oqu~T߮7~_XsFl +9Az׀5ޚH\Ub>P%\SOMi]E)4QT~P#RZU6RSV'N|d4|hUܪl 6:A4 +|%)bS`ViiMC3ְ"B㿶Я\R-U};$Wb +uRl/"⻬nd{P=>L%Z vX~C#'*4' A'U {ɺnrm:2u,U?v>P6PK|ݬ~'N%.&]ą疎~(e҆W%[ koz7gLYh$y&b +~I;(| { +܍^"! t}4=T5$^*ՠIydsؿ'\=U0򣐐ͧkSLV&h2݁~ ]<W S=ȿR[mUh;k,f) hEaui1G|kF448 1/@OTJ5n߈?Q5O s5rNMg*,rV=h +˦%k 鮩ILl"n[t$v?oH? UJT薫O'c,ldc _#Б_qlw4' v, b=[j~I=L5&[GI8'/sehi<;Sz yUoYE;=^Zm!z,׺々O |*[zz'xtڌA5tf"WpzW,c!j7:NpGA`nd%[c-(w.}l9XT6F 5^Wo"EN.mԻoFďPBxZ@t 1۱575Io~2¿V[jK9?k ƾy;4{w0XYi>gOOV:z.U~;8vNm1K$o׌ZKeR|;,hsv[)^F_nH:JZynM8}X%|ZoM$lR u ]n7ŇZ?T7p|{A8zA$'K ` Z1$\ӑ+T)U?nFGշfMHhӕG\a(+# _sGpHI)__Vf[8M_s?ar[_:V[W>Gt r7]`U;vѤꝒo&u? +/#2}-FZF/rApAOq)ܽZ̴=#Xijs ۹eCBmTU˹vB9fhnd)9* HXƆae]F$F}03XN&w|mNՃ䢄< \ذe@!U.fk L7L[Z-SijʓE05 u!"-Ax.l-i\Rm[6-Svk(kh*nmV!á`(an-^Z´G5´c7X0ȆR0،5jyTV8WBˇ8H#I Ji=x@o6dJSElP'ՠ6@Sjy4T7UGR_ަ2Ȁ{V'-81 B*Xz +H?J֌ QgYc.*y1%pIƔt%m\2nNdL!;\L.i$M ԓ&cKjI#%mFQvkk -PHUۣVi\;JI4EJJը`s(+A9B*L۩;"1%rI\B@L<r=At|$lJz*-nS}LuJ 5jLquߪ V;m`n3H]OPP.w} UU˪`ũ6[5T[b)M Zf޳ޜi}} ͝3ڋx)z s\$`;""?ҷз6bfubd垑Z1uo+|VD#mD2( +r^{vi1 +\}#zz > +> [A3 ,su3,+E(s$#BI)JjVm" +~Cb$Ƌ#O@ '3mH">Ue+NU0lpj7To"}#/iajXt.GQwN.l2ʪJ vP`%ar LdxĄ?%ԐUA o*WB49(Δnqpϼpo7^onm73BVx "1H6?" dTUIc򫕚~5!W돍Cz;cÅ:Hq +Z_|w|7r]H8:i*#^wE?xIZ kʀk4Ru2ҒN@rzI7|N*}z %ÿk$җɚNm6[_\N hNZ̸aš[dаG2o[a9 '\}3|]xگ!n:L)v^Uyl )Mn4K숇4I^\ [fV@{MoLoWÇڝZ٬$2&UWndd8i 7+pjQ%i fZ"[p8[ǔth7r&a=ڵ<ۮfkI;Wa횮YTIf±j*C׳׮A +o^nm^R<#45 gDcb(W}zT.PlB̤+Q:u< žATчNp{`j\UiuID}*4YtFInܯ*k֔D%&^U\FWK^<*4C0yU 6 +bxI!c"0ķᩓF8!T-ލՃb35:Aw5+ d|@ϥJ +z_T/~i"sLa;~YWqmGibqE[IU{H8-msd<:k(MU&:5XDzA+%/DP YV9U:uߩ2i~.?_zoу#nϵwwZ)JύXqoʇKejժe{D#i6 jpubg, :>qZm_g(ˠu;R4V&2$BD +F<~IT7o2:s|IZ{W3Kg-s|o.Z{^xmf''rR=l]kuazbw-ł5iKiV][MO-6kmcu3b:٧%+8UWtz)Nuc z'r.f3ovfwr`~<_wזV'HChmoV6shhnNq^tQ7LP&sRf~YMsAwztky\._ՙ3ZKn:zPݪdkcsnfhO`jmqD87kzymfywq}^|̴ʛΛ,ڧsDZe/Ew'fl#s[m.f}_?߼rFV\vfr`<@+14gz/˕s1VS%ʎߌKKšn(7-cfD-Il឴f\ϵ¬_}Z -/-V^j6n!܈!ˇT`h߯ZΥR_fRib4<c'\v?xT}_{YxBd;KrYgNyf9U_ǷbqZG8\wJCtmgv65:iLiJkǝV\&bXSGhph2d/ ttT#6zȕ-!vg#jkg=s,4錶t|iL.q~PoN垝N(탋0B]ohr#SB],fK,S,kCdw+3٬kxTn}D`hƺ%~qjXۗ=LL ͫX,m7Ik~9}T޲i#s|>؞ 4 /Fq|ν>>Oj7Ygf癲ΩĆx&,pz8:a,=-c~2'cZn,.E4DmPg'n`dxX1-Bkh#%6p'ouëCE\&* a#@)f)|ՊYO,Fh%X7Ɨh&R1 BkAfA/$UIHX|LQ|-bYƅڲiZ6VxׄCBa0A%SvE/lE>}Fݏ728n{cH%:aO/x"0|ϥNgOŵ,?LIϧBqh:4Q_FNrۻB}6Iǰ;掬̜5⁡VN9u-bi#k~{x~Sz~oڛv3v4w_lO]!CY(gYcN2-S>.l /pCkoOdٯk#Q" [\c~:(ۗb ` S9Zo_ҭ 'cTm:ʂ+P%`o3k:u&PSكMTe5Tɦ +Po%9lx`%7qfd=ڦFHlǙ`=[s6@ :`/:}vek~EN 4Az樶6?=cdȧtjq#4;F7i44d?Z|,`6j,浅[MKXNTNVHPio+-leאxBڽ|9:&9pbR4754ӵ^ +uͶg5Sfqz>vVEmu9mJ5YٓWq{8 +k᭍ԬX2f+u$Żg.T'v7)/6&gP77^N/ŽPvn _ƥؤg[gz{&BK#m$[vzꜯNWCBc+R^{FڔF>@$fhn;r}c)_۱Lvd(xtUGmD^و#$XL{{r}3{ lSVؖ&Zs~s赌{S AgOS88t^=b1k .vի8zR 92 w|z.'7+g<,bC;#lD&2'WW1ek}Η(MmiBi-sg+Lza+/d p#o96>GH1Z.߅4,8xVٛA8UneQu15~T+N +z {K3ҾĬjy`[0_# KTewy1L?2zsɭӜ~^ ЬW@ZTx'IB<(m %->vV7R c^w?BQ{\OXƀ l%":39]Ck4]W-wo.=UE'DdH>ՃZ8'7=_U 6t`混y9\ ixamif̾ӿ|Eb9g +K.·[&l3$KoDEs'^^W2ߋK2%JΫ8b69g<$#ܣJc 9]T Fiz?[ӏ/hm:Y#E>t7g1\}؂Ő\Ȋ<ϝ?ڜ)Mo  Sv/;芯2'@&v91ϐjj팶)9R_ىtu4{x* Z'%a-U +Hʖ3{8t1a(c:F"Z,5^;_x+Fp{|xEL{d2ubũbPvTխòvc ]`8z0w=e3sN"S8ߞv޷KȂDגv[ŇMbD"7H%a*sZ,hHqr;ٿmH(P<Ulڅ-ؤ%V&6*fΔK/`IZE,J/~~:5n764HuGDpoliA)õwFnZv,KBye5u2O +W6O?}9~.w(ߕ_1C0LIv*7""2)凥T)JnB~LZ.Ki~ +/tҕ;*} vNY 2әءњ:?%F>.F[bs=:{ւWvDF k: +~D+[JG ^ܐ.-7xqQ‡Mcq@A+|}c{|I񭩞CK[DGo=U3e{SV -jĜ8[ +Xm1ŘЛx'1_2(>vfžwgVOݹ玉?_a\=d~1r\ +j,:CS;v5 eˡjYy] r:74cVяqmHսm~k#f\v 3;g͡#5'm{ÿ?^_.eõ̯>/^:;6~٬ W3%Yu{(7u@{;MlΆf:<~}~S\ ţɍ,NnFpBC%= [mb$xmrsӇVqցiZ6oM( rm9!V{֍^B{],F{0[ s^^[7_ w ^oG$T{]DݴX+~5l,LڞݝK~,M\Dxm% 5rҬk :8nޚZuq>4oa^ڨH6.WW= +Ҟ+;ש'/̫>z^hYDW~k&z׺y'Vrn"zƨ9xM{98urS+o;qӝY-$j?O^j]\hE_ =|3zՊ77ń^n.W6㒶>{u-3Lq:#׋WX8{pZT{s:u:FpKsmsuYg}ot?֗^'Lgxvpdj ^iGwSno_.&Cw|:QJ@3r|pv\u;)-A_tO[ÉޭwzV^q7ݕMl7{\ؕbBמvӮ́۞m{m z%ٵ'Z۫enxhfz]xo{G{}0Bgr4M12NwG^^gCv_ޙ Xn{m7ƗitC;t]"f/M/ζ'+Ct=mα:1@U}{.g"yхܶhUz^\[dz^X~Ygu Bp#?&R6(96No _Q7iRgu"FOa|&7XnwlW/<|\}UH3{ϥۉįcu3S_5 <=.&~.?l$|67Ni~LiBQ=i~ la~(u~a9ح;uon$x=5_^+I_mh-Z9O^?$}߼Bf!HeI_3CBW؞ZayM|ar1T`JK5{(Y@ioj@Z;plxŶ/X؂<184?΄}GmO0h,cacby2xdIweĻu m1'.C?.qrd0xpսO)W전^l])zܱuq++/zb`%b?]"jJz_GR+WZA2 tkJS" /b84]l&zqMxC黆GPDrt.t ^{{ )XF—ܔ<Қ>})km_gͧkbm#[v_F$T.4B4ۂgWpْqFLRE%4Fppf >kݞsC!>o{/vrW#3WOwz}{\"bd^~z@ S칍[M { 8+ 1PEY٦^7!b-%f1(4xѬ55uNGՀR1qO, w{>{fJ<,l^UZRᾎ!LOw% ͦ;v4 y9hg=e&,Bf"ުd(#SR.r "1N6BmHR TUUS|eqauV!N11] +Y75T,h5 l7SҸ/$`BMqgZm|i}"ݐr#quYGL}DsxӲCh߰ggum44܍AЪ!EsoDJKdC5h+ #zV`H<j 3 riXkq# o +hҸi?%?8 ۙz@C* ]a1ud09yL#}QaOVV;C@$#Xjy"$Me!qw'.cn{>Lw쳹i? _;=_I="辉:nf5㢾g +"ou:l lsm}À>\CߞɁfpjYշKzB12%J[A '_!&$⦟w0:1$1%k]PUw7"A퐚o@X"lEzN'6 MTaQr'OMiH`d$+uM5aG|=]" 5 +܀94tcP]Ϗ¡O#;yiG84<8B ^bp‡VTK $?PVkE(P1 }kZ9)Qdc8ڊ㳓& OLO[3&b%l6Rм'wkNE[uF2I!ܬ&5q{y'$=jqwn\-wnnPZs7m;Dq$ uldBX#"^u ~* G\cЎ&LN@ω(~-/^(g3%J@C*B%@C r=pk}^^p&,lnĤci01`pigq1g2U'C+ǺB4?IAC߬V# }H>^ڏ1d]4aN4LR70Kv$'*X 7W{0q@@V3ǥrbրdb*CaIK'Cf=t{d ,9،MK$wLŭ M;řN +, z7@J/"Xd1И$P:?+܊[5<"\nhŇ +:,$|>Go?,/}O}u}>K⧏>ˇw9,8_|~wv4|q&Kq*|'h ÊS,1>綊9d>EU| @=ITR1xgmZۘ<NBn8>T%7Ӄg(cw'{i>X49:Lj'*'m! ?lGJ($19p7>_s#rǣ9_p݇K(|[=[|/I/ [) Bbmf(-^}~>(N8,郙s=Zލ=і Fi0Mq4 z͐GU?nq."菞Gc+c)g +G>>3 GczIӚHӔ~'#i uRЙX3AhSZ#:{δ{0f<909d{oo?hU] +j:=ԉyU-%?2C! +\D'榌ճL0 Usq>ۣf22Znb|lAV.k&(c+)oBZ@]H#iDz=)׍鄄 ,) oO,xHO 9k"}C@R}A!XVLW3ii i| +)|hDაHl2L+8'wN2 +{ Ss"U:7iZA޼m&{o{ ik<2>v>{KrQxov~<$<n;>ڤ +p0<{YU +^t#4hl"]P+c OϭX|gf b.iXliy-aԥx_TKIr{I$A7r KOLMQD f Q[T_8p/9C7_<2opdcFN/2oXNDq`<@摀d7@2l"2/;`tq@:kN},:sC2Dxy7SG !.?wKt87'K%6'A{{@K`+IGs.ʓêhD,=|enzDkƦU:ց=zk:_=UMo8I]pJT  9!R;a\UG9\:&`⒎R+lR;IO{1vX(fx\5}z 0N prLWBn ѻxB${H+, HqkdAK$u:l($0qq8`|CZ{?( @yQ+<3P+:54(/dApyAy# !*^i}=s +dM71A띱ļCǫ ҴFG&煸1's]}'ŀjI_ƾÝcWLT]}Z=6~ךuhqom3Uo-ys8_/p_ֶs9MF<* +K/ٙ{~~ *s~oTizb;K*P %\`wG`۸Qo~3opʷ;jv=݊!("`w;je~-짏}鿗`E- qt;* 3==āzIQv.ֽQ :\7nC'?>bv9.6G\^ޣMmL[gh n/ؤu*<WM/}Ě^_Čc%ր"7T1Təy6 j+30B]y j6SV +}{4 +suF֤̈́9^J1P^snrWns4qWUE3/8狭ceqOB!r cr!\u~T'rghe!SNZC2Wa4>+!v)</`O=⤦،S+}SZ 0&sTئ{k'2wq*@LQh81)3T fԎ1QAJ" F0'9GFݿ@xu(C'DJqǔu<3_cĮ,ezᙵ_Pd-MÉ=Hi_C+?>NB^~lPܓ+f/"q;<"E:1pԎj; эRA`b&dvl9%&b:;uϲ"n 2:VJ}Rw+'@47ܱ7 a{R3*Fu@*Hi!# 1:aw9edV2n;ˋ ӫT dpD +֒@#wIRKiP vN 2 +3 {Z8jHicyX-|Tti} .h^D;k- Y:@}t`iE+PlT<${3+Ŏ*68>6n&n7vDTG];?f +twc\irFnOG}O}v]KK1rb[& +F5mm84ny݄Q ;lQXt['D֎ǿVݟlHBծ@J]R]hWY%=^<7øL {%q*@W '52eg˺-$"Δ8=Lĭ9 +\ףM!q+D*HL!aZ^+?<7q+ +<.%X9`e `0; ,"Ѩ! 9`Gp֞N$7 Luq:(Mӽ;K <ڈݞRu'`}fr3.^ Q] A,kl.^YOfS_bqgewU/^>(fε&w΅ 꽹<~Qk7/KQoG:)ѣyJ_]kOwƕҺ>bc4v~\fIQ\/ǯʼ2,6WVMq]^YxZw0笈lJi*~"'+ݧFb Ӻ^9h}龵K~%doYYm(J*g##MQ~=XZe`d!p N:)侅~k uJ+jc㹾xW%\U-tvV$iQVV]>oi :I?hBEk f?l0K7nMSRO.~\?>l'C@EQmْs ]0B\?GUk*({Sj4%yketHE'j9n \QB^_ SCq][V&w3@U%Jmsu//7;{g"?z蛙'eMYvĭo-M.kk8L?C&gj.50e{#*o3O+P`lU K͈I~l2 +<'GOhe`ܓ<:Q_ZduF"..~cگ&=lNxQptV>K D FeP .oQں?u{l..?K-RMQC'f̔g L/NWFX>娺n*ٛ"Z~_qy= BI;whe:aZWc U +3FxWl"4]"\Hz.B/T|t+w{<""tBOKPDG_!B$.U1v_l:ȿ'3ԜGmҡڹP?aj: H4bʬiH;&yq}.t@&܇0BDOp'T`p`Z郗U!-eyT] !qLEM*;}cގ|ocզvܞԛܠRV΁j`t i8m:{fXPGx!Ri;R?T:$Vc4ÎԘg+I^Ȱ]P a!; n +%\M'F$||sbB&`NƱI>1:t[R-#+7&{ŃZZ8_i;_t/i~:>tR7uF*^M5g9z/h5e.,R|sFeZѪܘ++=J_͉t7.a +Ĵ翐W;|R^C7eU.o׉ŒPsݡ2Y'uY ֊:lߎ?BM%ɗ0uJI?l.Jt?-+N~;w~އQ{^le"+W<"$UVMŜ[=8:ڦՖ\>qtc~zFX' +^[~kuM2gmwS^dӐh׊d ۻ:۠Aѕ2l״NC2+rc#T-]׽t7*_-q!n{B:r٤:u_mO8(8n3K l_Mkij` SE,EGYVVg2;3 @+]9ϭ!ӛ#*w|xibjAtrjaϷqAYX֟HpʽmKrCt~p/ۮ: n]?Xd{ai0´ACmFNmϭߕsĸO1HD,dHʵz;vIS ;ӨO>O7Կ}ۮsXYrۂד uZg_j&7}\o.O EIcp.rK[DzwnwܣvfaD鮽Q.$[ vVq~zPsSwt9C3'Rr!:?]{w'O-<(?\.VuOIoc/-Qr9%y|/G3242ϵ(K%Vr~zDh?'q23ݼٞhfm+ݧY9`.6L-H]lΟD>|.6LG[.6Lg3VaaZH??>+S[ِf;O32;R[9olZwo{k7+AfOI ddeZi,6E .ϣb/Gʽ0Qv.UyX,k:&܎zaU-{Rky~3.=<&~2ePM`|q'mצ3 44&A](^Grg~s0״^N%dŻJ\Z(L%aL´{څ+dS0vgCNL^Z?.'}ãDlZ'xz [z0uXA~ܘ/WgH ܾ/豤_ŧS *n3 %ь]Z 琤D$*wsގ~{;xo|Dwya%䱱|{lKε?iptCگp)u]TrSbFOJX{sK0ep[]\t,I>?=2h5g5:_X-XFf#W7*hH+s$m?bݕ7oN:F,7k'¼ibnVGF<ÀLK䇬~nT,MwHjůgo)^W H0s; 4X!,:i"6hyw:A%јg/?˗ 1Dm!bgtZB9!:+ *"πM@*rwnd +zs횣0툶$O)_L(y>>- ĈY +yP9uT +Ǣ/NF}l\VHqwzMK9fRP^6uu@Fod˟:Xݑ~UMmRUA?=qKP Oe~2B p{fO)D"  ޒbrJk/ұp'L'F&;W={}'$0ItH ݥ2/! gH +iN>\B^ &ځi>:!ȑ}u'ag#nw!ބr!O,%h;wC_{ݘKͽ7+ +mOތŽb$ts Njy[۝@ۥͫ5!9}xNd#kqxN;y:bW yB^~ۑN7a&ANIP<1ϾW*cB^/!P R nM|l㒖/>S'O>FI<*$:yq={I{+|:t{ޏ~s-;G3 +K*:mϊկv}KCInͶH:4T2)W쀃kv>pq~K r4i)?푀iَN}Qܪ_i4CKTmxDZ7D8Dz0$GvNail:-*YiӡCaRNOV45j + %oΈLs &&fc=q1c9Laؘi6?mĀ)9Ek(|<~~?I{|~o/#E5I6GdM_4 )o_~{#Ry^GYA?wi<<;2K>;no4FfG/uKs#%؅2vq]sw˒M_,ERD' +mOHŕ8P?QUIP K5 ]-]QI$4YV y+ &f1bjc+QPŐ,QbR-ܑ dZeȬ&cEZɲ&h LC HѴ4YUC7el+DѰdQQTEPMK5 U봉aa?*)0I0t,Ղ˲0T-MRaD͠-t>VYT:Yz dGZ)K4Ce^f@j#`F*lTCMY"LAa :$S$MUQ6C/&,㞎j%+O;4hb80?YdvJ6%|SAM Ұ(>FRMY02L @Y?S)HeR@D P#8hG@90h $nF% +lnDdH$IfU8|``*/@i vjzx3MZZGxL]=:V A~~8  (hb!XaTD0Zitb cŒeIu"inEX1Bp+K K? J- +`9AEG [X5.])Ҋ9GL (=恃cRKAyBBYrAfnj\ &u~1 pN>JK"8{!>5nEChaɆߋG䤊A:HdMm1 'J"l#4e?Ky6զW4@* X4H zՐP +g ֫˺ sS) pƶR5( +}.=iBR OF+8EȀ O3Dv[@ n"b YɰDHTu.5LxF CTd T]BpNG:^qV d(KFPF*Ht"Mp,KDrh8!2[i $8ܦ!Z,Vф_VL'>|4d_G1xá448no*b@S3滘rCT,V*Q- +;HC68>j"+ UMiB='F:<%͞N k]VpIVfTJ"0X)|( 3-{(*Fo' su[ӆ3toh0 AIgBFoͲjeA)-iĀChjMJtI,뎘CqW/TI_PuCHDoV P^T* ahBA9$TA6+`7 tlG&]ҽM9%G` `&6DZ)p9[&,Rd! NXG(R|M=J$ZA5~4QȅdMb! $"aN*ֹXMdqc* +#>H'ӳ2bQqh]f :)AzMh*N~&'?4'AvԄ# *¡QKKy44+Ei'QX'l:i&t*6un96;HG>z7Qɶ]]@1GE% KQߛ*8*kt+[ K haE1MU +[DD8 /Ht:B@[4A*#uEXު!t#,tttMX늶!D{dAp9Eڄ(~=\Bר+v  ! $Jlo\hHknC$Ώ*h!J }ƃw%yC4{]QI%;갅SL>"Ie\[VH^>m3'uV۷c+v[m0%p3w~d#1(hH;Iwv04Yz"U(_#EC(d3SL{=܄u筍 ZhܬhȮgetجjc u5ᩣt-ԣM4B&eր3l 0m*ѝF5ـ+Y 4ot8< DD + a5`p_!'޾6zkp)TI& +LX I%AC568A0VmV+EG+@ [EGksV)37Ry~~ܻy…#5$7Ɇ3$EjA > 7PUT}*Z1( $ N28 Pt +eײABV0 ASЖs]#G#YUnF$i(:nB DQ pt!;M#İNG00j5 HX3 TORʨ 3&˔PLQAs (NVmk +7/qv1ƒA +A\ W铠!+AA$Q瓠 Rl_4# Q~0Le*㪡zBT3*m! +syI>VMh5`_Ѓ+GE=h''d&sLC$ڄZEeFI +#iI-VIڈ0&d J`Q,DMlJ+v.Jw'Q G^HN I3w;>bFn?~nz~l](/) +endstream endobj 25 0 obj <>stream +%AI12_CompressedDataxr$Ǖ&f|m#u%oڶ6ĥ=H#)z{h`UĨQ(9Ob}HTQi*LT~Ww_^m6'_}p_nLvkIj77wX?n[ ח //o^po6͏rz9~ g3i~-׷?^ys?q]row慷&yaz;7mǡx> C}ga1ֆ4|߽ _]ݼ>`῿~'دoo^>`O+߽Kwy/X&M67_/3e#޼Ca7&yMi ܍|yso6l^!(7crns7w6K.^8`7:w! &9_vvÏ7?jۻø/2yu>p yqsK>qZT.3wo ӻoD-__t^bW÷7xo1į}|˻˔^xe1[xm@/º߮qp}*o_qy꫑^^5|IYH WƀRpGRW3%G_ot:02ȟ؛0S~26s~u9붿'=;C~!GGn8w7a3g_x˷w +⎯ξ柾: 77x٫o=܏ߟ!~8?|w/^^ݞ} V#c>|p%?'^}0Rn-ȿ-~pv}u滳b3W2 zi~pbcp/nٛ_b9zOG_>^8ohϰ7/_=}no0ë_򳰬ؤ =7g{vsw0ۇoqJܙK쿌k0=˷R/=_~M~7PNCwMqg˳.Ky\.$I~'{>|B i~>o_?O߼&MLw-Կ_~=y R{sv_|]sx:zZp,!?~ȣ1az&uYf/˷ߕo[ ӯ:`ͫ!?~M-?7l @ÿSF~y?p)CSrc܄Aa^X&[o-A p[~M^W}褜pygwÿ?^~w@co\7 +?I{x)+k,~~9h?|wr͗wwk 6/۹Qdq^߼L B?AFFJ5|dBAia4~~<7vzꄭRyXmK§/7߼}Om$ =_7_?qܾԾx{ "'{C<|/QY A"zvy?>j=˿`B'GWWWWWWpUW檻<_.t/p/ݥ4bw1\?E^|;y<ù?wܜwbwaqjjw؝nإ];;놫r·8C!KW2]O4$|cO!M&u*^Ƌxqb} Gm4?ǾC{p.E8 CH!> 6+/|>x]Kw.sAQW^s;;dm:k2œٙ$ ]3o찝6wXaаiw_H@ appae#d < ԑ0^Օ]GF!dBf  - ")$ _a [#LE./W+Wkt R uټSκ0ߕeљ0/mrSn/#[Ly+־ߦЧ?$7 'KT#Mg­^xvs5~xDrztrra< $HB{V ̢v i-)_Q^ /'}^]HNu)zՅV/xEz\^./(hWǫA \4|?I8^; +9M۫uw\ӃNqMt㚞@Ւ9>n]xP4ˆoy k׼#y]4%5q"c{u}h0)& kGc3 IluV{B3  tqv;,F>qd˭]muc\|ZntmCJꊍo\`G1.߸l`OaP],N6]}gqΧRgkqA-4sri핔bcYD8RQed[!nl ,Rr.K:+D Pe^D<%_}~YYQ\̒\!aI EY: P7BFRJf9IIe%KYf^ FE+ QHIe@@aQt%JU/"FJ%,d,(~780r.Q^T\th.T;$~W1{$zmq?fo?i1|G1 c( -P(~sY/cy# j.tO~c +5Lg;xFȫFR,(Ů0Yi㕭8xhՙ ǤY-WXXՏָ(| en'ֹ|VR': pG5Ǖ;kvA[ͮ9a4N O1x>NV֏&3Q~iz)/hF FBt<50H9~"-ۡ7Iu{V{I&_K5;fJ?fHflDGJͦs0 $Fl2j4[1gcxP>+4lo({HͤfE,2s_p +H++5uaSWӠ8){!S~ȿCcDy6e..=@5DN^l-%kX[ 6yt + QBe)4 nB"g="!w<|jDs<+<$C8oǹI|%yn>?H<)FjYd?z!QH,]tg3:3[&nr^OE82<>t!\וN.)V^GyvGQWZp#buZ(ġϣp)pn%9[!-u'=V|=a6ҝz6TGҩyW:+h-T >j->V[sɰr[I=:yS|ʽu߂.g<4[zju[J~O_[+Dڃr-Y|UdF݅}Pr:2V4b\usag38<ˆϺo9}h}!>+atDS&2eq?O16Sm......ws,f翹?>>N:7QN.g\GF< #=KϼVnaCfnʍ,αIĈyru`Ә9:͊,9 vv ʕC/V.)D-7Pd]lnL +W[_)uXXwvRs>^L]S֞UpGٗ|尚&^ӄ- mrD] ?WrW N%>gg]pg}p 5 }6Y5C_iäp17aIE'%S8է=(Luk\OK|zw:=CBc%<8EF??&/"ua;gzHgNv~9HC-tnv[&w>6Y m@ղ|[گGc2u /JRcj[H˗KN+4yƅ3Zvk(> L tHk5ҶM]4iŕkJieՆ4xiST)*F.C PH Ih NV>J/1ה$GH-))ձ$;t9QR!>vBs2q.AQEEr:h"iTbZ)2JR9B(0a&7Fl>QwYUEV'֥NcV٣P@ j#z6Zٝ`kRAb35J\"05W*D8iK2,xq"7:Vfi[Z֡ear]ƦPw +z4̫TpG>HǞ5J5LOVCV#'*yBf@ctT|6n<*B*[/*ЬɗI\Gf2WĨ]'r c{d9 ;?DtNs6MGXi&fN#cc$eN$ةcR4M~9l?n0I{}</J׆DHn݋A~SCR6d ۯP)Kh\NBKԝr>d}"E!CQu}" #~"Et!/>d}"E!Cч,-YDFo`CVƩS)U\.OTE4"`0z2 ź&1',sfxfidKƹ[S&82F02gv&ڒQ 5El xN)m_w SU\5t BXD$EI5hjh=Q+~MCM)(Lq%s?Qg!|ڭhr)v'[NVT4Q-#1ڌAsm\g50 rsavqڴ5 Da^ RѸ=8HAG@ob1tgNԳM-T R= VeI{5s^KQqQ7jG`ZjTUfS:UIbHjtJNy*(8d+\ˆ`<RQ&UTԯBtZZ+.&m|)*הT֔{wU +DiOكR$Ѿ82=D 9WT\eI iaVe':ө~G|'!~.Flw.8H<^jMGԅIb?0Ǩ4UO$4* ާd$GhX3<^1?^Mϼ/jiNWa`9V0?qB*au4jёU䨝E0GGnm/n*|ke"sǬ29˰u`f ,%<hO4@MGp˸OXf1){ǽѫFSGHըS4ʓ #tUǛ^PZQ3Oդ)mvS23ٌ1+Kgh̎AtK ??JeҘbѴnS706s=ϲ5ϲ-ؒglȳnųnSi5Y4יDuߴ}ag#^<3 #QcK#։c;L!pψR'Rm󌇪/m2걻ƘGOy`n'A;M}6qG>H Ch&>r|ۻonnn}b|o߹Ϯ]۫ۛׯ1߲oLoITq5tHq1m~y!/ (ßo?n0o6߻ͫυiԟRq=o{6nV&mO_ew{q|upwO_}y燗=?~:)n(v%91)nir.N ;6ЀéFy  !u' F1&߂ΥYN "|\dc)I8eĐ[ q!"%Xk7@W[aq+H;8ZTp@KZ10oJ nǏ`q ?U}"h}:?i[xΒxW4rGf< DŁ_AmX4l9 䯸ðX +"qbjhi{1-8QЃ!>Cv$/NoK6m<p K[ƹp\"}̘o{ dqBҐU'Lp/.\- +lSajC4;N=A*[aXѹ.ȧF>5oLysڅ^ x 65<)@"0Fxz Mi_K^XC@PV,{0k|~hn"5`!!mKZ;Oh0a0cBxa L,PZMʨA`ZXƁ [)mim^$A>d&}"{hY뎹a"Kt9- :Z[]8 {qnd6J>[`sۻWG\?;|Iћ_}}j>拇/8lj&u3zo4Z6"PnV( (x$!.06!R`s;B 1p#H7@܃9H +d~+<& 8nz"@Hvࠑ~~ d?`<â @ l{ptJ:c޲+Bm(@[v㸳aGU3~xmP!=8'-{Jc$#\2 xXy P3`G* +qB+,cP1i  +,ț 674􌲑QqĦEl  +?rO&n& G;L:AcJ1sp x7vH<`(>I4o a/Vi:{Hfng)X!"δC⣘pvqv,<>/D9) |?^HSfbtxZ/h|IԿ +r#-IȪag~;ulW~[hh;[ $a `H+g,PO+ րGbGhV.bv`̼j(b C0 AlMC2]=R:S2b\K'Th A&+LG +e Q + 'Cb!rH>=:˹ 0?N'f==˯%zƷ$P X6m{d?naJa͵xH zZ!{ {t2@޿xÖvƒ!F;0@'7i<8==<4Zq& G@F-i"_,d> bY/zH$h9ޝeɭ#F,Ua±ԴW15sA6D ~((,Q`m˞nd7qOcԒ ++]̏+<"$%{H8z bw8mk\ELe lo ?O?&C;>6AzCRbAIk&x~B@[<># +*lH45tzG89"lny[%d/?,G*v+* EJ':٬gw6a +K݀<eQx]/_3)LtEBAbE +$n2aR8?0 M ǵH\>ʈ41CFڢN^ME-%2eLfnxZ}O=nRVOJQkhaEU4Bá+gq{4[[ owh2#)"K +fu~r:^lʠ#8hݠ/8Ngl!C`]MOcSl< TL4Y2B0anY>@8J'ϛHGO$goafq_O:*7kS8ħ*>$2D _bp=-o4E]16LoSd o1|ztb j#V~zLlhy<tyYA d3I~' qpă=4@ y ڹ q?N=gs (ڸ/Um lwP:Qc-~MW-&=pb8=#/Wj-05{4dSz6m &M>8)7 %̹S>[(+7miS,As;}x91 |91(b #rjwq\~ ߙ/>DyCB)~>Pm%҅[ +47|g`к]P@ stKbt12GsB:B;ֳݶY"}*k(\d\RXsnzBcrx_׬>Û $эPѥ0Z`\fMa%NݬEa% R|PU(ĉD6$eY- e*5"m x(0StA;_2X7m!sD垊jՏb嬦P_W%9ޛ슯kh( +C +hE uHJ>_u]cR*1gzwiZ@n>KE[P!Ʀ@a,<&:;wCԓ@h]k z7XzI['܍$ :ypwZO] 8 E@|fY~}x67A^A@; ŴN쥚g1(au@8+8x/azU!@!;lN`ﻎ= ey%4pG#!!> *qCzڻŽ^N1OK֯+N5 )|@2!u +kZ%K͌}meG7PocJg'LVAOOKeEQr/g&Dk/Gc(d~5z"c|=hմ7~6+ c&{T"t)UXLӋ|$hFbVB%l $B,4S~+ֆH%guRU@9AQO~UR&tY,&:Vq tM 3I90]̀E1dC (&ídCzN,X!X*fvgkXE\!%2Mr^ϝl<( IT&\+.XÅl1L5`|a +> ){;(ā7TJ%d + GGVRC^+C3UKDd%Z0ʐoʶ6>`XvXď 1PEUa,Hud`@2 0xZPp2Pm o `ՉjgqJ,HEF'iu z,fM!=kjJg >4OLۑ9Q Hs:Xi/4z/*QFX) @9Pz9Fv8za} R6J",KXW͘D[P 6zlZO0(o9j)=~[GGFk;Q1U[HE< +C9veP[7;~Q9P tCEI`d:gb2y΀8uDBW:}7C|k~by{j<{)]V:jiQ8^jդ-kr&L-zAQ>kzCJ}cHL.S3ZeXvn|R$ +a lb28g;ר-:?v +]+PX!H,րoW&J )zX40hŃpcqճ֕ ,N/$DkJYUa39@by8솱@6` ? Ýas v{י{Xz +͵Hr ]C'C)UB80^@7br" :fZ?Ntsi@CVF=}`ͱ ڞ(JT!M,8(h.ÒcGZ)A Q$JOvhplG/UO $!vs7&tC(U.0$ߗ>~ʔr1ɂ"*|w'Qdc3F +"0ac.ZAT薝Dc3mXLtˡA'T mbb4!OOjUTɚ=31 U7JփJ`$JPJ +4l`x@}@sZN*"^Pq[̀ +D}`3՛J\CP yOMAU&B[Y1aQgM 5wtSq !-cc#Y:찞GMTV1?2iZowJ1@㊉*QܸI}dQ9!6#|?(3k9R!u˚ I%,#N5Cl$*#N΂4Sβ6vr8opOrNFW'ޣi]9I& lG)>ݪN-^mj ӕYofP-+˷0I9R9''Óᖕc88p0"Cٔ4a\A*ʝ.Wnt}p%XTB6\1.*:R_tUMuŸ>'qOWQ>UYcpKsav!upzhck4L +R}r\/-TJ2 '/>pf+3]-v#0 2ٱd8XކԝN8k<1EVQB[GLu,Kns?_p!2YxI;^tbF˳0#`VAi`Q&:*HReL!I,9f`^ҭ"2ݺT &_Idi`5%U8c%M&F ~:-KvGzTjCuk8 +"˷:0F+&lC̩U Kv;1S z7YedeY&[5 bT^ZQY4gˌY[?!M&?L>IMn3fABҘ'Zb@Iy~]dM"ߟ/M'uo fYaphØ0{{sU Cf-xzW]B@tRu"Li ^R/ug I/6^HK?n 2@uyF#ГdV66G'̐`47[F[QN.(X<ӄ ?+E:u0SFKr *dt~L<<i@sQ'yB%U)CR\;O3D輻Ծ@|4h SLqub + ci:ɹj~Uwu:1 R]GD2CUlO:sIv׮IT+plj. &` ;ܠvw\egܟ_WKw1)G?pp'qt]rJ\Gnk}4Fֵ= KPB>]c8 ' 0XW5QDtJu a] emJT^܀G%$VuZ)W+R0D +6\eX=-f!4SZ ivc躲(B-qaYK܉T@[8CU\,7`hxA8>war~XՁ9ͪs0J +u*R0Q$g.*9\n%)qX9Cؐ!KG(+[0Sf}BR_h㵮̯[D +oe)MQ M#҂]YC4,1uoU7-]|%#AP^;zrw|v .EPl̛X}-OIӂѓ2-Y]w3TؗNT@VU{{|ui3ITgޑ0;PKZrKpWC/_w!1gٗ&d +b;րzEL!P6G.#vR-Kf)&Z!GY=k;ݡ,c'.GcąeB +05HG/(EꪋI|X_*xiϺ];5c:CoFw)ܛC#k n,[\d+CWrLtoF7P5'kb^R!zvbsqBk(Գh]5P/$cN~Τ.)t۴JW(\aEtPvfl4@Pψ;cĹń9FY,l+\)$5QXuQ_.>Aҗr]CiC/O6,0}6Ћϔ?^Ui2@@.z3gO",ǠjC)nʗޚ{H CfOVXfB T_ +ʏU {XRcMj8L-ٙd,~6Qyal;2YOEu 1T28N[SMV!υ0ځH *~Jm817kGPMeX0We"ld\8Fpi^1y77}E4sF589Vąљu]y S`-€ Tzz{Ca2]UrD0N+}WʀJfzCӤ=UѝTʂօ}hMwOwKɻ4Ѯ5*/5Q\]JSlDDx4tu 5;UݫOUlY@'{XϼԅЕU]P]YuTebRE݋ըY~0:J+VbV+Z +1˩*ʐW7̀vʆXw%ǪAmlBPOJALKejmnPZBFfG +}[=geqqYeC8خ>EўM-N \;T刘v\hGMMj-kwMuk?>ŵTZT^#v)>q*^+wʓXq@REv6%v֒R;dk!+Z7cNjEnҺruD鮃@u\),uH6^!iG uH6p"SGխ :c=mKc&("LXul}ŦL868Yv*iS!@8Im[$ReTbWTZ %DVYjUdҾqQX*{ +nU(2g(bWm~6pieWQmCV]txGA=&2ƓK!%jt}q.܎Y4J[Ujt⨔0I;NK`!K%@,_dL"pbñ5AAq{U0Ik~'ʡA +u('S0y,5'CIrwU_Tm6טW;+4{juRACUt!(*+`E+wqMŷOK~:SC>TKlHu{h Hg6ua{dǑ +48 +mZ U\bEW߀Jq^5Z׺}Yndl̿Z\h+Vn~q܆"COV +}[΂Yƒn?[8&n5и,z{)2suN bkArzq 26a]lQW ogi3Φ4ԫՠ<.oK +EqŪ#a=bkAo;>{˦ z/k1"I;Do^4d=i#e_"";"p=tC͆ EgPO%،̚KFHIE]_*QeX7*UBsURk!Xtu~vYhGZ&dAhO1o&p2H*u MM }A썽Ƿ17bȹ}t4V}^jŒːaBolmc$8i֪Uhu $\u{B`h2R?|حw,o8TۼGk)~X@ҬNS4Bu{Rzu}u~MCjHC݂&f'5ߺ#"꺩: pXnvP|tP,P,jBq驚9NQ̵K ~ZZ.V1J6UBM#JZ*RSWim"W_ԉSm]c 8 +*$毠[X sZR?4xuq.֔.X#fP i/i":ʹCU\!XAq#,S:Rۈx*c-EA0Ш#../e!<%Ut +"fκv7)@&ǷQ=\epPR |Nn\zTS_syܞe:2й aƺѺpם(hkmZG[^jc=*&<;V>0< kˠe53VOSlcrBSѝ3VC#Us{zńn{?6G7I!B2mK]=թ3 g/8ӑM? :!W(# T/~~{=\XQn*iJ5cΩvvnrMn:6pE8$ M Yuv4BA[kbc- !#7\ǃUR2,fZ^Mƌ;$<mU|!?`a-Kֲjxػɱ=R3yȨffrJǤDk 7'Wr. L.,$M1z&9nK H!(iZ=> +{Zh-KVN,$ʘa-Y78Ѕ7XT:Dғr 3I/iS,0UhZg!kT({FI[bE,\P eTM"k)KкJ2V?X Y3/0"1gA悍c`QauDYPP&0zF4#|qbXBzO4#A;1Y:Wd Ybl} } #]Hvq#ұ K0$Z}wnHАcM80/L)#ЋQ=Npg->ly"7H ڳEHg%k_?Rϝf C 0R&hSJ c1q +lg _[CY | ͡ceY}2h@T%Q,J7 gX$c7mzcaX5V)V1-Od0$dS)\7H0Qi+ޑP";A=Yl1<+DVg +L9'g!oK!vͥẅb<02=(?]g}vV,d,t{*O,<Ҙg.?9]}ŔG]=ga@">@ "v]}.(gÔqhy(}ٖ2 +g'EzaLY$bYÒo3őc AZ!i` k[2[EҌ8N}H`6e2d}\&K)]Vl TIS .R"I +)SDb2x!HAg1;6ΑK NCR t] pR2H"ĉ|7/?z C"^;5vL[5I: 疲#\Wr@mLv[T+D=mPp=_;'J Է;ҷիÖ^[O;,n@o[UKԞ~ܻ +D`+Mw&& a4ؒU "n7@P|`GΆ &!Z3 B)ŸД>U2ե mE׍ipR  +|.&1IB13 ,O155? >",0fZ)Sz`-0RwtIz`X[ȔIrE I'f?#6>1J-'I]-g>`@^ ZV6LRLq E$%@mu䢳E?twzFh5v_jJFpU#=8v˪8 K1-&6("r'kcMӂ乵Rؼ(Xy&=6K4GTj<]̦H:s DK?oRwb0Z[By1ϛ-'-X 5L }홋 bQh8HmE+&/?;h 2iFxoNxqCwRd;=򤩖KKz2X::j홄 ǣ?oh/k\I3tI;>e4&1Hrl[ѻXt%F7 ! 6(l~hm +41 Dqk+ -rӜ=M';IL6qyY@[meRaJl0z)teó@ImΕ-0j'wfǶIXif? CD}R[G aKW]hT@>hzwĆ'H'6nII?꟣3= iB +g[z 9tfm7al,naŖ0_3BDOM1ɺ8lH. )>#a6Ě?FE8 ȗرRۑ@d&"HarDpT!ɫ|3+D(퐮\h ן,nck81 a{!:9tΨãf=7fe8Fv|&nq!Kѱ)xևu:L=3v/t3ed5]PY/&!#sU@;; OO 8 +ɼE çT'ObyƉd=`L35kQvҦ@$$*X~bEIiܚy٣u5/B={qbzlS2[AIho:rWϪ2™SEbSfUsB?+\o)bƠh, K|4B)%* m%Sĸ5HEѤ0ZM.{W;'rYH\rOVc-8c)^Vg$ph*ZvlO@pʭ4a#tbQOƙ<Ȑ7Ud5`TicX3s3nf[H';٢XF$Nmr h2&!8DyUx I8vx R_Y)h`6%g5),%'(EKYw ~eэVh: 7f~D^Z࢔3H*eLÐ1]FZ!ra}~3dMX{)RO$.9ئq.< -ynݘzy>s lFr.a&YoTQŮJOv<%yiV,D4%śh+g 3 ] F "m7DU^8Oϟ(2n#3hW[=e''o͊Md($HT#sgrq2L>l|H -k3+ܦDwHqW `mc :IsQc "PXR AC]8ElPGƅ6yD<$ +BaLJƉ#X='Dcc,XIIlA+җŪ} +i4_V^{f[J#?Uoqqۄái-]B{g̬ΙKH`CgWz6r롪š-]COr +Uąk-Y@R(YJ>! +؋-?YM NvPggl_*Fg^A?G Ȅ{:܀,00'l"ހد߈i%$GDJ#%3ݯfP'xL(atbS08$V@[_m3_ޔ,Z mu+.n]snl^pgA [ vXep}݂6П?# ^@[ AM]Z^fчFD#3` ] !c֬ӣ1b +k+fYhBHH䅎 +۬bh} >5C>?yB5ڻh]fRWZȡiR!6\xh'CXԇޱ;zEлj -+Bݾ/4 '/\B'x: +C'v%.eݸ-?ڤRlUp)BY6%A 獼4g~'7;P;(Pt_%4Xk?J}@n+kr}=G PӅ}Q~u:Dio;@dflަl;͑Prk_KZavx@y?&k=ZFW@,[Bt+!" +r^eH0P95vE8AǙO؎1Al-dAJha,^"V|',`(|<$!^1 gy66pȒ#R%7Ϸ1'~Bq9ԣ'狃3g2\O$ٕw9a(qsvma6ư@&}sO=1yG@,G]}8@V}33\Cg "]|ҧyשN)mm^bIg'7G+B8Ƈai/*!)>m({vTl:z5mfKD>pIc\L}:A +`R/sWxE!Goٔ#Yc Gi;lfM@ +*~_Z/sy|6ODM7[X)>7{7`ֻ.p0A^ s!eތ7.da2#G |Mg%aN[c&|^&YA /^x(6 +t͌m-$TRC +ӶswC%Nr>aIz~ I$wȞ"f6f@ڈP. Q!x/Y  u7԰ediX3Тvvݲez*&!@il]ܮfAvĴO +Y祶NP/ʉ92GOi~ eֱBa)Y·V-"![ T{HN'hAY%qZ2!~=)LHF-aBNIj.R єS0 atwجlp 6GrX齤 +!4wO<oa$8i EI lE4twfÎв+gYwy@~]Y>b4M<&n;\'d˜f{(f/k2vqGf 7@b̰xDaCrf5Mb᷒X>ӝf|('=#h' m~晓å@V~XJjNJEG%p?w +g@>y<%|bo!'w!Ggy%DaQ/(}u]Xv2JvDouc(B@]u@s"0FZ}uZ7&O$YTfR%ў}7'1#͒EO3N~Z94{sW%RDvRo y连b9'@K/ bI--f&s*6VS"QQ%@/:t6DŲpnDgB U}s)JY%x@|ˁ U; {uؔ8vy w4͎./e\Fܾ}_2$e>vv);sſ۱*6ɬKf`TP@*d#*3; +eDx{2O L0g>61bacY۪/"qIƬ%ڜfl:Shy9Y3_](A~.6ƾոVN^4 I6o +ݾ9ĔaZ&l辖٫CJTrƋl-7 + +|2YHT0G/x Bk>tc A|luUͺ?PzJ KU{fݦ+'BgT +X%q5B LhX%5D#f ~ P-{NL9z# |m3x*A}wSÔw^ycuۢ*q>DQj{~]Bct‮˄m0|ᰃId[:i7fa/ʳ/5QvfMy! @] IuَTw IKBJ@ Ms7y@,}(*ɋMF˜9pK@,_?e$"@-!ERFuiSK`@OS $A Gݬx+P;yHWˀbt'б!6s֖NL[6֑\Wj:6S&V%hݽzq$Iwz%&+[LT$+{:EީgA?[ ^,K K=`e6'+pqɻb¼PH$&G0,1(>E? 8"V<ͽvaO33BNϠEmcMvo㖙z wA:B'(ǽ',gE\`}a(ĪZƖ]7F_`e4 [ {SF~-7vӹ1eGUkMA,4TdziBVYiشzƦ ɠ33LI@=t\1Ka!Q,N,~=^lgY^)ÊY >C\⠥4r11/d grb$}J^:J+Y=1(R5٩k:ݕ5{Lݐ4C 쩽77(Жݛ2e~JTo3(xeS35i \4n*uB~j:qPj.Qg@ňڃݎ"v)$hBpP/4dպji$ +H욜iNeWL,НmwI";ub]*KLM쿽,?j'5Uar6ӌv›6TΊJ!G?pS$V]' +trB{]|Bbx*:#ĈC#T%Gq$':d(hQ1.ݺ~ۊz̚ډ.rČZ"rF/X"#3fCn[:Ұ?QlPBW(7Ԅ>a)};a|4t $C*6f<(1TJuQ'. ŒA—FCE6ZAEU2G ++ Ü$JmC5JJؼCUھ4QplWk r(3`0R4-PD%[ON&3 +f /Ce\:}tL#!~@\T-6xE[cv11]ȍ6e-? 4],dJV#3/ w!\Ȗ`#EY(nW+RY䳽-^G)+EjX @72:(l +'|32cw6@jy}BlN, ߦ+媟SF0pL=_56@RAt֛e +DĨ#,65ow[opz^Sɓ:#D{p.p0(ΏO2'P'1^457%EŔc~S`\Z˴:t~i.Fz/$; ͑[.5KBTuٺ)++_;5Q٢ ^fj8DmWlz@zz-BHQUElqBӸz2r˨ikhkQ(21vh[ʾH勋 F 6/|4I|pQ +/[R[|unϕś@PzD m{E!bό>=BJբO]i*n;QrԫOz)˕# vK.=jHۣOK}$:_(Zucѵ/}&]{*u&2 ͽkObBm"Jnw-R޵g(Uݶ^Yӵ/5H&kn]2`oB꧒;n׾yp d~w?:_^j?0vX<:̈́ξ #7/:uMCn6끟'sao2O" +x0Cʂwۜӵvd^" j_Ob9=t?}sJ}~==)AɭOW3%ztO&jdu뛒EgZpa*tFWG74{^}+ۓfNW. ;v.qzxlS/jBATmzF? +2{bN7}sJSZistO>x(/OϷ>f"5omӯRy1Aczw\ޫ׌=lcs]c\lj̄ZE'ývŻgʊ\3(^ջoѡ{qPZxf Svq(aAukChfa&~{jb=wDK̓E,)Nөճhtf:U[ jPh i1ߗv}N&ԝCL 2)ug=.\K[f 9hwo_nF&|r3Oڑ{LdZn2xh =!r3c ?ʝ5U1Zoqa +d/lJ  0kY}g7f^^HJՋz3o+ (,Yovq(tَJ+`7W" Mqެ $k̨8!Sx[+x [u$WMζ ]r @}0U^֝g68sp/ZH$KBu[$80 +{T"|&u"nn[bcR=C#s9$'zz! ]/3!!f(sf3M +#eazuĔz>ݿg3]Wc@C25[frL=^dsgvtkiA?(LAhp :WQ+fd$|5D3VK$1X# yM5.@YΥo~ҳ$W}$QH=).JS6F̥Sh<s0=W1/6dBe_odx|?2C8.Ϙ(P N%Y M?k`RxwMw:Qn"P5joX O NWvcE sќ .`pNTQ5aa'5]u l|PG[#A1 `PBQ='[g1otw]£Hm6:!H/.8%i[3Z,EBΠ14ḟa#fgACÖx&lda_YZ5g^Lؔخy>Q2.9ڊF,a*ܷ{[}d(g7Xԋཨ8MMfJV: #'^sRlQ~Fi:=$QNfϜ|z(@glJZ8H~0JǕ/vE3fj?5%}QOo} b;ɨ .Ӽma+0I][h3pa̯÷qD[WgF^x|ʑYP2[ ڕ%d:֟"|)Bv򾫫HfˮUHyᇲԸ¸ZT}G3(ebӅ<2H7=jlGc:1G <6GC){) +ēg>̷1YFP=6RƘͭGWBS=Y\mkTQ6>f +S$'[)llNȯ\l3Ko-g -F/Vl F ۊq"l_J}#);UE}uŮWTT|3rYWFz8k1F:s nA[mʖD- +k؅CYB/d%sv5F +_cz!hYSTAmJ/S혬*]g?%uv% C˺&Qk/9/;!T@Ri&IH#)@>U661Ń +57)Ef[Yv弮}+ۺ7Dt1gmBM-ŋ"B/uC*`p[7Ԝb,e9L$(t^IT`p[1 [U^sA! `A 7֜2FI-{/%^.R05&L1Aᾒv;(?OWx%q>&jʳY" @H16 |QP$ο>uET>BǛT3xmF$ *Tb׵7t8jJp]iN+;Cܪ8Mym6jDN'MRs4) gſ34ʼ;O!V=h42[.mgzzΨ ~p𰥏\˻;}:MFYMqhٰBt[A?&j q1^7]xB,G̻q'-pq,Y;T^@Р[s%%qȟ-[s6#Ʉ +gabCg3&Ct󮇄W*YAR~ Yv.a /gC>dkDM HC2|0(aUKU?%T kk\%A?a.\277 h7}iI|ZMЀ_.GCY(Ɇf[^IɾXQvgRh6ηP6l9.ַ]bK<2InxKw.g _J#p  .onPk%bg +&lS8 B7E + ,TlVn +tYXn3dآc˚~ m2YR!B g:$>M@ioc݆Hrn݈gAё|9Yg9\x?Yτ v +-*x}rk-\mgd3]+h2u R`}?نvZ[rsga;>њbCآӟEduH?a L|h7&Q} +.1QFo.Y< UeoiG +Ӝ6r޺]X*.!]95vV P*vr%^etNPEGHa$l{Zlm!?kJJ[De'W+Kݬ#@Ú2v'%3V՘w=Y?Mn7|)_$c,^,k8i;$Ǧ4N;fX{cݮo6N)fb&$#V7NS,]>`'2IDXܼ~ EC97uT)"C>#Ve;Wm8U*ôµk3HPz̹K,T5;,TO껒*+[\v+,<n k}p]> ~DYF0;d%5v;z`pc.Q +w5kX~bfh0$~XV]p6]ugJ>}Ӗtߏ39k ZQa(#^r9){j0?UYnAxh} 3yя#C0ID  D4RoIDW +!8ΰ +h @!xo +/oS@!׿ |N,":40ܿ }d\%h`\%(#JDW*\+%h s%z_^$~XP? u&!m.ĉS* &(G-JµEܩt'W,E(:Pix.*nԱ7.V6w} E+]k.cџe' [媹k!䨠 y|WX&4. >{ e34](lDwFZ} \607}nfbF|iý5\Fs73ImãzƼժ˖ŲqHC9V&E63C` [=46fx'hlxfle0/} [coyץAy?譢-Emz+kK./ydd;Y"dd=jK" jW)m"hݝU<k_nj6inm_f9| oW8XQ p.F.F.ʽ] .Nʽ "Fmʭ|TFp 60Tm` 0UNcT*0T0T.0Tnma\ma\-]T([([¨_QrQr_^?9wwI5\,iB}_o͗ +YZFa -H_:'VJ5*}fd,%\M4e𖱴u6e,q ?aU,W{X{hx2y57ZBUbZn")h]_6OJh5i͈xՎ[=77N4xtQ$H 7nTY*g|%ݺł[0@wm$Z<>[Vd뱑pCPzt6$b/&5:5* >)Aʍ&0; )7q=H}0Q{Rnvit#ީ*~7ؽ$vcj8ul?;_i}_S2;w߰gAcwҮ"};57t\ñMu\ e"m(v|J07ߒ;B. f{C3z5}K^y/LPm~nkrPP@Viς8VEI>!T*3.mVt,ߧI_^!|_UOj_~:El+ZZ\k47un%@o B %;4<" V®F"l8a4ε,a 7la03Xg,ɳf&( T`UV_ߞWnm|$rhΗC\T('+ECXf8\oG霮ԓX #4n]y@;n;+F1ڟE<H$1.ztԢ.Ծ:$J޶e Ғ> j]%u2t[J.%QٛXK 5]'u2TFqS#L/]mx=V"H:KaPxhQ`g;u2CTȚ6ن=ԉ iފ~׳U*2z'Hꏾ΀SO=۷?я_}po>MJB"@J\,QpTu>/G +Y62~H'j Χ}7'xSNaJ,I,魡$WsմzUM6˅_ +Gpz>ap$ܾ|w,;ĒmZ󟉸U:mY~ +iJ;+M 4>;ffN"=V]rgQ*&6Ho#e%BZM?"N65z$`ᤖ^ʛ@MD9hXS,^i} %h"sC1;p479g:1ۂӋRnTg u/<2+He^$ 8̾BDEXgQP>J>e~{SMBI2)̨jfeG%fNTټ' ^ydPӥ${$ט; =W#H5 +̽%H0~Yl:6EyAgny3RѷKRPD[t/"6^x%法mtTF ~@v불Pf↪bÔB)>#nNh ݇-Ȑ$7w,zeKxt5EPoJ?hb'e0~wz5I}h1帳>j4|nԗ zMN +C0 +} ym+;WtlvIͻ69ȢrPtR:iy ++o +FmZ4 gtwmuٱwRE +1mLtKJqG&1"~U%GCφM 0\!` +gpZx yXj82-b1cqڈk 7BhM)6q21 -0P>/UPEo.TAg[Tu2lrLIlj'4ŎMvMJzqardM0uR%0:$28Q|#d?!}eXq]k|*5ߖ<*ntŬ#&iJy`<|5ARc)M +NNH56R)c֦)@E5Y32Nj2DaϦms6 ~z<:Ϙn?B]coJdu4Qk%(/``Dr=VB|&O.G +#6: + 05ܬFm4GU +􅻖#,Gb-mՂC"y$_qY}*]rFNuwreoĹ|j̀gkӎ=q7ZpUH'V=^IO-sjgQ}{qIx yvއvq@S sMF +EDco bQ\>=;q޽ߡ VlX q.iZ|nkC{QP\xތi .{i+b,;>,M$'MC toAn+>aDKqg +n(B//oW̓%mr~#m73LaeFgiEl.BEYhNtnS 2`&׉i.7A[t +t')bX.qt-lu=ݨ_SB߾|sūBKuJ%3H_"*fI !#taCH#Ր\.tr2 ዿ)fGG&N084PpN2xP9*8L,`KaN$B +Quok1 +ݩJ h 3bflM}WJ%HսAyXݯ_X"w LC'ٮRrXOp=ND!9lXHr9iPf:>1JCP d+ӖC~L.F;[ZY`*`P@)k54)U]8N j*]ZCj9jRZ Za +Ytqz/ ]ꌏ)_L'Z3|-X-k7WZP~tAv|~[KVa eaЃ{׿ LĊsfB$m +m X`#Հ[wyn@읈 >H%z;=\) +^֊M;i| +a\7-r++,8:d^hl{G=₟u1VX!z/ }`-GCcĶ!_~+2Ɛ+0+DZ5 ^1^A//"hc @q+,8&=V| +Tiu3MP +`혓`}*+C*lśZĭospy;E ` }wrm#&;f ] kB54A󱡙"s>} rh JrC+>ZYB<Ä{ffn %/!vP-IK"6mk%X]nj,%kE>)\]/L4kjQUXU#Mpa71gkNqƒR{oZsOy=\F +r'nu9_W+b|8GWyn[8|~4[E^t-qZK:kI6~?&ZK0T|P^Z j-Podk;Dr߁eqxbI3Jw& sJZv" _8n6O vjPEϠbߑ&Ңb>]0FdF4 +xcZ׾y9wy1&}_ +￟2X9{`ٔǣfd[S`r挡DG))x:Xx, rEk|Rg(5:mlmQ!gR,ro.4/>ËQ~eד]܀gPp )0d= +oCb=q:O~-?}^rl6|N|6HEecwƥ>w*9So)|(cw,FaBfMTVDL /9Irq~~gk<}A'b5D E+ TgK$Qfo뜏H8IBE=˼"38U(&TO%GֹE@OKg +IP^ +vԬ_V7 T)ќ; q'ĕ 49Xj?4 !?Q`zZU +wP +@S! +4ۀC:U09CA;S& si)C)r̳NM%*̠>ln^1qraZ}H8f^Z,$n}T@-r}F֍=5]Ha~Z>v$8.> lSh$\p~:2r&R;0 7&㊈;bBӯ&RI*=(I,/oI62dY55Px !qͳDWa4Da&V0(\Vf]m9#x2el{Ҧ DZY.U3'^xQ: zBgOD-NU44 |`( .jSx씋a-A'{[EuՓ쌐MwqC~E y!)ȡڒkt}|uV*F[hS E0(?N Pa*L6_h̢g$ogR*/S@̸J88%bb&_2oLH07x-:yOh"!,v2!͔0 HJP{7,%>!nB(3m"nUt6fJZJ' AJ^B*j% }z&:EҘ5+=i~?"ĺҰf^5.̑^BN ۵mpήIg-ҧSLtHG=ފ + 3#FE?so⪴Y禯i^B|CxDw]Z쇥U\ l:+xr||i/iJvWem.v@\Igh443¾|i1|a6ePYi|fsȈ^KS}ԢAxzsT!@lC'6$q|9=GUҡ v4/.4\3ƒ-fi6As@LX#hfbN^eG ܳ(S0~qؔtۓ&oܪ>_=(ev45bj1ɹݲD,?/j.0#zlVqAIDuC;J; qUK)^Sk(e 7࠺p-/8a3*jՇM/M !V)_gW髲/By3ڝzeXs)9w}Pb"3w_oҋvdh_tpxq ۧ/sؕJma^m= 4T0CWj'`I+B9,' +˅rM@Ob)*U s)A̡gzS\6[[6y:U͞女ju$o*ӪAyU]1b{gڵ8I!3ς96[P7'<gQSմbIѝVD4wګ%³+ [~ēpp/؅|۬$ot()1ӝ ?O*ԱmM78u ;* KbvisNbF|aCi1'B4!P՟_=pyqGJ塶0duW]5/ƞz*9`s4 +!ϯފs򏉕|1k(/mHT~'4eOBt)oH*zdXB;m{s4g/e`zGb~A=<  J+G^j>3~c +'x\A#T@fm;xt'KPJcd_p|Hu}; +}" Ab0j=.|ϰ;) +uq_m3z0o/f;/_}_}_}Sj7p6WW8J*לnYgǿo~?~/?/y,% h_g?o53g=[~nW}?IxxL?|ګW`g̈?w_~6ݣ>'=?/GqO~y}?G'?~zI-Ą#r8%!Cy#J:GfgdS_?>ln[No;wasם/~G?5 -2%q;NWb +R\? h"8RK";dPy<IR' bءJ{:Ws~i*ĭ)'(a%~wB 1sQ'! melil"yPST{mN.&C|7wloZ٤;?"'v"f]@eA.4{ȻYDŽ/$fgtOu4dAP\8<\gWH6>iU,/~BW'H3LZs8C5!tB<.H+gي&oAA9MXTDݜ,Z$1ʜBzB}Wim4!z$'*zenFSn#\D|ysذ}$5IV{ec{Dd_3׊Xr!e/^tl|v&ݧP ߒƖJ /iEĦ_iyif(^tH^n{}QQsG~yHY2vLg=Şx% +[P8ql3ǩqdq;|^p7Z7NCt{ Gm%<@0ŜA% +7.|i?|63IG33-c2`ʼn@rA[\mI7}/b_AV _r0y!d>a2&T5dۊ2~= Y}f(onuq J,NƦsn9*oC?oSpfP|nnlM{Yj9?+MjPxJ[7M@MJ>ղ_prSOi`)?~f@!DsA35Y'8ɠ9DR\#~̓E%/O$}ڋs]ۀ/37PY{(z."&g8:`K+zc\&;=mbޛi)e=^rkn,eb䟨W1<]7ue9 +qGɟq,NꟐ-*?5U@A$d?mAHys8E.JihJobQAXsAh|q+xǐ}8BS9JerRL6uGkx~ȁ*8|^(4B]@y~jo`1 ĕ}~ŝ8!2>ZZw9) D``G/pKd7gCr`ԜY/ЇB5x)} CAcĀER8. ^H Ϡj2m9|.GцׄDgQZzDishlϟDA!U$b +^H@ǤeKL;q8hQwpf͉K']sP?SŅB棟> P3Pɜxi A4lzHj*s +9𳞿D۾6yd0<:Y3!C5~uCWe(Y%OpA*=[*&=pL{uYnp=Q.l-k_(-J<0\2G:eg4)%o;E@Zl>%:~JuD/+1pO% zy0Ə!p|Iތ.t=r +VR|1cW MJuF]˵s<8Qyw5gMg4H3wε=GND1Qby؉LGJ̰)1NݰJSfĸLdt<fA `'[QILL-;IZh=7o$D*b-cNZh-QZ[0/*+\!D&~mԤ.hgx;n)a +6R"Rs)jG"e{|%"<2#2JRp) ] +f  x/R9]I0,h~~9X J3K$*Ur `1&M#q?iK"tw6uhO:Qi|(i{C\cmcOW?yoX1F͋QWdH3 AԳ?, o4_ŏPiDZb-"W@)B*Pr"7?|]O%3 P9:˃ +l2A"̑0))ݕ`R."=qf흹)6fk|%c!@Rz4M/8|Ad9T +iR6"%iƝr*Ku9ݾ`:'zemTqp%& <|äQntS)5,N +B "9C\4QIkusc\C@u:yՑlD"ћNfOCژN x&OUpK8kPt3ԧS}~y]..f p,(hk> '|@ۜrÜoN@܅#+-yb:⹹lz.#\^=utw^vg3͡O]U`t8q(t.9;@Ɇ o=]TFh "7`s~U:k8̦9>^,Fw( +gMU!։&^%ms88S@^MQ,=&"ȧB58á[5vshi 6ҝji!'SC -h%EŔ6Oc|G>f> l:*,LI6 M+c59M g\C. =T)"8|zj:nT%$y>b8t? +_8(f7;H^e& V@4h6iCֱNFR;kAO*%Tt`ܱlOEZ}*Y\^r A)zp4ީE92]AeUNBfgx;CBC'Ik"gQ"ꮮS–\_~HX7+B]]%ɤ*rۅ1ih~Ü&' l2< X4OGiJ\|- i'C~[x3u<{o M2 l ;U &ǬnlmGNэG7\"#$!vqy}EtXVOd&NE-5U2O ez&q-#N5WNiȌ_6~seKN +@ ”C> +HX>T`643oD5av$wojVp۞F @!FTW^u;wZ(KM[ՏcNU 5Uݳ&:DgYң?tAYQ9#rxg|dO/qNi\:b'DW%+Wx06Y#NBnv\ۨxExK)^^fq4,I YK>{e`NTJ`HX48'Ɔ#N̂v -'B1VϾ, w&N['>hz{"Tp:=Шz[ծ<֝THIΠ -p{޶U ثj U#zNabs),Y1L7a 4s L3ASEx)#*}WxQR莙6S6]M ŌN1tv+u[p(\g I׿º܋T`[|Cٽܨ@_P-F$ %/1 wڐ]1\SrGŌg=4~()Lf;By.4p̗`pL[y H6}NC(l5AbaFށ~3-0^vC;}eӀ'j3Hq}0 +rХo"-MX:"U> alX 6 +­VhBf_ MWآ M['ӽ/O(/V0w$GB$ID~鿷La0DNym_|׊:{^A}*R GnGtI^0&~Geb水h4JQ0١'*$GZхflCA;%¤A$f @pPطn pR& ςB.p GփDl6o +(*cgJr͢ΛEcJs$rq~d#[i@$kP(o-! +쳯뒈EdyPFhD>9R-@.]P ]]I W (PF;0r2pba)9bU{O˜ԟ0+m%H$TiG]̌R^fBK}885G3f%®B{^^0λ'j/w萛Fނ" +;7z-B~r9%S8<r ӊԋA^CV" + ل]QbH@!)< :(-Z H4` +b/d +,3߸a)([ + +VdA_~Ӣ(5o+ +HHI">9tArLb*ړ5>HuSF}ަϺ(N@^u@HHVuY(rg6NjK:$83!YƯ1"119ޒ_E+?D8TAa +3 Ti} +Q|h3[nza5LpekvGym= 6F.j,D@g_ +e26ĞaʇzZ|tSTA?EbI>=Y"JnԒ7 Dk2Fk=K2O-Ωha_mPGd&1nV%@`Ͳ`f){2(<:Ԑ؞wv/U/u ΰ GEjTK{wIZWlz`!4w C.A&U|s:C:c7++&BJ^LpQ'v'E)uTqQ#իOHJ2 (ŦU J|%{/jXpk*Sn8? -'_Vxo5gUP4 Ln0N.禵Lر4,8 +=RGЋEی2۹ؔ(>+=XN0'Թ(VM@T ȀfՕ|k,F/*p/   'y,v=M]>=uW'zKߧw]i:BHR@Y*$hUoz)܀P&p?T^2ć`֐Ya*RB8WtSPV"~mSӭ=;IT޸@=[{n)n6|.Jx=C |u$0K&K=`/uK<.Tm7T{ <9yMHeCw/2أ3 99U@c~7XmR"&Qa:X⒎z*|:׈46לȞ_*+ (hV6CxAxe~s\ի-oMIUZ Jcޱ >)W-pHu?5jyZp$Ex/y]X)82y#/F-ho(Is7Ñ4< nc ۑjϒ+nՉ&ؕBQg kIsFPh)$ 3gUpKYyJk s4Ĭ9ۑM>d\"$j৾>VH߿ֲ5{z +A3tb;._+#]DbӲJ d#KN?)E,){d;epMN\L=&QOXIԋ o=}*&x@7%KcP_Oēr>d!5Kq ,8IAQZSa5ʔQU1 +MT@^ +o%uҢXӱ_ǯ]>Ki͹uM+?Lg79.z̴n_l\^, ^hHC^ })qEA kQAR~ +endstream endobj 26 0 obj <>stream +QV~:tcWP@mf/4_BOF\Rt V{~)8cm-,f&In(>IS)īxd=ȫ#@ ZO:Lku7LwB մMX{2e);]4t̻G#$4쐒IukZmc<@g@S"Tnkf' Ez%ť7 b@ݥN/sIɞ!Hc3i-ztB˿ܟnk]#hI7J) ')$fn#Zp_#65I6n^7줦,aQHjE>6wYjܩÇpšJR6:Q%)N{AWT[[\{ e'>KPB~ n7ɕ$ +mTo No3;/V';$Ua/!0rD!dKfvo1-X<\ SV=Ad~A /dGJΓRC(! X6WXA!ȸ7ЀR @Z;Dt** +@)-{K@p4xmsr:.*=>d l:*Wx2dTH_ĴDWViRajSW]A +a7ش`ȇN}L ow wF9nG{ _q^=3=B7| +>HɽAFb` +!ٜLRP7. T_?%& R-ב@ !qB6&!)`=h$En#}aBwGz;:|[~P H$^Ll*H8|y^|ŋ'zZMgQ0%֠9:Ȏ(fгߍ*ÑH5Z(K/Z\~hY$#+I@g"B5XjaS"0'ia8 (H<# u`Ϣ?+tKc`6%MRL*yF 1@B;u +[z\xys +Iؽw6h +يUt}݁P)*Q`=㊋ c\tF;#'˽`#3vQ?ˡ(@ٞs1jJd|Ǻ 4~aj}#6 6dpaaGs48M7-`jHLE2OgB39Gfrw@F%C7d,G7»@^tRw/E"t`z#y/jGC2t᫁BIG?rO>@@!>l r3Qnbg@) *+PX UVt: }ꤶXlANȻS=3)ח(>9F=`YbW9Mvk3b G?eч? %*{| ~2 "X("Ǖ8& ja H"$ +_;;™9yN{| %\ .ʕ;"^WD|pՄH{j[@A/G>G(AE͈y5.LބV_$7*ݭI=Be@d8+BPlaҢP  ,10}9=HpD-u.Y *nN=ͭE匯= c}+yfv'pj!o[xdjt^ 8U` 2u +F|ý ~y5JUÆM&?䠐s6 .bHHw43.T] :t=,]9V[z6p*.Ga9[`49A/2U>KC,uT筜y-MsNU@`ȵo: ybC-58D^ u1o1 %!A9?{{k^wSPeJ/~PY YݭLlpQ5Ô)'ol`u2>V=ׯ! <&Roh/b ɞ]Q%?v`bPa:C 00xMN1K+T`Öt+h2^j}c 8JNY:yXNLqb: 6 j':`Wͫ!+ΠꗂSq!ā%\Cl +|*v;u:GZgf<SGLdox04@V(a4JG^=q'} +C |&}$47h#ף~nh"RA0+Dh Z\&! j}I;(G7fPD;F؟P2`fRe$zo+d^ +!|M ScYT\^PEyܶn9:>q(7-/)!?I7=I +*k7z(a\S- .&/0xGL^{ȬNYƯ`xTB -k{4+u2_sƩc&iHR\ly%Vʳ֤H*W0e>{4mO_QH Z^Vj'q|1pMWяn2c;UwcK1@9Q|&M{s$xۙY:_cCK mrg jďQY"UΦ[Iz]Ǎf;w)rd.#22GH( ,YN**1ߐH{5GQ59i6?1_ ܣxNu'+,K2}Bzvae)d =p 6 SGˆ!^ i߻jawQ[#5釄>L;YQA00qD[0586GKHQ끺sOt4X wt&%1Dkp= Mf .f6y`^]$1Ja/\{@qΣA cz2mЮռ=q-iyJ @٩?aσ by-W*윑S"xDI +Ɇm\3(Lstli(>TIEvTr540?V TYhWp +Wu43j +Z3$&4ךX^)*+DF/[wGXҿƴ,Dstyf`M.i΂Jlu\Xl\3Iz " 3L26qrR2Q'=Cm`ķ|BƦ J?K6Bg{H+H[rH,ZÊзKVE$HH!"~+~~~Tzk_RNϗL5$YVUi>^p=\2]+ БbSʹ?ϦBud + +KFP[ӝ= +rqt<% gkoņ=\lfGP9A0a1*Lz3~9V9!+8tt4-L`^jf{gn8!ݺ{T-V[CfM.:h&>4r?΁pBdH;`#v`*J +lDx-IMT%|[ITij__kGbJ=V kk 5ErA,ӨA{CQUr"+\ +@DXHalnՁ`0VjVVYY酡Q"SfMSuQр.ѺB߰{]gl̹Etx. 5@_uE QȄ_䍎F+5.9leG}vyأ4g ;ϡotcUx>̰)7RXl:~Ġ zzE<i`Duȓ7 +P/!-pbLHm qP}QLq}2)s۟r̂l#`ku]QcFC}hF%h{LCOA}~!D Lɔ +GDT*#TэܩQ9] +!expǞT=(Y ڭb8 BK}S =:43oW/!g~N ~Ȅf3;mI_O?Ow8O?_z] ?n_#a( +@p5,Jr"[ &.TՎBxi(F'`eoS" +@$wRW9V wnlgj$x7{`DR;RTtu th +1  ~HPcDL#=vL9(z18͍U -Mt18C#`Fփ"笓NwT3nqCw!&W~: +0dH7rc Oa}OE!+14HaXKihq/W@.v'c`!&:PK0 +YU`߻FQE-MqۨYqXFSz`m6q Ԝ~l>.Uv#=г}b@3JdN8NE=!/mE= ;D' RTZ6a߮zJKfJkKzh^yEHI790D*zEV(8*@Y_ !lgqZ"QnT D@fTuYq;ĭ;9@ӁP \u7=e˿l~`W~xe/pA@GWpۊCa݋Qc:=*7"@#aA7t +)*^<}H7ݪ~ta䦑`[_ z0GGYCaW̜$t【+*udσYtyy*F, +`-!qywd)9^J2D- ;(V@WwٷFKTb hS i8.QWȫZUHtwB9 q+>pG `҆* Ir܀j6U6[[ߪf}^#wWF (#ƲG ?(y숋C /ƏAk(QAxg_#܀ἱ5Hb >&isx?X&P?i-;ׇ?9oj g/(\J+S) z:cfmqpu3OEb{cA}Pb\a,*þt ?"ϔ_R[Ym@,˞l|S~U)= ޭ |m83l~it٬FT=40G =:l +.)jRTm@ J +VuqBqu {}9s$4@h(GVd +C"6xeIKKuo_>k*2&]5D"ZLy׾ hUƽo%aeu&;8'wGfҫJijMse +d>͊gJ2}SnCR +3rM 2 ++.[#!OD }[eJ{;:ΙA˻m3^0zP[m,rTFдVjg4{4B"I1bIx*#>׏C5q]B5X"R*UcLk q$vNWC_0 e bR"}{f@(ưk@ҏA`vz֞ t{F{b;Cī= gvdkWd=3a2hX0nۗVTTSgteڍݞIH`nxqNo1"˜M% pǷkZ (>cPy/XP6Ki8qcSP"y8Lj՘@W0&NϢTD ؼC:j?PQP tc"K]jnM#!sBly.LٷY/<~ASBY\K,7>KgUʒ&DywƮ!̼~~NE8QL$HfߪR'e|CMW< +΅{ոـ\cyupGu2vágy6 &3[)`B  fASʁlaQn1ъ,=-<" ޿H ;  0k9Ge+D"vr2it-Q$c F%$O/O6xf@=_LHQ|&h)=ա쐬 hjTsu`QAqG7zojw˺OG#b"k>=~䆬-6l`X`%@ܟk&kLB<ϗ kZ#E8ɦU$M-1҈ mOZ3LM Т Ocj;3lw$v i6" @ʈsiyOL{ۍE|_V3~W/rP`b(GS$LŲ]FWV)`w<ɕ9~il2i7@ާxnz#%5a}83 $0wAGd9Z8 c Kf +-2]A mP@BD)1Q^Q~4\9'|<T#^P̂O:2X(e#u[˔v(u]Q-P "C%ߣ@ [QCqNt38YuN垸<ګd׍6E]čPM,G(4$`1`XI~#A?}&M~?bT71}HCA( +Dr_pi!j1k遛=VF~t$j" T v5H/p QeK8x@z1.p7=dcx+|- nc8Q[bD$kdly +Nd1 bʴ#JQz\@Vz ;IzY@/y vS0wl:!BAc SeiuzSZll˳C +o-xHq,P+|*[ a)QV;aR{#<_c9Q(M K!m;~F칊\\<6dI6QSG@F?D-4NeABUR9~dC]9jXi:f +ꃁGhNφPG!ٌ~tCD#MVy0W:QBqf)j=Ho8wlT-vN&&=jup@(їpJF2Kr$_z;K$R5UIBw+)ow`=tSL=Q i63EUy1;p®QsܿvËAAݐ))}1{=G v#5D<__~%+9:{t!ȡ#=`F0G1juek:no;=&3Q:br/7ō~`3h-ԗуê؁`ϙ f@p2Oxu,!Y.Q-ԣquc|<7%N?%PV `U(&&2̆p_;s[HZi.]Z7, uVx;H]bt8{Đ;LZބ/񏃢,% PrsPI $8uao AA _x mt! #,8o9C(,)erV}?3i& G3?ρBpgSߟ qtUS7Xg vڃ$ {*Gw0 _hP[/Xyv"(@,C۠lqGq{qΦW HDΤjk2yhvhN(ьx,x,`:<)+s+F@!DEa=$GSTlMҧ8Є#yfD}ݷ^Cbg;|ɺ53/@>ܴu`}7u4ܵ`6XbD66cMQ^:hY)\k7q&yǁaSʋř?.R_n>4!ECWHE`Q`f`3#U5 K|ܖƉxI!y*L]g +gR 0~PU9@"B(F(~\7STDU6XӼ:~1s' B2;DCg +*XB `}79\O?$6|t8Iv^aH le Aps2ǣu2?\,SX܅Pdh_~f~q45Q_j㽱Nry[~_+_=Ćx3\ ~'xZ +[ʢ6,MAb!*=gWZC'WD UN~NÑq<[F aow'uBQJۧ&m'!50"v{,3XqRiLE_CEs |;jW4c;EJ@P6?g/Evx]%KRD|Śf=Uk=ܕu> cuqjWu.mvw23li'~x/MQCi%6>hF HA"΄W&@B! +d+bj`2%Q#aE_ djZ4&615{M(|]-uU >JqԄ*mJO4f7|<4S2dH)>*p2лв68!V +=2+2LN!ĉLE2O5J >5mEhƯ3dN.~P @ĆԪk $i#6m9#pv2~R]V?@p{"=wNO ~ѳNY +,;^ΕCO-cn )aš)3zPؤGV-vϰUxy#[P8`M6+]mQ.{4y-dDYNǀ$B7J8[g]f|9 +9`!޶,#B& FHN^#'C)>NDPf8f{`lY!`&"VEzkPδg8 Bi,Ȣ@I:Ǔb^KM'k9L+E`rۀw"\81} ĝԪ0K +R( Hi J~y9lI.wDfnMf +(Dgl+Q%Ql9KX Ⱥ1ȪSZ 'zv;[@M=BB.d35Ke:MT0|dh O@ NУ+* f +u}15>B&JjD}W0pk7Kd =1iF:t \0 z|jicBW{rD etzQ`lF"P?0{+:CםH6 i;x9HYqjw-O&ύWxfσb"!Z{٣/bqWcg)\Fu"{q7}` 43A`I Oǻ۾K%D%kw[|I8J9>CAu$u-̫dDݲ,Bz8w{ &2` gQ!hbVJ%]"Xs/@=2 +FTJY`3 LBs}8:Yn;C=0SD`aND@'u)k=b +t˔mÎ:<>0rΤ=`3 1bPT+t^G>=FH}=.=AȽ8iH&Cz0zBspD6|oE3!qv6U6Տ!ݱ|Ҹ&4<\14WIS9 +Rv0C!(GnV gM,@>,PO[Pj;xNaX(ӗ~_lhWo:(c4 W1AӇJߓ1ֈXV/Ê:=0n 0|+B¦XROB tػ.6@"!RCoуu$iS-[VRv&"b/@3^S{~8f(kپ 쥦++d E]Mao^&{H~DHQErHSW`4rz|"+}܅'"|N#rОٰ0W+ЖԛC_RuX`7yxц&7eӓWw 8%-3`+zTzrUnS(W +yt;u3Fs\oWʙ/(%$ # @GH.d[4X*)/-@N\.t3ՓrǞ =yT|Ң(]q*- yȕ~.γ7 ftLG"gֿzϣā@$tW}!X22,e=21yQ*&^IZ܁zF/kltl!oQ¥`KmD/r2p_ +K "l 1닎]ÆϠ>KZqf r5jQhJKd +nl/x7dmkH~ByV:S{iw:A62S5\kC0Y}3)t8$֩8xݡVӵ'0b{iMR!{(ˬs 9BG6LDF}bAT(JY-c)ϑl3q<'*63*ʬ.,DW$Gc2V] >yX2R"L`DE;W޼;5['<*޴pH[%lY:A`i} aHtߪr >T"LK%BX9ř@V!L⴩MT֌ⱍ0`/WCR>K*#b|% 9{0PB;q=[aBV D;#4' |"0Mjž^Rv11wFlJ $hfn!%9Ojjn3 zѷtإ[=|=eY:=kYf1y'{h-PF0z D4=]}j^dO# )p>$B(C+أCꯢǰοb Xwۨہ@_]`:\ʉf缽"%0v/N|xV 84jPt-=/LgX7Vd {`@(Sݕ"@j+= Ӌ(HkƸtC]), +{'Zn+0X!¡/RčòۨDFhm8/\ `xAQeG'<4{ +[((va\[5d9ح]p3n9E +{ڑr (K߀ sY}B=eISAӌ#M@&=OxQGu&gT$ 9y|bSأ +\n{lͽ=ː +OSpc)Е+Y2b&d +TFywB1^lxC-$+ j6On)biX(gBXcXJh%k+iC-$C + 6]BO* +qj.i #!0%2 ~ .VrժZ}KZԂ`ђ7Cbu"pZr8x fOԸP*h\$GB<0/iN1cs^RԇnZASg-v!KHoT`UZ<®F]zz/<<͑1QKJ`g7T+{KdLJ7^n5ဎ!хlH%ؒ]NQ9 +pcb0 +mLYgꚾ5B=಻ŠrLjRoLσ92|H]xԋоdlu1m Z#nG%'(R#8[|(P6bFzjbtXv}^ =bY7/ϩdzl*~\IzS!fs]G 4t7u6o&p̀{G k26K#`뀡!"rӝ(YJ{OLQQeX%!∀idkfǪ#C}@҅Ls" J_ڗ,)Qd+r;t)hpb/].)EjmOXbk:֬U@X[}d:wZ/v?gJP`+qheU苢BcMԋpefeH)u`W;0Q0/"wjIfAʼ X,nw+J; C8x DBT~M?d=It$zJ>%aNutUVD nz4COTm$z_.<džgs0z6a2R:3SڴyvOޟ0~y3U> RnŰqfMpYO"c~ )ԶPs>SPcu1Mi a|{}(L +j#jU؀ǰE\G(a wJn3_?;C"z8gVΙӞ0?$BvdRZM*JFNi>פ! 4 :3S@ƐL#hV|gD+jp d +f5OiEK1JJ6.̺{46/6c(yB~@ArwP]Y$@ҍ友eAnYE#&giY,pLp$$!1O8 +wQg2K*ȓ=46KTO? SXBIPJFLlrT EK6.] DJsLGL<}']HMlb'=-t .M֛0:O[d>  -#,(lEnu/P@A"SHO9o`o6>hĴ89{ +9t4䧨ePbjr.WD5>eq~,vWY}yf;kŜ|Uw ?5[ +iJam,][hWh-֓ϷN`(lŸ" R_ˇ ً볛g=n_k'm^h/DD^:.0}yɲOiIYAZ_J9 Ov]!X"$}%AZb'#L+(ͷ0esNШp=2,;Es_jL\;H2Fw\sF()6$GReZYNi 籀IYŬejLЉ ⳡMlͱ<50-R-suINOQϗP-CPh csau9m4| :6{ + {F""Ah`#@B7dm`1Ђ kTliF6.7#ʤ1 &VSQ Qq,RhpDGC`m`GïG' @hS+*j;2I)1H&FIdcVh]2&8 +¿ת+uU 'vi cXal(ؘC}s8S&oC]` {!`ɨf<>+BXd2Χn~y׌M(w{39͹ғҲGnf00BHS45*GŸ-^翸>}XB>R$ 3Y5_"|jr-5eRyE0PQ " TХ D4dz +z<Ŷpܛæv{O2^つ:{ u4\i%ez@L~r9UƼh ExN:u%<*N=Er"&] Zp(n> Bw,=C~!tק uk5.5?`G)=Uˊ\'K;+UYW<B V0Z ~k|h1ŊyYv`P-{L_ ØWlvku}'6 eMUDJtA @>Ht+B K_z]c <5zSWؔYZ48$V.\IPQU4Y: ,40Ȥ҂9|l)4<U)c͐+dB>Ӡ% +brgaJp3~in[ܖI !!@9 +i \U9@)B<0h +tk!AniU\.efҏE \}%/X! @y qڄ /$fZ I]tNXR>{yܭީaYVXN8g_|4@uuA)āí[YRvm>tn P6>P4/13̐U݊7]m*8`9dϘAAlpPIBK,?j cN|ף[4Q) ~y&.wOnNu`"{B%:{{~#, +z*֯ IrHx'&F^Y`k]Fڐ!t:d» +ңc .]C(b"kdd=!Žo0D*QP;u#,:ڒ=pJWda +tZ~~Bc֙&{ӎdXrn +? ez +7ví@CIZ9 7910=:tXHS9:5OUsoTP`EY0b/K`][.gc:]a܄ӥ#L%y["Șˡ8Byls) h,ur;VܿcjׇtJjm|Ko"D ijlmQS-5ǰb N +ӣhOKͼF4GdD0wiLz oPVf{Pu0C9AAXWLg%U.% 1BcO!b4%b"ل)B&m*L %V@f=_r'}QIr`z5-@ASJ}$,(/CrŦD'I,kȭq@N1Z5q y%@wt(^0^#WC4ir?ѣܑ"RntCe[7xFʊEIUcO= dޢ; m9 +{kI3d+NJ.Ȕ]+m r7E~u&zVf41Zs=@8=nG6|]i~A[QnA+'60$CڣG:=mPMX8$,ògrlChJ=c}+yhxW]&2Z(|txT,qTcOHb"|7D12UR<q$/jcW^ +8`ǐiGz1u(JD +/LȀTc.>fDC7, +Z=N5ohO5)_PְGHgH֑p 3rXs썰ʎNNaIm`mmsLk/n{FBYz ϩ>AɖG(B I]I' %SyG3Kɏ0pQwPkE՞H{޻ +*:h].oTg2kyqﺑ}t} mԙZX|ۃP + +0"n3 W`:Mu4zK֎*(N ;`]qnW xy~s[l/#Pt) +M&3s&_ULV9|M6 0&Y@Dt'|}>{+X2K=¯Ɣgȋ/!"{ӣW!a}&9&MٻșzG h9Wd ;:̯@ ('eG\Z`JI@%bH a⁎h…R=N5,h_%V=@:um"%h0MY1LrZ1Q<nχM=ԬmڊIr"uxh,{=ETPx梛w==!.QS}[HƊy|cPZvQC;8b 5q(JMB$j<^p8+N3Թ=BrND +[dگ2,EIFa/ZS)z_t08twGKjP G)jw&}I:0t +w6DJr8w]qfICuSPY :ԧ8T%1D{mGԭ?z@ [323|BٶJ7Pl8KF{"8@&%&'c#Cwy9y)i1Sdes2uH $)fsZ}!$%%no0ƎsiOEE$ɑ2U;pP,qϟJeas}U ReV[{|ɖD- NV/[Z%foZ<1i!G<.mQoβ-(_!D +G&@bRC 58y R{34T`fۡcYUy݆KXQU +o~HŒ(.hxGIB60de@=Z)5}ӲKbf:@pjbgFřdQffG5yG#DAuqM>Au¢s gaӰc_g[NJ0VW~O[΢:{) 5NE sO= bd 97rIK %d#`yx܈ [yf)t&`˯:i|*nk 6wISR+B$8<,H@88Pa-` > +m|Ə8jQZ3l>2̴<#uL-2H.%CFN&] &pLtJٯ-)R_/mט~aC {-p\!Za" +-=fW<1J?~ͣl6!{oh+uZClQ&]p.Y:A jdd_46A?N(w0%0^$qA]3Hxj1d徑iQ N0P)x30t8Ul'e=޺BζV)t+'ADv~~e,+oÀY«MTHPzk.X{AUح;;֐tӖN3Dڗ +M~.>0 eK(dFgU[B@Ii N4\"vT|V&E/%8z'xJ(>ot+%;jtBEta*NP갵j.{3rTr2gAh,g/|`a]'R6<:wo2TV݉P/E(s:1wMTD:5a-'K{fPf8GA:22iZ"B+Y.{C & <}by_?m2a+_o~'O??o9?o?U^ 1qY#eg1(B*PCX(`l~?ⷈ=ZZ0,e?ΦԞ'(K[e0zP +(hP!_Ӑg'KlTȳ\f~Jbm]vC%Vv[k~}nH*=V0E.D9bl';AM. +zgHg>B~4OݎpBAx`ƭzdik>]^_\1ہ%/d4f,86.E1|wz4J8+w/|Cs(Jb\Ό#vPɺ H p=,ΨMe֦b&.90%9BuF h.ͥzn$m*k(=Ufj+ؔ|QMҩ3kc'&VLBcFUL7AijY]|__!*22s~*sT1G0dF#kqiJmݜ"".e~:{SO ػ,dy9rb2e +(g +Hq +ƽ` +A)d W ڌ)ٔ +\A 3ah`krhj+P@ޚƚ?r6!xU>0K3r A% y'@kv;bqd٘JFT!/b-uwָ{Y ~R +waf{WD(. ) _^]_=!I=z$W\ªb&v*QQxm:K{Q#āg___[_ٍp -WOсdYQ[v/W}Xh,(Ѵx.ihz&0edi~%GɦiņbcχܵQAWW +ngG 7Hn]݊ă_Z{Hcj CDM?z$7F$Myxbx(1ro;Adaܤ")':6u :Q:]$TMy%A{^8A{!T~LcOBcgx}iF+uknUCm/CD۟/W,kh`TydvP& +%E$c@)KNtpIС(q*u +ᕓ~laɚHS4%ThJOk5 R+7=2iF$6&3wa r!=1-._`;|U/!&vT#V'Ju +o+AAe"^3s95',b~5 8Pv+m@ʆ0IRUMĜl*ͨ6ڠ;ޥCr/g'CcuȈAz!=Y! +KUЁ]gV//9-+ KȒ$IH;MRtJu㙥x+'pc?n3"~j#N +8SzW[L!= qq% | D9@Yd%?\QFx@v3jxC +-NMԲؽ@@}D VSh 9,Dd}oٿ!~j>{>B*]1XGVR<:2Zؠ7Ǜn8.lGB1i٠$v }YMY !bR.R׋p~&{}:. ላ61}4Y*"u{5Fwƶa\`˫7a +RD>?%+׳kUMX8XpdW_);>k*$m`,`6b_z'4zw4-6@= /d>$X4{n<7X`~LTM_)kASF+.P{F85wA(8~4|Q+[?Oa\QC g9Lg8=E+H>cRTח#DDgP<YH--ْbsh- @C WِwPSk\!" l/SOe[aChi<-AA5)iX]O>~ ^0q[/:ߡ S1Þs4V[7? }Ek8%OoDhyr}oYg7j"$uhI:gҝ)h 헴"~fbzpk(:ᤁ1i#BeNYWnydFf2nx2m g|6r+nzkh@Ai6Y|{@[=ٗ98GvxpȾ(-_CZذ_'+^팯P|ff(7]FYLvO + +4{To!6|D)23-la^>ozHǷv[iPFK8CTSqk/ԩGu|զVFn(:ylA:/PՋFt "ˣ32{}Q$)P$bhwY_`}>laQ)db 4φo ݅Q֞sk)ַ" PyԼsa\a)fb0\~{f$f~sjt)#A +9?-P7w~ze!8ǘ!iꑧIh >=@ + Ȉ-/4&&O@#xJCt^ǹ1|-TDig{Y^TTrXvnTB`bSO=e!DԎ,4͘#ħY|Xͳ) XO޼o iEHoz bOnf&NH`k5s [=~{/jj#moJD SU݁`c/A>)9QD>U~= +sDHc:ǁ`!H#Fz"6epV!bqij>O={m25GS09"=Gϭwege"գ^ss#к;\bwLާFy+ =]ds{T&Ad_pfq-R$A! &h/,š~_ML LW;L3 Z1Ɣ(K|H39t $ޮ5`jL9CYw.2 qvx%FEMhV`e4*E}Бa/ A`ݳ +OɽBE<J tޜ|_ƁqY#~ω&dBK?Ea{IwV Rj.|-ʭ!5M=Nf|-kAՠL0>5!n&eH4\{ 5߃r@'5': ]ChS8| 4穂8jQ*hOlWT#A:yЗq2di]5 +==rfݘcyǁ:l0)ࡍoz4'ޭ!y)Yz5*s_\ͅVu+Ҋ+ʣCڅz?QsHqgF "C;C#'g8Uڥ{Re&*X\l;v[7hcId+s:lk ͫZA>D@٬S='b_1ʊ-AL*S}<2;o3٪PĨpCF(Ӂ&8c)g@C?mgq +/(CEeH.? LIb?bJ2rq7 0nOHQ p󿢇|Bb r\9t䯞&Jj/s\Qw5PlC[ĘBAY(rS3TfLT]YR-*l|G0*/ǯQxfrFq"\\ e \?kc%\ȇw# !\gsZo:Su }p;έJ( i@yVQ[JBݳu: 0AF裠3UbT@:Z2kL# +LИ-΢#O5G61X<#}-6dAACFEN0f}X4DڢwgG +TS:Z3sG\Y%ؘ$MwЍIUUeH6s\+ߋIʢG!$5@* \ +[)&(jL|H5);LB4"6HY}mk:ψ"^ip4/"K5$AtOAg+dQkh32R  Af~qփ{ȔBI }aK-ʊKwr5ԖWʯ1hjĩ$,1U*MVFF +4^^{r8=,r ZQ˟S]1%D{{bǛz%3Rnc9(g,ey@r_c~%Ʈ>ܞX-)׏r'bߧB5F@ԗ9 S}}A ~{F&7 RL+~%,H  %Rd@:01S6ǂ@ɜ7A~ 0}_4HPJ +w]ݿyrVƁ[HcuċNB)) }'`q,V`Qn4~/j߫>+.ʫi 8%f|X)M˔1)tG"kvwx +]v)!xXpq@ف*/Hf'3Uh75ĩ^AjCGBGL!#tv{uc/܌ \^ ׵ɻn_6T{)ԛ4Ome <=1ʱ{1+ 蚟Z UM<(ތIi7em~~J۞0&df.hHN VHIWկ3樋РY9 I xҡ #n*Cw#(Z~8m%|:tUHS{'"L^΍a)`< J,Y*nGUw7RPd'C8u0r눈ts(b&5p6I ч"%;Qb3 +Tio>y)\d(58Jy&ܱ!^.3uqxm"($u v_'𙳇MT;l;~(chSs?Uv9=rQ.2SJ@@س}"ƊjReJB0H1U%3MYW +֥N0P G-%A̧jTvqB᳜{Q~>gbEN< {w`vP7R`=k;?YPY0-5>Şޠe u--&I 61kJ֐y +U$1wIbE< +̍HYcNf"Go% }*Ytk{r2`(1}Wls*\dۇv#g-(3 +!q#r(}L؈z꽞jP~Pm¹IO녬c)t)jtP Jp '}l\܋tIe.)d9"3" ub/LLZ,ZOw P@qD-|~Gm =46 HNT-i@^,ʮqϕ`{~W*~WmZյJz +J6p9_ʟ|H2aN*ɒ{?s..)LJȖ9#C/4SCR;%Y~U]_2i'oB\K2ӨYfC!kC̨Z{/7yf% h)¨S[%8%!@I`Ʃ]wEn3i7V~x,6H-64+Z;Ŏt:ePIӾc/Vzw$3UݫP *q> H!\e#ٵOz_qvJ\!s E+|tCXstr"ړ`/6O&EE]h1\,}E$P bqQGhPqNq^y7N+ 4koZB_gIF9r&(j;< `;$?ҙ5șY2kyݭb M;B Gi*2u@MqvݫS QO9z_BMԗ .II&9<ԨJ[R@ #Cl*dS#-/ӴKhhnB[D{|zd&n4z>;)qRc903xsm R5VR)u(I $#.3]H [`@ߗ]Ƞ.=GQ +fZjS5%= `8lRnmcIL ?;tP<9Ĉf!Mi=4 K馔]cȦMXnXNW#>h SPa/NbH5:~HLՍ98u^:rfpPkHv򗸞0RLz _ z0A7tS!89,.WIC6|R=*DpmePeJT=6Jl8|;2a:\PVQy𐆝JkO0)ϚNBF2ǍD!~ҸړX_ӡzi~0oWT%:?$!Zh}PvkY rBaֱ5n +ms8WVs_n)z;5b-|N d Z"2KrS#j-fHyCB9њc(JMݎ0rϞ)ݟǤu/堫₂p6Œ3Z 1?p7k D4Cc? m~AiݛT x`3[W S(g`ȓL=ZLEEp$u <}hgʬa'ǓulxĝX]WTm,ifwmTEaY{kBC +`/ (+%L&㲣† 8giZ!YcZڀhEB;LQ@Ƃ**sGF#)Y#<Jg5AޒU\*U81 cu[,|iE6HwPC.ܣrţ I 8Y +M.ilp%<+,Ĩ?p_wScuRD@Do(O[6JD${O!TA$wFFkOU4ؽe_aRI5G9LqxÅtA>z҈Pw!XB>ZhDE['&t? h(IK'ItHNesD'_~R-5|$٦OI¿[\(N5[W5eȃZ{!*I49yLD)!^嵭5  ɒCJH;kS + /rJl:ƒ @ @5Qhz$֕QU'8uN7If?v+Kq pbWtr Yy^.&|iD@M6NT*A|A̯@^^L62 .+j($R[ԩg +p^ +2Aѿ!Ѽ Fφ[?s?PnPU&t1uCH~{d}B\Ǥ.o+lѠ{g;膽]QV0C{c/@.}PnOcP ;c>gJ!{vE7>DFm*l;^a7x 쇞ңECdljYcCnoLq>ngV {2@KkJ? Vow=j-Kz&nF=M BFaPrLnxj}j,fif ~#nl43eHl:X\ %"~y\G[IV }׍ªkL^ +ҏ'AXIړBq*6#HvBf`I𘋒8!c0}`f :gQڜf;Tebܾj](SRc cJGAz\%D9~w A=fV6{,U &Z:umIvWX~(#G X:[7(}#ڞ-ӡ_~nxmA(mՌFD-zJ3%wݚZ%9l2ݺp<\9F]IH>8}cTfzF:kU{% )4u@x{MAAahV%kèW`Zb-oIȷr:lx 6CsFIl'(q(Xb z iwUhZgY6y}W7~CقdT h`OCɖ;[ثw6=dqX$91W!f#$SsadW%ˑ_A;醙!^^[&L̊EUoO|b>xDM"_&Ga3{PY.i}I-vP _J["@?hGj8|+b9qB"th2jH<0k`[Qfce}+XBs_0ucH?]UD` j5 f2g\;(:Z<^"?] +,% b]b +Iܳϛu> Z7F5xEС~i }qL R "${׉gCL523:v{/) HT xZ-p}{ovHtÕ ܤsHq ɨnd?BSͪo:"[f#8ղ E k6 0RfD{Cܘ$!r*6EG;5'{Rv5| $7 .=#--zu.sX_T]E$6XhrK +Unkпd͝:φrMx?65!f_T?vl?'x4"Nvo0-.J}3v撯5tER 8u(nin=`= hv(fM0\q|7A{_lR_<w*Т]d +2ELJ, +BMOH@4"2{ @G-:chHi+tw$ @sFPZ1Ykr#Jtd`Ugë[NlEB2䎐z*Ro&P# #7Dc/5w601A$yvEJW̠V鸷U&>ßjI= +<&& Fc4 ,/{yIqx|>?(z8܈7ctʺ ؃@b4'ֺa__B +1 h!Iq.: xpmizShBY'K41YHowaOP[ qȌ=SAեQb{K0 +޷0,w +; .ku-'Ug'\R+ټ}o8=R =ڊT> 8\$w-ʾn@گJEXX'׈.{ +%YY!:2]4^&!ddܯϔG:=B䙊ڴWV~5C g-jFGaGy]hPyjL@"j(9ota8yE7<Bnl +-[1v3\`p@GoP"gcw)Ri8:2Ɠ|} N +U&_=Zo0Tz|\>> +{?}R>^o0Fa7剚bHo7-߆xx8E?FZ)r`?!TFz kI{9^9Țp﷋p0P&lR|Ư9lEtc+Jd:k):@Jp +#o$,jA2Ee}gYwr\CI4בQc~T@S Ͻ/aү7uTMR +Ͳ% a7hO9|?!7ZvXCKZtI5Ґ8\loQZ'j69-|qf309tl +p֐6D,Z^ + <fܑ:]89>f>zXY=[WhzH#Vog`UZ%5O+ȕp]uСI$ F/7=>˪<"K@e{|mL_3 "ퟺ9E,E]SDÊ8GzoݯhcB|H&u+R!/>R F %}D )M1H"(C|OKqK"e0𥴃ˆ11XnXjNxrߚ2XY]b sNLUMb.~YcN@\9&}-Fۢ~YtE|?P?dDsd폿7?'?w_?o~7fo7o*ׅK8\ѳߒM}Zݢ +[]an=ѣ +Az/J2;!=a_&d;Q"\ҋ+;K".P;a^]#}[A ֍n {PF$X vn r@ 9OyO}FiTZ`=-SVhc:SmkF]tRW{7ׂl"O} +Ej1 $pS9{6㕧-Gid)m߻|x;놻WxPR =EaS7IBZZxA=Dڙ}-=}D7FtݰFC=MiO~V.a AnC\ީ9~iϘ e7ovU%\!Kq=O@}_F0vc L*uH=+=xYMx58loۯ)|u3wTVg6;M$ bӭU~O4D /ߣ%ȳԨxFLH=o BgnYlfo'P=[7 + umt&rVdk5ulZpi:x]#BnݠB*Տڠ`eSuB(8ɷZ~:3C!1zUHX#~jzxAI%z50z`2(K%op' v: i\tZ(arc@==ޮuRyZi.h7`(}ك2!=@08)z*v=EĔI0"5#z qXԻL,̄7}Gz`Ma ' +E+3<g͌өs56ruw梈*I0_x,`te;Prc}xvNCvNR` +<<Xp8ؗo2?+gX!T &ma"~}`CfïKӾf@@DF-ݭE +}q + dS܃(tuh`|C&gͻuo3N ɚi~@⬧G.t6֋BeMI܂OQc&`㝻){>5)da#l}:9= CBr~s D̘巭#*HI<=쌮 J~O dZ{]:0"W{]Y 2 +>>Cə,Vp0nU _uΤPY4 "|@ʗ `ebFL8X̏l +nڰ]rג5utj# U2ڛ)3T{~qgkэ Ƈñ~eWU(Ze 7y{i'%h O@ܢ" =2b.3|Cz?cgSJ軂Q@aJh7J{y|Yߐ99<2 Aگ0x/cnRD P[vEZ4V3]mJVgn;dnuXY ~ A"!Ec*hށ @` 3CێګUU(e ?%F*{z.|mV6uOt7y'JfeTDħ]WXƇ JceэZJVpp4t( % :u$;&2J)Bd\vv,(^/y5t(|4挴ڔY3p@^=ToށeC4n=BvSYr0BtS\")=о#4U Lf#/q*YoUaQ1Lϯ-/w m]pڳɕNg1>y_-'Ԍ>ŋ_>y4jEV(Dsc#Wz75p4 /jq |p,%~909];[?AiA?)>fEFoz(] +D *pTa#`s#2ϻJ0f\ax وV{7D}&\C@-;NGpj[sg]a]\^UFjDjܪzAU'Q"%$@g*ѴHOIlЛ9p 2tO_ ᕙ9R3zԂGTR!/G}X~Ta zZia5xŌ s >,"ŀ8yuK=n {( 6\_A[vЙ5. L°%;CV,;)v Ya˳0;pcޢq"G5i[BA5B.,vuXVr"W&F"A욑PBǥp?ʡDjT] M#]%+{s4Y=`{F@ +mzΏn9q`]ZӐtH!2Q?&ɍ^xĎcתH&82S.Et4~{U;"0P 'aR2k@q +H(s3}=:p6J]~S-`g7rR G|jH[]^5Iȥ} '+3TvtMEPQ͌L X8W@5T9 _} +7!hKNqa1a|?9]7BQd6-pVXf _=)N)ftZ[S=^ IWeH^MLY!H fYWV2ZduAj=}hу;c]u&袀GX8=zP~F% dWu[M emLyvlaO^Z KMx>E\CaөSS2arǸ3Wڍ^mL"}2NlȵDUәue"3Ё <=[pppN4.Ep0=DR ^П֑]H'd@eGj0廬%jYz 0(pbVR~F %`+Nq-BHI^ +IP 9곛=S-QJԨW:; N$j={v +d?H N ^4F}3#VXP+1bU&4BBzTj\$l+`~d:?jsnWp;W>ۚ}DkqlV8ۅR`bQfNz (L7". }{T [AJIi:܉(&Yѭ-OuE*}cCq}#zz +t3L"L/ +d+δg2YENQ׮Ȇq U1B.'?#$hm,<|?0"x◚$nVM=|퍘_?z\b G+ MƷDѾ1o^OYnSw3rP + +dM' +;?)*LKg>xq=y\veh݁CKvj>HTq?;T5m5~6VX!Uq48#6},@ԀS7ܬ<&Ț2D$ItA;˴{=t\m{s,h}׉"0ʛWNHW C=4PKWB" !9AP[ƺ0kѡ-AA$~ 2_NX{=8qiEɀBM%DC!X9SwcSN%s\1K6# 4,ݳ3Ij 8.x]8.eEo.y(РyAY⥟uANA}aDi^1XQ`GlE- y0O8mN:5v.l`CN@cO5zy`Vj@Er=pSbjYnjq</ =)`"wh;G=V*a,z`6wDP2p ]n: }#poz>Ar&I/̠>Ua62,~{Gf!}X"K=2B~q̝=1$fHPӀXfad"{  9Ar\:R3 xφ)Cϛ^#@%Ȯ][==lɈ ĈS!&Gyϩb>E>f*3*璇{{W0 @o4pOU3pû[ +)\_[Ɋcg(=kƌ̟Sw7>Fwɀ:J6D ZyqNy6<jw\ғ%,X9\s~Zh¾'?a+E6hȒXpiǙwmPʔ+_(6k_ȒဴTDlU ݯz 2u}a=G\[9!{7]$dUF\}T %R{ |'`D.'XpNdF$ +E/UiX[` N n+ֱ[`J 'L$P^Xe@`=]%gD! +?ܽuxjuV gRu}GW(yo=NE/e&@[8x=9Qك + [೗ ( )s+к((pm۠A % 1:@7u=mԶ$v u%"źr`?<R ozuv{mBSTGFNEKq CpQ% ܊ɻJI7T{5fweVT'd"l%ɇ>?910/D'x%%N|ڞnNv{C׊14({X(:SW;2bJvE-HrG"~@PhClefB*>>ZN5}#l[+rZEH;uVnE7&'PȐQ$qW5m.]v #.{kٺYБkMYJ³=!\9eu`M;AxűAeFBp 6l;]'7lQ T>KžBJhp!%7/k!ѐ1u,r* + ,EK{=J;gND[b ʠ@+fP +yD~ySU/#߱)C歈S$+fTN޾qj,|PWl.c[S9L̨{ZaIKs^Cս[ᛙ={SX  uK6>U-&jԫїY(0=@D0ؼM|{چW啄ծhT_F"7NV zXr<'byAؙTIKcS\:= TrAPfzr0z@:'=1@=."l%QeGXCl 2Jue˓ݓV[{5S€s }eJ|w%s** +D0r`X(Oa{Ny*ՑPH~*`CپL^N*:1=f}gT + pޘ_u_-%qX ('__PF14ȪƉr>Pc M&2lVW"apė{°Ga n`=_CV"!\2a +( + %$؝TdL9L'ZLIsu*e+ʩZ69C _uɻMkX>4tDGv`>^ K0}!ԫ 밫#UCԟ Op"?:FP]@3K_gKFE#RYz/ʏBV\7ݣ857 XwA6b-AȄ5ciP{h <V._QcR c *Run:%nM `9[BzxHxkBp1ʯ_AX13zxUl>|Jа8L2Q-+1Ldn~EعD4JMCn +g+`GɟH;>"E޴C%{RGyrB{kipqB 'XzD-=*R@욐{/DUIqPph\F:H_c+ 0YfM (|XC  Qj$ҒƁ F!^t&wq)6 +Y8ss GTp%HL7繾ɕ>Չ?~X`R ^fUI_H퇼rw,0@JQ\TEzpmA%Bt9؇\YDub'C꧌I ɾKP$ 3l*A67o_2y,{ab6<3^d*(QfcK's+Վh9~lV s{p䔍Cx-,Y(E͆Ӟ_ rjgM*эsPHwKPǗ{trܬ@] h^c誃|=U y R6Q0I޾<޽@r}%mn)|7ub@Nzt4wT( ?wpYVKmf OhADYr]DNys/"v* (`hi +. +7d$I2Q]>I0Ge^F鋱[ +Y BkN!RzyS,u0ũp͉hC+~4};DŽ͢*A wuQ '386z + @Kj*Τz 1x+f6T +ʦH(Cq]!P{",0esɯң4y_v[JGYK|Rf:=Bh+e1Py 9$>Bd% )nbqS{Oz^vGE2aI= +a+!s__JGW +WA`?tYR8- ,JeQ hG$ujY;iHJ0o Sb SxdWg^n(Ü~ܦjAlo/$)fUb͇ʢMB]՚h'x؋:J X ؚN^klJ=x{t5Fofs;rѩ~&{_|볼 wCy}/eJץ).$3:$ =p s@`b6R0ͼ(DywrG :w{谫sl25qJJqrg-h:9 +ş=7aki} =bNvŰ؏9 >T+=B2n6n v؟;W 3]G {=xkk,]'8f]Qs qXl]x}EVyH꩖;JaXP Re + \V^_+$]S ) 0~_TpCRD%#5g#ث?+؈Fy/LH{/V& +bU+#n<ʎA52M=v9v/LN"sR@j^b06SϠASQG(r׹Kwt`F.SZ7):#dY739c~~lBd:[8` +68LfO=F(vLb#2Ll&ĥylԵN„&"`][FqrᕮF\gRi 'j +A%l +Ĝ _gD_8pmN׮!ؤM< hT;VUrE!ɧv+&}h}(w>};kUWE)8# !, +DQ#WDt7@YAQ'I|vG,[X ʘ){7-E"۝܉!YvvUWΰ~H޼Ie+HPp,F 1،H_xE>v$%߬%*|wǯ}] W>F*&%FC#7EUdo($̠H@sxbiKﲱ{vZ v1F y:M +y1e2J=׵ +adᴍ]=`(ox-ׂweOE +k¨O+@k-V㵂F>vmTyUii\c31|Jp -t*AA?WL9RggϼN;-Ҁ=s!ݦ.*w}O$nvK)ULj Úa/fsMh0 +suSH"" +ul +Q3"xNU"J<1u$Y"e=S`éP1ɖ457lk^}I̭OuDlX}4+Etl: 2dnke p~7@Dn\qlw% Xqn>zP;3q;+9y^POKL+!^oJh@] +>UԱ^5 ~${'}!0SQ_4\%wo HxHK\. #NW 843-#DZuϡ>Ι,P X;$s(h4VVrĈv;O_ׇ}424´/H!Q`(]K(f@6-WN%JFTgoiu*:UT4WFroC&μZ PaU1Y`)SI*W4s,ZM| JDel}B>SaEmґT0Ax26} %Q\]l1N&1vgW+To!/2'HG~i'//Xo/N ֍5AazM⫩mYM͊Rc>h" +q t/N ]S/ ]b#!TgEP}Ak ݢZ`q_9*PmoY26lNpwZ?Vʇwr%Be"hoAAI|zq] 2WoQs)a79%/1EsݲQ=o`H{bF MIpЇܲg=g(8MݲQYNțP^U"z= 09~}LUc 죨*97Dcr{ꑧ'osׇJfn +A~uH"\Q`m&u7%Of0G2T0֕^ XRثw9RPZz;GWRm{B<$m糢p"G66%C6pH/FuGe8?m@eX,Z| +(yԪ +S!9 +^X.X$?rLG>Cl[vBd [Nԕ^FFCJLqbjRe-{|Fy9b!z3. ~ YڳF qN©c$9FhxƜ}E|Xb2ʏQhXس2 eڨ1M;hJlV7afUʾ(gWA{CEZ<}).ёMA8,z#(Y{?:"QHQH{_6qY*P9fEDJֻ T1s|kp@w"tdQy-yZnlPHhSă^>'?ޱV%% +r;3"g,Wd ' (?D#FFSQ]mtIĈAɡ @`02ZJ1v *jqlWe^,>Eylۭ+0~bK zȱ8 )}<_Dr澐 +gtf|"3G(P3Asgk@cn W3nWy)YL&D #ڎxh;6~X6qpzŎ:i7D _ \sNhr)]B̺y ^вI.FN9 + BoG 3V@߫k.2>/5Qf_ϰ岊tԘ>Iu(CǤG"6)0*:D:@zEwTY)mk% &8P;ꢘ (hfg8d($k:O^2|%6]>B&F#jfBC +oȍ@bՇW:OAp]b1:qn"̩"li&^1EVC) +=pۖ;"@Mq`\ۮP B˞f]b&p|<"M2[CQ20gЀeU,:= j#F<*_[C>JHg> nX*p9%3Fh5n{*Z߾܋Zn# bn9`8Uv?+@6ZKIJԣcV|tXtnu P6 ,fYUG']T륅- +YM@I(wZj2Nr U  Q/6.X gp>5Zp;"ñ"@NbChN]>n xj΍V$Wş%M" +24 V[`9#<i^no[צZ] .wfP$4@>k/> d;!tMy3aH@ю s)ɓz:Ya=.xa}/:iE.R"qÈ1t;yT`bJCxyT Dr Li!B-gLI2poxiWc &QŔ 7ѕ=yű +8v +j&Z2@xo܁ohsE[r%`Dgܜv_NMP | N~ozD +RO2X|> 7]xٖX_dvMnu$gֽvƠy}0XQi="DєD؋"mP .o(dJPtwRUZ>0ћ% G{!’x:pqU9#%"H+=Mv#@O<#U@񖎸m|me$LCT @ig1z}y(0UQ ]Ta\?gQ#4%I1)u4dd(H,ME[ Ys~F[Fξ qt#nLn(ᛢ~o|A- +mMTza:_a '6`y@ȬIS+֝]_uJL}Z~ᑢ"jj6GwFץHRu t;e +~DUOsqG +v T`T/N!ڤ} 8SWF Nl|PaDB19nDeD- ".eyEtmy;8wL,^Zɲ +S^kLU!#SR PLi/ԙʈ##L S^T#J_"gXW5/ ?@nn$$Z5Q/iakSܶz5J0Dl}Q{Fɪp%T#D`ש"W\?ӂ/@I['M5(~Viܻ$H|YXg6E_s{mЭ:^54Cޫ~Aߨi?1]Gt~PĂYg0N\串b=94ēj->=)kycʜb?{" $f#0g^ᨊ} 5v{{=A}"rK9iG|~>l`E:^Sc+PtmDyI/ +3\nV TsU}eɋ~p CؙB: tX|K-\" G"Ku3,M ^}5͜BRVD4cq\cy*(ׁcjZj R Q%YQ8PdCb7lwQ Y ++3dlFF cG":R +g}r (1{͑9H]:R PJDNtYg`mQ!9JQRGǔfŔ!ɚfCTTJqֶ7 1*Ĥ>”()DQy7Nc>g]ƹSfPG3k +6Y;XS`6-1+c[nAE>!u)a1Tب8|YP8cO;Z"@-9F)_kS$g[]=pFtk]oD08 ^sj&m7"9@<~yD[5iVҸ>Jw3Mw<8o׏kLĜ 3y}V -¡YdN׬M@6Ce"4ǹYSV t@]"n*@#'x> +7ఉϩi̪vLEu𓿇(36ay(Kpb`M&}fAbU$6ޫ/gDyJ#4nޜ MVwnWl.x+33AL<{ +tEU5V-p@mÈ!*6yq"}eW_(9 M0"dcB| t֙>^?E`{{xv^PtGaاIї0Q<бɏ +q{jh.e^Ǚkݙ#C;~;J tj +kWzЫCboW@s;x?dʾWX^Hq?Cwʡ20zDZHgb!֔*2+9]nFshXwĽ# [w{X)qdy൅@U5w{R8\puqu:VhReU'M+PJ%^(>`DZXcԎbӢǥw[zة;IҺNfjW_aЀ%V8{ċ{J+ۧH{Y'T`}߂>z+@} ftOH@!$ClДUֲj 7#ӨAOA{}`!awIow_SOwӿ?/U_GYr|U Pt BҤpZ #ܟa +"Mγ_Ew+ +Z^r񤕬nLVQ*vHTu] Η>2\3 cK8D.ݒKcиڧ݆QG=Kᵮ 761eXjtftE´FGe1MOE˄M9Z`tVVUhgM*s8TuPVulfiW :aqT*5ǑFFoCi羔nІbj|Da"e08v9UL8`RE9=l/dz䀻aW}!3!ma=s(=ZC~B{Od1U<9%B8{@D ,.uǹ!;1-פ8(ԐcTvDv6@Wk8hih4UHġ#3u&1/MdtF;&5;*C=B(U0CxMx+h\<9JjwJfp^gcƐ[\> 0o Zo9qеg1)_]s8s)D~'U4&E(. +r&E0.&j; {ޏH?]nLV]ewG5`?NDzwa܉YV2Ս3ZW~ӑ?g bn=Z-@ vֽ̰{8[ΥT}'K[߸;$ XYݳ:ʢӍ@ ͂Dw'=p0S{97 ,eP?9ų ϩhRJV`mZBu" 9EJ\"1ʁ}ُ!lL3f(򁏧ǟo 6ZOb& +2Cc0]$"g +'d@kFl>F7&d> +aPU SYs,_f_4,froJ9YY զaV!ᦩ+%2a93`+taF l(N0S)t٪'vykjFi*a,D󜋞Ɨ^ po%=*A"%b=0 aȸJY՞0dь,S鬏k{J+_,#$L“VAf<-C7u@Y[wXV`}IArn[=W 3z4 RLzNV7О>gP: $o{"Y3N+{Vq#^Cw@'dgkN>"?CFo[ J\gz"`8zIn:ܘ@Xh.s~ʘtSmhψۙZ@硔=Ooth="x?cʷV +y_ǡaY$B <-'"Y!~[  EвQ$URF2C#^RG!̾a(& /{e`3ect[nD͝KڀFzw/yQbˇ\L +ee9sC_QK Mu"Ï8o=M; 4J R;:1^m:7֦v/#!gVᐉKJv;Ts(6 2{h2ʿهIg +y_\"crѝQiH +]>nfdo;:C|nZ +(Q@zVY*`LFWA+qgUCH:~?~-׌>O0.ȳAd~PgDN/7b/U$3B#7#bJ^D37黍 +>wYnpJ!MhGI34m{+ѭJ1)|ǧT,;nҺp_hO)Wp.k[d|@W;۔S=0^0\V8Y1D4xK.MWR0̾s>q]9xp;stD1.U $ǣj+>5zkxmfJj3))Q"$BT[NI`@HK($FDr%52S\P3 +eGVR#Twyw-`NAߌ!>u.F!JWF3~8bFۥw?' htf{~ώAA?߷k>czEey;ÔRp ?FL-ͯ{r1u]iJS\jjl_wiyϔaU +uo{رMPk/~2dGb,峎(2Euv+frJw6vƗ x3*IxƇ~ KbW3Հfբ6"^ɶA{N0׻AAf&p 3'Km)?Gr0rO0,M45vMZ u9˄ـt\;(Us\B{ +/ /:?ԭQ=j!3pDjwd-3s]ƛ9 Dyme>stream +y9N\Т97nx-AfE|IБ=8TίOoOYbg뎀-=p|F'c-x+Vb޹JBpdt_$u#]_O0j._̙uą¬!()$J7vv-i+Sߩyh+(ڊXQ2kr;vvU?t;CbZմSp!$Ï(]bs[g(Z]l[x= %,!Qf1QHyWcy꾥  %1sQN rX" +9U pf DV"*|Ne5Iק"8鹬DLyZ^lघGAoK|FƧZ< C#vl;8rvDO)DTʵHӹ2fqr Nf}{l +A7IЮf0ťۏT^"L̅p vwE~i9$7{>ba맷k![ [*龒<2xt$\Gup.vyS°4_aNmt_4µ#9<*JyΞ" ۜ#SIy VKNQS)8YU_!lږ +Gh ++QYCN fՙ>2u决6x;5^yU!B U 'eYEN1x6>b?"@-3 w-xlu@>ApN%Yb\V/+>8G;CGsuzd]>+뉽qygߊI VX>aU&E%ݨ*9e-=[SofSGC7xaa1Jtpy4]XDe^>K@+졔HG{8}"U=Vɼ1z/u#QN\0̄iu0TLIM)rVkbfxoG$B^ϹƲʣ3+yĕ3٫C"?ԏkkX7)@`(] dS"Iu>5b/s롃 z깷tL}*|[ab;wrgĹ ;f_bgtyQwC@EA[WX-a_?2[O5nhһ sX rw= +@?w}ʹYfU8ZGqeP%dwaP'a΃A! |$qO$#C&.\Ԃru84xsbr"hMEIɯuz;waŭ_p1F}W{ŨbO$ǁg|D<k-FYz_jf3:@h8!+?Xt׹g_xh cƝ8W_A\#yæRd9v^?E(۶ƚV.30@TAɘ`Q@ ӒR+DJW@kDа[;r*7cf &&W.ѷBѣ+jXy&@}3,~^}o9 +Fck#c.^Xmw +Tz(Z:N 1?5CKKlZy'1SjQP~*ϪWqʄ0~X FS^;oht0v^p_]ZdXyTm;՜oiᶷ*%f0M| M0@kkt$N0 +Mq)tvdtS]F܀VDg|4Ttt%S3SzZ̒1sfiiurH鴛?XɑT5nfF]20~۹0C9Q :#=?lQtE\ʼSz]o9_(0>S{w 6 O4] *[-i+4v+H^`^S@oyړ[]ڥi5~VZ9xπBRFD"G:nݜ~AR0ȵkيRI/p%9Yh+{za7h': bXZq 3dCNmDĥ"RL)P?bߺ/!EA hyJC^?#,h1rPF3 ) +o="d1?Ծ!D 3v>GTȝ"(av t͝.<1O«yu,m!]rV#kmep '7Zx_H/P@oیlд>!dx˃c,D]G&=0+EgҨ.=)**-~6Y1sz?,6h^vmv3­ze'7_ïaŋThέ'\G?ڨ t)곯tuvՙ궞n_N)D9>L] +̼ ڰr`L>P\2,UލVAۃXE4 l iڑF7[ 0bs2 eU#fI +I@Y8TshoB(x\!KABDŶ$@x왮NQ,L2c\w +^ */#kq@kx\ )ha1ؿ5B s uTo% \ 9m'ʽ9<LBԐ')} vy +(@38)[JD͑|=ΧffL<@WLL'dXJPCQ6툲DPLntIdHhI>bVСxG~.OJA@—տ"+Vd(8g!ϧ#Xر_f `Z]ږ <n=]v$^ j!,00*Wi@4i`d)LbߍU3tt҄isξRWk{oz8b_!cy@~\OJ8>tMt+3+6'oc^(dH~@!m=41b]cr}CI) y٤@*@pDWqN =xfuM384$#T=6}I~uXƺDh5@#%ձe+JOY?AI>aDw +w6$z۪DJNrA_Y?z Ձ}ItIp~kp+VW鄵]|n-uo[)n /5 _[֬cbaf|UlfRz_ eE)yyɷ*;JPkPgTJ:vOV{F$V3Mmick]$E$1*r:]-!S(M;ukDV֞X^VSρ"#>}BFu?ă+]T2H#_Hr321֪xї@]Sek{o3kWL)@+D8h3a=Z*wg|l 20N[[&Hw^>|fGLvwiѓ~nEn`95J +qC_crGc0L÷!gj+#ZeZBf&B/o<^;z96- sO@(V6m_aqX^/8I:kѶw*h7 +VX+!ۘ+i~ROvܵ((^t̛gGP`GW|Fn_cRYv]i(Ǥ3ږоS~s%K% kh0D5_g:f. )ʐAD6/`M <tNۻ[GCsGS8VPFe +b^3g7e +W;sucl$Y>;Vҵ7 S;LXŴ~1~A?$3R5!d|= ++mG#so%HP|Yu.b^MUBaShTיdO:]:`i a uDN H1ׇ3硢80L6MUԠoR IX˴U `bM2nݤn `C~H:׀D1*y(K*_犽qvOz* pR*F#+Jz˂Ȁ@HotJ➼~`7 K}GJY OlƂ]ˇ֓!4ׄmpz,Nr~7}+,;+*zD +m@D~/xcY?@V*C;6#Q)숼)¶Y'KYX$[^L~6|es&BFc+0baЃѐ>2WRy)P2QA|:STLAa$@0S8tpc + +]^^RhgeM+%LA{sݐQ[=ಭntuj(EϿuq}OpԜMO 1əiEa#"b3۷I5.QQ';!V}jbԸقH/<<} C1; Te0b]L +Ǘz= YhdI +cDpibX?VSw"Uh@jŬ7Mo۲Qv9{>~Ċc(ךWM. +cpd +Q+qt(!۳8T.uo>h+vfmF\> [ɜFI kF@{>,sѼ/yz]%t1Q,'*X#~n:oLJatlB{RH!j{ +Z"ȭS(UYI8[]a+{%H%9͍&Bvy)bhQw3z&[?0}w[|IIう˱+{ +Vk/ 7RCiۭYfLRg@'ި*xzGKa4ͬ$?X|b)|RfK:فO%t&MSvL\0*b^v8PD,ķA PG pk/3iHՔDgiu*!HӀB$F K)P&(KJ A{ ~0OV=xU||#:H)6Fhdvb3ԗ \ɁW]#1Gbah)ڢfkz쵢Y̔V; Eslhk#DІo!#mcE +a4)(gՓ7L8 +`ݔaӃ;t ȧ:% -1T:pkлs[0΁BCt,'.ϩ>)tj`t^/-%ڛZ|04 ? U_v8mY8l^j\%aG}t؎'C_SacpAg6V1=dN"o *|"xQm`(F\$rpw~yDsn\3`[9#ӼV8?OʷI +yNpC'툇k\h[X(º!h졪gϏGX8pm!y("V߹>9AbGمgV,l 9^F>=rQZ0`ZӏsmMitM-wVuidL|jm3ޢdƲHmPG9vuDƀM +8Pǫ n:K2uC Og͋^\N`QԌ,t9͉hYu2_HnM/#ܧRGjJQXsX`FPs-mk$o}w/PdUYQf E%zoDT "Jaг BFVg}+ϢSFϧH7npN*J? GDEa֙[ψ<3{h.0kVwZ)tE۾Xa3߄rɎDI6)ֆf$WXu dЎ3Yʕj[K#6~sVXt%Uq~毌Cx#uSvF(ywˋG2<6n!<~'r*"L'3#upɴ8'ʈnؾ.9; TSb; +Nx-b?ۣp~ 6\ }|旦2/0+h(UgIY1!(PTF\+\ÑCM޾d!,E ?6xHIlז OrP7ն'y/~ғr˗6aU!lbi)YuTr<f0fG{V +]M| fW0-G֣+Qc!2jI+MpST￘CbX!z\gH.Ŵ{"3E0'Fԏ7`87q|X׭,lg~hb/GѰ;,mG~p[f[i@,K,@l=(ˀli%;/ړ#@S*>MG(ieGߞEu{m[C80OmGp+s|`F:Qpp +qc%&7c؏|ȏOʨf-'v8wqȃxڽGQ #ХRcL3FtnwVf Ɍx:u .֯bジ= +D122Z Wwak۫2mO7Lг1yzpqyJg.>L% +Taz{Ս D}{ +>u8J^kK2e@.R$6.,vDVKN5|5`@#w1");C6_Z~EtĮ]j܂@Ye/ 5Fl~F^h❭πU?^EmCzsZwZ`WŘ0kH>L=5D=(AgsS%)@OuOttg$ Q  ] L_Ηl;)hzۻ^ʞ!L??QRfHQ g2k;˪Ɉ#p^a*P$\&9=*iTSD & /aγ]`07wY)d9I$Ŧ%Z:| 0]HDnz*aCF'qXlt91:t?ӍTǓ"~K%)c vSCc +Y++?sӧy"K2ЩĀtlv@UbEoC:*˔I =}#pXlXl!H}|O*}FbT&ݙYe=PW6XLjwFyS ;*>.ȑ;bcs&O_kmd5P` +[ MJ-˸uK|+eɮJ"{*C ؖf3tRvaክaR8O8>.X-_NղÃ{SlӭE=rn36DrŶhb†lZ9:Qd2UN*~>cԤ6f7"w#88 :LcjiARہ6XIF %UqA:C4,fT/-N4 +v3tfkSĺfЈί9 ØTFlF_$0ʂ\V 5Cl95\j[ƤжW=HɆz<;6[zBsYJ+GoOJ< cKi*>?ڲ*0;3Isa:rQ^##$sQ3?__9&AW.&#h> +TU' :(E [aJB΍[a+?D{8P ͑9P!i/HJ{r*/l2oo+✡ؒ[V+Ӆ$`kEs?EU~"Y< +ıV;m]M00 TRv ;8] =oݯ {-pUC{RUBHDfGEں+hؐ36/AL +SǑ7ꆑJ)t!8NǦF(g"6˓4e|/o"/a+YCꪪR]3HMc-w4u[7(:M3'\6AyWgub6rSu^;}u]| +XǛ͟oQzd'TeaZ_WCC zn:צ5T@0gsNܛ}7qzVo˔~J><|Ϛ2\*K{7"[Qؾ`"!,-8\ gy *KvWӷRscƆ/lkGs['X`W1A~Q k3a2= +5 oFQγ0yn<}nl^a9)r* Ήhh8Ć~Lhvr7v52"[a,E5ϯnwfG:]bdgŷ `:5gޯtQܨyIi?Ӯ¤.{9c/V8)Pĩ$[A÷r0o2;Omv>5g|kXG|op~q X aep39Z@d}Wƭ_s*NxFXjn0ۖy2{erDMl|N٣64L|@b+t!0Br +(@9P2AN^k{J[_U M@yG<.#I5p؜Bg_@wäcv6$>^g~ߏWbk+("tѹ5O0Uze;p]qPogFUaHA _-jT재htO2\7O%#hzGiyAW$ Z'SfwĮ="xp5|}{ݠK#<IsYwf2_!@#IֿtkԘ(JfFF^Vz~ϰ#y3q%ώm "·FlrAL?c%$Qy&8 Yւ+\7{K?-OʟGϒ} +ڏŁmQdS.Ua˩^ wAA T90Q@k~BQRU5Pq.}v_&v޺\4"D@^_mT_L%[I'1 e[ N=n+5 ,7N?%$9ϥlF&+_n*,@6h)A{uɃPpې4D·n$/H9mrX-ywճ8Ŏ`U8s'@oﵡ>h7= +Zn|!>paE];5seNEučڮyaZXBdm/xXLA j*lFHSR:\ҙ:$xН|6jssΦf(s\wh=Tb +-up@ vt22(어Y&)z[|S|tqlz,nǟGB#-bKjU@rxToX4eǦwdHlwqT"n (" +{v +Wb)V=:clR-} iTI0tŎ&PD6|D:KUs1qБC['6%,DE+wEMd/""եmQZJ353ik2_Q?<5ϱACZE~ }4\YcĠ + iꆱOeh+G83r֖oi"гT +#ʁQ@ꩥޕ,Df.HF=Ց }]l="@=%Q%"lXZ[ϯnvoxW{Q81\0h1t|vZQ-hYeTH)"Iϼ.; u,CPuM>ZssF Ikq*RC(h>}0b^C VQmU5(x,;$hy~|YD/ihs?vxW +3)2O%O8ז3^ zDۊL6ӱ7%~zyxM}.^ [\J}`ʉh֙7@m΋=ch{|Y_Gl} D^Gtm6Vbn eРہ|+y$;Zo9?GY:ʚ!BߓFm|j &~]jZ54۸jt=ec" }Ljլ4!̧-ci}á"k= KM6^j*)mgUfdΙ]1JlK_)&/ /Zd"a1[m Ry5f8f.gG|qm5G8ӰS"1$FEӌp&8"? +bqrTfDgI"6f JFkU|W\U6쾊nsN34W^_r 2] }=#O_tH􍬲O_ȝ0Y e\Tm,5EX%\V\?t tw{7%Z̍ #sIvDz bCXVܩ)`+ď @6YE4/7`=+3pǙl+I E3#rUR5ͰEP)rx%\W|.$ygqղz cX;-#8~Pv Q'Kئ6qJ@Y֙_ +hfB) xd߫d9I#$ jDe3L5ՇS6XsK4;*)gGh)5yͲckk}Jne5Q5+m'G+sRǘmG;6@&} _U&|WzɲꓔMK + dO;wB(svS|?M$H);] =O[p _.s#8^GyS0(Sv&bbDK}WKq6Ii.Pa@ynFØvFXPDQozdLGbo0C +i+ Fvn Wtp'y-+*[ g^TbR8Ԓٗjiikc)'asjzʋ[k(YXV9y% % ss4wGKX(*jZiO 謁=2sZf6ӌ$I.^eԴn.1 1c>G"Fޯ4/ ɻ{1vW2 X렵V1U7fsJŽbi~UW5CPU#'k8QA`ᛏq?{m;;RٸoXq<öyd/H&6+)g3"Ԕ,vsڲAyGƽ؎WA֠̉})VY&ʓaUT y#ݰ3]HT|Gt Hϑ%ie+M E3#l1g&]?V%hjo&=axӷu %v xK +/wOn%Os,&מlkU9GBH"U({w|̲es/y̢ +jk +G׽0Q^H +qQ!325㶲g 6~`~, "7 LWuj0l 0rAn3x'&," V&\Ϥ|F)*vDP!§1(g.ە#JERB-agRQ*])(TTpCT_V=a1I׎S7eذ(ʼnH{yCu4mL0Fw19Dl/z  z[?S˩iW`f +@nҌ,>w: d|^{JBqS@}"T1{W1oV{jI&vVۂuyKj9H[9չQWQ:W-uS<9/g5ZIfNKlB~BÉBjOi1)]~/T%ų'5'g&N +qā>gJ)%*&Ƙqi;(=IS`f-I¡a-*fNjt:BbzޜQT{-ݶl r|$ԊB+/8.85 +⤌}ޚnDrJ2<Ru> %1 k%}&}Qi~̪e(%iF€CmIYTiҘXe7@d *Mr8W[FB&RŦU17~ZF4;o]Ul9\=Y۪wG<]?[ NY+N| @=ғU,3_[SAlebwA=bV4qt}s"~MΖ-Eȫ`4~a4ԨtWqgfjdcvY+R΅[[5z*ß '"kTT=svUξB\#jD*!&}VZj6?DLACq>#| hөb]ri#!(l3ж}[vDN"oy[ ^kg3go Q9 /` nٳAgDIw.HȹPʰ:Ȣ +F$ E>hO?92a 4?^["t|18=>5Lla0@c,2n5 +Qaclj(BBٝx.9ǙzL@<3 W,#ԉ= S k6."&(w"`-*sВA=Ë=1VoG&|6RT 4Pʙ')$Q쓡ٞ=LJDȆ;`tmrJE@]?t~]RO%G=U*šD#,I}PFCIlHE1wUe*y b +]4n1c~=}GbvGNHEJD^9$| >~#Ml%!,1KPh4ٲO]E)IJH<_e޼=6 NM"%|6CJ2S _"k>28^,7hUbc(s;Wd@mrA+ź߇yh eu*el7jU2ԃ&OQ{OxRoe :ѡ׎M dTeql ۴tiJpƞ=!@xcHstJV-Χadz"2捍.Oo#cF^~a^$z(Bb +PLCHD YLk$s__ES:ӇG9:eS!+9\JR9!~c8 dC#'ZB+p'GOuH3{_^)BnhLrB ,WУ3r3e/<bLbF|6E=Uuuf埣KG58fqtJNnD[0%R>f.r@R"DEȕ&-/JWS &V&I~tS,Z"v+U ]$*a-^k~/nF~lqZ@gLZ)LӬ%ALJ,_2qO>G! `$&F/]r{wDd׸mX1[3݀cl.K(ݲbS -GpJ>9߾Vusu8qX;^8XB֑-XB\ˡ*RRxNׯ~a~'\.V8QR1mPDjNKQ P΁^: +^DJG%*zݟ~l즫8Ant=i|FK@s)QoHYF)-֥|Z00;G +zӐ+ɓL3{%$H*q%&ɔȲ47mؗ'S؍  z@ +c4œb29r󺌀#s_Bڰa =3pmK +A߻^ +gan}(Ϛ}(FXo?TνlߐО n* P(udS-Q"GEP:[B4͐r;*ʰê:3׉]i[G\3) ƫ5~LY2~:>]Ɔ}E52@wr$A7-i-h7]HN" /feM}9wNde=.~]p7NǶco¸C#ơRce~0l5sM' V!Ig3pSF΄yf=A$[v= y0mqW +2+H,ЈC;im>W$]dhd Vrv㈥;\&yFMuRň;ĒJirnj#-z,X(8Jr;mǫ $gk>ԦnYY1 ߫^,aE+3C/"\߹)d&1  _BgIZqcvcY{"AE!c;v}`/RBq ,R'gl,*~L%:ZyYzeXs>LZG +9vSTN)k2`q; VmCE|cU!U\=&yK@|sA AHWdbvv3j5+ku ;ʱYbe[ +c7۶GwAږ5\`tM܁&ՋU`ޟJA2izLfc@ ?/dv*|O`z\J{gcr(k6MhRS&J@l|#B5I5yܺ-V.i w\`gտN*zpsfH V=QbRR㙭kwT|9, dyEdĦ Y #rUҽ# g.5RqA ֔}1`E<3f>SvJ{9RQ.@RAr`AZ$_RKq2aK%YJ=EA#]T.LC>'VsGP&֢K})ٶ.@hdJe$@TLڀ{xdpO L16A۷d*PbI@-ݶIyh|-7vD\&ܐOQ=2MXA:P͝l8bbՆ"U#,^nD=y,f')-d+՞kf`K6CR +W}7206gS0$ +ZG~؎-EQ)h.,P%Sy48%<ֶ[@  PPn4Ae;T{g1:R\bL9!jzh/吲`pCa$]bq6T,귺yב5+bZ7QXGcA 1;yb L^LjfJ :DºIAG`!g֔ (ys00r {.$R،|#xGD(;i1fFy3Ǽ{z$[: ǗeAB`yg-7GLw2T60KҘ;AS%iTŬ + _"͇SJV7nWvL%/&~9וU- xA\TnӖZ]ԗKjl>h96UGmJ0jw4>R_nع%4tٶc44 S^ίP[QG$O͐<b d\:dعAd$>ډ:g35"[)K#P?|%cYrbVF4 +bN+/G=1IYal - hw1G @"EdΛhhޏ|ZBA@qVVZb2xzgQ%;"bՇ8s v 6VTϥVM; JG/ų6U +o%Q)Ym 3wmT1zĀGuk"0kr[c+To|2i-y9T@e-ŐحYF~Smn4c1o+EnZ?oM!*bTTlaKuX)z,L`׊$r~OUva FЮȥʴp +Xl^m fUT0%j=qyZkpT>{uphSj$u Jp_#b4Iw*ԍۗ*ajC [NpЈgׄnw[JA:\h#6jlj -FW*UvcR"1H`0>fjp7.%0 -^xƬC K^DWުvXɣS=c}]I❧$tZ/ZԢu'HF(6hkYq <$-{Adt_>n-+LiKũ)$e PK#/W GK4`bRROoP66NFcbRylpeTF5%ymi5AzYZᕭ"L*6SFMfD@*ψCŁbSz &J\" +Dh.%s>eoHCد8_|ev8Kpmh 5Cf-eSHJBp8J{TXf2 +pw~;pl霉vfzS5 $~}`Xa39N'Go#Ā MgY:@zQ%`}ě% 9#J݌%lL%*<[_M&Eq'YkymE'5)/ 9)~{CPi@̣8l-[DOŒWC[ ;BwMՊs+fv8d-;a>8蔓C@)>޳#q7aځfJmuwjj2Җ~hHɏ=A,T%MQ9}501RpaZWjariKiB"Qr Nk"보`ގTgB]i B% +ҧ)%-aͱ0 +nT6ʡ!DKņv@$&=0"!קCtmYAqߗ"6خt +l&tE>Hs&o+5.}KJ1n:-'C3fB91pgL* +nj&=~A~vp_E< rXMrMe.V0PTqI=qXS6$y$DL.˺@_jG|F@# ߄C},GTo 6v_# }1LHR[ fG2azrLIBŞTog;%qἭn9R|~YX| qэWKMEĪđIDgvv?ܺk>gF4r_!$щzPٯign)7" D݇+=<&SBؼHgH`T?0w:~->-л(r -]Gr&:L74 4foFqO'b>g!x݊+z>#ai8Rֶ%y%["ctOިNDu +-xEoe8$Zp]`$'5F&zAw\YVއYξH;M-O\UY+mDZRXk˪( .~xOjrӽc!NfmpIh!wFn,syVM|$rwψ](JZ>WD֭dr\39ك\⢃CpV=ҙYØޔ_M~+o+dWNJ<^;A DܒDOF{\_K?:$E.HԹ2Ƥvk:)=SȈLOg^A ظjvd6Rdl=8pq1TM42B[l kȉW͚VڜBp~F4y%/l +g +'hk"/ngERZf4W⪕N[wʄ ^/jfl " ; 5)R''5#Bq H yR-v$LԲm9)+c%~МD$'XQjms6JF~(Kx>]ԯ _] >@k I5[/,bD>ṷ9)Jh%/P#GpBurLٿ5LKN [>ILO§b=tb(.ٗ)h7Xh낂nYBUq"KS}P|"{ jɝۑv^NZ S:+ +[?x1'I=c 5FwIO lDf^*U6) U|t0芤pD|jm7_[-y"0Kbּ$c"hh)nOܒ!ɣ0ts3y%svYߺH4,/'I8RB銑;56+ͲEcCl-n)x_#l3b*oVUTW.An#>Ifr S=!eϘR~Ӥ5$FoC`!oNnW5F;&2ǚ+ܠH4sNbc햃O 'Y0_!fzB~DlV1;%vbϿhnLh;9wvCyֶyf.}d *H\[Yw:w8SQFi-66|_@D`\i/tm$GEwUM-&z ɤ t؛ ᴢ?er E(..+؅ stQUe[dP\TRUܦ-`NffY+WQp`d&s̅晧Jw)u)-eQ6xD Zl'uv;`17 /'DڱW{u.&ZFC-Qut0]|Yʍow5ۺ'/ϫ`?Jþ9`;(\tH\pr>9'™zOg~bջ(+O3j1n{N-~_s%ߗXzp25XJ޽vWxյ|ݔZvrb]a]]IR@s>ڈgU\PI%p4;ogz?:T盂΁޷~[?7UEB,\kܙ"-!9*>BA][ɛOmվCt1Me3cHѿI5XyNi4WGթ`ySw&Zg &'鍠ȼ2U?{t[*P'Q2w9ZrjhBq$H,G~"Wy<ΝO + @C +`@#εv1jޖdH@pL Ћr::ϔl\̨6[_Q}3ױ:82 }E 儏϶ԑj$LQ@HVk"J= +D;wJU5}^Ѿ 0.)ڿCJf_S+fDJփ[Z[fVq">28 wGSa%F{ 53%,Kdxf}o$o|`p@G[: Lq(wUv $s G5S\c)bL3Mo"GsX糸iQq6ST\%^JzцbJ")P) +j=3;qPߗ^RTsK\g/7أVƁLT9 F_c%r77CX)1~FWK6ZQJPq;zIļSzk=(oa}wz?<9m8}9.f8|6ŞS]ΩV +V|-4%W~O f +{d/c`؛#a?~D|;6}:pz7oiTtn3@kƤ`@|qweLqiذg2ߝ#Nז[:h7uH;K*'3f Zg{WG>iܦd(jI 5غUI*]aع;M+ +ss{kJ*,B/GRA{C[8YL2=3Luma`o깂z}(G[eҴ<hIŰcc%!Xb6q+mBL\]m'8u*yzIF[86% 1ƫiawEqo}"VaKJլ'<'JSS0rdgPú)"Uמ"U`6A-># WGrЖ#=~R21 +=Ar+:])ul%%_(i1j@ dz*g)6/JP:Q= P'ኁXՔZsUz++W40ChI軀@JA47 5Tצ~a0lΖjӷ r}(LL1-Ti>r'gUoAp<џodt2<ǭ̇ZW'I@>y]'PO00{v76*[bpjW偑s@}ߟ[JKk̤ +GZ;Cnc]nv:SǏH-@xI#)(CmGq>|B&^CJ`!ay۲(j2S^Jb&$Y>.AL/dCз8ߙyǦ"F̲W%!Cw|Gyg D|e%شny|_.,N/,A[I0%]q'Z%i £ TeXr˿,d + rA9y=%3#)?H捏z +Gnvi]vhɵoyacDRt}8={.U_r=ګ| ґ3b׶ߘ9yh."(Mx=8#N1?r?lŞ7a6Qc`|%$E}V;=?نd[>))SgZ/ʔe(5QJ}2 +C sL%`g^J*Jp3^;~S7qG\J>AOo8+DNc =L l a# j)K%؆ U6CaDO%S_oQ1S!EFBϮQ#.dj%$UR)_1*,иL2>ѱZljrOB&s4gB_,ǧ0d89,}yQBxb IzxdmeT2E]T|jqw2ar(@UPL& >E)CCJʾqޙ.4b)I`k@[~f&}MSy6؁J{E-`dbsb'ũ*  ׈IfV(xl=bb}P,4HxDt^ꈒj,"aM!;=$%lV`Gr+G x'9lcGu)Pb?>uEkQ0ij@2\i{hjO M&]/8SE,ty QW_[4W*Ei=N{zqψU.pŘ?ODtj46ϐ,nX4yCWSISg%'(.. Sӧs2zzO#N4!c dV]]%ispUJkƂ>1:)gvNXsv=WK%tt|&} "Oq W +8P::Şr(3ihPB$M1;.'N|9Li2SUW#`,2:jW<p*bXuaIoGԄ)C]vcHS^\~)7aT4D3y""I.P>F۸M,Vkǔwv.Lll[23 ~5qǁ"?yAS#~DJ̑ s||t Cf'.ˤbEioIL XL~=C{eڛZJqRBSt.˔qn 9t|AR|(;ļ;']10쳧7:DP.'=E:ҁ`RMJքłzҨ'$[ЈΟuGHzm ވoȥ)mYJkC"G/`)x0ZW[.yXD6h+@CCi&'Ȅ [EPdOBExQecHzM$!O<7F{4Y6?&t4zMW|-I/ Be#܅'v*oZD27<[(˼jy`33ŋ*34[-}S1k#OҩMO^ S<'(D-PN Ѕي֢i#w&-W&1X,MXR8 +Ab)Gy +nPKU/[d05W!ZT|kQpbXK# j6oMW KP4 JXЛ'Ė{.9^4Zi +p6Uqy +jF`K{Qv=q$Vm :-*O%#5Y]G#ID8ͫzs&[T `K 1uC2y"T{[l#RXAlԆ~R}ZCAl<#Q>ʐ+ӛ_Ϥ^41+ҕRm&]A|L5(!ѓcʜK }gkʬkCKN5щzݝTEؒBHaz"˿J,\ +>]w*" n:&j-тϑWL|P<( @Pͻ=})^Ur߽&`.7aS׼|vf-OؾPǐuYzD1ؠ.MՒ[aTKƿH&:(XYz$^91]~=lՍgxٻ +i4P-p~L2"0%'dCOI~Z[\0P[K3[`YŪTF4xu98Z|F467(ͩy@;<~OsS5mzu|:}g+7+)4oN[ڄd L=p*8~xXk\?(AjS<,FDOF79 jJxsD䗩T b.5'T~zXsi~Vߥ3~WRTSR{F}qΓ?>f}3"/$<=)@NvbRXXAߏ#&(UhP]_n٘aP ;]s!<jZ|EEU<E;u]CUwM-0A?G'm2`0ڲD$Mbn)춂@0|3爺IgT@y%3YRb*W|_IBT`#^H2Dх0))I_è꟟J Nbź?kDbjEt7f@Y?Z mIՒ gZj2kvh.?1y7&iv:Sm> ٗz k V[N'd(M,ObEsZ ߏZFbn=.+Qw2w+N*AdCJdL.^'QCXL*>OTeZ(;k;kQ+TW6T#دڸv M{h6AjwHpGMHD ry +t轳^ÉdqTsrye9o mh{=rj'hfg59/zk}KڲDR# _+z+JD/WJ˰ 1w{֜^'_Ѹ<]nh۝DZlh*zXhȾV@\+ d+é/](&I }<;eA axgrd1yJslFGsψqGXu(tA{J׫J4d݌KÕڇ.ST9S7O6N.y049@)!uVT +|lQP rxDCX$Nl(ސ݈Ð^hW\ F#'V  +ayR$4yt# qd2$>D,d#PȂs})@fe %NM3b)%aMMX;};I@-ҵnWaxwôJ*xRbK h_E'R<$6.ڷuv))u_dMkQA~丐,]^\k];a-[U/h{<)3FNDpOS + +{^}hgwcךCnŞ`0шχSnF,Ch9+36#ധH<qiRtԹ4U/"<1´0 +,AD,&l: LXzS5K!Nϥ[Q_ڮ,q@+;ׯ`)UC +hЕ'ԑh!2}@ۖx{h#n,AXdċT41PK6"rS׏Ģ|fγ:2oBG }݀ϰH\[,u)E  3G#gɧ +}Fߝ܆MߝH=#NMbয/jf7VHybh8x,V}+#0BKHÏXs:L-?aRZՓ|Ό0 X\6zUxψC%sżUd,\u%kඪdn.Da{!3j;˰FXVO"b7oй)t͜To.~ÃLcG +qLyF&&42EĴ?137|϶Ϥ97'k|.HLىѪSRS3^oUB:bCm 1SwENz)Z= +}Q`6Nİgn(%J>7eE^ p۰öh7@2r.3QX!AWNy ýår-I2"U]TZve,;=_w܌X"dA!֯ď1iĶ2!lXT`4\5 =J'0F;^_т3퐥 SqIV#cRT,ǁ߉^/nwG-;)};d}De?)#*L1!`RodxGf8@LiX|.oך`tcOۿTF, :e;Ą@M?>L9y)ܴ`TG j%aqy?"۰@G}]*pa^-b?SxX_TԺ.`ء.VLvXiiQ%G2 xPocKpJM7ȎɱGDܒN#׮@LɑJ*t <$-/†n!"t#šu3o(gZ\KCb >ڭu!6VG⎨O[/RI]hp\F̟oMHMt1Ϭ~~|$P̦@xUvR.o"1?X%b)zu$AZ١(Ƴc0#;h8xq*'=i9pjBve|j^Z厘@qϹ#NmZb@&`sI~$R?h zP(TušB)޳[5A` #?sh)m/bh q15kjD >#l̔zlsqXg/NrI{`:AE",GsΔY6Ʊ$z +V9!F0ySױ:E0MϒRTb0ƅv/\#3 +qS\Q!CsĬe +D"BlNa0MR5BbiowM%⇆/@z#}u( XhKa` j@JxGYf!$$[7 `ovXj~s4A)+tL׊t8-]s˙ +f| tNU-f]hrL0 2m.RIVenxԗ m2դaDKs^ɯ3ye6r.1H }z7 e}a~%@;¨D~E +sʡ.-&dV$;EBbES^9x34 0Uj=p OkP͘.B5ř15_VpPY:w@o&g{)#y"bRLvZ; ixSJ1n b(QѫL 5$ʕ --oÐC@ "KrJI@=a+y~ٸx3xH؈ D\vŞ+yPI7ҠE u)ٽE +R` j +8o@5}Ԓ;^vZrVjv7LSL!VSa۶+$ LuPM-8F^# z؄@tN$lľ&[Ōj;q7vyZȹ*u}!t&xJR/9$25O</T s0KGg[fضÕ˽_BZs*T "`wO KV"̺ҙð$-Ҟ+!4Qd, `Bp/Pt} evוF,w \<8;+hlhؚCwٹ4K"AvAIp#:Y\-|\CC&Fpjb` +Ge;5MNB aȩthql(Q>讒UD-HlM:g I) 0!aAR5OzV U)  (g1 +5i+.R>84qѭDrO.X$)X3u?#q>J $پb >ȪґRG1s@- Yns}zz-kI0Wˍdre+@.([#NR*[1*}sѸ0e.H:%Kp+ +D;08GSui^Bc~;JܒlI/3MofB)V8M뒼E~`P`2ɔ:R% sF+!,Dȩ&oYRFQ#b6'u=SU\TX+^eOa+x1[$6DbD{R%j:609fK&}LSr5+h{\e)A ÅKl( A3Z@hN>j[b 4BufQ8&}Ρ2%Z]^@5\RRTCq_xq%gBdhV B0kFv0'!lІ%Bg]zW뼿NGaXs$H'qK0pd $ ><5-4,wd{RzjDplj fF6!ue'33Ch]}Dݹa.=F18>6K^9iu5Պ(PK{v#[Ũ_Hj[DuN5AP(QkMv|ɏ܊JH^Q<*3({c& b2sW=6[[srшBiCZd0m$%j3.p=wԂ37J5 }{ik9FY"9p_pEX:O?)!|0VA}l)Pbe)i{=ywM$YJfy2qȕݚhB5؋%65ٞݥlqhz"oyT.GCJ\\xXK]_gȭSCk¢ҕq{s-kXV'܎ + +XWx[jsxžS2_FqS$-&mFh,xҩ,ʅowoYkjp$x!1Ҵ5^;E(k z0go j&t]t=5ao9T$0=xꆗ([`SV(;U-ݞPJ{#4 +ؼ *&#^cxt@%6i;0DG1T 7%Ⱦ_}3l>^ ԧ&.y#S-56Ϫ.(#(L01BE(dĵD}ug]}ױuַc a̹=B|3O|sG ~9CBBN+6 FN=s 1gmdDNɑ13?VpsgVC@WN6,W`ia[q +ϙR9#i5Y?E&i&" ܨYEXHqN!؉-p>1a@e[;g׃Aj+&`>Xiً:VfxdSLwt:5mUov 1؋GrǖDDC3.<X!'uW!>*0f&ABߩ6{ġ0)*YgPtNJy}CB>_NS9Bŷ&pc2FdxήulM8cnWҮ9{/WQ\d"(^OǐSՎ`n(SQAtӼ#kT &I%Ԃ.CGR NHdA"y)JX3cזnjnr~1Q;QueJX+T_>vt́fp3 ),+,vS E08sO^"" +l9^CQ6YQbtکZٝc?h}Dƒ(n8^M>U-_z"cRk7v6jgrZDsEy'ÊQGSIDx8E}&,`l wT'mʶEC{R.`,kyEb'+ +o|eZX͆TGsf=Qf[sܯ%jsUϭ/[lkGw,JZy݁?ǫN>Z3uaL W'DvrS[C,1]oаDd axM#'E}3s# cH6 +"Ⱦ6*يѱUB(9V4AR=S) ӗ6vgZZ 4 siWQw[IҟNp'x\&8#tNt`WK\ۥKMj %eZ% ._"\u=#QHbޡ ~,Ƞfh*VEʇrRft>j|3\ +UaTTEH~9S +D_un9w}} A x{>N9q xzPcx&*QeE`Xǡ2NE<#~qkJYH?L +lk +dMiBa-B@ bR! +pOɛ}~~/DQeߺ[y~-Bѕ)ft78f6sknLE RTRN 4WHBoŠȪգnxSELd!9gz*Х/3"y!p1-X^ _]}K%8v]fB^C_lA\[~sn:FtGD_F;ˌJPʎj(8 +/uZpPJġay=fx +Rq $I4vY.1Q>[`CPc:]Z&JZg%Zj^: J飔qU@&+}Xiv3yH3CVgP]|&ӋqF+HOyWr.I%ҵӈ]_.[%@ _hu>gRg-ez=Rerh( Hw%r.<3ʟB52'bWAAͲrE (k#Yf"s0ܟ:ã9EF0JFYݔޥ+ R 9KM(3HV$ ՊhغAcM*c=9 ZxtI(C>% $_tf̭VZԵfz,vWUR Pr.I1;QȆun'EviDŽpGsX:kOtd+Tekے"4=+ pꮈN8+~n):2|" w[x"CcY-s-x!Ě/kRvݟ6a'YW`_޲06f/- 6y}F Kmp {4%@SV 3bKIL;Ԏ+0&/}* !32fyL##Dd?  خžmEAȎ6^\ +gA s)U?23űQ: Ɉ:2Ǯar(VB4;f|pCz\FYF(8CwtYT+֝dgr店qjaMEϰ *DPq8ߣ2X'ϰ rײX[:t+;4&ѓ`gTL2j[ j A26| m_0qlz xKWP,w0e{&"WqRe,q*7/[i odS::C=xBzy_}k؍Gmw:S&&5}vfZ U֢`=P!i aIz'աy Kyg@5n(bQ68y)! Op;1|97lК@V??z8կvmCO2|oz_Ք30V fwbUg9iUЍnc!9838(eG&nE@ +)E9"Rmmgt&jkj){">ܲi@AER頝H+'O4w8T]];͌aSkKI&$ +uJ!ٯȎ@-=./eSci9׉kᖏ2,m"n[V;:+v)1ԮH 9U2+ub1FrN\*KIWʥfabVztVң ɪ <2{eZT # GĆimƘ D97<1L~S؟<^͂5![$*gğJ${`?)]Li;~| +M*ʫPkJmpMJ$(KW3\7# h!L6Z5at zp 7#x5QT|B]g| +Qdh*vkAݧe+ON0wԳPˈGj$wUDf:玫b}?죒Q"6OevvltQ)@2ݶ85 N3 +c]~ޘ|? ;UDX54}< j. LX6,?Ǝ t}FC\+l @-[<zJШI0mW/iHssGq{rY.p䦣p[ 0^ à n_2j(b%9SC+QB6ZY;q6A,(mȰ> /H5]a`WT>(Fs$Ӫ_" -``{TвQ ^z }LodWRLV!\OduHkCKtq^s|)E-tInw;jpmbni{ܖ=!a`kG=b M(1ho2#*܆V?>#4m.,;^ +@ĭ?tIӶ5Vm7 +z_ }1i8xe!0 +Bͅ Iޞc#Ջ[u,,zD4]AFdGm(bP CѕX@4YpƬ3)\IĠr= +[!\{8;"|q=&-viO8{"`cE/"ѰI 3y~ +VQ#ƯHIf9Ʃ83l߈+Wa::l5L$gr8=oNqLٞ[FQ'uNEQA%lJrt4M]njedD-l[[T-bqm$;8NJ!XY cVFd5f}/=LR`lEpk06{-?6H4usAb8{x^ڙ=1"fE<2K1[6̉x{QNWU"z~g\(V[Qun;rYvS51a<"䊛 &Ve LZ+^ bG28QsYO3iiLgi>mxֺ0_Tv3۝\a +pP@"(25sVͷE*@ :gLnJmj#l3rmɆ[7>#bHCeī^%MdU !0:}q0:z *"B +hGʩ2UҡygľgtG`GkwJ#$N3g<&ݹ,}଺f{+@{OW<_jM5ֶ:qZ7R!TDS 5{6zP=o +v{i`vψ}JJ+fÁSu0jGR+:()4j[n+,01Y qF 霂*pF'1 n~JJ- p= ~L˭Y䬟G>%&W5 lh,L: >3A^qR7^?Q`-5玨hO_(`Єyde.+Ҋ^Tal6i-'ǕVa5w馅1s`%%OZ +fM{LݵBh#XF,!Dž@ @:UDPfEN}S%i!Tltj~WfCʷJc 3*p`Qͳ؊ׯ+CW+kK|#}?@F֝gVoj$'\ +[| ,Ep.cÞG׊LHȟ4r'tf05բ=(~w_i_y~8zWH@=]# UnD8/ǥt(:VW'ym g*Vbʝb.vBDn;lsA{Hg'S, +0)Y42(V&A}|OOK*mF?u~A-H`Rl9mà("i1O(Et`D 6D"Jtpb;b$L#%,M>6O +)wW)gRS-7>DG xڋ(r~x"D#~ +$l[z#3NdyQR@Q}f`{ħnp̹x6fOfat@̱1Z dRdjE3KҶJ2;1l$LlݝmfM׋= \s&ե?YP-7u#[.uP,bDONR#ZM28iΗM*=+qn&z6"m-4o24aQw #,,gp4\996qE?XF8F8<*5G^NZi4x}lQ80=gQƒmvޯ +LGQHXoi0Mq J D=Gfbbe_J*1V)X~96{Ig#ɹ0gꮼ~1o3p애;"-t߳xQdf aADs~bn5ʪA6wpvjC}}AG,npI0#E:_aHmr^Q3fQ4Js]%FW"ڛYa;?'>cFU/RgC@O +'נ1qjLgyԘO:eGB{.ҕ)X_;&?&š vb+ */c +Y?PPVDu4k}m_)@sv;#9ߢ@ h 8RS.3#6^4]`vnYX[ +qP}+yPk }{k#x>M$^]Nۅq%. +٢YS* e&X,n {oRpŨMbQbEfFDT^ʭ3d_a֓DrN@83Tu: /YTןΨkcdd,yU^6Mܜ{&Ly(:0jeYu+uR~G"VJ[=zcyw3a"Q<8HĉhM"I]/oA$Aղȳ<4Wigjiq`Ҿ460p*czA6̛uv+ lpQs虿WúGE / $r/1܌=R#.ȕrotuAn"\,\Pz-@S'!@V}+lmto tݯ/.K4.#sBjuܘSUKW@>#vEU+?qa}L#u +ᬤɪα[~Yo88$qu +Gu;l= +O$ܛ}ԐE/ai0ĻŒ9-2TIM$3+aj[ub#F"L?sm ynPe> \J_vNVB(a\r)h[U;3W + BC@K9,uA}dW\r=È%*64יbG^c 9ӹ!CYeQ:ڷy d`T/5O~ܥzTx ;W7?)6vrm-N$qاIw@Ǧ;B'QY O'֬Csp\ޙ W3 C{;l% {t.\^Lg_/f[iۃkOO믊2X&!PݗE7}yʤڱ!!XN+ÀYɎXbrQ4WX?8EFftUd㷴9K|NY>l_{zODN\ +!;5!96ەP#Qs*j$N,a+oU8_Q!Sep2wGX7$n WBJ “W8*kN$h* \D`׮{B0Zo?"""^LWGiB!Lؘ:`t-1Qy؂g8Իad@XqyazP?0XP* G'6=W%Qx6 ڬ4DzE0b݋]h%F|eX#T'r\Ͽ{b dG7x*C#p 㷦EVʆނ +͸lL!^Avmjș{A+83ºXL2)Eop(!VvZ3}o cá[!ؼp#(,F"b-D"yN$Tn ANɟ"." ]錎L"PX:W9bx>Ȍ7~% b\0pf؈i3?1֫sA<& K CďOGuF,< *uK a 7W3; Bڏ e-҅/ꆒ܈Wn<ZDQ"LěӺtxq3G(wa nDeƤQDr\X T&;b#?EDz2pc@2=W"f!`8egG| ih맿7V  2R#)L0$MR^0X W=QӪ+iտ}[`q=xq& +5xrP"fӖC(Qz + pOѲQqIǨ$[mCP&jC+: zb5h:[Š2u#K&Bv!6Pd3K9;tP eN5dy5V||qhڲMEb@8@YݹRp3^"]iF3&E:iVyf+Nԋ \:I9S8 @( +H8ՌGHZ\|lZ(~q-/pt͛ +aul+[g:~kENZ0ukw +@׆?#rvKd]j%:K&Z. O>E>nra2隕&XWQTi~XDqnQ,,%ҡEш~g'H+5- +SЀf3}}'N҂@ n9gľm]͌Sb1n0U"kJ+9շ0E5*>#˿RyB%7j2?#޷?}U!pw>يn}qRAhN+~3 DIqh3K}nEn҇@+p{LDjJ]V_Uj>Mhܝ{1Gx3)l nvt̐I*BD:tש]ara,.ܤ$Ɠmt<;^״n$a~hUx{c=[ lm`BS4YqRMQ2р\圗/3EE!/4 +B 挒:g􆭷 + WTQΥbDEBcXg+6zJD94X"6+ &n}mXw:2\ph(7n bM$^͊ҝ`w~}z~uQbۚK6nGI9[{>c nRHfC{1v*D(gZu " exaF4iӮ<MdW?ܛٔYOesGf^-p"n;}} ;t&a8gfMC2g{HB5^@оŮDй)܅kvX:5ſۍ.x'c<3Z[bi:g0u4)d1 S:Ogsv|}Z!8bKD z~L5n%vfӨݚ@A! ow] +sq=--;*D\יh9Ox@D׷Ktm~n0I-%wƃrn}v5;GT{LSThD(ZhÇz9n*.-]Eka3}D''@{GGat[A1&l`=ʌhcB##R.#\:z<ОWD0+ +QecNđ"-Ъ +(f~QĪ>t&m %JmtU6{(APLA*^tBD̩. ƾha}&|Ҭ.e1S@߬٭aoH3h)3-atZu Y"OF괞 u˜D߸B2N@ur 2 +&DXL(r|:]aJ?5 *يzk1i}7mzEſlCw +zt]`=:op.5s %D@=tN҉ĭ]u<0 -5\>m^C Iwoz ۧkGf]p G,JVj&<8k#oT\9m+,CXDDlW0\  =ܱ , g|!Dy>ꥳF18}\pP_RCbiVD啳}nG FQlؘ̠F 8QE}Pz* ڸ2nX`mH AL|ؿD[/אm#"w0ə,:('@@9+ c4橏YU:&ּp& pWm}wV֘u[tKGx&)O`p70Bbܐ}:wa7:V76y!C۹NoqNb8sՕ "-<@'"WTmskCOBOL "PCǾ+@jh܈ӂ;@Owψ??=>EzK d\LRNaJlW@Wx6*{1Iћ3BS1g3dx~8\b"JR1ޗʮcD=,)̞&QgO"Dk Xw5 +FDvLS3vP81q ѷV +>(Q'v_"u rȲ†ѵDGȡڒ;mKqԔKEQq|bu8Ԭi`}TFI:O^I IK1W_EG lܭFdzFSF=uG*uh' %?Y-~ʯP}ɻ~ 7F5tK@5٬LQ8LM+着<b`6u{F+(؀ݢJ;h,F RJc !^@lwn\FrU v?xs[r~Q anE\[ +m>v5UM0=gʗV# k1Dgh^~6W{kr W 䒓vY:m^rOoo/aFY] G0fXfTŬ?}#yXV}Ə25zt7C y7c*)?uy +m$:Z~&V:5iP__?>֬P2.ϓ6r1/Kh30 &[F+8@+X@`F:!D=HC)f&FE0^M]/\PY9gTN oˎvD`ޘXK'w$AG>gA#|~Ъ>RТBC]!3g ;r/f+E8Fຢ=G)c@q+Z/3. *v[h)o>*F}G}`;ZHL-ZwPWo(HD=vx8=sI9k`&IwkFHh=qˊ$}yE%0R#QFD?ҹjc *B &`3HuP4I8&L W3ʹ#Xh70G&z 4y:lofhm0=hlZ=)hJT9(Q`ϞͰ!}Q2Z#oqDxD?U +6 ε*&w(G[[~r9.;Uў$t:*^e=zWlE=6,Q@lZLΥvSkxj(){]2Z <*weBջ̩+9r%}N`X|o]S\rHHBnoxLq=dP2A{e8r2*jv g{:ץI ^6sh2:t|1=+b ^ATݷaҸ"I0RAlưՈ --?[ɯ1^vS,Q?p{kk},%{"P1Xמ֛#pyc(ŮkX=b|UMS^D39_T[SظÓrI7H9jtR2ش@iZOͱCr&Ls?WЁg) #,:S5_ ,p''ߘ)F~Sp; h_آ t3}=&GpRfJpM?ͽAX= oLw<: |Fg-&VA +eZ~(S o:hJ>9| QBk{=QgR sgV#)^rs鲤uUb%>Ңo73 q5 S FA8h5l&"'/6niV:\P/ +I漽^/mys[\6%:( n^uQ"DY*8&ZëP>aH- nmȻ4p S9ZWdOèt]TyVZV3}8`9hwf|VA\q}ktw/Gwn ϲ `S^lîLp<'Cl`(]bnOTpӵb?,O7D{6mٌpuulrIRΈ ΀GyOumڠ¢sND&IMzmBjS_]$Lvi6TӻcGԡBӆt8XՐשH~2eV4uO+ZQH*h;Ip +4d¾m8-}RɻR-.7V +vKm_<軬1B?M6GOW8Ņ xKH^1#\sI[=~]e.?zeqݎx%\BCV~9pyFG?pU]BKfJqY8%c(B` g9~I`7@\d^'0G?8j[^b銞90WI2f<#hX7ѿO=Β 'HaujX2}Yi 9.J62HR7bF<2w5 G;w]K(&=)rJt4׿zUVVht|+a)a^ +dY9Mt&w^s<~ۘa?.(6 +endstream endobj 28 0 obj <>stream +ߛt~#ol:2`Y'AҺir.-Z4rz@i9p=]& 0Wiji +uR\1w`FS߻PٿH`\p%NYMVq zp +x^VU4ѓ& +AHUi\'9U# waܕiDmX-gÎdmۆ농X? hB+sgt+le/ACmh@yWvgFr.Z Q*6;ԭ%#^~{S=V1Ъ|Iܫ٤K]Ѿv&4j,#qL y=?+ⒸrbWl1+h˛ c ^ iHon8%O֍2)ѣ3z5k(?$(E-zIv8)F"QN3{\ +Q;ҽ8̩IM]qzlp;K8"(eU_g!$\!gi= + 9er^S*28ϩ}Az-ct~ +a(@F)~y 7BḳJ""g_Ҋg6LDඨyXF}3d#GĩD{9x[ZVwdbZtWFz'Gێst5~kEܡ53ߥF|uPtwɵ<8{|cRdjѓɣa>΄ ]KuFMDȹv2jDzw+fAHlPB2`-*}?w@3\_ ;V2lT ;Y{\W$; /Qa)hGv>JX.TRGRH.)ׇF)bZkY=7"lI/-8h=6MP\v`aDTQtS$4+E^VkAMpg M cR7Mew)G~=+1mOob@P$4`}^X\5!v *Ǣ˪Fbk-#?͜]Z; ?w0( +ގugT|QB5'݊o26}K[W|om(Q ڈ!"<'3"D$z+-AoTߎڏa@"фxF>xro]/g í\c@_1?7&qF 5qU8o#At2-D7BFwvn5ѻQлF^ e^#j`SgyvZmM$.:G㇕ԿFU[÷nGA(/H1|S<#1*Khې=62xc,@`^m<[bF:+g oq8&--4/#Q@EHo3V$k{iSm;i4{0Xvaޑtpdk)q)w}%47!ſtt[A򵈡m \?"P(SBx>1=0 5abV╔;2}RecbRI#~mC 0QZ0rJzrµ%=~a y *t>IUɘ&>cTzG]$ճ404W+~i&n"Eq~O eӪH2 Va'] +%oF:pV,]dTCB& ꐫ"HX?2U† +SƐA?YYV1`EZ)J~^ė]~+4x)X4WT< @iB~NPcͤPڵ.moUjzD GR#QL,LZ> \fB{z8ʷpftݷV;=h|Sf) WlY-IBHxpH!m]ʊ-m2f=XDk+zwx@u2|mu8OC9S}jT4Ye-V60F*0D{~=H#+ :!w@-~*ߘB(ivhV҇Y50ݐղ}}P3`(ldB|sP9飀}DFb3e;$ ~wzQWݣW=ocO{y cdRG{uK^3z72n6 +}b{~Fy\m#Gޣ~#ZWH +fLo,`h}vUw$BPs4&@" C_D~j\1ª@DsZXBS4?1i޴:䠣[٥֦L86^BS9|)hE>ǻrG-odDX|:zhR-5=:hхFZkkHG`&ˌ#,ӥ9hQxbvg?d +nǴD`m|C#'LyP_i +V 2.4=Kw^Ij"* 1O~}8N)-0Od]۵]/ W 1{kg:} šn7נ&g@DYcUݵ}mo#bxK|? V_;^$i@[S\,SҪyg<@ar[&!.Y.dR _1*_EO;t摖cu5."5C]Grz!ZK8s!8c#tA>aHx`yPMckJ: Є=JfSыL,TԉUW%+~؝GअÁ,&텩?x pN[Z+)2i0 aFqs658XUgwWɫhwQzG٩Uu_W:09A>wfHJwh=R41]=6jbޥnO!@/{I_Eh\ 5ͅudLC_Pʩ+ڟSiBxw g!# %P+}{EW!uU|qͬ;1Z}]ŠiicEU1gGInkW9ݡM;--U oJ/ګ 8-=θd# o\^Î+o}P'i-_g -2}P)F8 +F-טAʪ, +r̵WiA QPB:7xqxt:dPBCRh,i6@ PP$5opÐmkul~hcBe` |OyR<{ŭq=fэA&Ð=[[Ȩ'ϱU jQkο6q㐷 @-A|zgP'C}nY\x0Q\Mp ])755HngVU`!4ow +α{ܹűs wWv9pT18P۰SY=l[Q_'鬞vzĢm+&Hh`ĊM&2c7%^eXup +$ʿ祣ַ\qǁȰf-&>ܸD<ݫqIϐu +ƣAest}͞9/Q#=*Yڽ4 %"wE + ?D`W`9>J땱WT۸6_cu5X$ʌ>LC"GAe?-&VT % F&ο0E"hR Ah鬹ͭOtFHN彌@CĘL!_C{'S0m*j3P裏gܢu A"W yk"yr+v7gLEzVӠKg>ÈꁇF6ϯ*]iϐVψ #LE*:\t13FK͖U|DL|@llw@:ͽhmW4-&earV}Ջ=F^e{Oa4E@诒jc)+'i_ +Y. R2#˷rM414@1#:ZHq~FՂ^6D9$hfv)ylJ+hGT֦oqGjvP$B~3AP +yv8;FVzVr9iy ҭtq9e;K1 ,Z0Yt$zF[LY{tKRgGͪouՖ1_g>THRYe!NJf7Q bWM0TbWJEJ.ӆaY/$c G;@['eDw BI/#ױLf=ڨ[ l_ s)ʂ\ ]Dt=@'. wjtYnYl6TH_{mI[ +=XWEnZH>IY3T:թ?x"'%FtE G^ρ]a تZFnyQ @r*EH4?=+v_r*t#>і/Atny<Αgğߡ 9~ VP4Se."~H?œV9"~0ɥ^@A'm8$㍯5![z_K[? +s95ùO[݆&cvtifjHԋȉ %XeV=Pd~m22eX(:b34s"8s/\ceqwH.fTAbю/'iGD]%IVy80R&nfL]B3VkJĿo{޵wd@0c?̖~'ޣF +Hu2љpi,|VQ'CG~} ,7}#Qt3هb  +eҝCw $$HU4^>9*{}c(~+.(E_q7Oc +iZ*^2/&kM3/ eTS"GOu/6bnУ=@S>ZTd,M(^R B0 IMqf񽈠:˫L&=us.0zŢ8v[}0)b#2c}cUz%|6ԍ=iT7et>úv0˽;m1s~¿# .9JoΜv rA*"FLMBOOZqdPd]{D%`ɪ TþI,F?@+LK$Us,Xrv^ݳajh^i@K5EA#IZGJTzldsz\1 M%ig쨧ƁbTD$4H6{'DBKj=HJb:@3 .ZGW ۻxw; wḖi栴(2He~UXK;n̉=8l:vXr׻4 ]T>ګVܨbgh'%ޒ/G/|lݽ;O ;w ٌ/լ؝1Ħ@k8Uٙ$h)Rn=j9[2d4_d_M.11U|?6 兩lYHa qnr2kżrzH /.fǤ*9M|UJZ}(xuoeN_7B"a iDҞʹLf0,\?v%"(80ON)3ûN\bz0-S6t{G]a_o ߞ{Fmh`@|6^%Ee-P`d`d!{%>a5RQ&E% p0a@}UpWE&^2ǐϮ $W3 F=žT-lILxq\ l&^@>{.Kҥf5t@@"LxJ2uLKXf߷df$ g }pj-CY9 廣fFI W~Ф}-LDSR fBaȔ!qHgR5 eEdJ^]-ZD +[ SCh4_ 4\ JJ<R}ۂ +q2\k łӥK%*9lohj@_0i=,~1u;BPK((} /ԙo*MԳxup-Ŝ. @ў%CA(b䳰=u%S4s ]L/)6SK~ۚMrDH$f]$ 燱-M4qb7tTV2՜꜐[R̻O"K +?s3#sOi&ze=zZV=} р0uW mUsV@vf7yhnBr!eQ8l.BގYxIԏiYP%͇~;XiB@:]ޚ`6S eSDr*-7 *ʸh3H-31g;,T%&ӐƢXKxq@OxYBG`W4VG׉U]bV +ءt$f.Ӹ`=E`p;UBI,Gdx1jä!@%o?=izz/O~}w/;ͯ~w~ݿ}?|׿O?_/#]_\;G2zgwvȆВ9tG2hU_8㏩ǧlp0 moR—BM U'ƈ|MTK EJv9٪u2U;|$& xSܔrXߪ/&٣[8a&#%k ?p62V@̹\й2X0 +K' +GPO#;!}[zJD 0؍vpߟ| x3NR;V:M67d0 $@<(Q$ɹhr[bstA~B + +w,]\oIz%cr%-ӧZ_ KYbiG.9YjI,O&#I|qG0{Q_VfV i D[rj?J5 -}b +!ʦ}$tcGj,bOղrg22CDwlCG5N١hxeșCY'trkg}%9N\偌[ZŅG/᜕Bӫ2Dbz#ӫi]Jvl L:Iكbދr%"PB`aj$8`QqX;{?n1 V}qt*_Q5( 2n-!{fECou@@&gGJfQo4pv?4MQ⿗K %N@ZU qV=gr:(uuyG?NO dJMv1)$z"$i]$XyHK;pV,z1p%4䘄NȆR1A7ix6 0NLꁎL0 0=21@&\W)7՞Phm2SewŌn{왂Jv|&ωzS31MBdK}!]f2L͓38,JnsQЄlbOMf6|8GPE}|<%jEXH1F(z,1jC5; Cj: m@,pL'PVpwAf{?/%=[yTf]ԙ4Sp*&ߍtU{a)hMq5Ýo6b_T>tBZqoK>E7q#,ݞt 4~6QĹ\4TՅ:dHsQ HR\SU۹{LՇtCfR!VXjnnA"qY +"۟vL DmZtB$~,!!Ige#k2N7!n Znqen*jǴJ׬B I7L:\>@~O^]rEˇc>im׃f 2<;XIxၗPYLz7#t䂊hɦPvSra^@`Xs ~8ApYDa* +xjER؊@^$˞Y>p#9GW7%9UL*e ]ͮP}x|t" 39dԞoI=QH@^53wcI՚oKFb +5WTy\"V_D^WІ9GX:9x 7 )_pgVVR|̂:;XnIks%s SDJ͔R.7@\,Y]؏1e{ѹTԭQI2ޱ#ڏM$:(])sˌ7?m(Q@/!AUd`BA=E0D*;1B?P6H吠}a-\cd7L__%)0(KVk!LNgNd-mZ4b'1\UBBS P/ؾڥ}[lz0uY|XO7Mt%ݖqj}:U-gj'KyL*bY]*A1=_JB~mc\fi@0g L}~Kٕ!0줊xda>L^M,:92ES4I&p +RBu.3a혡 WAQ5ݭ:/a*ڞC5nòl ȺPY +I~6m3\Y4YN]8p/c<~eS}Xw2g~ Y%ijKJZ{\Gv"5^{^gWͫFZ#w\4\s%D!xs#i?$g=fɦqR(I@PXg|/;Qn~l&r&>XS`:.XrXo%#u_@r@BF {|J=g`T*Y| Rr&c#P촗K6{ofIM@IuuY'=R$o7Ϗ +Q]nNdS6YD .=K&$~@\hVS(_/te4l{mD}xhNFȁd#z=[k^v` -Z*0LoIf$8 nMTL 9;|rENeLU>狂궧a=@gYLv#3ڻEnS7SS|0k+,6\ʫCΓ trh:>^'̹&_?f߶i{a5? DU | +3tO=VUYesnRk, +%df}QQ$nB +?8ߦ%^D=}&s!KeI+|nìc$ь W`o᠎_ZDwL^{D՟e괤k3X0!S"gvMqlNR#2g%k25kr;pQҭ(g)M>2<{ +HlIV/Y-^吜!o0{4 !v  wBIgxԟ-LhR׮!eI!$czxpᘗoT'rJ$&=Eeo0IB<;H?p$M4;%Hx1$\=~e3sdE[9{{ݽ* d; e2EK깎Y[Zyٸ0wJ2 +˟֕"Wq^@=pOQNIHdI + UJ_tRTʘ)G=[ً}Va+ڬuT +iЈ_َ,l&a3A8X+ [eؿ;O,N\$&Jr =Tb{5tpf Qz"f-vmMn'ïOu'Kjy_bz|?[JݤGbQk$țd Z$-*0P.(C87EH~W=Y6%1 iM&ɲbo;|;)(ȍh5M@J@7R.] #A)X6q N¨Xuw]&}KJF$li-G40^ݦ~ $)qfe + oQtPl8eg! GrepAyCm|7z!%/䁧[ +3aI8U&rk ~a@nw(_hU/;e]Ĭ9VC>H1s'R3ECNt4mװ4_NmB`BuZXRS.UT)bagd H0uOe0uMrrB졽z(i[B@7UX*-mϪ@SAQTQ +v.# .dJAh7PI-jo=nԋxUU6˒wO$BR(y``䆳=c nߧdS('W+p8O3'O]_skv +q' +{M0D}f~O~p%e:0V G1ˡFxRD=3{mCDltU/2-"קE=$2Y$29V˟@&i.3 ׂiQeva~ X%u#Uk%LĆtbFi=&K0QIN;h[6_ tY'Rwineqծ/\[. "Γvyfz:$ё!@y W'522?uK!.BY1AUu2R=iΤ!!@TF ܴ.(xJCA(~qi nq2fPj.01ԃ#z@Ayd4@ A>${fnL~͠(,MSǨHȇ ]sc=9A;f%IcJJ. 'vg_M*%9 WP_t% F7I(/?bљ6p'^aс2ã:fm (K[ +{"F&JjaҳG1%[rE6XtSz2FfHC)c9> "R=v+1س;造:&i⣷LQW v])H<3ГNf¥©u\+ɹWehh7V +Ԟ :h.7֓r`{|x=踬XJr57f|"/bihPN +v@ \z>V""{'DGSd`a5cQYc .~`IuFߑkQCidƄy: :ҩp3[RIO=A%p8jҬqpVI%9 PG7f-dIr @B@I5,[m7h $4 >5̉`)bqa&<' +:"q0%T(pqJ)E+XkΔ۾nK#7)a4[Rݳqr`AB_F-o$``TQxvFc7Mn˛WBcװA.}/=Zv5Kzy)f1jcH1s _jݰ.o$-&(N +eʠ?e)F]6vYeYɀtpM)Mrg}#A)!ۤ>UeSXjŒxh@hJi.p{᭽3YV{1>`zU9$ic 9(ARd=MTf=d p!%)aY93һ +E@.?K%϶jĹ.CtT;wT/=kXX#P5cHVWp#W8*ӱB*ZMvT$R%KIV/9})aONoCnNv:ICd&>e} +Jxuvq,%N=`Xo)M +1Za̬IOfRhZNtR~ ]);;^ת,h +!=̔4 3=#۲P.=ŅJsap~Ԥl5=°|-KI+l)?cVOH^D2@Y{FJ_ b3@Mh@ PȞUqx );W: %K\{Aa{ro$oyg "lͪ`_KwPgV.p)d!GUs6]KG)HXC +bt'vt|Ra}% M= pWE  p&[-Mg:Fa Cq6E$:֢h4H'ȻCzjs5t4v=-}Vm e,r/Ѣ$fCtuIlUY8qѠwG/## n3u cp4o \h0ϧBm.m?PHI"P&ڞV>5p0 +l1.Q!I؋i,8P[pqJ ĞݸkG2Ү,3;,M P"m"'s3Xh [6-%6A%I3 'R$Id0.sY|@L +=0vrJr \DR/J.Щ&Nt($P=v@RF8alGu (SU'imBh~)usQsA#Kׂnl@TS|`9 jz؇(?p&+M/%xU|ZaĿ%/WUUIFʦ4aLjV3*ByS$YkPq](]ɸz rcvMLsa <~TMopxXH"?EA?H޻; ^MR#"KH!rHKR:/¡Հt+XCPht(;n,`rֳLUk(r33i]>,; b2 ^PMށD+Qnx[Jh$/$@)`$%?.!0c$pm.{EY̤-c;0W$evp O3N9\Ѹ] *+**~?/:*S!c" NLU)J9@|YfDڣ̂܅tEG|!X2uW3@ЪM> +jsdb7b.\}HM:>gX]aIQ>%kɏE5"-O/#؝. {R=ف@fgAx*5A_Q D|7=}&4{kz%Kmc6cQ*)JQ%׃G?^ -:& O^.mfajB6&asyE- _SE%Ps L)3 6"%"hedDƕS4KKBcȷBYZPKl7Y~ +GPcߘR$-D"pG +. x/8jN0jrٟ, +g_!iU7d=Z7J>5>pNX֞ iXM,,~.x^6zmS>k:/!rvs4K2?L5J(W !6}XXrש&l6ۣ=#k4""*V֏2Y?xZf ܾ +t[ \ݲe) vxӃSTS(Rew$a476i3xmC^dtYt]KbsfVciˆsN#vח' ;7BiMVm#%ph^BiceT(0 u ̘رO$)H>pol&!z`Ǟ)fT$"+@Fןc4 5YXNZ Q8"mK}TjʌBHC09NbhtMsykd|JLB#D&/YJ6y':6)` w$b1MԘ<ȅɘ":4iZO*eA;bh`ޥER!ł-=m|V_!R@d8@9aLPB{W+6-t.A8)Ok}.2#d5<ɓנ?BCI511Cͪ:ާl9a\KPV*ɐ8k¡ዐ>UQ%u[Ew?aKj>9o|7, yP9M ay5+TMP.z2 +9^UpVk>rHq>;O98!~q,AJLBY7/ &b$KT U} Bi#H ôT -3ck#Z8,8THv*n(bj Jd`PZ#Z{6ZnBR]Ղ"Mۈ"˯j;( mA &`BRBق=ZӨ"(GL}243-BܡPuYj0/~K6e>j3pQsJY%0gS$~B%vy'L!R/U7)l/({ً}*[O(anBuw]T.'Zev:Bf{0bohJ.d[|~s$^]e\G.ӴBzҼfBS۟\HFʤҲ;fIZsW@`(I@2<-\I7(VŎŊoT)H#@A"8@kpi-y)+}jؼz@-4f(FLm‚G^M0rPH]_#1ºZ"PRhpr!'ZQ$v{b!.> ilsʏ-lϪCR.=+(ȯU^{azUl0xs`xzSU:4_V%gAmqɰI,~Y~W@=lA C큤lOoyaBQ[B!})?Z=;l0f0c`sI$ f[G+_jN{5E|KNqmu(BV˵?OKse~=FtבbZ 4I zvrܵ ׸AUa_1%=a{ A eFIuI%f4r ʇ 13䵻Ȏ&HBdB^/L: "1mSKMMINP $ W=mJ*փW,wF qǵ;=`;:^!I9LL72Q`(![uτfJl d%޽'c´xRDp7e.ƴ`3ݢEILꅙ515LBRo6/C +qbHtO`$}V9WWtlf69v-.fFAhbJDzKu{s[eYRszHY +l${ةDXE_!)% +P9 ߋ,ǽ};z&!UbcEhAqe\e&ɸKҒc@4ğ%q +"?BcC q +~~ ,F>Z#H L{,:\}ތD98R㟺FL^ +Ԩe 4b.!4\RlnrӈĖvrzv P86G/x (6GbH[T x2c,wnޫ9ٗ +7i/Y8{ +Y}ed#+ىYOz7ۢgNǂbj7u 6W 4z'=pՂ ĭ%|rm$3@m Ua@fۖCpz^v!,=G%kRBʿVq*)J q+c~N4٦bKa =`fF%%B}TU˖gx,dG4>41iRU( 2$Qd 2h +(J.b!HDp\"AԐeOț5Z0w+U]q0<əq`bR3kGa;*Г$-@OAMIƟڂ)rw=9d7˝y->{%$O,$ ,D=[3F`ݺ]2>9HI Vj" ߦXHobmA_u ),^MSY/ ~7I@Hx)o$dy5-GѼ$O7nM&? Ngq4 w!M_R 洧<@ALtKR$l =T2I&]pݕa1Kf^4RYW/-\^'" FNjj^>- !jIcxۦXwUզv͸"nIU]FYQ,q@GM=Lj!j!~4_A +(H?~,$5{6.&tlHǟB,'o-[HtrCocV(-bv=,X` QTvUP]hBpb5vlFKO= .JzJ MINJR`At5UbuI$.^ +IHоoӤ8W@ Zމy2O,9Zw3Y`N=9Ӽ#IHN dײtB`z], +42=rD&1*T2Y9ᴩv*պw0֣[8Rcj GJ:] !< E*MsM勏sD{^~Eu6 X#M s>1i+)V +$ZQzѭio9IObXUՁҜmɎvcDL.XкLL` 5)2 Z=B aM6i։.K)*9@M4 +_IQ}MR34&ZjɮQZvEpX՘$\$٬ +VQE>\xcfG|:zjȅ`8TSj0]Gv$cotZ6$z4I~NWPV)$D0Bb-p(#3&1QI>+(vSG0H*[#V;09PF-cVYd5ā| *7]߲x}8a4W#O͔ +" G>+,gjSPng2t?'NK% J 4!`nY[, nG)#KSai4f2I4I]jz_./^Q1lFu5 vy4j_*9<$UPbSÁnДRQJD@̣tI$ n6/zlŗ?Tڇ1Ccܘ,=tû2?.ѶeR5zLH!UVUfHcn-Y혁b!Pʵw2%Mွ0yF}l(( CLǗFa;YO3?t?'ߙvNQ êz [ydir2JNt.-hqv0.#O6YXVI ZyI2MCA_F%8nP ѠkCF'I[ ީRyxx0@0ų;@U'\jC&SV)C\eq,鏈.6XI$R50lT +"<6we1@/'SM5ڑmQtJz (/W`M1:ab~|'W^lXEwt=NaZu@lb?.Bq9.Uo-ȡl CUx z 5{<0F]u[qFqRYqIYx$ +nP' 3Jx%c,_WtuĢ[=;6Mͬ'%)ߑ^/CsYHy^>HG^CGrZ ]HR/87f10᳑ufJ;zA5zO?jM]|<5%x"<,T0:n.} Vr%#fi+j}$#Dܥ@.VWbf=`(Q ŮEѥM^d?Qַ )*z!WA֫x/UP)HӞEfz˫rSbz{%Qbb "<l҂er= @"_k=0=є:=-[L]]|ҒRWt J4PRK3ݜ4rNq}*bZa=v~# gʋ T!,(E.^u_vzLPI#=vچL^$o5.*yI6"%ҽ0@ Y$EViKC=;RhomKT3e>] uuDq>?/߳U*L6YpN.6T%boS\Ez}74u$  bɃe\¾ 4 $ 2ﻁ.3YRt'IٕԼK/=m|U"@f$FDvx1૨V/u;V[fUux>LIFO[d, _?Kױl IGuPV/H-{x{’փiџዣ|oɗDuL|QEIPQvBis7>4y: 諒Iy4QF{+}@n@G:輈F@8q4K(,"㯉Xs`$XLI5)*bH .~auG)X[Hv, +6ĕ"Teg&}&m9RCβɈi1}pDFXV9†؀22C^xHoQgO~/__ỿw ?݇oo~W.~wۧj(Hdo?_?/_޾~?|%bO~?? ~}3~z~g~??z~(qh/~Ñ?;v~3֟??O^o?g?\mVo('@yu- 5Jb>>>? f - `4C>ƬSXB{>jXhoO6^CVs˟N;6bwֿq>)&ܓ]N1PHbw줳\>*b@Ű>'e?1$q?zGKaibhҜӆ7E񑼽dhш+7#rdIjǟП!NaY/ݿ_!}(?2PH9ako}v쬔mwcǬ‡8!|_KpeV [+/{3Eh6]3+.S"rXWBa~J+&*OL2әEFџi-|F'isno/Ox_K{Z+֦]z[5I5{ {U\9qτ?ze Z-~wsU{=aj?kwk "/lds^ >5 sUwSSiV=3ioq0'@h)Y`r1 ڀ5uǗ قQ`~GM=Ŝq?pH/ҧh/5tKQq _92FRzo5|xxx9/[>,&(IFߺ#H,G.tOHk{b0>}u@q5-|̶2k4Q]+^߇Q]$+W=IPzX_DWW Wc>8?S4ÈSfѺg^h+:x{u ~wH)a-qu3;fmXMĬ +ǗtƏrU +X/O?Cxh|yQv6#ʠO%^=iDHX)Ƥ(֌Y,L4vO&mE% >_E/kz [/mvc5۳}T1;K8WE:QYti՜3g!:Ň!#il)]"{xXE ⎖1V+o9 +7Ʊej2j%^@&{Xn:vxu$_ÿfJ2Z|)}Rtu<_k;՘ھW'4{k vؙ7% ++Gϑ\ 3ڀ5r~g5Qk۽)^&uWm!嚶d61j’ 5и?i/!b SD &R=χyݓxeJF{|h{ kĀ3_o2]()kN>xv/P\'Xc='\'䕩{DCmPeg{Ñ" G>uߗ%q=+BN}6dnͧyfb'U\5VH_Z3C=]W?mǕ^50rg<ۙ׵S'Ya.'A8&'~9>7'=|bۿ=P-5!g|i]7q;8vᄄ9Ec+/ͫ$PVL׈ FđG XDH֣-r躈{I pfL|yWɨ뾸+P7ZkD@/-̓,G[OcAxذ~!} `Q;IX.Cd+y<#^4>*=xMG 1_F; w7-~bh/^n_wCf˱# l4c3 y`[ڨ~8gKSkDcp¸\WߍsNU~y;mg ײFY^|nM]:I:%1z礈ՓRj'SGA 7kw<پ/I$!3ǭgV ٠5sULhWUW|Sۊisb#yf4{Fa}ycYd<Plv=< ?/J)ׯSZh=E6ly,7l<9)loNh`-˂^z>MxqYl[iaj,0U(Y规uݛe떍;A/ZW};u_{:݇3v?h,zx| P'h/싫}`4B^#E#˘vw!<Q)U,Ku"`8?|܁O|y&[84z$˓_^1=z|Dč(' (TǥȍdvX#G٦D2N{Nj\ȳңm"eEz W < Bt=)0%z#?<DwJX@k'w}7:k8wC'pO}{3B9#xK+:{ú)| bhr:3c4xq<|ivJ<^[:7*0%`?_>x#ΛC]ŧh/a6idq~=St=x^=7m}y w{z4گz4#_t)گ3#vUhs m|ig*mKfh=^?6;`I״b K=ٌ Sfwth7{O'FR/FPU_8h7n>׈:1=H[Ⱥ{Ɯsiq^KJ=?$ˆ2񒃼kk'yx3BFL= 2ηBѽ_a gZ`/[i2mg/<ϗ`Y /I!C]<7`M#Hd=ѤG=崚hj|ͳ;:]<&-q#UF.V+F(ؘ`qo"/H>x y?FW(uZ^iQ +qjНJ57LaS<ݗRNVji[cdtIGy_C֑VZ;8TxcTȖ%q>ճ!s=vY.upwZvo~~'$E3xli[G^Qbm8䎛%]j u8K!R7l+J%#؍鞿**|?7*YKbe'q{"^9AziC(Uѹ;3S7"nZ=}rS֓Э6հNMjImceO.s1}FièUd.P$kɎ04l%% #2S/,>N,<EbdEA2fTR(?8/?(ʆмqΨze٣EV@DVpY[! VSVMwz}Zk Z, lnW{0l>f P=@tÃO",C=F{{:iW4Ζb^ wF(N_>i ?ɇGRũ9^8#{Npcګ߉io$u8a|=Y=M-GAԙccjlrg'5U@ĵx<. xBg+ 6E옸9Xb@e)Uw E[-?R\‚}cLs5LR=KuT =B64<'s?3IpFΞԚNqu[+޷'Jմ`dXR3nΊ~e02N9SQ98|8H.E+y#VJKLs'!8%F hlKe PIj4WZ +vc3?j|㟅&|K>HԙX*56%vlogCv4OK~`76G`5 ua8#j { JR|R(d3֧lsnJ0OZY:x)c*HGv<|s~1 gD@辬Ў1oG&Fvv9Q9ymg{zUx!\TԈ5AYc3>iW,1$cXbU3gȞq"rǡK99,ɬtK:sGco(НʜNx--$5>HX+*G\7+I):wC1_+ {2;U22>BC%h a+;7\G9,1 ]y_1YW &[*Ʀ2ln38 #4) i/@@]W\pz=T)cG5qE:r`(-?\帖v&3pޢ1 +FbS'yʸr80FY$t{CPW+(^喃 +M@n 񝒈`,wuh.F*>GUDﻦgdF8#D.b$fd[@(ut'՝6V m&7~=-] + QO9o˫>)z ë}t?e&۔#pz0xo +Aj7%ʂӪxaF0mV:f/ +}F}fIB!>;gA,WoI_c;Yo7rL%0,i3}>{;$]cR>'Ogfs9aGi!@+\Ό_CxcG XݢrCps>`Si7kƶA+{DT+i3E9N_7l"8%۱Â6glVȗo\-4=Sgyh))aGx 8"q~r@nq,T$tt!1dKj}Y> 7(wlЙxyyq w;|F4z.,dc(\wnӯV}3o' +*fU+{AWsl ȑڌ0Azph)1&!WsCDIG6#@rƒg `H4Z9[$a3th^ PF9ʕ3D#V>#Hsk:?Q>r< +n1)x['oS ڡ:O$?DhlN$|Go=RB:r0PkE=e=.QUor3]C) SeJs>.x\oȱʄ0R=WNYGL9^,5$]qJiayЯ +|;KX:߾=$`gC$s4ͯvEY1m]Uv6bqq f 2ڮ\'s@y:~k`,60i?KA~Єc}cD&L i#&x3!)-yk=?Y{8,MavVWJ*4 E@$@xo{%Q"EOx '=lL;̌H*윳P/{).dȺRd/ie񲼘S'L;QrT[9r]Ϭ7sFZ!Jjʩo4*iV OZGB=Y'l|ƿDJ$},oNDwS *Ѝ~J1,*(:i{&L*5Syz93d8nC..(B|pt/˟-(K +rcS]f zoL;lO&CM|sANTYFes( +׊=rRaᐇ+wF^]衘C#Q-z*BCgP'dhjWC +: T@ّ4VtcJQ=W,(1]G"BIxx;:&WlgbްٗAVE%ׂnr-V4lBM+ݓ'ӂFWЩ7+e= +i +*mKVD7l0J]QAӨh"A*@Kd^鲮]6Bu@D.)#'}I0L|j,V>xZ%zc%v +z +TRITA*Q,ZIAD%U +QtW +VIY*)@z()yLfF1^IAJJQrwˈ$D׊{(" T(LVYGdF~_ҙTႀ8DPAe0z٦IT{iYq;dȉBbXI}ZCѨ yZW)=gG$;n I0%)ӨFIQJA,R*J(]:2*Fi+S.BiF= ibuӨSRJw)OY㗐N :UU̯@> +2aQURCfR\Y`,rOh/C)_1lFRV~P4r -婢d%`Ҕ%d!h//nR +T($@2JDJڞ4U +zӊ1Ū?!Hb:{!,dU"=$ 9' +_JKڞs1G朢^M5\?ʅ +p=՞B9B#V7*R\Af;md䟏PP~uKgT3B&IwWn 4*n@sxEGQB26*FI;T2-`P~`t_X \#:]tm2r +H^r\w~EܒsB:JhgҋIIk~1_-HL?,@F2)W*WPA՝xc Srͤid]"rdSI-, F*EPqr$BoTIGҨ_LR4 !tg|Îy"xSFZJ[0Qc&o9x# Ju(CT E:_ZBi5`^xMB)B/5˩:Pt|2QDd!}FT0&y-.Z(X,Tχw˨;Uskfv)-)%.R3U褗lOtj" + +FJ&CrZ21BC{7qTT?-J[IT4Rq +a󴢤.PHH1/b2,Yp-Ygc8" +&nGB;LZ`yd %߸'s̼2*4RSieq:=ɗ[!^YJ^Tǭ_e_Pk[3 +*RBHSo+ +ޣEs}1p{Mȋ +*RoTTر*Y*+UT;deҋPm9i}e(fϪ> o{IڨEzKM + Quj*uʪ~*ҭTfh/8]Q{!RVI/rIU`A;'\t| *W֟yg}㈨L)t)}2Q`+i΋D]¾޷roA[+6JK[%5j; MVi[ji+y|"©<##hGxh꠱$[lzYݩI/uO"4"xs *|8 `JoB$v0N}$PD=(pa4*2+Ûj2%/yʽ*w)_3Q@$?J_TGeO7%)0g;dnkܣ(7sys?0rtBhå mcN /$ Q#A{cUsqRTkQ{g Ӑ)͇*ot[lS-v[7?9l6??SR8Jf0;r$Aț(v)%&+T(2wyva'(ܦAğHT TiӛR^J +O;A!i-QEx[YA/_A=f;aYgcNYJi i)qubAՍ۵|̦]EK*otEgVgyyu829,ٮ 7jp)b|ޯۜVm<XԻoqwetw|Rt +t-w%5qmsW?ΰN PbAXt)zqNU9w{جqg2ʾEޖiE)Nw*&yk/x,<.NZu؜32Ӵcqz^gߝ6ZrNzhY)~mFovk[p6Df59YfSQ-&挑6j~Ow!jL\ʞE\WEe[ӱCXzRٌSTi^x>1dnP`.rsjcs$s)DHԜW1/jS,"f̗R~)XI{bVF{=[wKVMx{N[K{S "JyTK%ؘ\eeWֽH_//{3A6 oâڴZKmkw*.w逜u 9uZ9jn;t9A&hHd=q' S9ΑINųt}ÖAc)mߚ;NG.ˀрI6naLZwVl">1QC֧Sҳ#4PtEG³Û @?ؚ7Aw~$VaּܶEwQkߵvڗTuw*ko:kؓ;=skqNNܡa.sEIԋN-7a6&x' 5喵}zUvQoL +CE޼=-Kڔ͉ޏpm51]=/>ko+_Ub39EpX>[lZEů=iaLZ؇q5[/\jvܩz16iwBQ§&\q:80.8V\bFRK8d̈́Kܘ 6>+oLҤ.19v^pFrk)A 'zE]00QdP-Nx5st>I{~!rT`L//d zM%kO95 {Upj#O:%Vs sb6Q]#8>a}>6Y_Pec_gc^%{ʫZۿa;Y;jSA%/<|vy1':jUEthjʯy G'd} +QRq#6Yª승ͦK'#`nEh#z5ˉw_M6^дo@qmD߁Ѝ]$Dڧ!*wN4V=ݶ*;6(a7ʲCn_ޫcx^ +Mrs2!iθMI+T'ݶ֧x#~͈N'#C/t.gwYF=[m*s08;q'$)m"SS2>h7u8k$ pq qp o0@,FE ) 8#ceɮ_,/q.2߹st~wt}ii*ߴ}ɉ$*6攵~Q a$<7g<!|c1/ mZE #aWv#P 7ӡ[ o@ԭ'j; J{R);f\pOn^L eY?7GԴaH Խ.l"03@ul/pNasů _Nt}Qg߲}WJCgvINA]#iŝfcP<(O8tEޔS'x>;>wo6e I;y[?=ۄYQQ&alMHgeuyau&-k0+wYכ~Nk&6?͋%/|%ְw?] [^.0 ;pwŝqGߑ|׾pƯNlZ ۳IIΥxGkw[ۼCfe/u>bl={qOx(|_^fCI^F yuobcc'?Tܜxs"j6[iNNx ڬd.ܣK8MSٝqiˬ&;tw|9Y;'qkoOt^Jr&kM8]@Z H+Vuj6|k 2N|w_I_=b ؑ5n~(6eg?FY*]{^zW=ojm>ՇeޑYv'8=>>>eSqXHd,;sR>y_ ::|+c.yW'{g=頰ymcqk+eA3fo϶n]`J )7J~ &}ג 8`ӈCp&Md]DH%$)XZ pz-I!::ynQsd*CmPm[U~7G켳j~\D|5a62ѳaAv?4tyn?Y":+:.aQUM,i}ofd*3QpMK+}z؜h/?΋G, s`~ƻ߷v.iS x቞#ܣiʄ[;kR^5?TEkç~_c/ H1;p9ޱiΡ Hx}ÎrϷ x><sn ϰ|՛鳻ݴ\ƯWZ, 9bC_sI dvpYi1=;N']ӄONdg`d`>Yw=\zªLKe=IxRAvVuU_K ~%YBԟ)DJHo(N9čny{ +5DhsܫGl9dxbYkd +z*xuʨSڈUT5'8 js{,6+kMԂKb^X?>*dشLtR۹1i~̋8=A[Ix?Ef{b6q_B26<<;|w,eGfYٵG[Sۏy9Q >/kxquv' G36;g}4<k_08`ʩ}݄;4L߁m=}G=#8S4Nٗ (yOذ5Ru$FƄ$蜴YdR|ApdGO5[ܮ`V ;iaVL/KzE`chʯ~/n +KڞAzEt>P_`oSA6YbnnMT'> Ł3! \>dِP&-/* ?6焧na.LP%\ֈw*e˩}zٸ_F%)_{ր\-<'HLf M1l.o]&|͹ÄgZzTl-5ܫCu3)dGHF^\K 0j&-d,3KZu:S%:Q¥oo"4x%zz_unc__OJkWsV̮ͫVrhx gyyw+7NKA'jiV5v8EtgxOf˱ķT4pç^82h2^pk5Up-n4f0'Ni8̢Ky.opO͇[ǬҖ `I-V KsgS#V]֒^J "<=WD, =P+ 5IN Zm_ԔYt+ Ò]aO/ \]4jQʣg/.Ra IQ,X(|A#3S:ӤIx>R\EjOE81gÀ>4TKvV IQ7*S<51 `m` ] Iiy;ߟTQ 4.-QE܃Cܘ9F#D-iqug[◓ʶuB aו NeԼY7(C#KewMzܫ%Ab^Oe;ܚ76g-ۨ&ܞ׮l>`ڮx}=Q=>\T*ш^=4bջ$g#.2u/Tasc; YQvE eu|Dܦ~zŌhzcC ثI37LrN#"MlXGOؕ=y<6wZܪneoʯ +NvY)}TJ b.~ )Q !YU͗uAd L*vV@o `=98{W5;賸_鐒dVTHI/+ߠǼ_mmaV +rל WBǫ9-eWI iu72RށQ? wV4a??\9/DFi?^^!X)d.~U{_a+Sbv`8ri3t1DHZog.bU]o? i6LHg[$kScI12?pIZ3{ Ziszܡn/_~yg8^QI[{u1|qڞw1<7~sBܒ]Qw=.̦aÚx>͖Eչ>+XY UXoDw]' =B|It~c}xoOO]Zq©Ng SeUށۤaZMo3g٠C\sS.<3po홦N;ڸĢ{}`¦Wp1tBWʥmx~3j s fEl,L:bS蜺][;i{ܠlZO0'8l18cO +>kGXˆ(5,E ^~}ZW?%5ՄSїx]Ą_X}mXlhn{~u˰dg4 w"󒳉u7R~q[&ȍ9lsRYu$&ܣ |&c8+a*1#zsp۪[|,0w1恘W#[s3˷{$3{h Mx< + FrXUL:`0ޕZX2(Ft:Sݗn/^MzG1nREBM@d`Tp:擳`|\ܯ3^ иӠ <]u(.Byw:Q>3 _+4܈]^,op! +)f3)gb1=+YS=->AGϾ-*VYlt^Ѳ5_?ѧUQ!M%%f=p}sFZzُ6xaw|xg_n^gEr['C ׀)7u9dwIX;?z85k%)夽_q)XepwY V;I囘u黨UQ{ꭎC >q_g}案S+y{,230w+z6z>Yه Gʼn%Q+6pܦ!&ȳgK?}oףSgXw1śg/icR|}g Ov2{F~6)0epP6(}7gkIDiX͍cd!^,*٠{yyU6"̭ba}ᯓն%mإ[zrYO>~V; ;d 1$F)) ;~i_+ a `fEg6|mRѸ6#>^oʹĜu7`OX5ᙘ0E:~axI§7&"^`˫W@`ZM:[q+yB sIZp|ʫ~5YQ,hM.8< +^_8'l5J,\,|ly;ˆ~1 dY֪vWT +طW&-/:czI%OY]625`Uˣw*^Fc PA+jۀOuʝe,4 ;t]2Pũz5Q!Fc]nUDgt]8i%adk=& )z cܲHϯrm| -(, 0q¡ᮏw0B7$ִW-؜{ePO+xpuy^}ڭcv^xutsN:n<)q]؂ $% b.,m]t^wE0D}'VAMҡaImwdFTtMB=,kQִw\s՛[y Fk akcd[9c]FM® s +^QK+i](v ,1ٌl; iCG x;VdVo> t?r^ֹc068arGJ{Ȃu{Aݳ>+mX:sNj e7v3 xb;>0(xj@-9u[,wWFbI SҾ䒠h*pm!fO'/e}lQv0 +i_%Lσ6C<24>Ig:.?Q[Kl}8FnKwE R˱;4DL:ծ4V;K %A~ڗF8E*7zG^ykXCWG0 dtUTH Y6&5רw.fìrv1|g^7mkFTӁ%Fuܩ6'ona^/\2 Z8}^ 赸[N ע s7#MNwE_W:s>dYɩ"ܲC~/V|^-]я7>WlUqDG6'셽e5iYfmAӻ[]nxmZղ1'c.\ R^^Yg##{u[I#pߠ%GO]8왝/`=C3#+Z]%j^̣f2[U*S,=n~cu6@64^6|жK'zj:+cw‍bA ށKITpK){iw6RUnwQF{6jy5]tڑ՘4 4}Ɲ hq&˚Aae7[5+T@hwA`òl42t@Eq)IׅK_dV uj @!ٸ5Cg73 YpeP!;(_JCN &YnRli{v5's +(Eaw>][ۜߘ.ZG21A~n5)t=9[(pO[=9ͳouLiVgwuWYYǠJ8cvQ=1^vBߟ\nCpg.gwh9/54ʄo%;+lv̭bo%.EKrF\s|(Y)F]TK_9-<|L";|7%l{`ەț9'ouҲ0TvWBW4*|Z9p 8VA] )7^J듎 +ޑ&mƅ$T e>Ȯ \Ϯ +*xMc)qX{ݚ\ Ҫn84_޳]3ûǐZ˺NqCΫ6&Y>IG6UzqRW06,`zu,E s C/-:Uwܭ%}pK:_$EYUqP?U!KÙZEvEoY58pKٝ6(aF^y[?۝%/t?N. gtwQ.J{D.9eO˪7mr09,flm%$ YљV9dDxa|60#|C2AE,bg@1{{̠cҸ 6O׾ѫGp/6`C~ȴ❤g+ec30OIZ۰9Je=># R^a}9q P~DmTg|ckGqhNzj]-Xޛݕ&WĢ +x={nwUg3'Jy'g*ΊRrjz|jݧ j3pըW/S / Ly*oHJxckqߕ#<%ԢB郗z;O=\uά\ u(® m{8l;pJZ^/j:H>ejQ6 } F^4_ +{d]a/` w|46̀l!rvxVT5!<]x62==-8ŧp?|;)êRpFbViC&m=ӻU!QԩDZ$"1p=F,⺸Cѵ1/9S#I;&hx/J.lKg /$Nk O4a6n듿?{@<ܥc~SB¥z `8mWPrKkI]k2,j8zn,H{=iY+UCrwF9:#jKbtT`b|XqvVm'MEY٩etwUoYpзudzzx ]iKQjm925}v_"ޤG[~е/qy<4E q[nS>x/y8^X2Ɯ_-CZ9IFĜfSvqj:0x5n7i>՛r٠P^<y}}gQƸKT{͘[ 2qcAKze@>]%/lM?{vx=bDg$w˞n}w '3SҜ[Sb љ]H8]y}d^NJ; ˨[TYi$VGDѭ)Ii珄^>bY8G#(Uxf}sՙ_V=/nS|f5G,[3NAfsBR녯f@>'m'Ҧ8S! )ِV)EUI`CҰɭ?&R6oN?162ݽ/>V8Nh +>C9'k"dCޔG_ښMy nLyI~ql:evi5Q4Kގ;M%{kd(٥3z]*do%[LnRN᥈W,된 j6>8XG!?e0t``3 \J/4q/,mXMCBgu/nKyq)JOy*,0%E%/VDmkeqщcx,Z?GOU|3]y~pҤ[ÏXTk2c/<;9'p;L.kE1Łd. }9O4\̡aGDg_=xz/ǽzy*`PP>{pmMp?_~kbnۭn+*XADzキ {@H H[< άYi3Cd8(Dg6# !Nss4\eh&FpA'jZߏbf7zmvCm"]𩦩R?DCHd GFUA\% ˜yEF~%[d8)|k |HQ/1w +piz S;D?QҲ#)% "k >6a"~,|<*2B߬6_hY͹/NN/K*I<<o=繾3YJQ]Vy6&gڀ8Slÿlt!vGȱ3<9r~&Z"]ڿE|E~=%ؤ -pΉ~U +0#K=Z +,TE:q_w0_1_BV'pd'F[\qEJKLRa%7zɅkP <$ø!VWk@櫵' Sj`fi86%=0 {B@2\ziAF Q Rm0\ny$ž6)ohSj*ܘrhpfޅs!O܇X8lGmLC,Yx1C1GvBw>Ug=]iwGLWV[a?te@?c}uzcދ)\Yzy,_jk-26dgp3.pZK7E}9e7 6")|$.<C};Spå/ ϟΕ,Z0N(W]aFR4ցStZ-9B扦44Rݑܘp0^Z~,#gZRtPu dې3 :A\j#ZCnJ#`zgc2mS# 3}0^y:[U1D .K}2BK<71>k/M=yov۲]{kMlS|书8ꅹԦ>\L~ZZ~':.Ãw{iV;4u~\i 69G#/U<҉ H( qlo}%k\Kvz0H$GX$(?0L센]{\\[$=HIi@='Qmw B4]. +TK\=F׵з/lkd? :LBJy87z]LDMH8TZ0ly~RS~VPLWp ԧ)ӎƱUyϧ(7707ǘi6qA{Ä72bu +y*RE]}OWt>凜prօ=$Z%gj^= 7㾶"i'<)+ez"cMv`w:ly.tə1M +`z2i uHQOcomsf8O#NUpʑ?t_챜vOt\FOߎзZiv).68.'<.?St. *b𝜓p{xSBOg?oCnM "jW; uYg+ +v)r ?y/1ٹ v8Jrqs6 uWsc/bpasؠNj챬c?v+eBUγ9QM΂Y*nx9Ku/7Q /6w)a%="$[}q5KJ/f]Xs EMJF%Z%*x3NJz:NHvP2A :@|g~dT"[ӟ37Z]pOuu\x,ו!OAWCszG>KzYRARK )"ws +/U[m*rS/t"E7M #Az[ŚsIUɏNՔܭ!RRL%uzz{DP銔}"㖬uxAx9J(ѷkh?W YYڽIru;(y{vwȋ +y}^Xϼy$mB/>1Sïk3p 6?PWdy7_|']׺J_Iw䥽91a-%^6Zs_yw1߮uܯy1m']wP_:K?P_>0pv¿:z(p!gj?ğ3w$q>8,@?lC?!}wzо2aKbÔ JNq{2a>$9|ycS_~OƷ#)>ycj3@Xr9>+ugU`% o(ɯoQ>GoA䷵k[%Wak%NBY+Է續Vy_rZqO[1q,f|M)f½?^Wf ] op1nELH>Qπr$<D-ֈMy/zř\ax8\Зn=ヘsSߞTMov7En woQMw/"N-_IyZ0nw$>|čb?&%~ e| {5i!q)LU`l\U~ /5u--s; +T?G):l{1"TQk36'T:W"B&7iQRaǡ ow{~t:є6x85ewolelwClH+l, XHuf#@~[Bznb\)F7'RT46Aݘvc=S]>IKKOr逸xKII|BcBo_ψn-|<"H[yMOyMN|i#ŪF];3(%+}ZVેvx3,;&][ך_nwCNɤ{uuBPd(|e,ʲSw9>~DWkKƚ'15+y.rn#j%O!OLeppu}$FgjCG8a >QO $|gRSbSK ]DtXcޢO!Gȶ+%b&1SL>L䟋/'qϗ3Tpau们6fr>nwŊ~xd%G/6_)d;=w{HgRW[]հt3|"n #3w{ܖRou}d֣)k } +Jؔq;0\ӗq.RW3\ 78M΂nb”Un,6%#,cT`,wz Rޮ/t}( e9*2@ds v%fL3ooukXI\aᣩHy0-HwKy1/|?a24]NGNh1|cG ]nN$O< `w(8FN< g*zodZ|q8TژP :̉?A["kE*PڎBN#"Ƚ&FgaR~J WjIчcH:hgcv!`b󠀎2^L ^2N&YL|X9Nیk_,}FtwdC.5pIs,zLgցoCyv-OQVq!&>Xiy{0NiZPI}*t&E5s*Xq8醆o #Z 2Kq[𹦬;OT@|=%YĜ|yy[)+b#>lj< ?#edv Cu26#֬|Inz{st%K^v!剚~wp?"x9D+ +"mF\caZ rkն &jMOxnV!n9!7z +>쌕 M#McD`\oQ3δ#{sKOrF=>b~q徒3,!Ʊ1te'ԐG'@6WCC1XTD8V | +?utU#Q,g)˰b_@["W8lWP _/Զ~>.'MR?=EJh%=^(>Y\ȱ{vɲ\܅%5wg`g=pilMN>`LRV+iwT?߂ ~V;=k]~]ö́T^[Rih,|]Nat,gm Zޝ(16r%ixwG/.V75}ۄU y +RKɷHq`WX`L,R>6]eTfXY7ŔpWP *&6Sb ]o_tXhNkEPu(YEML=ъ6%aqQF -zFHz6F}5RVⷭvb~9`jUG:.nȼ?v*㔚'`va +VYNN3B#1Nf./mvp`axE^z\5V718U_ORUA<; NTv4-ZkzɅLb}8-R-6TM"7@b6Y/:z C=GbfəԒzb5٩Za3'e[sm`~Q{f+69@ 0HQq-ir12` e pe9q.uy.[a-D0IH &9!ޤ$&ZgYr]QjT d06ƪ`@k 1;CoSP_qE 'k˙VubxiddUU],T$6RG4C)-rnԍ.V_p8:Vs'3T{ቜ ziwe8t74޾ƛiyHu(8A+p5b[$b#yxaXB{|G6vkY^*ϗk;Q|2eXV/ +1b8䉸y^fdz1* A +endstream endobj 29 0 obj <>stream +9Grre>תc +?( qbұPZC篴|,!t\K8IE wA N`aOլHC;ius6bЀq+)ba~M\k~dG["fȟyaWfdwcOy@ TP.BM\K KT/m0a{ lΙJH\hU<(t7g+H :v~[yu +![UFK3t]Xp0+B6jմXUe9RQ%H{dn6ݕ̐JF uKZ:JE@?YP#~䷭~UC:a2Ηϖ:mc d_iE6끹 "B,cĬ |8$/Բ7[EiFmge'*r?v,O )[2vuO.d[;,d _x($vyy6^&QvK >8bmbm|Ȭ`)gBᱎCJBw:0AB|=,Ρ?ˊdu"Xfbkݜ♪"W0!`gS2!'c%"AYtzOߋ 8U16f5qx{#ArA?h8 fR|Sև|~Fů!܏>VZ$k5]lҶiyБP\.^,W5HԤ{~4k9*Yjyڛ@;_.#mC^ZvB_?1!]~z/@N +9Oio +s2鹚.Y3峴aJz9RwėtNp'̌=1%bU>yTU'~Bv'=9k.Ϯ{} Scwd( +殘W9 ^n^+}WiEK*v'{¼~s p8ܾryx(Dz_u6kMx¢/TTUSĄc-z"aD^ (NzQWU^-\L|ۢ Vc9?~KϯC$ čwt؃ +T faHP}󽻠^=yw;B]]@y^WZ9:Ze [s킨JF\m4;7,:J+VA)n<_oP W;OAn߸xr+ѷ1 oЧӕ+hE=׿Fu.+D^ x^ (3苓?@@\}7 ډb%ǫ~Dó~F86awY +$x~ey}{{>}?uݻ _c~ԣ;>{p>{7on\<秿)E~gZb6# @@ʨu#s3;>2j7#Ї@/^"޾>{ O@n] ^gw++ukDٟl6k+B8;]و|?ȅ9U!3">  + p;ׯ^x1?@n@ȨŜB]]x<6|MT寏sszɡZ1 {[+k85{X>; TzR7<$+\+oZ›u|F5Hlo=<{ۗ={1-^#JQA\DX4 Y'aKcUŪܑr@?HYWщ1Wq1W2A/>G׷qGϟDFIyЉKu~X%uTDM󫦉]wn"Iy]?|߼zr@NO{@[sP}?#^?I^k=,SeiΟUU_7OA.@y:>}zz/'G;AQAr!QQVhTCؠ΢O&9-C?+++c p}uq%{>>{;zz='N/߫Uv"e1b1tm0a^T!wWR}%zyb<=syt9[.X=g` ݟ>s_$֋J3&9ggmY%u_SW!aGBX tBoq~ tg3 0_]ggܫFe[B隲fc4jx(uӞuQQ;ȼ[}z`YCIߙh*ۓU@3V6x ?e8T=QhZ$Y#9߇&ed%&'e:ua1^ 9asgaTW,D-yyGVSա;"yhr^"1OHxu_7wл'Z~r~t~֎!zE+̘I^QV7LU` +trHI>㤈PY. (qrP5At;(jO𴫐.3nijڽ0?|Ey&E]w' Y$mQZbwrfZ1 Z<sĥ}#;"tf?=_}yv-'!!)>nV|u}#yk1_e+ݥA |!5BQW[a!#|nQD{¢Aщb{~ +JKw3—+ṟ3D{]lO507&I+}VsYhCmuvFZ摲c><]7Ϸj|잜WjPHrԆ:UCXnD:9]ĵ*xwPz};;SQg,ʲC% | -S 5yϸQP-ve;*z/'I[PmjGʾ>9i!r-k`^J+7GfeSM`S +ē9>tVıMWr7iK]Ԩ^DjuHYn.PtdM6룧*~C >Sܐ'{WWEJK75 R5)IVF7IL{A|2ç"6$$/m?\5֖#noi: U=\gM+'tuX?"?ҎBeyhpd;Og0$E[𡦲X\vm)MP7T[V^s.nT' &ZmnhShq:@Qf~` tYS3;T[顇 qRZ؁]ݝx k]ZΊZUkL"#䈝1~AVMƔ2Y!o b&vE&9,sgFZ=mIGEhM2(B0&F]pgs~l]ͳ*FY'o)ʑ˒J2c"NZ$k).n,f&Rȡ+oi p=c_usnҠ`o//PrDۦT?:RXU0rl\Bu큚ͶK&/:ϖ v_An 1l+@Wk6U#P 5t^ ʊmӍ-SuBRD1mgpUIZi3@N~;QG6GTSQv(!VY}Mv1gpVmY顢 bӕcmH- Z&EPU_/l[bRAJOߟ$|b??m +| gY8V3TtYY+i٤mmG }-ug zU肴du2g_qlPK.UϝvԬ"sq54iv'HCe6[߾1[hB  +6v_#di8̷+d Ig-gjL z$쌢C2FΙ9QKB7V;Xޙ|!?_% 2Z|ڦ+J' UGKu=fpQNAךXU йO}re~hhyO9Y s\<j&gYR?7+ZOu-VeנUgѶئJ,rZAL[n)83gδQMSx4ЪĤ-~auwئPV0Tv `:%&˝1Ol`ZĜFcmeTSYfSKvFq{dHt2S%ḱ[z(gcЇs\⑚Aq}k>ebvpat Ъ@X`,WT[4բ˕ZihPW[dL +Z֑ ?-/qݭ굯q{:Ɯ͓ ?V#%9Dˀ/s*6ؾئV94ރЌ:ps5]= к*?OW{*Op<@lݏгӅx^Δ*j}g0 5ƀ`'seދ 5u=;R&H>K+`_ gcsNub osդ<\}kR +le{3\f'_sI`.h糌b{>yX*0Ȑ1F%>\ߤ2̀M%a T*r0ِ zReYBwq1#xŧ3Nf(yìdG 7l.@BN3щ&51@ML=&&3JΗ+7 Ng~_d^6ӝ74ѯ/fp۴;JM2+{0Igt$2D?Z'nO`w'Q +j"rUgk5=gMuf>H=Q'q3"N9Q:k'~n l3bY|6o]lSQJf?zzz66E)h0*Pu>t/MEO?O!of:g?z C9oپmcKU%㧮})6H7e i[Q^sBddђROc%1wo?**/5ӓ%1b1< ]L5 <7_ =HɳNO7𑛃 ~M+i8g|לϕYa$L"R&PUէ9XfmulMt. < Ę1tY$)+X': +վ2 F< 5 ZYI?Hr $4(|q6_px'}O &8pHƇ&߁w6S-<)}goUbj%V"u#U>`8uY!Tr7th[nUrJ bZ7;Wwg¶9Bg7N'N?kΦES-oU'A֧?D\C(~NycЊyo,:~WZֶ/Hyo7:oNU@N[b~0CȐ'[E&ުBEƑ&[u2q.ҩIy*c琎!Ox+SxsYs,gE'Ygd6*;gl pOeV]Mm:і!u1dJ@i"NW -&&%tB]@-Z&Jd@o!tPm",22xP*M[_;x,(p LrٿҵCNl(-~R]BM'U)LC>G,M;* V?&]|m.DÄN"7>'KOg94c2`1dwȭaf/Xţfeo!&_NSrNUtEEʴj(2b8!|5JHҵ&UB?X{gRJʥYr>òk傈 +uOp1{{[JM[hjmd {R:|U(:*fY>$%zgSK߄VN;NjLrjQBICj i?f+kNNjY#yYeN|= 2B桊 \}ܵ֟+ܳFM4{p$24 >RZ)ά`fV + b\=Lgdf2IuL5{AAzņ +HiإI&{<7P9ւxliT/`1;UZ"&ö@ iBeRf֮k/}k( 7:^&Iyb0,)×-kLO+PvYEMRt[mAS U#O_6݇z"d_K|)~]f}DϦdvjf)8WZ&aW@8!WsJ;C5t$J,>=K:@qIBb: zc-}.$]~7ޞ"d/wU5wAXV1c|\_g +l3OzbuOyraNJ轪Ua"%y%rf%aw\8$%oS<:w&Bk{sQϊ?o,!\scy}7#/l==XVads]Re;b%i{PH}8>;E/"ЛYj|́؛EwKIxoWul`^!4}UoǑ)Z6V Pi^, 4:Qs +暣ov=f; EF}Wۓ4WT0[WW1`'za˱yp{5BrS떘^ + 5A[44Гњ9L摞?cJ}dW9qj&!L£7G!;x=hP2}f +Z'n𫕶Vx(g޲hAn Tҵߗ\f_膅GOVG`fE{J ~SKi"i>Z'&g\0=uz [QqGp4>1IHݝ &o #Cm&1$PXaw I?y3)'$(ld>å?m[}rĠmE̡2ve0+O3M[ֿexԍ]%X; kX +ԋ}~ĩ244+^E1%(:GMS] a\cX0y|WHNt2~屿DiRաw,zKέ޼G2TS̆-X6>Im?-7{v)s?s>dp)X}% z4x; 꽥67O+,36_ŵ Dۥg*j}ρ +\~QiY8_|SK?u+˶S<2u@iyx(o:6v/{W}v۫j!nHsH>ϳg;oVm9%&u-Og]Dg?j[m"\1e  H6OCߜt>5;vk61#k'&/T8f'+4>ikF_KcsP8:jw 33u[n̿k)y\wKӐw{97Ʊ p Ex{b 4Whynwǻ. 1p9UsHgT昄|4u'3UYyk=1孭9FZo{6WF(&ް$ڄֺ 1ky}#^j ^'J D+ݨc ґ~cc([Kڝ +QZM ܜLJjqX!BGqT™)r]9{6u?SLc2P oxywLmE/w[SOw#;BAi [#:a֩7g+L2=z^rv}!]mȹ$'_$ٞTF,’ C/ { +ϫ6+_ɗ:^"aG8\ vѪZhchyozJk7DO9Rǰ3bJ΁^WV#ȸd&1XӣoXuXOL%'zS={\EvcW3Wv)|{V2`so`#%*#E滗űD*|sk:s_->12 %f]F+_mc럇w(gÝ3b$> z ~s$WDd{/L5 z H*ޜKUlKj588BUz:EBk^ࢠ,X%:Y4,b!禂vE/ ~C?ܟ eDZL~Sק\3~^ + 6Ǡw0))dYMm5e qRņt*Y'&', VY ,)추sYFϹaNSAV?)XY' O7?}૆tHgԵt\W璗8+×? U+*jSO؍G#{V p\Pp &Pi(x+#+;!ol$бZȶMaֻrX +rEd2 x]QMg\Z |ӱ {ZKCxa5@m_! ̣5!>%4p֟ysH*ܛF#B7LȂ q3ML_>4w ?QH + 2{GsIɥ竽 Wcct\rֆ'@<̧ࠎ9iPsiqKn nЪv$yAfQuT<ޞI؈Le;QN:u_@hZuSc虑_>`+K* yv9ҥcLa$ynjzX.h5A+]zְ=.ߚ$<1 5<Ԑ@ ܚI^Vj-sT":؁Xj!,%Σ`#* HSjc =ׇayfM51 uW2JYR%y}SE[>| }R`zkʺgv>7f޷GZtM;60I^/QƁN4aON.uβ=cu< 7oG iRo _Ea⻑wU/sH%i_t Kʺ38~>ְi__!;itS'j;V1>%p2 ql (1gdH74@QGF6fwP +>1,?\T:7ðw]h,#"scW2{&eݷ|E@BLZ~gɺw<($lsXnJGݧgF9yzYV[&O uMG*z]Tjjɿ'- {nE/!QYZ1 |껍Qtp>w l$XEx )kg-jGEN[1n +3nn" gH82{uǺ/)/F@CԨt_dW #σ[2FJrRREK )S;BJ$=$ؚG˸p&iq%E ",Z2BN1OR}ZDU/wk#}sP"x<(6W IJ~0.t:|74b+( |5C}=45oM;:0ȵP&X $..u)0<^mh5bW1Ů%~OAC8lQ|T;{1D 2lAX_0"~{`yc$o"%/7'+?9P@>{-π0|&VX%g$TjBEq@y\ cSN@}Gs + 㮜VkBAoPrVtcyo%&25U냿C]z?{6niyPsusCNYJmSwňXqc}5qo2cD9Cc8`=c%y9#5zdScIF#Oۣd@[}uϫ6jJ.5G(|6QMmpvk@2b[A>xI_ֈw-g#S}[C'L>]ecSPtš 7xyw|X!dgˉ>)2X,gȻ1\nUNq +]]vn%!߱HȕC/4U?0 +̂T`[ d-Rl.PqN92O[/3oItHYõQ5鶙16}[5 PrJe\`Q+<.gwi9 _@2dvJIt FXme]-nDđ n V̓" =׵WG*BEaş]󈌿68uk3Kqjl>5RzhSZDfnݦj;\c]q*xj?(9C-t9U|jeD/lOcSLmu\B͝6g ;v?zk7СKܼ[]x~f|Y86kw\exդR\u CN2{j0s,틑Mq.; uFPJc?l(|NɻXa˦‡c0S?eqD8gN1#gB\RTsg7[_LT1(v%'E$Ij"2X2o#2&ړPQKN`膇 a/v.{Q鷛[1՞7}kybc^`2/A{R>ɥiC̫AqIwծe&gh8Z7|ll雺|!u]UA!l^;"↘kYdB/ R./b/Zs U /^>2U<7V<ϷPQA` g}b_dfwG|*hiZ!^`> kdzH;ia֢ÈRyl6J%QdGl[v w }o~WJ/(yG3]][Ϊ]fkb&p}9V-bh胾e)"FSC]Þ 'CeXq;sTH{wFYA=zOE3ħc`XS)9h U7xlcܓAuݛ'yfٮyRckϾi,|`!ǵA/b/.?fdC'_%^1>NSj^z1b2j9#cGWdSw_ؙ${ mS]LH5W׼o3T-ٙ-}햣:4oOp0tO94 !yTOZbcZk> +AqWK ?nh| ~nD"G_^%85w[ %!DpO(I%yL[i8@p +r)pyn%z`#BC^tp6{@qyVa3aLԎP~u\6j>k_@mS{J6ܥܙ7E+-6TGdF'1w)g^5\rt4+ J0I%d;}V ӹBYe]ëowǖV9I.<4v.z =jK}5 ōyF|虺J~f^/c!S(]6ɫỹׇQO¯ȱw+C5j/y.Q3+#Q;LEOIhX$W@Ex̫sTy `)L-!v捾%RpuG -29EO9]%A+]UkC'cSRi_mπ>UhX+. [f%MLGKJIjb"t, }Rb& wG(@.ـ!\1jy 'şwGl*P0a"v0F'JK喚3^Z&Q񲺬[Rv%sOep ~b$0< r's[UҰε'94xuG6ܡ7++Ќloo!%P͵h䬪9yi̽+ ]|_*B%;U:V$+yU1#5BGFPg4Eړ `_/d&8 o >٦jӶi-["z~\*p.<-2>>HR4Hȼ?ֻ+#$~L£W{!A;/s%o-o] !h;c ub $șR{j"] +DcN=|ip_h7vR2Wft[gnRʝ*˽g9d@#3 S}R.rYAM&r+-ay6HomHt.߾Ȅ9Ul쁆 vʈN18 VX7[ -J֢W\UI`뒀|]M_/t+H0ukaOV)h xDy{Em Yv81VlGwM=ШQD1|,-u6#ƥ1I9D4>CO!Smq@]?Z!.ťSz\|sWy@Z,s^LAϿdܰbljlKm5=rFS3<'_"%^4Q܊ܰ3o5B/߇*\q)hYоBFXx#%@qc3v+]/dM講c̫)6t.nLf1a_g3(|}@MC=HؗⳏU;`}1@ל5n<6<zޥpݤRH96$RsGMCm0 _*( ' ,OD{Q/~E:- D s;6quU uL쾎E:б(mu{PÌ'mlZ_V6?bӛ??~rO +vH`}t3dHP ;RaJNVS!x1Tڟ'9gi3]<:|gUu!..MFiD q+h>5dD.֥_c'\\*yD'TlYSձ:9+~bxduU\uRtRBe xWgVH *d{Y/ι=K~Uԡe]ޚDD(J;8cZc|$,{kM ̀ o& ,~j``0'tzEXjQCe:r[blVOEjkѽFp G}#A JްJ"oPe{j#<3䢈1Zi_dInr{W}\&Bߜ\I|(3>3-\;R+o+"$\S3o,U$ 켰?g `4u^㙑pK㕯gO1$8*>GȰMw{sl0&Z +X&$Oӯ|qy{0*vŤ|}/4<<$w=du&eȸ^vk{\.-bP뺎V9<*pǗn92 I@N@}[_SLh»sߍS2r?\򫟋5޹E/>^'WwFk7+^*9.5," <ቱeȑ".a7O)qql*W66hoܐipsE˺mz"Eޝ_^nzcVg5(Ap`+D˭WQEGN*Csܳ'9LډuJfY\l`NRsLݐWRn3;ڛED2,}mVZ+cb~ x\Z&|g10JW]T:qΠb &,Rr2X[I>z +5˄R2SZPdks^?쐐 +Gk#6Q1kx2FX̵@.igީ{u~ g/-JqAތOGKlѲκH6JKj)szc,%]QRnϒQ9! +~WEhN"~~R;s[#Xng3ĭ|~"5݉냹Rh̙!cXُu9 \j\baS,k}O*_nHO_Y xuI27vΛgh3= *ywɫd~yt]\c#IkNW 2u=7hN:^52>5. +qb,xMFL6jCG2nlg.VϽȺ4E̹T_p  /}5}o~'LQLÐyW6XȯˍJ.hٙAĬMR +R~_å 2> 3wЏw WC?gj#sؽ9lWά.QbruQhUhZ~C#>xPd[wxILoSw"h8hiBLXl֣Vt\[A-3m1:M/+gflwm 1I@s$=6xcĢ;$DGi(+_8sBE:meuУX]?6#&#E{Rt,+U\򧶳꽱]p0d‚0E-=5 JL}i[@'[%BXmK8Pyaw?0[N7ꇎ,pSiS9N6LJ=PR%UaΉIBQ),a^qKoZk12aٽ_{7Iŏt-Npecn@9̓qru33JlR>@W'pȹM1=Zm^ |/E,_V^ ~v7W: a]׷d3b +~F\^$i,DN,7- eSgQL\~vwX;C,Ls6Gpћc}xIXqYVTu{<@KZA|f_ZDDXX ĤK=d@1&c}KNٸCj)j={ 异c?W̽Os# dGj䢝\KvkP>۫ s|˭v#@828 +tG‚lOQ2bJVKá/fcC=uPGMꛫCֺѲG|vYlPٳQkSW7?Aj*}4.wĐWo+ 07,'WQwPԏi}yme϶ʞj[2HK0|}1]ĤSh?dvP;OW:Jl3ԢA|;04<\iExEl)7@9HKS5m 1X<+vq/#h&#% ZQpq^|}W0P͑:[OtDЗ:J8"e_J9&Q)"b9JޚX>6ՀئP5ήd/> ߝ $!|FWM܍f^豞׸3vqe*xwhaT#  |@+uc}DUMM^!gLc#筏}::AXu Ʀz([C\sRP6)ƧrN <ΑM82p -s Ve2##ۦv L=`"@IQ o S3 ]cWkC7ڮ];H[W`Z&E}}wYTMH0UV99N 'l2VSAxTOw2mao#2Z81*/ nw!εA~1[џGqiWyO&]1*oL[ |wR8P+hl}ӊ;u}(yckm+&sOC/1nZx;ZJ?}!6׺K󣔔[WM#/L"DG2O?N +UQ꩎~k:)GS[5)3&8FŽ>>ZB|v_k? .1R,VYԓ'Iile&x.0s?9: =<-v?2n_/b1rvjxdM'*}k\ܿqFٞ v2MQ[万A>7TgU}p <ڣ2R:B"{#B'{QƊQp{c{{x~h{m㡖\mc +Vaum;X<+gO =yTSJ(8ұz-ƫpǫٺMAKN,jo:7?u׻k6k?lB?0=c{^XϲMq+wljIdž[Ǝ;CȵZR;0KŒ+ڦJau42-C=J>ۣkЍab4H.#_xa`rd;TƼm>JJ[Fx6kmjCT¬B ½CW[#A.رȪ6?Zh/ ikȐ[c(*K8mҊ>-2bh[̮R$}(Y;#G3HO?HWr!ڂmy&aCcJ, + +3?G&^7wnm93dLc4&${GŎH" HQPAA齫({9ss#aU`R`r钹>kll\', +;\ Ǚ7-Ċ9}7%ꋯp9YKrX=u~Q"?>.E 9~>DxuC o˽;tل +}DWVf]舘T$44P|\{H>V/$SI~w}4n^5|GE{rĤQ^sg=)me!rXvԜ'K3}eXX99͕|vMR^d:,*UNh袘+/8-/1,KCʞv>[pg+ps&7TSs޶|lw?w4f [nTᆵ&? d4_$5+4e:i*efQxټ tÅF>Qs- RZd[xihsŊfc4,ՁVv F{&jޟrDʩe z:Sv W"CRPGyw3RJ[\򂣫}\ï_wv<cBgz[dƎ hL:xQR1ᔍxn#;t&/YY遦;-wsɷygԸdBt=Z@se֭,ئ:pjvCuZ=ʢ:i@#(ZTʂW=B-95#bDXPɪXۏf,\< .4.oJ:.m| sCX CTu+6Ŋ+"Rvఇ`W@m /:5Mk 87>ЙwgP6'͓]&}_hhi^1:ҮY1}T:{QVZ16[ +8Sr-P<&⋮YZ/Tqݢjd,  V>qѾK'=\ =m\ +~zn@$Բ:Ã5O-3kbLIkVyE,[u +mMSu&xҞhՅΛ64%Ni.襢9ʾRa7,db06m5Qc җVi6=jJ_r4E3~Lz3#'e-qgDw㹁p;7碿jAѲY8;ô:fA{E~פ,YꢏsHF. t0 u !&ЃQ\7B3~Vmakʜ׾ao] U1g-fzm@(!2hRfvca?Pfe .gYHܲcܭDo;f !y^Ӓ3ƧZ>E>}RC*pw6 :AdbZR1&iqkcwf|p|gA2nVӨU:c 7 fly.bŲ_44A+~s-5_}g=k#mmc.ܨW둣cJ4=p3 (pҘin*XfTLT1,)v&q6FZLi-&vϛiFzC-\baCt91= AGȷ1%-w?owIO Hmɗ +Z[m<6o]2P6zٴb"5&kY_dE QL:"63M#vY赛^J㪛T?ou7=ken!xu{^*| &|x/*j^M7!A} /xh3UKxچ\kLI {#4캝VK3TM%6m9X0$c'T/Smer7$m +}mb\ +yGg!{^l _gbe梉>xԺҰ3YtҖl̶/<egd/ɕ&NgDјꩈ^q@V<亇Y69+v.o 7]^13HəSKgY#6k0])=& }0*z~tH(YS>6pMhoqhv'85/5lY4ȂeRV >&o]qs[Ģ @7؈E3hB6Gc5_0m +{ܮQlM> 3Wʹ~M|G9Y /VݲaaYjl`=Uw;sɧ:M 7Ng͟ m05A}= "7E' 6DG)&9!:|{s{pt|x]j$kjfuoh|NoZc}Pcvj|(*RŒ9>{~4In:gs]lL\\qwi =ol(A٬foM悠! +~ 9UymݻM# >"RZɫ,wBNHӶmNPXI#h o WG&n@_t[pY~aU::hx|}CqvL@1`7aRF2N@//ua m/ ֽlp+e˱5nq6fY $P@M &aKrk}Eەm91!h!Wm Q1+CLlI\!6|1EC6l ho+rMp:-<زzz㔚P +0omokλY+>oMYam%s~suͬ>:C̽!.cfÊ_tvR4JyĵvLd43*6, pT)>%]_p:F {[I;&8Ϣn7 m['+-E5PbaRxъWeZBSy/i?Iz6|ld,YsDq()Ys{DOrgk1uL}ݖvf򄖋ߘ*7ߝ0δGYTfK&.uo7BָWtiV<ݤWdvW w NIWb^ovv n';bn˽5AM9#:iE73k}dW/9!lN]zxy^p1zk/ޛٷ&;+>li˝1tԲ{ L⪧5.S̀amܙjw *n) H> mB ҕ֗~q|V)Ki6+O7i_\;Rj]V`b߸xñNݎ_([rZ|jCζz TNjػV:9oYնozX9#: אּ +{IӛBP7]ݲ DՍipn+KF6V.ͱIAWe7I- E\TG] Z ?Xo)6xVv@ ;*rKQnϝ5˦tO fbٺZzT#DitQ ă&MP s6̬YrL 豦 'px=b=\FvIEӖ.Wбlc@|2ZWLH/ZƇ?Ki>L֌P屖\œ: )=bA-ب5Ϝ1Ju& F)[{JܲE"4tD0t[]ޏBD3o_7bIYrb\5 )˛(U:t.1fʝI8jR 0+lhgW%$XLTne5nE*p$0w*p#4¤8y-#= tu{\ ߛrTVYҿ_gy,ֺMtuL%mZʄ0SN>sgZpbKeskDz>.rqƝ"h#lp )b{r;!FLT =4՘oTIr\&gEcPe0\F$`%.tK0MnKe-Aik0PD)ґUmtϘgI j!0}/4$5hTϴeU-W-?&~~4Dͤ2#+P{lWS4[6 vG|rVwfIxY{j4]Y^6cnj"S__^N<76=$h'LTe}cK~0)<<~fA썵f< JԊE<^'ӣ0 rޤSvRNQn'tCgNvS"ƤTSƤة=:RsioAX$aO9Dq%4V䧣%5^,lZ }pzF9gYtۂX9d |[/#NJfs).kvav\< mP\EB`?rӰ?'~>["xȟwx ( ;kD B4tJX(F҄< +?܄=F7na{jMViqeP\n0Pȝ! 0M`oV"0m{trC.obF!I/*-W ++(--S+ {?q^vH;̉!7C~;<$2旒"8hmm8eι[EH9Xu0h]̠1y\Y|h1D`_݌萴3{jrӈԛT JdH>H:7zV|;מƣ9$k +(\"w%= ˳g!2%}tMd2Ū3xIKԡWU{MZŰW?/>[?]* pk!Wof':$-' o5熺zlG'mU)흽x +o:v;6/*OZX8'GO+C"c''= + Y~o0^4+)Bm ud :(qhcOhY T@ת!K <}Rx萇B^FB,9y^Ƚ{)'ʫS<8|CW4"ܟh]bSu:Vmڤ^Y)Rf&:~9F8N8Ts!=1Yd\ A#'v+i©\ll-U8Cb:Cn( 됇!o!!We|BjGkͲ*riRxZr_JkGd ,CL?%CnUu~AȳȐ#Q?U.J: >kRѨcPv$h:7~:t6v&>OXRA!wUD'N<{G !n"$*{""ÓwԓpWUXNfV~GPoER`bqD\2t}DrJ5{WCJN|'n? VrEMȋ^$z%)|2U@m[1kr|G}*^1F3H,meN)̓@:* +ImȽǕaC>BD4p9?$*~M(?s6uԔ4 ݊@j`-,DSF0w(\JV?:d|a? +1CJI#TcQ&)Ue+|}0wRZ@8}mvN~9\u'NrR7 aM#Tn9 iD&ATiR}EQis4~ ǨT?~I^JܮHh4N .i# m{>Y}İ\Q`ĢL2~FO5u[ukMwa(-L&VE*s(h%ø ;:{^K]7{([שhj%_*/vkE]"[m} G 0=xi$'vc:{JBKzIn>`[vrgT6j,AZۏjc1[OѶGɅ]c?%t2< ~N(m?UwzKP`Kvl eƝ^^H$JiW`)BP\ o3.|@LV$pR 7W PPS)L~MsM`U`oM/=?E,7%t}dQۦ7R=EJQW#Wғ&WJ:_ =.B25M'95obml zB^VFx)ֵi$- v 1OGi'4DG"/÷Ym.V`\\SjqMs=ä;Ӻ[7ަ؛GfYJ' FoI[.3!]~'sTR"TGa7@( h81}gӰʥ,wDuEWN.g EL٭zk=vBMBfybbnzIأl-2(bU(!4U'/6+ri`n>e,zIK.>a%rX]wSᄴA@lgM):VeԎMZWZ:(l5R -mvuOÈ7nN :XNeázuKƘi-ÌV5λ{F>rX(p)iVY[@6g"$98Oܥ21 aW~8kܬh-kk@,<~< ifODUяVHmNVax 7}=K@n8}2U"y pۅ/v_M}aOϪ*_T&_-c=z 9$%E-qȫ ;*Jfϣү\qۋ+5Ly;;Rޔ3l<<մ.؉%+9JgmUL-+NR]UԾjA}kTY)cP VX:(o]EMq*c\G~ɂژu,`\dLi_FgE NWA9b7IB:zeXײf€תHW:d!dNp{~'~g^?̪^i7|5#ߏtwU<\2ʂ>|xZ<@e ?:Fiu}mtA~joXZt%LOm>"O۱c܃aBX9gWxs5{:es ;2eo_!Vj\ƪ9aȣ1 +bӎ-@M!N*Òw3ZB=E'm:ҫMc32)9wv)uρ.88>Cn:Wn;0sMKU;nAKM*prl *~LZ>& (ƍO0"gLIkvl&; v̈܃V6ɷ@8gM_z㠣[Y>&{5LلĀULw`k*rNϨY0EscΎ `K=T(p=urռ?ҙpEWrGW vd&SpS Rq{.4x~rY6?~gȤ-'4e#q$0nlG5#,qtο3SlφW`KM?WL<MجL;%4Sr3V:jE͜51?0Eܕ7N^5~˟ԼW3ƤKԅ3mʞo[ɻ.Jռj"V.`wЮtߍZՕW<_h^ YТ@=]GK<}=StQ {eLFtn/hQdzTҚ>bRsyϙY9 jLzfq&aNaR׵M)u5Vd)(}agg_No Cdغ ڱb=''YsDf{?mc{65CNԷ&Wt!ٔg+cA5ȤU]I䶳&ywa`:e5ӞW{1Z:1jWuȔ &cCY#3G"tˊmI,qw{՟-˚`_Ey }kS [k%iXȀ4jqAY @/j˺3YxkJZꗀwCcϯ(`q[j?' wzsJ;3ۚ~~NScIcs!nI^4 Ha&^ᤜ6UY {^7@v,Ue]@e$VMM&FפpǾݱW^dgdϊ.uGjJ WB"W {^b [,{;[|o "rY_nE +_3TA~ucJ;ًYlΎdC :Pz] Cb]͕}o4`r?asҰ-MeWlIY5%)yeF:𒠇È]O]š÷maLѾ[zu] I:eClXnc/ I"h]y4*؟~_}(nVOiiC[bnjY8ueò +5lZBzC7fD[V|(Opho +zoz nw\[;keX)gMV~/yڷj_˪J_5ZBf_ly;EsW.Qg<3 PT_xQ{֦/-K:RMa#8آ!PǙ韇5 6wώJɽBem;Y[fdҦ:bu? e9:c!|]z5YGD-Q12dwqmʊ 1/=59i FB|-=6uԖ<3cvFyz9/ [Vּ2ֿ[?|cKf{ꢶM=&-({fd]07ŜZݛĢuN%_,-~A%YKdzRiӀI2w d .J(ZSֿ?Qcߜd^Ͳᤝ4Dxx:J2-y*ܛ*{}vk105%~wg>,k@/P 91$L9VvAsK})WwMUQɸ?Zþ4׍ . :9WLRϪ_fc ~G_Y+GWgȰ_ɗWL=_Jėo=W4ذ_sFrʅEUM쎵1u-!lŗ@ VG.*}m,0*L%$^w7̩*Ote]_UU( oQ;%4I +O9̏mkcL_Ù^y`1ۖza릺7+Ҹ8; j_ xY7_>K_翎eՁ%9(bTp଍\ JlE>WmڔȿY5?F+}~zLi!ByYޭ!^̩"NO)?gJL5%~dv0r8i..~C/;@}\U[ڌZWWxX[ =sL،5M}Ԅ(Hk)7)1F5doqU@͖¼3Sm?[OHk^jy[srHԘ䞃z1 ̾%99Ćh.{7 I[Dʶ9oM K4c-3+GiٷO-~,|& N\/LW-eYM1V]}u_^lg|F +}?Q 3"DҖ㦮_s; {_ 8./?ii^TA,7;eYYIҧzBݺV?$7{3aR9?잯葯=WmjʝLw<?ʽ8O+x9?tQNv-9"㯀l^׿E@z*jcY O[73ش ̼?H*ߞ4bx|.y\ȇ-8n0p )ᚃuMIpJ_iJ|h._54gX@c~&qP~]ז{X7#]ʙg3gs$sOug]%"~ߋ,)i? |\οgh#,D-k"4Ց#$o6|سARDT8F<5Y{=JvO7PqFRtش~JUWkMĆR1u_*Gb\׽ +*qIsX t6P }o|?m{*hl`IAޕ)~ፕޚ:Ǒ:lSBpĶɻ0*,mW{N{u zN g]/"e5~FDCy{%CJc&ּ;eU}4Ʀ +xH0dWeEm3$nD\anY.9:Cz#ɿ5tQ ~\~ГN3T~dI >.ϴ!sɅΎo:U6T aP*c3!)+m੨#'pτ)~g:a@eA>A3Vaܘ*|CVD(w͠U%ㄠ𖟟~!O>f;5Ox%<]6?>{1'?v2N"ܱWtA|kț%E]x78)}!>#\?"Vuo-iTس3G늪UWQ꘳VIW>z7]ܧپMM雿G&4m; `%)8xku;󮟗ugK_?A\Ü棎yuII]P3Yb kʰ s]h9f۞nPFg=ذT0f{ xUG>jӎ pd,sSg44ġPhŁ9YU2aFRU{K*mׯ`}Ucot]v&\^ՄoG.Ji\5&-3li.*''%iC܎Tld]:)4Kk|[_hGŝe%*~ :ӎhgׅU5/fԡg=_ܭ5<~M ֑[>H޴D7 #nBO"uN\zod!fvߜ `E32c|ߖpvFu-ܟxK[uJ#j>ъ_ڵҦO\ݝT<|iݭ”yv-Uُ vSzH >j;?w// E/p䲪.iAQى,~zC lPY_SLueIᇻ6M+.NB]Bҿ@7D/p{nD@RlZY`L j1qճ<3--#9ayiƍ ˺X'7ۑ|grk[ pjY4b-]kSچ8Uuء ʼn+4 TNty0.,=]qoNz0O8̌)Ϊ'NrEkq; Ua2P誶1qA{xW? կ]Ms,z޳s؜AEuCO~ix:%}uunx]=;H  amʟeD%}WUWu{V6v=!yb^5Ǟ}v0N6zBd^ҠS?Ћ-ڰǸمNFe2u͆S}CnJ_#cH)fw͠VLOEmتWp2vmԚh[ڍ:-)]VЋSCq t(8p?{VΛu]Ues 9gP9D693  rr"U}g-]k̋YkXwxa$γFEjexXm?y_+;+܃_uNA3~à dTM(\|Zclc(rE/n 7~ѹsNA-g&-*qA1˓17ҏ=@&}#9{{qgcF@M h)[~Wc#w,<-Wszr] N$=omxva]/;m)(:âGͼV :_FSe@);jz\x> + +f7Yg>A_x k׈QU?ͼ<8t$E+;ͯw^u$992cs/)z;ͭ3_a.loJ ȩ.Pkf֜~kG!q(َaM5|rz{Vfոeܪ:GnSsٰJ!Z'A%n{Q|Kɹзg".?E$|wnKX$k'UȏXDlyisXR]3#/܃)hPs6Iai'*s<ĸ{{_YJay \1w,͢0}5g^םhE47!.1JsM.9ƯcI<(L?a~]@UU'!rCjɯ*!cԯ/>'~*oԮW0Rs@OV\cV((^q2ɫ4nm8aW,1Pc|;dꄸIFKA쇧xiE{צg4Tyquf +a板z䢀6ZjSG+q~= 5Ƞ֭S=; ) `7$[_}00>sSS`iP:d]p…kke_o!96?,zO㥐VDx$#4`/9o B/|lRR:3fje~)CL1Cj>1A˳!=/Ra3Z‹ƔU-jfMlv)ٛI)LQ, 8%9O.aoI$ Tk_+sM(؝RBZ$ |r$"U)F(.y \X<3!a} 4! 3 v.G)#~&NAY(TcS6G0WmRV}i.گ {ɥa3R^rk, K" %]WR^WSY.ewOuI[ +r6I"=N^P>}>:ħaTͽZC\[|]h)#؛Ä9Ӽ76)rJkʭ1N{ +gVs:rY" 6 +qۥﭯ~BrfՎ MC j=&$`{%Ѷ|9o\_~X'{}]IQ7TT|" +=ȅϦ8o hD؅׈'ugV@i%1o~ cIScn9?>,bV:qwaggӶd|SAMRG{MJqN1| +zIXÃ9'A8☤]rm+&P +D r|;`x? ;;s訥!99?$WAo؜ݘk)?fl;FPm 6{j^zUwүmVD % } lk07Ԅ垪g}rbQ(ƀ!$;EqŇ5|4yyG_?Xt8t7Ĕ^ xCNslCЫI\WJDm?:+L@+5 cq&9ݘZʡ{O}ܯyKN)K[:wDBGIsL A^֝%:T"[Y 6Xjm7[~i>/qL41W%v`k unm)MG]@Eqp~FHY}=d[kqKvvW"t we?mn /noPrbOůf!"3MwI֧ELK #:V'#!5A,Y>]}Dbc1i[JwL2j\RlN,I8rl16 )jibIޖ mRD^&[V~rzk ~ɫB-Y/͵[ǬOl3궂cQϖ4^w<]S] ?̿$4 FP/`Z@+A r)֖qv6 g,>͊_',*F!NalFHcO̶t /D5j}Y{m@Xظas > +ɐJSb[qdQ|IbL7 ||M:`IѲk#^s883EGߘ]q[Z FUeqmi^t}ٜzڵ6kSFXbf/D1udgB׈T3K: ^q\/?o9'Vu KroaAV[ф^1g~7М:1KHe%oO {}[}Ƨ5HYY'o Q 7i `QyD^Wo>ڰƤ MhV_byʟ.rgyGw{aWÈ &M\7#\淸Tm{ẳQE>{m{ e+;`_$tu ˳ V{aɾiBE%$'+4nWG4R R37Ǒ7ش3c톟YgDĬ6[Wh~R,lhmO_؆I~%Ưgg !qO$&4tyYqmekLT9HK>Oܣuv;%{?j/ָV6a'_ѓTt=dd{bG-59`^X|Uz15s&.02A=(ɀ}R#LGI-Z}8ҫ7Fye򠖏vJ  /-4\n^ݹטh@%%FYе}(6Jv+ӏ/:I1B$|s썿3zʣMH=j8Wi3h~zeҦԻufӧ;u3 +=śð>.F^wAD}敓c3bV"QyP-@죤G%C WvNYIcbڸjz?֋9atv?1n@Ft82ף$d{TNY"dtвac@= #KKQ#]V%bfV6-MG:&IE}p>=:8@yuȂegIQZ&|m0¯w_E̝M!e8PI󯫾]}7OS>jlb8aZ55i=T"+ݽ[ۉuv{Y=W 0S[R&)8[J5À~- c*><;dlOHNQ7ڮc}+)zaXR$d\#m!i-}u56SC6C,iUz%t\y{ +䔳"gCEa[%Exx4`m{kkGNYvɹ5~㘠f4[Jsn;ezy9^!4m|F'V `%QVg]c~|lrBY}~⨒ԲKs}$oA(!=5Ȉ yW[-/3]g=J!# +b ;iS_[>sL nZ`\5̜?5 4wGX^\醝~5c^Bo09TmC2ͮצ!n&\JBcE$ +16#U9a#roq^qa{-mueYe:\Rx0+դ* +ke­ӋC&{t!\Ǘ%6 17u=]~8kLHj I/CFE(BCʫsJf_4vAVlqٓTX't6.g5PKW9Q=fWMaFK*qO q}BQOIgm{5V( ^#ٺaBrRܳ ]YL2*RvsܭZ57Pạ&dμ(bIfEՄI 9U?Tz,lzZ坦a-!:# <9!Tu]øk} gm'z7M!r?XD1SmQh^ǥv0ȸa/c8x:= c cm ; ڻWDMZ>A-X![w[:6$%Gj/tSÄL.M su[QvVWŇ <̶T`RrZWkLQզ2BS=1dyQs1L ſ5uA}T4l +aCdӯz8_Ϩ[jjfcY}:9!h[lGsLz}U_ my?X{ۺV[rEI?K&9l,tV\Z%0+&^&|Fկu|_#B0S6HM_cf,'vT:-h1^OPnoO /`܃<6+$Uez&1ҝxBG]r7*1wq7xԝ՞s \_-h\F_[ï8FioV1zpIԴžSyw|ĬQ74{'i)FErʰ7@O(qiثVf81Z5͇MS{k@݄yH$SaGl\] +FiHǪ;1&fe;襀 ؛ha'D/u˸>)0Sq$b]Ӵ|u>r{s=9V*93%i9I) @̲1 "~H&/+rgAp=bjGM J՞o#F.ɧ ]JduUwu;>SkL6#l4 )RvXx9&FaW-r=){ ݪ4/ߩ%Y +@oQ!ڡ`G's" hڍ~#>Du7zZ7v~ FQ,\΂[p3lS(c6> )3B݊1;w-]cgzkYF]+1?o_V~ys"e&-VDXjgMkX`.;sF0lJIu{m2^}Z V4cfG+!9UB89mm{e (3w_PjEM-lЇE.T(-1&rLjmc512}:F$z/R)_՝ +r + +93v26{~c89iJaLC-JQg1 垦亦HY-1ofJmq h½n88fR\FtTa;X`jScVFM, W[)"eWCcٮQChbFR6W7#ȫ[K OrZ厾֊W9y;|0kNHW),Or*쐾=fnou~>k3Yfbss$L"34O^l4;!!&fX́bkX=~#>x%լ!aUTJݨIcjo϶ G3͂BkβefG%ڷ+]>C|{g(Y9ҐpKM-;Gnucvju}=Хfu*VVC Ok6(413fwڎK3<`Tdyj?x|8`f\QHxT/j>$nwq~ O%p>]b $2+Df.=-wN [cz-[ΩZ\ n$tO#DzFӴAj_9͇S`?C{8m&VQaY 74#$ Hyi7A4ګE52;om%ڇNye,]Q `n9ү WOF+qלSk)|FD/,v>K56ȍET~6YsگFçm393'U#P!=2 Gq%! .g}Ĝ-oP⹾i42pfj)6)%sk X_Fx8&9QK}=%A% vLG炜-kea=ۊ{̥u˶ |f|=:'uꐆPjFm; +~\z;oP)gf|PbCZb_F, 13jjze854H[Iη7$lӄbMҲQ^=puyuustzlQA\ ijMz֎'"AXK,i.91kgM_k}zɯe4!n_zkU$ 65qqRF 2 {"-IުX3Bnt}yUm,`V.` ';y4dܯf@ WbFlC]{Zڢf pOr/(5ívv qN1>Ko+ɧ$湕|Y;+f_|~5 @_pnUjrJO(<)eDV0GυT5-FlE2RJmxˣ`ozuQJZ?R_F+[Zf]F/MP=j>ܫz=uyi 8 t(1V.%`w Qrkӌ"VV2Jם̒YLqqKoJ לrN" !/ՔB)n;RR^[뇞?>[Y Q֪L3ǯ"+11֎;쒲;.nY5h/qn9`Գ1OMs0/<,[ZUI3=VO1 +.ư\҃B@nVɡ&oWMB$b眨>9Xqrw޺^-}Tvܩf@>pf - 껪󃖇o j"/fiG4cS%VG!gw_X0Q8Nޮ↵T۪;*/E52d{&y7G(^ a?$)sc=M/ +ϱ9684(& +k@yY%bEA.3U,8RHK. xHRsMKm[o*[?SkhĻ1qU0RJ[wOskōBG>Qqk_pN`2F64da6}0| +11%0=.?o]t uܪ-wQ_Jzw^1Fq}TR֧SM! nuX9b lGDϵܚ)z[VӪi+X: 1xX,_w'!=(& NqsmՉnE q5Zx8G"rJn L_ k>cmyi[F, +l{[zףh +r{ȹu]S8љ&;t v걕7plT~cC߉xk/WĒmzx~LnLX@ωDY|3 n":rQHoLrMj杅9Fag ~+dEfH%N9wnd[&j=RB+oS/Y^\(4//ު+n%;VߥW;:5m)9oI̗w>ژ|oLTXAnROJQ52v̌9R{=I 0q._6*Ls +r`a6gk<[$zd \lX(/K}Xv@- i849!) 8Uw]za{ 1kvX:!IhcG]XzWWFؕ1bo>nߌ5( ̴5gf-;]MZX'8&% ÜR\u =#eY_B|>Lsl98=wyA aBN:ROO)wk~m /4fҋlegA"A=R*FE,=[;X[Ģy;`#!! +_M(Y탞؂e^h~=ؙ677gG xRvׯ`V,y{_ 9=]ĠjWC +Ȏ)j 쫊Va>Кlzȧ0 /CkSORZA Z˃z.̈XvHIJO*۝~]?,rp13֧917IA%6fCV}F-6d@=*8FܪN ˣgu?y]359oaL"ҐaLiIȁ5,Z)ِ?ܣ@j ѧme͔NDn6a%G$;F\\דm h46}⛜^pA?i.upDEL}b$.%EN"d5jPu1Fϳ<,nqw@D0am"Dϔ54#:.t{2<﫹g_ |\K_džxU|*3ҫƔV94 +I@~5 +N)hži0~Z1,dfMXt;H/[C</‚J>rsԊ9 &[$1իfTF,lH}4Y? +8dR]JB,aQ?yoYg|,蓵>k/w^oi]j_w;E$,#f9zD,ܞnq'Gq'iuabnpx13>I-Y꣦.{/h"ո hmE(Ow6ǐIA=!;ȅA!B447XH9o\DlRbj/=?FոD~Y"ޙ@I~&%ħF#1psvD91=bdC|O˩%8`5"t(@U!.j!wbjUjnK@5 jx sɹծ !d{c}Z {+4*N;bvdO.eVw}tU3=xRҫU[~%߉ 'k@oͶnIj~%ҟb:r鞙k08:w09ͥlTF81k# QֿhY1%[qf!1j|*Z`ٍR *lhke^E  R+*6%ȹ>-E[O֧?GԨYJվU Ťmħn&y5NH}ZQe_\ݝkZxMA>_rK,}S0sd'V] ճ~vL @-j3KBWJDSKbSo-A`+MM9.oZW*v9\<1#Wl θpV5+=l #RT-;3]C.'X ╒xdY>bꎑ X 5Ѱ5m}Uq1𚚝baԈω~gZ{sm>~zBڎ[z>òD~EҴc/GlHTM+aWlÐ[Kn9)3gUX>,7v-BRؘx>z٭6ߵHxqk UoRPJjzGŮ^e,@olL}zm[bolg:&+oP$9w]ڱ;fig3l{߫o+i\G喢nd lK-!{u-lpMøKfv( G)[,8^U`_~9fXG隈i~(+Mcy +?&ܙZ-SW1ܻfޯ. .̿,9V#svgeibKF-+9ݻ 0N)o=(l : cc[aׯ&'{3T3P{vZ[7tfXi>r}Z`&vJQ}sVn-1oY[lXYvclN ]QKRBWݙ;^WNؔJ^1q1fZW_1<.95/iu+;ƔXGvĄ.ڮ:bRbs]/sm]~ )C$;&:e;-ΞR&ԈdW9f3JR{k=faKίz6fU'or9K=DsЍr~+=)T遥k@L .l$aζI|6t{u 8w~[9}+1r`wQ 99u5 'D4}3 ;'fY!ehTFGآ,dhNu#/No7qإ.b`F>2q93b}b)9ū ZgA~R}>N0,m]ASg81ͫ ꛘO`/اaK DT\ڞ`EBlHèڞl쒡{UȽUP2 +B*5U'd'inC*W?,Q5>EHǯ!x+} glCifENՊp룤^tF_Q}@l'ppG.paoߟgLWI*X2R4S)k1ص\Z q 蜘q`[kI͠\3G|XMC-Imj/ +}԰&]pmizUzu WpH446qiug=#q +MgWZ:&qMrg " 7sn ģ\V" Pbswv+7';:CJVMHE+81Qޕз]li\Zb&.bsvy]^iof,BbPk%y㗣S & VӰkcf`dN$Uҕy3# ̈']sI6ЫrHy$٭2A}D&:$R{VpoQ]Ӏ.l*=.Ul`Sc UZD[TWNޙc&qL}`07h5.\ k_߻`qDR@Ǩ Z}sLr?&#RbI! nf3 lK0?.q.9b bNti`Lo<Og;ӜڕAr`<_ih/m> ʯCyr2ѫF6p)$l}ʈF܌Yx䃕Ї[z&IaWwLڈ qy!sӠא+y%tԁqhE#;!lP:ŭ"m9˭ a5a]3#&Lm\']3*zɇe[< &>G#o!/BNQ }ӸW?m;s{+o#p +A-nL +iʚ>W, h8xY5=[Id8> zok1b`wy_7S-K7*E9"fzw_,=8 +ٰ I]TPKÀdߖZ"3LȞG_zV]@ŃgWkHD_[v0*> +9xmc9)*[Hk!b{ ~"~POӌ7Iɪoyǀ7["ꖌ K +'ΓG\]n81=gCފF+#M)p̩]RM3g[x8npsԋq3ZZPLXܺ赠 +&PMҐt?`N"8b;\ ͢87.(qK@!(rM/T|=;}Xkn[ni͋XV};gjt<[i!r0)C3+f{/qe3lnm>Xk3 ٟ9`ZdJ@O8=Wz1)޳>R_ro}`Y` .}\XjӿuIqO5&Fa"o% E[$_ 09Wߨ;S? e/q>?E.o< G[yYtǸIbz}o0C_ّ#͎9lva#G9rȑfG6;rّ#͎9lva#G9rȑfG6;rّ#͎9lva#G9rȑfG6;rّ#͎9lva#G9rȑfG6;rّ#͎9lva#G9rȑfG6;rّ#͎9lva#G9rȑfG6;rّ#͎9lva3ob8y2AП~)ב`Ks> lB^rX@so%]xKUx4xq2hN'?>%Y>T恷1,^zx8R'/ONy8㿮$]LJˆkK[-#k>ǁ#a>}&O?Rhq| Gko{tjrrҍǯ\N~HxO{k`OR>?ɏ{[S_𓠎 %FB)yuiv[̈́L<.j^4F-b_npȈ;,5H!`U:}QOurӤՒ *ID<ۛ< +a[(tMnpa98!f6ª%6c[amTw,ڐѫcfng3kCjZE{~u][ovv}|mY%KVIQ")99B"@B圐3*\Uewo58N֜>ihulNR4HͨS+":9QoOέ}:0kUaM 6gQ''aeמ~i>[ՄM"]ZH᥇5?kf}ϒG3v ='.XeS͢F7w%m&i|۞R5NHoW\O|J.8[ىĕ+83/Ỉfj-ZrM_{A*+01q^2(0Q_ٝOAjUWٚEjfƩ`%l2*̃dH% +Wɀ3\B9p +1Wtb>I ⓶GTMT\=Jy;WqpJ;-ڞc]@\V" ioc}x|h&&sҩqT?g4$ְ@-*wu^𩸹Ex _֞ kL*\j.蹁u\Dnj<(DEO+Y'2>s DrZZۡF)V9ֹiqDqX0Œn1;vp29!,K̋*6E 5k36u(Ӧ/ۏsbʦ:d#b'Ru$fZcNeңh#: 0^5h(}WDMO֒ Uވ +!I&oHȫpO2,4pYSG>}zĻiLڽ +WÃZ"\܃{̜TRnY:#DuK/] +ts9ZT@# }Z!7(ɠI-c70QA<:{ JZ"#.E7Ůd`z^Cze-GPgrAVq.̩L{ZN$m0d*/ȅU&`_؞l+yBhP^yr<ԬX]]-Q迺O^b{)J2.^q#oѧ7C4[@u|XR +x_#:l>]ٞMW'Ob~/mߚjvs˭SvuTQ)cݝdO^ziz9JN_ŅM>>E ᅤCٺ4Na2 +~%կdsԼ ͦ[ٜ% yw/NY}4RڭO.->ifs25ΊKюu"cWw&lC;#+ +`Nq jOH{H_ sDKф#A}ĩhfuʮOj1 c߇w¿|yc`'T [#;y''YگC|+ʏ"N( ڿ=8D-\> YLAժq!zeфx͸KZꤿ4j/ĺ v^LL~LI)w%9Ϲn;EQ\H#A=*1ģnh`LTMu +<lr.@ MWX_4_υo@ *=vsGq[Q4S1 + ?s@[Z,3'n=YK2Q-ꕶ.e{.b0a].,>E_.KƧn #N2,e>Vю[;/oޘXzsEGZĥhE{~e3T3`^T4Zvn 6 ^~Uſ9z4x䓵'୙7՗S9>T&#m52^uYZw'o]]^ >!]Yvys/M1Na]GnWfܲ-78MbRZɪya Oay0(^6|{rǨ,1=}<1;W.I]eˁW|nq4lGPNxEՠMhW'ġ.0Y!n|ь}qKpCZSNIBKDDZ׍_G:d5m_$E7gS#g59m~ɟreϠ\OWw-0,p}LrIȣd yCΧS2D@NL-'<ʎWX||y O| QD@LNvx׿ZANY +P"nQ%C5ܒ*NMD~<`d=P QloQo[js1[} Ixy^QEUBT))Ĕ"*$mK0U)O<Qާq-b| ATi֖BX,{r3qx*5YaXWގUoBLڙg%oC݃o4x(5x 9 kg%}Zү`BZi.da~݉`,i-(MhPNEUB*܁x@+Bނv`[( +U. +=\L@m*28v u܂JBBU>Y+S p[  t˨GXq/`~*픷&mb2"=w1-e}WnAǢzjI 4j$({7zb LLhNQz1ֈVwIj33ywP"\{TI +k9}yu?'M͔OPo>6R7UvNؿ,=o?B~BmԌ|UKj KJw 4M>dKۚ :]֪l(̼:ḿݞh?`ڊϐim[rRx%5<<^Hp':Fm +s2NnO@8:ϮK I;Yʻ;9OͰOi=Rx.Ckf6GZ~V÷Ggfѷ \t 5͆%=vfZW)Ȳ9OMZyE99:I^U*SU2o%}yO"(@=+)v& ;Ȁ5P^`7J-\TV1_ LK3IKI$ p.52f E(9`|`"WID1foYuпP!IK:O&D b(d,1S".Q%OD֧]\X#z=5rzCz> fjQg4Q'D ؟} _!$VqC ,ܴ3ys_YY\:EP۴;!s;v 䛌K߃ߋ9MYvwk^)}pO73_V__?nO۵jfU[uެ)VaijVT=&@y^Dٜ\ڞA^⯎63UL͗)kÁDJאN-0)q>-X*Kn~sw㍡{^Ycp[߭te'ϰ;%9C7?}wg5 j)#8dxtԼ$5'(ڙ`۝bD ++mD\PC3b«NYhWsuہƑP}/S439T {ʧ 24|P#[0u+y`W?u{{暏d"jE$ݷ[6Ctqu@Ra 6@ +~,5A  ⎷ѐ YQ(|ڴSXkv3Nrn>C`c>a a1W !is~"9 +χi%旵T܂rZh_ҊxZ9 q𯀇T)tw}:\EhMiY)'BFt:"$c- -_r ky`VGDLgd"F- yǮ{5G=*8lCSP^9dMy+u2rJʌGZGA!JXWI윬 icc^XxK §bN1Nfg)ma奺tc +}!x;= +tu9 /nGTƦS+?m.>=nIIʷ8+qE**#ezoPaʻ'X'vǚZڏ"t;3Gn'Njy:9] :|8d܌3$m!'9+(Z Gť@ +a% + +kiuu"ʌUڊY5M\N&!vAT뱕 Z@̡aN s3U, oc:`ch/Yy:8*{*XYWDը[ţ4"7@mɈ^@Z-:ȺZf"4(΃/b;Pמb +A~[YJDU0\l,Iz-/*Rq*^#*!6+i, iu_p\D&Bf*"i%Cr&wn Z"tcL@MfST-פٝg[;N )wyׯbo'EsZng֥gHz-0{JIE8ԫ`)ZE:ѩpND{HߥݷbTf6(nښ]QUtЍp7"Rv`~dԅ8tm`n31?AϳmͱOoO +.. +)씼fm攼ljiU1iҥ{!~>5k~m`|ZprդlXխ U-Rfqru; _&٧yuHn uiXy᲏^cj rhyfNBAuLM|";pyKA6\macxkf dk5PqJ!urfS3Iύ,ˆ/oZ#s.<BraޥCiH :q.Tӧ;ȥh|CoQ2A +2z֭7A5[']&u2C>aq3c\L-_ zjv6/Ynj]ZDy vb4WnY0F"hԓ>|_ƣ# ZV7oL.c^y^Lڇ:uEߛH8o2 ;s)`$0JdfɈ]ntkGlN٥5i;6d0ԯd-w N`D T`V Z辷O-] {s0pߣBdU.Gs@Ʀjٝ䃦C-ޜR6}R;{S)4$)ybӷFyפ'Z ?ٔ-;1oԍϨz%:xwD3d|w!=-8 ò45 50VPs +>U'3GҸy(TT@'&=3jםG60~^Z~y03)#̲/ڝAdCU,=f4 ,?xUݷ)ƹyb9ׇk>i.9+\~Mrs&HFo:㒪փYEȢqAqίP19{c/RӒW ?jng(xʜ[/BF7ϾL2/#NU+OY #p:g@^E.M6ؙ\!}}ޔS&|t6Q7˳֛O 2a]Uk~]U) : =yzxHQ]v ZYs֧hCĭfڄ-{ KjRqu;VIe֡ܲKZ]unc^­fWU}O3.(νGZcWH;iagFRqd{{ۯ8%{a#]R +*&zoߋu lEb^͢A.,BOYzZO~q?x90*8dM\ourQ%ӼGvEg$2Nd-ӌS[㌓K͋{7jX `7;|a 4TWnЕdP!o}%UM;/#@3VMgڮ㾛#x>giة9iEzNH,!`IN܋v b>!~MygKʮᬍ k/0FEo^-l;y%CA"u na؇g}FlYF2!*=9{{{.d=^֣hY1'qm 4Neg.*C|*D\VsIBSc3TT YBFz2շ9㬎+ +endstream endobj 30 0 obj <>stream +G!ܡ]hW_~h1z]|S9=9:gh*混KR4-nѬv.C>0R6I4"ץEWҔr0:r˷g7ݹ%>+#9cdz +|ȚW&ڏ7b]N 4Jrϼsj0g՗~G[4 mgNTvHk 4dzġjt,#/Duiez yITkgߚ8$jΫ /5*Zwš0d+pJ2bόٮ [\ZH^^LDtr\O[j^prKc<: + +s W+;y%#_PQKfZykY7KS촲%cUٞ6 w  ! 45,k켖C/LK."Ջn=:o xݾ + /g^zk4pc$v?6Bۋz9=/)G̭!qs>RP3"߿m_䜌O)k +. ~%w/s +d-v!٘q$*fl{ +qD)m7[(㕷%!Ƒ u#Dr {ɰhdqUʘ46' wԂ:5郬ڱ 7@#,tו6aNi% +&xG"F#XP΂!HA&<^!xr? ^q+Pޑjz V,bIܴKޞ-4x9롎XdӤD d1L$gWQQ汵猃9E]!MJ3Ĭfy:5%5UQMBR>KWʪhJ+SVIEbsjpNO;xxO|n;kt2zo"ﵘ.c*Zug^)hmO}'}wuQN`~E {/*kUb7aۣwiơlkaEwѧ_|wY''J6w^ [):wds_DU'i8=Sǣgqгcw*yz4 ,LS[#SW)I PO@XP|=BDځs_NQ].d@qA:ר{110'Hߓ3bS0|d< ڔW\x: +ϣS.VRHBPA ΃xl$psX4ȆO￲gu$4wܢ^ ݍMyqY!};O,7s"W^Qs.02*vlf5&חZF4`'KdX%].býkSԢ6\(zc\G7j2*ad}26U\0d]j1(A &a^i l*,A}ON-wkBZS^CM9?xWϋxQJs]Vue9^Hm{P4fNT;M)E1Rha*iP K6`~3;]e|pT@IxD5]X9\j풥šS|P5dj.֣\OEqu3/IC.W" +j21kS%imgfFLUTXؐu˚IMk/m1EXӳmI"d_Q5k-f17/F|:7Jy{2ϝ)2S2)%kPoHD{nQD]=[rW>i?"j}s5+^ńG܄դ_ɆPcm hv:$ze|i5 {nRQc7ꓷa^I#Vgs Xԏ/|1y_[S1|yj^#3 ]0bzޢVR@G'V'Pѐ +F|錹W5{z W/ևUP.G_KC9@dH[4A遷d^CC/xkv׺c, 1efu}O܈ZIT'輠8˯oUl1aVq/&:Od*5^~HmQ3z$믪\@-O3=zAtwhA|W[Thx}g][%{$6Q zÂNm%ftL=I8*ш !ujGwRp̈́רA]Z.W0eA_0XҐYl״U̹ C_x?e5+ҳ两";%PS Y'3vjqiͤ#<o飀}(ic_G/~1-Ы a)٨O]Kj MEل_u*sY!),2p)#?_ytI ~T[d;UTj&k ]kY}-nO21~3ie ݋ʘdt8 k6^ 2>?aAȇ Zfˠr4j."fdVZA=7}C%.b9+LJ`΅/WխI>bd=iǍ'Y!𙞤W'ZZVeDxlXXߍ,xr?H S +K= *3~^i)BrYX/t]C V\;?C|!+/>û;+ +Y Zŧ5Sprv&Un-2D.(g3uqӑdʅ3B7PάKTyDLD 6wٙ |Բsc`7WD~+وOH85OuIvmisV\cy+Yd@#-6gW fl\-hףNY{kD Qޮ@oV9E/^"/+%E-}ozICcA2\hZ=J-3#XPXw0OHȨۚkwQQ$wYIuaL͐,$00oYP1豨V +J[>%ӊ. ++%r2]4 H2uFCukXdH޹6;s}kT--dG\ٚ`ڝb%V !!`;N,lt,xA^ &z=zi֮jEܪħAZS/pQv)C'*BgiI9* +Kz޲dcԫ!k J>anY} +9uœg +Gb*YžLa1Z)ⅼM?`Wn3mNn%f]CB_~SRaZH߆9n}a=xHI}̊Rpmd@Xp.}*gT)f|-kjA!o<^'dO*"i!àPs:?T_W\P΅T%`ntb[4߄-w_5-LXD#ݝ[^Yh5ߨBfKr͆zo#hhpvD!Ho7'ܤ?Jn/z +2\X! Ggy4 iNR6%#i|`ymTcAcG!Aq#FFS~Y{*̳x5'@a +٩9QIbRx1mV!}%,Or%gp=1!3= *zr+fZVEe<NڭsQ.rkxGI_~o&B܊yIڸh}Ttiw{wR²]T=-1r^qϮtɂl=A5H}1a]iezΞlǢE5I0pb?_ L6nq T'g81 ^_Av*P ++? ۈQODQ6GEg- ^1O z\XsI k_J.0!'3v\@ޙϢ״r{==i 1ޙlȽԢqos>QM4\TIGAO([\Cㄥ9Kjqgw78kvHRL6p?nў{Y:R *3 !r=Ocw#mCj}9d>1 +[p-eAދA<8j1QzߛJݽF׎uWTE OUk@%$5˻ޝbܝW /nfm ib:LsxzR8CC*y5m3ٶGP'%y^hwBpISӼ /i -ڏ*!V:Q1jTۓnIxˡ e @}OFF!LtE̾ܤB|uyv 2|,%Aw%1ͻ@ ,OI=*6$ldzvU%k{' +e'*A퇔WB,*._ +=^o +L@!=F`>P96*gNAY|y*f](D} 3 Pe0iY$MI86Yƅ +>/ DHLՄ_T{80D6Wa%7r1%/S]R+niCXzۦlY]FܽggVZ6 3]ȤOOTmG8$99d{);'ӴVM+023̬iޏoF[i' +׮$u +٣e .krܭ گiBY*| \V3Qq*;0%=˻lƑQ8,5#B }xkG;!Vi]!l*@j>2/kD%蜠h kоiѕ̬<=nJNiZ0)wg߰e܋K*1ĠЀV&H,ԣ&"zՔ{;;HF̂_ł0.iM2~8_M{aꩈezf5OVJϺz>Zc>Y& ؘg0'xwZ\Zx9@=0vg)lvbJK9=wkBӼ=! +dO֦wՍx?+΄bA$AIt,>zql/|/)}gbF sՖ_b^{9sr.UG~~Rt%5% +|:9/6^4~>=~` s?֞5|_p+Y9^:=>iP:;nƝhBUvM9Sȃ/?ZxEQgo?+cS4Po5|P"=K?EuҴ[ݙW$>SR,></P^Dui橬[LD(ǕC[ySM_Cퟌ~fZ{mV<[}*;Duq>ΡCw߮?_vk{lwXxnrEveBVFze{rywǵN/nJWݖo֞wMBO\X[}iA*u?מ7KLk;GU#1#Y{;A3o2̓ {Y{yΨ(1.9pÉ#'W؞G'kiy/cgC_'&DםGzvڣٙ2/?Y|$%v]VGˏ۾e%[Ü_P;> y2SNI}ͮO߮Kfѻ-mcQ쌬"FRK֑Ƚ=8! clmyg,HKO4^ |=?mkЗޡ> ?5qZW3)ŝ(4\ϫCܟ7oT,و8 [#۴MN,=m[2w7|yk`u?G|Qax87GI{i w4|csYzÁǼsXj9=H V'3&AO4]emXt.v'.=lu@՟7B?K^9Z:Q"e8{9~{䤸qƋ/U|vWwHqߞ[^ap`bLVWn)˖r\{ZUXx i>N%K row>zsЍ& ̬װFQ@ɿ-S^G NKOmsOy{j<.)oq.浲c+CSKN +/ygғ~80g<[䏾ڿLh/\شaIQ|Lrei7?KkՕf3uBUԤnғ/vAV}|̌ɛ6CiIӳ1"+\쿌 +/_ćS#5t'{vyl'pOnN-79%-”]'e|S`ˏNKm꾫%4Xut'''cUͧ/?*~oa'URyw?Ü*xsc{bIWy9<8oY?^7ߌɯ}[?g\:眛=svw %( + +bRn~>q|wl;n.|yޜe>#o !o#].yv[޺)”̄ĨkJ^.|K;4i;u,Ǎ4'sCŎ{8 oDŽjA[m}+SfFc]Es0I߄3`* +om"mv[r;K m\S/%nb}V ~ыHi>kZpgTxtB=8Fsf}Wrsi+;}yq|Ⳓh:Z -9Zb"Biv+Wd:UwE[[n:IJa޻B³\#=t{ pg(uu-teW0PqRҜpO8S·(ʰgVaynw8t1p]h,^XL}MCq6c8@[lx4eTqc |/<.QN͸6?6ڊ??vzK/6\{QW{>Wt6dWBJ5c,ØߩVc`V;?L-#2A+|R{()Q-~Pj\Ysw3:M\:& [,yrapuux1RDGJޑ^ee1M=EƾRߕ+ E_[`+-E +&PMٯ-o)1w9ޗ'8 ΍gM'3 @U|1NWxua.ߵ*q%)-V)g%(qȷT &,@}݁-i$7-* +xo6N/,b02~gCC?0]-w>dڒx؅ʤg/0C*8VSTvej|Ruޫl j]>`Sjg+I>f{dϳYϧ8wq72^ۧ)gݡzV'utEƋ nkyM?)F+:T%wu3\Џ;8J;14z,*t2|E֋z;5/8v;v_aqMzۋե LHяBϊܔǺJț^z_. c?acz1w/aCbï5]%2 ܴI}%MYκL3.Ӝnϊuවn9mKߚ~F㆜h3׳|wQ՞f <cEIu\-T "pBeWBobnzJ̃ȀU)8I֛Ar4'N'iف AFyJhI`XQJk䷥R.t4NK}Z`r0Sե}%][k!FΈ=( UV^L7e]iIy[=fOͮ"Ǘ+wvPu_ JAtWL7NOz2DJy5X, )z3CP <FyO۳_6&8'l2N(?/@IaӹhG[w `;@z)r[1ѶQl|eR]9'19Ŷ `(4eEYNpa#ٚ[mG[I7aRf( +-P2_1I.!.u}ӳwII;]`w +dۥߓ u/tnTܗcĘhg3"ή3`ؠ7uiԼ'cԸ]qh#GnwR~u!|.Coi+2?IZw0΁Ls^};JYmʳ)9O&iԌW_!ab\%(F@W fSgJuM*V:X%XUb*`xVl?g~0 RK<7P>A|e܏+XQ$({I9 pq{IlԑlRu@0{?K{%ݞ)K~dhG%4t2H3T6&ow$Xo[%>w1rJI'cӉqp:e1j/>Q py4%H))Ǧڥ4'm_ DcEUcj s7: +}su)/ qNtN?6d=91 +UT乍q28Srm2Z]V'\B!rwaDmA~f_MwL.S3Ѓ1x6W ;\Q7Wڊ?3 +yJ5,0 Zl1#b(+_}3{ ov 1rM4'RC{1XiAC;"Z!#e}ekkOfDe]ž*QPC)gw{٤e^L>V}*^~Rv,#(dl ۀlj6 ;ˈ@b:!XMUʫQZեS_8oV[>+@P//P.*KIOUc[=%㤴~\x:/boV8@x*ǽ[lܜ.EkJxq/lD>xrvõμO[E>[E߭c0!8#oezwyMGw-RDؾϞF_.uڤXqs 2nr O@QOL}h;!N!3c?Kʶi`&G>8RIH,<v Z$~,)?!A #tUMgs2u`иqB\1ɂ`p 5%0X]([^k-9v2?MY6<d$ls_ԃh|0boۀGHv2rs-N|cq^1Vm`c_Iо1m*p-tbc)8;q&j&F9uS_ysJ>VҐHS5)>Yv>_o2NHO{!ZLy֋Q[RfqVԓv 3\kW+)Ћ&&{ ;b(hН1EW J0wb8cbCiiig̣xuub/oьeSFѿڪlCowgTfXl*bQ2QS^ʸq22lw]KsYn5DgE0-s,!'cX'(~`#Id$ +.$F;vz +l{Z䨨=- fLq'E'ȑ۽?8aj)鯎ULQ퓕LVKRRV.m 6^F\&ؕR6J.7~6 a#l +\UM6O`3l\'ݛiF95X5"F}j+ |޺T +؛l4y8}g}oڒ_?į8T.Ȯ§UT=dOƆhI;}ȕnbH3.4_G2sך-C'12DNv(y%V d^ŶQ&>΄($#&'p!ARaތA?nw{qAFy[hŰ(ӸO,x|YmFG?!:Zix'`vzQ5i.#gW*>rLb0c-$r>߅Ess4bWO9i io7;IfYo<pdqmD<'\^h|ֺ _ZjWsP262$xa0wwm!i:c ~V:Qd(^sJRBY5+YF}äk2M!ԍ@:1I@6B۽C)r_ozz2C*YFF*^hڊHhbv?[SUZNPrZqkH0녩8`wfȎIV9 ޝ`Eߟ8ե&c{׽anW^h)bQ*~@ *z0eo7$Q Sx܃ô!cnhp2'9ؐ{%a6B_ G MI=?Q dxh\hdZ'GM8c,E!~+`f.?{XGjmXh":)QJzp4bt4p_Q>cwLUcdHKHvrv}0}i 8_K53>-z/*MVo3{J~Z"BxxIؔzk~+Gǜ. N+,^r?ں?3]Ս⨅樷]i,*t"ދ Y$OVR~tQn b/]HmkAηpyxӇgeTv7YD8jui=A2nkRbB/p/TeMF DL  (x:D3chc}v?7} =-ؒǕufReTx8)a׈Q3}=((sB[i6VY",ݕU2],兖ʬʲaer[dsÔAHёWPW?S#TP1!w*sbmS|mZDߖp{Q?>È_R7%Lۊ1!*~ӌȼՆǹrOts#%WAOף[@ox5/(:[ffziO}ܤd;WӡV%tG[@Ua„9q71Qws=o F O^Lz^ +W8` n|hٗ##@anNA.>>y z>Ƶ@/z]hS\5< b -_d:L->43;2,2BkV]@InoP Gw@Q߂?ݺvOy7P_յ9gKʇ@$%_ ۠OB_9?=ut ݿzX-8KR&e CψӏS +grG3/] +}vy9_?m(dGzpm_q"ĻNJ*8:.rQX( (CЇA޿zp&s_}Bw3OE{3|OGɮGW6 Qa#.fxy<?}z%({`^޽r}M勗@/KbdD>Pl +!MU%ڝ`Gҏ}sEi=BJ8'!~ܟ>} +zޝ+W@/x ֕ GAhsn7y+B^]d麈!U%jX}LK߾\ P|t 8@}'|q\'^耇e|x_9]!M˽ N“A}1_}/S2աJ_Om)ئeBegu`u%؋ %1Q҂A_^>}^n@?޿*'A_?_z /o\@q_@ϟ{|t篿@9޾s1rpV\5яYjZlN&  rw~} +ٍ~<}{ +zpwA.d;+E:>`ٟj|s7YSN^KZ,| ;(3e'C^p'7o3+Pnp_G5$^^qQhUV(Qj3Db@;_9M@,޽~8CoA]@a?/VB.u!nla*瘘uSVN6LUWI!>s u)BgO`o@./A7z~6@_<2jf=1"B{I>yf<\E3Ga]dk+ F0^@#rn`9}YUw|Wuk#+'ڀg+&˱>^h+3#U8+=\Sxsq܎FyMհĸbϭ\IUQ*p=E_S*B&ݫF侐Tc\$1QI|uHX7ЇZ~ +ry t~ނ{kiK1nI&E~XL~X1ú [lJ2 yw{wk;/\$] _r_Z6U94΅'#xzoF,4NUԃՅqB"ޥ #F07/PP+7@߂ Nbkc Zfu5[<4QVj(+jq6Ap%ի~=ʍLy1Kv]J I9QbW+Yf,ekܣqREÖT~){X1Fuu~89^w>A}@1?/$5:y/CXULds FXY3M/.zxYZP9aRy_ Lx+зwnr%&͈B ;:?RGqɢx'ahTU+*fp uW HP^d(?+o/sWoy> +C9+Q66nfs6ZCXfD4$؛ff;wkj[bI.XO)+{*4grZ?3ek}=ZX(PU(:&[3je55"_? FX.mMz}u듕46Or`;c7r`GYƄI AnJ_Pss)unVEwr_!}5AAENHE]yM[`k۝m9n;2,f$VZX=+z ?5DeeebFUI<ݭfs1*َ +uf Goce[K?Ro ax_r8%bgל5Nuݎ)6ڡfN &)pg?]WWp*>ޡ2Ow5"[.!FnH ja`{x)`dJumj5ݪBlrtͮ$^m|Y!U5[ku-] E {q4$UrcbO3=2y}SۮnܛfX"'vi,r3 cX4-1Eζ j&|s |xQrE4Mxgd+&ў+{*1kWJJ0z$%~kat,{gqiW7t8ꛬJf-fcg3FMWab5]Y9Dǧϴ:%dGmQSȑ2-t wU@]Us8US21;Ұy`Bp19xW()E`UE 4ZwJHWWna)>jNcЁuT2٢p?[v9soْ`7z^7U7&8-S!EMlr!FD k#8mw#he*zWƁ +1K Y6%tO-LV3+KR>Ǣ`*bU)11&iIQ L6nBY&`/iȹqJYRޕ06MLi~]nGM4{)!٪`XU<8&ܦ'ϧN^ +`;x/8Y*3tV*٘ߋ).vg i)qYYw6g>|fUIJ4`Sؤ~7!tC8s +2QVeR`S*O4(i(PG,SIkc#eymJdߛ擷 Y7t<&8VC-B6Gacp$9hKP U{s Σ5Q*sQTm}w>0J9r4BK>h!ݛ:9|](Hg2w]Z$ Q wFF=%݁܏MK57[_#~Q{AazGSF$'$ՄC51k_2 vzXٶj¾jGz?mc%hcs#IRdӳ7H91Va>X#F&E{SlYN9\CokˀHI3p :P9> Z\q8[Yu6Ci @4hG +FZ&]U!bVk׎]r|R&LߋW*k3< +U wڲHTP).?^ۛ|fGF8f@Σn `Ccӹ3 ͈S<]FH+wL2 LrB?)F{IU#|xq@2< "nVJՋ{C_C-.gc}kg=;ω+C5P'E֤>!E'g\-|'OQ +/+Ζ˸v =:fk-嶼kmwJ -1J,UOe؇=y:֡DDGJ\YvvSI#sejoMNa߫e?K<֡RAyDdYmY>nrK +"3y"?km<&C8 2R7EY%FpiஒOi_iD &مRJڞuh![Iw=N0n`N{ {^(ؔ}8}q?E~[;@Flp8܋Qb>-T*^U=Hz`/nfL n>ZI~o`sAJ#6>]0}%7SmQ߂O<&e*P"Zd\l.AR W2ML{GS5xqy:!X1Q{9AN56"Ll|<꘢ʉ%6A˴ٛd?z8[!<մ.TT$ٍQs`S~ϖWP3V92*XF[ CNus3wRHG+SFewXiy *:&($-l6%%(*{g gvdqODZ$ +o@1vƈrao֮kUf4#|כ=M%{oU +k8CPc͊ ?bg?-G=5"z9ߚi;Ԋ*Ny̓yͦ! V?t"aDJ;q<@N62XEU ekc:qlc`ny*A,ϭrl3jsABb8qYqAJ̒U|F%zhjuWq AG*a EO$c75zF|z_Iy0WhX q["/ٞh3J$XqJW8qx~8tJno=tmcpӷG?ӈ﬷|:1 ^J&9T-dl06dgJVoWYe9)[_m펜!N_R ;;>IFQ1“U:.ֶz0qGs</rZj?622#zT3xmyHz&hv2c4 <[YnW0``IZWRg'|TUق/Ry"t>2 Ha6"p +ot2aAY],SRw}.tP;=0iM` +وړQ|()šVmJY`M]qB]ufF|+1㓏y^,Tԍ4t~iv3Xtwdl6J@*@Qa}žۃowF8(x`$}Y}P8]`Dx> N]C+Ey ;N "/};,Wzٻ%0$!uy-ׂݎtL3}_iam7jC'(") 6@Re3Hou}LZp՘Rf|UᏝQ>B.uR#G}wG,ð߳ l_Y+1v6JasGsЈŮOΫ9,RR!A _g;fZ(paFݮ*vQ-J|iա"߶"4e!rV yd< +Kpni\:FHXbe8)e_[GGαG需g_ XKhGS# gY|iw2^+V)Xߍ 3 b#X>~gk7[q(u;[[2F=],cnKH1K5:a_DKrv{k)lUs]mYqsmeZk;NAaE\hij{l 2bg2ⳙ2oXʷ ,7&> \[n{xj`v8G:8ֆ>DHNe|KJw2d= #{h<̓yA ohY['Zzbczwg#) 4)YC s?ifVq耭^Tq[&+XZ>"-&詏${rF3 r}v'*qsrN/wP8ȡ̖9) H#j?Ғ,Co+iOiѷ 6DlK"hg.Q샦/7伟NGt̾ahem2Y3'3O/D0R6LpRzځU^M+Jz6͉7ҏ< +s2H{G<čܑ|:&>/C;KZ&joG0O2![cx4qR{@?461ɴkŧeAECr3k 7C=]mҬ`B4CV?w⡬\0)f 彶 !AllyҳzcƐ's|A-]Ɯ?}b鈿WؿWE\qy$T]s&T|MJr}{}}{2xd vI+6ڠ_DlM+0j+omyi k9rGR+k.෎Y1baBUۿ}5hn5jSK/Zǩ;C8mv'!|]dBFN +!oja7~71OL}Ԥa39۵)qiF>Ź%ZK so}F9:e!Tc^U:TGWO9I[}0#5JE㉎GSSryC5ooUo{WַYy_EgNDyk80.~8UV=96-?Wi(̶sftf:RRmqw " K!$4Jmg>9?"";{/ysv>4r~ f^b^*Z +Ήc #M8B,]r3VzQ7wy(s[1ѿX inWGYGk8&q^֧#w]5{쵩%s\yI$yfe\ T%.5_0)1%|f>pNWi9*A+w^/{8O97AM:X {^PprnNU0W# }ƙ!ܧ_-|Wh38kp945^%)GG-O{*VI$rG0!~ {[, uOEtOVe ~+?w*z*␚O15ޭu_j##;_̡t>cWGZ䲿ZC:|c_ K:22*ON O a잩zoٽteTp= MZ+{.9T\;t@m_ߜfh-Up~s®s~נgRIg~]"vnZ/,Ĩ8.wGG*:rS@I*3w)s |hpݓ?Eݣּk)&5l!G4`Zz{"M Tq;FnF@e=6ш%uٝoOaCwkn\BTx5EΜfd:ϿikGpJ')sp5): WQ˼3ŏVz-4}]zcHE(8Xg<><<>3?M#c]9teVTrssQ [ G?WF}R-#?x@ ߜ'=mcTU4,ҙsoᲔ|M]sAȋ=:\r٧ê؝gUzcj}a[HS{3߶'i&*\ߖu]۔pYxopu2 RI4#3PSuD 1iPD@ 0iQ2|[N.Ӌit⮥{^\us=M CeQ3Ī==v}:Sq]zWxկEygi>V5.ڻ߸TKUJ/PNkk[KS~U*^{&iE֞9<ਕG뮱GGfTP!Eܚ"peٔ=sLK}&i[C-p`n顡{,QՑ[CW1+.t﫝U <6i}ܧ MXR = ԄfXP>]!J*mmc~s2\5\8ʼ1^#TD,&pU2kGRVzs_ںs1^.1o=S +Fmo&<x_,ၙ0Ac 1ٗRZsbo-{MsoUSξǞiJiA)9@M1Q Z>i@*=0@9@ `bZAyx<̠E + 莰2!T8!>ZAO'zTI =5Tͥ/Z?ti Wµ%gRfvzg, >5!]x[8`f]ץG~ *=F'=-``"o 9Mw)90M0!{ls kc$ҋ|bWl;g]*s +n~/,zp5 +e[KpPVj ^gZ6y1E5 x0f>ogO -HXǥ w9jWo7GH@le:v bA(i7%;:>/'D  +d[ +rOalam +ךx ̾Q=Tjk/e]G&~P" V4Ģ3B@s_MKB%0|-3z>Ym%~d߳t!c#YőZna `Y)͎R;1%:2Kv4"OgY7'0^)ouk>q!FIӞZ,"/ȣE=2pIGK%(ܷ~o` J 1isA!.[7icq}}Zd򁜕JwBG%R1 +@(:fS۔B_5)_d[϶k]gpmCk螹%Zo4/ !Vnא T20&f䚹!{Q5//}XwG:'tB)_}h|k D>-ȭ ljW| |6)'f#,mI9CKoV`qL4<~KϜg=WC+sʩE52h=.1(j8cg{XAڧ&5o׺FkS\@-dڞǚ/ړ WӵD/~ϢZv:4 [hå\)Ou)!po^wģc[ђ3OV:\QxcNRGvh]z'<,;b'?r}{u1qL3| +BV@) GBɡapo#ylcb|qMk=49f}ŇR\GEڋoX;o}5c51loы6ԯ$ ,FӐvmNy9^ ytT +ԈԃZͿ5_=Ml̶^NHߝoh$s2zy tF#ӃɼTp҂KtßFbRϰ2gɥYvK>nV )~~`"!#K\ب=s}CKRcR}賥GA|A*梌u?.qb/qO[aC3ra}@yfq9GG[z:=S}&ՎKq^e 4-"j0`0pEHy{Cswp*kchCKɍ!TGI:*<2N }[]_` x΁Y45m79T̲Np`k(nh8Iz[dcf9ɹKݐ?5B]ѐ-6)h^(%˄U %,V՘, +%ۆA|*lX`߫-===LнE"j3b i=ACαJ*ibJp럥{Љm׍ 7ԄVh#SsuXFgf(g-e]SĴVSk.5*V~`i.55 +#1[STu}, kjHMao*}V#% ssyL@A+i~%.5 [-x6_{NE:Qlscp]md"5S, ?m +Dd]"15Xl+An9;#'+{襤o=G Tb/&~3݄$$:y9ɾádÞ.aSuV n/6OݳEesB*D8u^s0.5 P^9BKu@nߐ1'۰g46R]ӎ]k,lo؏,QsPIbk_Qz]O:_U?$epOb7ǐZl6+8@4@`ӤnNj%0tM5=cwd4- +\}o\OI1 ]W +v)Zu`~dIޞĦ\ 5^¼<9NzAJjzg쇽j' +&rHMPY;-iKte䞎92rH>@G7MPuI?4k%O'qić㌂x{RsU(%fDc\J_u";타&ӽ2 Q 26o} i% ;sLlHGtȊ߭K#3^ߜyY1ªXbZ1&_# oP,k,|23rlٶ")'z)hm!G `bDZIN5omǖVJM/&o|B]cxo#'˽:(ۮU( %>\ΫLZsem~ “vnBʅ/~;Pxc/ +Y\s.yykcHB2S>ԃ|盗H]$uZ85ms M9"o|hs7ܻkCCV&6G7@2_03̒pvZrsٵf>&8'0jqe7󴭻Pc PϮы(!dJMl;C^徹e*0w0ygjvq|slļ65>R0.k8\Bs+!C +gzn+{bRFqL~\PAw[YZ!cHt4 ylPT 4rOK,QrZdk6]K.uOflL31/KwWq 3Y.)(*rsu)z+XU5 *9+{쑃^8*^LQ ̑:4Sc+עҼ_Zj˞=΢j~ŵA0!uOP9<S򮚋4~}1?(GfL=X"U~3 _frl#X1uG#ip#ෳOٷ`vU]-R!ZK} +\b[N9<ڣokĀAޘUN`Aѳ6t +uR*|QZOL eIEVh/XPPc#|z.~Hx2\`o-؏ 8u$SG/.0!y7>&>V0Cd~[Ž?ZaZT&7'j5mnyX +=3܊1r`{<0Qb #WPm\PFH RsrT1G8L)gRYy`4NHs(:\\Se6BվYm器ч|ei=2 O[DE=#Oct.VxוP УqfAJ)KoC7į͏wrx&NPjzi:1Ret?P3t] 1/0r"/w۱9Fܚ>`^ѯ]^rҜv8d]oc҇k*ig\")p;`| ͥw]Y|m"˄;4dkT<́c(l+e}+I5L^t;I_ lcm?^=lE8?昐KaIran, +l"ȡ& +cơ/Xywi/LD`us}E8*ߙrn ҍ|ۅOOy{}HA,!Fb)2!V +4 +!}OR |3fȃ'\.XɎO[^z>{0 +[c$:Yr.teQg"NQ3/4|?ɾP_xc |rRSWW$477|JtKOۙg`j>/$j=Z4`ۇ*~ڵ6q +O$/;s ]&yfI`tK[JSFt##j$W1OJ^|3F=}bv$=337ڹŷs[#*hEy: #vPf<HgVQ*sBRH/flҊR|s q+sk֚ͣ_Q2k^x{JFY 窩!Z{uyf1V@ή̰1d\>$jcgF_S2:æLȾNyLXFdUȼm9.)I6@Y뛫:&y.S?iZI.oϠ>6.4P%,T}MR}IKSm{'ְjfg-t5{gI[M8U"eL݈؀ 51QK4$ r8.jݐWI)Y|ՂFI +j fQ\#% +nU(!ړ`K疎kZAY us#61!7AoK}ckͽ#W8gِ;?bĿMGKTchu OUEU;:qޝf~x0,\R|s [qɺN{3& @<%XJ=v3 IVbRӐ![M+mj`Ά-l&'>'/_ǜ +*}-?`I9 WX=2 ud& Jd[MoMski9?3aBJF9=I;]K:MvRtVQWzo{ar#A4eZQ?/4?ytk>A+r#p~dWp}m)Yvb}ɕy^9)1)B֩vd99IX|cI\t^[A8{QƺVH$" ddWF4e^9|kPDxkmS:Cٚ-ǧ4<Q]b稠\rs (*sZA&u }0uCO.7T45EF43nnt#y>e^pLpQ!aj->T%æGozry%8f%AT{-UasHAnS +s@T2=˃{-bTܡ[/2B;V[ +b}-wsT?k*{`ꂼjy+C|F@KiFŦblȸU3+](4gEƌR1㜹aPH|mVdҳC=az]=h;00> eV͊+/!h>\}Z\9{Qb> +=.o+ðm6o{RKrǁs(i5[Jtsъ7FswI(bm~w}YpyI]3~Ӭp{a~H+Tr-\A 5l⢕֪nF)^zc)F_==S+'1kcģeqþY,Y\GE).!D25uD,,=,]$$.V>HQsN +~Aܐ w@DT.U²{Ks/m>ᔵ:jGS%`QNGu3 17Gf|`N7wЗn rA>> )9귕N[rrR\%f"#=}[ >=ckRJ:Nx'kW'pcԴҷ{:*rWzi; +RV}93r;(=M/ ͕= 0G?R+BErѧV{,SjD`ЊO0 =@8fjbu]H:| 045NzjhHrij.$yn9`u~ob~X2qM!2d< uCԱof+*4[E-yGf%XRk/Q\TS ݓTOnl^Ry}gT|7^ ѳ͝k'AsSg6dG\d;'%k}۽C5/=3,d|b~(p90 +yԽw dCNcL]D%h&}T\e.`?2׼Լ7"^94Q6|0@rom$!Ղ[@ML`}2F`^jb/)NfjAF器8CxZJwRIf=M'5fP{ttCN_|ė$Ŀ t +6+4-2/_(? `c&&]Ҋ +&)8Lu>j4|d@kky;02J'<;9=XCimxf_}s_ӄ؟WG)YO6Axg9;38TIF?x"D:BN]#_^GM2tv|sx$90@RmfnTc&scZ_|[ƆxIX8>25?,~Mx2 |GD)EؔL2nk_= +(%c}ܔ웨0 W܅x +}5͒JC.,)b|*R"~p%u_Ve>p*k]אA_m b ~X}9Rh +5 16ǘe;su$1FNtU1^^ڇim7n{R^KΚs.$\S褀Y A~q8.5 # ՠӶRbfE7Jr:J/(UrsdכֿKr.n0=f>gsg+U~5;ǁo\41 Ǘ9e :jlc>[I: ģR #c7ejè@ˈSa_ 1Rss~ X +͸z%tv^RysQ|:Tx,CifC.Bʛnbl+2[f~a2i {盥Mu4=Mu.7 Y(=ߐsnC4&vp(&;חWN TRCM0 +?`N*л _ ?mcd)炊[Co.X,^셽;?'(}gQ$ݟW%VmG)p+P)ԓv)>_B+ +2{`]0FN$~P >儜q~7T}6 +y_u&!?4@؂mEu7c){GA[GV:]G&hc4D<<C&o #Xei"f i%!}^֧4 KEd˃Wڪ_8eꑵ f# {l0w9ĵV=kC!an0.䔼 ՘T+/1vWqJj!Pa\\PCkş,g 41j2LB S h S/W!@잖 + c#FMa&=!,dA&ɛ +R~`ṯo Ag17cka&}0|WM򯃸={ ĵc•ajʺ^Psa~պS -Bܥ¥1ˇx5,H٦(k̒-2pͲ=P%elM1ä$}/>jR %VwK {S*Nfԛ>ZucezEzE<2bƪ5EwnҊ󖺠/]зNjTr[ `k)-:aVL7R)$=s¥{K'+oW=$Q3kcdPvϜ5ՑG+K6iyaA޴bVr#'l%Z y)k@֊[Bۆ[*y.>N8&h 燑鈬?bvޛW=3ltk%󮑍.+RC>ҩñ5CUXOM3 ) j8RxiVT4eµ&B5SQOsiZK쀛GS z8ȥUϽInY?t6؋~kg#[O<ïVej8#ϣdrkI[J\0[Jpn >6_&J%φȩvU,U=ˬ̳3 gy]j[1mC0{Oèr)y[SM)pK΃-vcz2\WWrY`mJ}vU=!ݟW< 8Sz|6dRuc fyov[h=r[-P~m%.6yiDuiE;>jyp nwN³M 2>lK΅O*\J<4D/ A.¼ M-~X?ыY +fsDU\VD7Ÿ-#^yfi>@MڐҳW)) Qv[WϵJVܛL!,*&Hi95 +;(]Մxմtj8Ӹ>.jm-^YsXs}ZSA)\&gi) +̭͍z(\wUYhhXo#u >f6G~ {&dA`6'{f)UF@;f~nB}]v:TDK?=Axrt';arNƌ&:\"6'k4s7>܃y1I/X,X`x/'(9n PT4lGئVllDl 3|*[0j&]V%j8h枊s IW +tІix "u*0ܣ$d:`&5Ϫ1S2KČWfRLr!>=֭e6TȺj$źGr 3\3eBCz6j#t\Ԧ܋oL &]}CŃk?WrLRjc_m)!zU +s/ROƝ%H򎉆66w);xQfJԑah̡uL&!U|1O7!=ȯL 䖓 -}HUwmiEJH;ۯ"kd9T ;ܵ0T*v. Ṇf\* U]_b4֭Osc)v}Q:G*k)ag5O7m +z8f^ crCfQ?|$ݱ=zo Ḿom0Ӝ+VBߒ +np)i[rj閜 zc}ӆ zB˒6tiiU~ 5'>[ǶkI +1ԉCR˨>UiۏR .mmkE.vԾZ%B0hL($|X߆yi$}ry5[[1|TQG+7?|^cĩ6ORFjT[8Iv_-L +&k+۰oG%:Odg^}$ltN@\ gZlj@{ubgC +-sy0DNn@DȄH[%>gϮ=ӎc;vwXHI7 +R`ݭ̜}y}\<}_/6>L^V3 ԶbnDn֣~ْh=bѽ>8O6tձKyiY[[bZ + 愵A +DSP<ߞ +٭ɨ%lZTS능 ַ}ZLsz6fiM^iO0@-kIFzծn@uk3 [ey.)+CvlWnimi1)aQIom?vvF۹W긛arնmc~u欘Q+۴69;zW[-Ec nJہu;lK*bOke1ť ր:wp+ø=;3ڸeo"n;G=٦َzm`eNG-`钷h;) UoWliٞl Qv}sikLxkߤ&tJZiZmkNt}[] شk4@o9ZGS` fXЍFҒrrqk8uY=J%&Akh76paր1*.ͶeH@LX½b?ki)kwxJV1& ^V⸔]T{<Պ8s4S޿LxI*A&E~j{W4ⴴlJOPt] +ZƊ?m\0vM5>*zNƨXP6;J@t-zýk[S?K_֕MGuN̛Zv*tJ._52\rZ悖UЧ Nً=ifal-k=|uY9-'O|v1؛V̄uk=zpݍ >NPli۹i\7]|Dͺ_kgJRW{jMo7͘UC=tUO]Fl\hm7#]OӘLȘT_:pi-9c/j}VjCqie+q{S `|`C5jpF,keNSQ{Nd8ź pAvoSlh&zO lY{{=}'G?ڳ:@l;{ӝC3wuwIwk)Lh#yJǂZ-%%$m=6,[3-ɶYLf}#ZmmL]w X 8鸃ΡWnFIXP+]C{.vϾEwI9>aB'K LҦ?.:dwOj\ s| +x}=.JR?9{7%m=qފY>$o-lddj)ZP,)cdPQ`"vo4{ae){;FԢ%.1t[xI6, W7w'ڶդa >A_9{~8Cv^$͊bKB$"PozL! ^6Tb釸ZQ\f.B\]U2-{$em}Ѭ +#mY[ׁPt"u/z 3Wˆ ҫ۱ 쪙:rq$维@my'3={bp ۰E$3 [>am9]kƆq3KJ\dZ؆䓓]lcg7[IfجtHf %˦~0>U aQ*xz^S7 {QvArQM_6c%@.[[̺-K6@YZc*,7FUhb-P&_{_~RX|P\((SaVhCݼZ?ʽ}u4өq5ԯ;H=.K'ͪiDb2"N|Eă[/m5qE+ƥ!'du33֯v +z {S4{wfku[x0ظlb.zuvC3qZAv:C9skqٌͪk݉~XG笥nmi4aXsmeq誐N,$2H"׳L}F+kR\F>&lq;6E@6ih0B$jNZC""Fצ8CPKg_/+:AzcR#Y{Tz7BXW%MlwG8mlW-穑"+ٱmf¯9micSoI$r7*˻9|Pz^5$m51``w_C]zU4& k+2EO_]̅kŽ!V 4u}8jTE.C̉dMkގ tڒƪ0#iq|D`KuHjבi + +{ ('~GBMdHQpIyN +yr\YwllkpO]#niYt۲\:¦:Vjݭp3]JgRx]RT̹VL_zv pV|l4US^nnf5ĢYȮJ5c`@Z%M5*/,Bw<F +˩}[[HP {J/O.y,d7 t!*m: @L]d fڝ>x6n*%2+.5vr'j&H81:a{NP= H]-Hzi>n fF-Z ];wh.u:?'}n:o:fP ADŧ$ %{)q_?3#"׳*J㑘/%DI]3TA#Dހ!'eUR:ڔigO?\*hqA'iѴKޔ{~b ]+[iBTf=@Rc(|.-$#9(ڥWK=‰X*{dWh Nq46L&ƮB +S7xqTWD]ޥB=^JeOOK +?^+Lx,uvMl6ѧTJRݧU!G63)hUFEX?H?RRH⠷Rb{xSü!} GPB%ޅ0.D7\Ag&͙z:GZmVF'&Sh cR G3N=1=>V{Dҵ'] xuХ/kX*J%p딦}oפPȄ6Kw BCkW|1'豧Yb/'usxw>WK<'RKp"韑@xsջ +Ϸ<| ?+?O1YRyP^$kX%5<=5uac>QaDs KX +( ܮmDW #NtSt!m!ɜ)Fd4HGmK^»7O}_DUh`#2jʘj5d t Lxc |X ypQO>{ +y;kxGJVc5/T뗞&sW _5܆qYmEA^MU'RQf@ɞDev\mC0{P ]eyq~`& "K":ߌ')[=|[vs$rt^hF!krCѽ/$Kh9!AؿGgK Zzf5?7cҖ: uE`'qAHc68i E^_G1.j*C𴌒:-ȅnd؆WBe9gsB]Y'_nǰ$z-8XhPެ^P;44PdT`.C7@`cȞTҲ*MQ5Ct?_Iu% Bu)_ ^u^40 )yEwߌhlE/bWMHkoEO-magUQQbxM{٘Y6CSKd ]0"/n&"zQܡnh'ԚXWy8.9ZV:QL.K9eO'`fw>axe6}FZB{d|I%KIή<ˋ=!o|R'uy{E]lq+MiG[#NvyuOU 359ol=oܵ2Ĵ%ڱգf6isKOPw *G28T=۟,fE*EZVlUKiJ>hi $^TΟ@|K$s^0XaΞx!7}J'ر&v0qALܢ~A"HFt7PkM4WcaHӶAbNmI۳$șnAP֙x..0n,J?QJnS&U!ZOPsIz3vTÆ]  v0yn/3O'.|ũXgͫ.Ϟ5'8;m66mXiW, yCj[,↍I^RrҵL*tARhЩٽF)[4K\2T{"|D.2rpW vу-&IQѐi,1Sq[0*w\춳];xӌM?g~];Y[zܦzIX`3'>#nZQMB1(&*eAI-mdb;iI:rg?7gh.d^I]T2b0"jYQoN +ѲM34VJىXg^2#e%<#Lq CI~$b4ԸfLܔ9+mDkζ-3jYUeIṯCf63N8sl塲}S=x4j, N[oB ]EutKϪ +} |hÁl p=WW봲%:z; +xĔ:hj/;7:ukoЉ⪈C |q4J,]ִS' }F5]/f(*9`g) %)/ +75؅KkSFlΩ\!Nj*xZ z +}/"Tw3 1|4mr6ܵ(2ӕٕ=Xs:E/&騳Y*?-gYm]m4?h^->C~Ljc67ZJᆅVs4:9c v'YulFRsǺEs#byzUτ9hu_')3 ybƀ:pEV9#KWJ\2Yg*b}59{K^/bcYqUPӈ3ԣו9nM0&Ԃ?eڊ>lfd$8){,L{*g@&XGF†\93tdEo$ׁ=Z#–1JXz`o` K ++R]>wZP0~DϊMYLg݅܇}E^ ,˱Ɔ+CИ:lAMR%. +T¡Ux4ejy'NFi--wRGc,`|r7bL5~e݊U%2@B`qXUM$Б O'껃Tr:L^x&؟zIez +eCHt֦YGsWmIxPgAg]\>աf.~nāU~d2Mwˢ!3RX䦅:iMz:زl9u³ b偍Xo 6$L3p{p1 yY .)y1GX5&{O]pmU!WOZf0)PO̙((},){&'+{k>iX&wwаָ[VִC}jS ]_;WE.r'+%AӼ"`*|NmS;jMQ_gVR,#ڞ|;,Ƀ탅X#vHgK]-.2&DKC{sʍEEE heBΖ&bUIb$^!jӗ{#6[U~kp9#t-&5Bo?~jGZ0L ]srЀk":H;N<-K?Jn(r 7\.)que=u|%h\5~0/TG1SO?kV*C{svFT q>)=mMu} . "#OҰ+j34#3Č[pn)8bGS7ޓuɢoGIB.*>(yrL̦XWiه!XT_[k3<Ąatʑ.s[Hag}ĭ(sZe'#u)Ч"/{S!M+ۈ _LJyfăǂ~LsUQr3mWDi!>vͶ " ]UŬk֥\b-!e&eqE3-#Ś@O!b-92DDG潉kVF1Vڃu"aJ|,IB4VCCNs@ pPm jPYJRПjҧܴVTʮX0Gb; (=Ku̺[IƇŁܧSݠ'*=ߗtE|shc5-1߹씛+ʠrѲYߒ[PfKVDqyz}C:[RH|)*pd ė[9' +rRgvd*PkyڤI+w-y1x*|rlT{ @W9p`GMMU(V_~1/ݔH1w4Ƞ6zե0pM"t 5+&h:4eYw.Jz(~y>E+ +dܞ<5sN0ok _% +3\ w3eDP5)oWS>_-BKwx5Q,WiH9;jl[\gmH cW9G+c\ Оܱ")Q/ocԝalʮr0L  MiUyU hI{:֒|c[Q +uʦhc½9nuY *\vku}Jȁ+Sc 7-[Vzҭc3" +_fD(&dXw8@7\5у~RF{!,ܼB5AqΎ̗}oL<@;6xk˿ct1*l Tׄ頑=Cu,iʿC1 ;㡑{Q'6|2Yy^֌x% -Pm-dQ2ޓsy{[S]â:ף^sX_n:n89wK2X͂*-,0ɾ7ۖx}꽣Gd=SB S-ٷ&: +)٥ŵ{ ~rd@Ax2J}@C~V] +EeuOMfU^k\Nޣ2ٙt'垮:b!'gGkQ9'ry:vȍ!]7,{wS^n^+D'ꥭ1EESzzb”9ȃʰmy`RYm9;kRJ_ +:7c 10:u]EsJ?űސ"9yOm)\m ׭ !L%^ͪ +TvH͕S;6؉fV‹^Zպ +6DL!K|-WJ*} 72*d\V)ɷdk7[22 eEPKyص$CGXyO, s$IJ7Bx񽬁2՜h)텓|W]?n|͢b_UW'm,gC{Mg[Wv2Qk~h'TWY1YS0%m8hIfa ؆+;g0iGf_d/>93'&R!W+|gEU7d]#'(kg>Lr2X7܂gk2oNv^w1wWEP=5&B]Ѡ -Eq*B>0.0> :c_w.ȠE*t *y&EGoDBlJ'"9\F*>LW9637M9,lOEѡ+jE>srm rZHjm9SznAP0HC$\w\?pD^U'|vh5#Ζx\O;wtmE/J\֏Qlṭ.@_4ftyuydž:*>(#M~!j&p8qSfr,{Wykx= 2c߈H$+zǫ*x[BJ~2#*%qfT w bCUdqKEK|(ɨhmC=%9t_VDG7d_--2mCT5I}0ՖpdCQwluq__/r]-['PH&cS}`gǺoƖ {WѺң1|83o:ȺaQD`UК&)ØC] +8Yωpfhɹ2lԉ [BLu?+\_vJ`'#w>W3JVCCe> "׆6vD.NeaM1"@AS"3\ogFL֞6" B>KV|>1+*Rtw]T0Dv"CrnA-v5S;x]^. ?44q+KC!sB혛0blw{WI:t +6=a 65E%ͬo6Z $D_&ޙB>ǛY/fzJ*|6TkkÁY+>Z˼P Ƃoٯݒ~C6ĥUQ"_5-O@זYK!:_EK&bw]אl!C 1Nci]Ôć斜6'CKɛW(^VX|O)jxs{<1#39;|\1T;K{1ّz{قK7:vG5"HG9#Ueዢ-eqб*؎Ls[`GN>$3Oԕ"լ) "/%>PK\VՆ K儨'|m]M$Ib UH)4Ye4Mmh"ͱw&R6UE_Nd,<4p |Ӱ1^}lF̈r='r:RKӖt0BY(E(O uet_ڳ,ϹW#Ăal<{MR?]k\=^:R악^HwG3s׀R~Qb*t.@̽=^uEAٮ-IwGWUU6i :hPt`U`IR #vL ]DŞR+x(|SY"*U#וT2ŌЭa\P Zhﱞ—rt'fBM"a^X6)4S{h\ = r`.$ǹQ2JvDwY?giQpzx梤gMK.QjgX읒q"h L7~U^{"N6/:z 9p!s@L +?}lBߧi?pCKe`e~W; ;BӞmP#]#&J6֑mjz&>:"rre VL8Pp+S/,⪎tSC)X ky6ҐxГ9'Vbіk|jj=0QJ%eA񫱶'jBݩ4c(зrݤMD9pU$nIEĜn ^}VsǰNxu]w:6K,|-/],lo$Yi5 -.yH)^Wl{}{=!O33W1&yc|摎% >PcN- :qf#(A[rsKy +P]#NPj5;P y=@kZPi_-D6_>ZxWY7׶&dMVt4 c<7RXe7U+r4X[Ϋ3;dU_#.7l 9~ŕ~ZtڡR4T&dfob7ۚ:Zd0F2g7fCΞPf{%RԥÈ EMԚ*hS %4x徆pc(LE`tq6ACYHkzL[U<;~}1 kIM|ZSAÌJ & jөPoW;>s + Rˉ7t!kJe̬GZGgN`'> 唢 !W3.}#e<6e"{Y2j +OZ7!dcL|h>灇c'9aro܃e[M]d䢲ˢ"+0ՓxsMhUTbCNHW-rՄ==P}-,RcySx=+?^>zn"Ov|3$[JQx[˃Ea7uVdK;ڜs@GhŇxCU\k{_o !mY~'EA~Gk%9/x5zz="髃 =K,؜i{Wwm{CFdI7|xȎzhK?Jv4~@mi~L758\. ܐV}5٘ KkŽǺ%GЙ}QTƩtj9amU “7 Y5q^ב m.t1 +7YA.=ŹVeT7@ψa[3ߜĚ3,iGS<ٛޙ[_ -S]]rv6$0؁6~C^:С4Uc CKN࡙RylVIb)q]U^d)Nu_|oKaՎ{ +WqlL˼ GIUJ“kS/?aIgdשV\º~?͈-M9ЗT- bDXR4=[72ȭj=F ?nh+#ls ӌzֵtD1GeZЁ[wK!X=uIԣw34yRȟl?GCg[ڛϝSݗ!7twh1APW*j +!dOEe岸fHo sMO4_ri.=OnΐǎYzGIM_//,O6ί,/!H%PBj)䠜yg{'lgT$\,{|ۗYۼ;x.9qsZ] I:ТߞZ/؜CbkShF 51Z=6ǚ1%%aup$| ǕǷ^!.= k~)1hK'm7KSmɓ'Cb89n9z,so%IӃ;~tuQ=F-_ K`WF煥 1ZwY4_uGy7kO9$On"ȵB/$ OJd@0HX'每sƉԸ¡ǵ,k~]sW?~a1ّdafsQ+j}Ǭ~_i`Z)p#n.jM+\Wݹ;SiQMգ$O@:5Z5=m>e`SV smwӧ#Pj޵H3+9ͤܜB|ZHM/KN۞mx\,6v%Viǎ ܭoX(=q| 'tk >YV_`#_t^k!+Njl!Ҳk=[ ;3+BQ,\dw] rcXJ/ | K&z@+58Τ( +60 㝇Мi~^afM^ƣ$7 |zw'r]ȥD &}+wOn>{5u7O(O{S(oaE$= |s۪zxlp?97|쒻~ eg]js{;1؜셬Mn%LZH7F 7O۲h~sf5s~~ + ݳBo(>&euq= c^_#|̮'8:ά9;k&')Ex}nČXˎ\ʬTm4*`)ڍߩĥVJ9K:r&+5<.dZg+:C/W볎}J>Z7̬aA F7vtm^ս!kc@gx51+) ȐU]g35Lqʻ5_8zr=7OKl=*ێy)\a1x ΐQq Nwc۶:oߘwANm] ޕ:6n.]K7CArr '~:) H-)+Rһb*"cc\AO3IjD\KX" 5.wJ'ŔDPRk0ZH„MLl@Mn +)0{v8fdJ*dcq5wkW(}kZX~j ooNǵ{^9A3M,L.'Xnz.~7g-h-E ? Ķ_L}q }XǴ rrMO[Op O +#k[#+VO.oN˔Cm(U#.$䊨*.23Yo)719ڿuN.LĈFt-Pkv&!5Y W;o^I{{VT{>- 0ȼ +7%R82ogX22BYd6kx;`R4 +Ƚu g΄dB+#P 5&6I)55"5Tn~ŷDo6<>e[`mPRFwXI및260p Q*)\1]3n5s-mq4iZP7@Qkgt:bXE늛zE0WMO{N$ȹ ]\w-@o:bg𛳽殦44?x _[*\S1:p=k +z.e~DAOh9g;fUu|&oBYy_~RYO:.1CܙW4|([Elk94Y)ŝц/&/U^A_Wt9dgR4{8RUSIdi\'U})vlt!+6?-R3To> +@v?Cɰj>9Pc%g"ޝc*S:*f6E5\ %bYT9x2%MaPpEqŷoW> HzJNcfF]x$q͠jrOQ@h<]!Nwju͗/+ +,:)e|%oLbn&,J`TCo*qɖ3ko>.JGK]dlb/cwE5,2^$35y\AXŀ HpX +vgn~|V <ݔj,o;N7l?VSڳ2!>ɮ )kV+gӏ߻7"2L/ eʱ*į m lMB/Ք֌] z=rkZ| ;=ά}[pL:.o(F\-O +_ lފP7vDGީs߅ff-[C{vv_P(|9TaA]v c[ajjvmakP +N} q(ݴ1Je}V #jT,ooB?abRJCJ#HA &c k9'!/'6$ A% Ybwu!]_H.@G,crν✁m\2eJMDEk7coɎse<4HL!bG`lԻl + v' ~j>c:!ݳD*X6 { ǪeC'-[N&s Ċط5ovt\ Ik~?,rN>11-1)}}W99[\BY2A bUw;>' +%8Rp Ga;uSŏ@ɅAHh@mVpa +.% ڇO-swkzG܍CIP|뵰|-{gum{R5Q +n)IWǯq +\OI`y15" jg?Nvf lH̭1i0i?R)"85QHQX*kܥ b1ŨVHLBKkM E͍Qٕ[ӑ9㰋 %^"T$Z<`MIX)4JLτy% (dtl8Vuz4p{V0p~ U3PV" ֻyI-!nZ{,?5b6rU#F\Ћ;#]@FI Iu#cAluIȥI^[}]ʛS› +4yXc4ޑoGԃ C_\Ci Eí?,=v1avWDOxԴgn}KeTDǹ a ?L"={=8mPrFGXJ +,cK3WFZNgs)HrgԼ9sscMJ8m9F>ǂtAc//r$qb־*_ YIfJ@3x/nd{Yɨۓ7R&~.MzۮG994U:\y^X}0āy qHI|+bӃzhXLFlZ|lu[L^Do@]6o'bfߪ6ar2r-T@˅oU=f2bF#Bv8m%n4vm\=M*]d4:칒=P [ue}B >j^j8p}s}kãOzN8ƉY +xTShQȌlа +W_B\D^-12fk v˳>wU޿)-}rNwT^kuS ߹z.%=tAL'%Wfݘ 3x~~wPҐR6*b4?a 4SQ?o1!yו S2:[Ws0iЃ^jkcD/b\ +ott};71?r=i+]j5~zswQ&j43+dțDkj?'|-rה3ezwT-`n΋n36͍YXy!cS^aL%Y( +]m:=V03Fhjgu㷲򿬏¦.o> 00 q jۼj?>stream +5%r4[GڰkS¬ۖzBr*c{UYTL,s,2W'׶%rnJ# +Ru\Mj3LX $ej87{-l;bBv(k9Wq@{\[}曎aMXB:7  4-b組\f8Ʊ-t`>gS6&v!0S;>)Y1TqL~+A燝i|IGhIYilsW`I-6v`/]5  cӘ@|R0{f԰AQP["gI `{;3GkĢukD- +v + y4U׷ 1w݉YY˸c?5^{Ywzx;E_ ^̺p(e3¾,7>mjw_ًClNuNh66 ]w~j/{GqUy踖Қ4PZ#*LdqFD=!n%]WM1T +Z·@>2Q5ȷvƳqn԰\Z`IDGy%yĵ^u`P:*̿D>8;,i+'e"σJy=>0)f[\x=K(8[괠s{1!9Mk#=wqgRlJy5izYxI^ &S6יOhi!}/'\su}mq3NdsyzmH.$xiQ9!-m .nsCRvGL)Ļ& EOl8cJ" +tQP(q/tr|~NH;G_~_  i_Ll;ozeGBł~~80dp%gu?^7ߌ8לnsf{Q]"][Dٞw|#yYrPGU84/TڀPUP^V(;ɕY\AjE؛ +Q=VS%!tlT~*exoڷy{= c.&5(Tw( +t\)A53>j 31ѰE  iNpZo7 35Q)9`N!))0˯f6 9xX1s€ Wxhs|f鸙YazJ{`RTɣ,h]c+a.&-@33y  HMl*a>aRZ>.,e$4LHDAkiФ)- '9b6FU u/=Ih!VVzZ2 ^hZeX΅Wf~Zwkwڃ=Bl@G +EGo6РQʳؓZ6n`"C#{Ov9PP琀W6Fή,> I>[Ad;ZX-0Gϡnya@'a + +!1&:Q꾰>j☒XUfsp9bv@Z~j~ZYXN$-C^QPEo8舶 x/-%7FTKx}߯ A5'L +,S:\3Ԫ1jQ`QtL3j5~ln{ ~~gZd]a)=M.B䄕| $9Sb&:4&Lwu}]''7Msn{ yeIYqo|z/f#Al (~e?mﻓZ+Of!7fdcS9f`cu؊ݥ )'-*owUI?0 jsj0[͐sܬ2 ug/k\NpWߞ, )Ϭ\c6ȰAԗB*|ȁ}s`rRF.1-\nm7q9j؅U!?ia$jHSRZ,9avƁIy䴙OiAv@h˅]=ffc>Ԧ[헷\/5pN-4 /w2Apv6r5%wD54BLO .®^~}Tئ9VĵogbQ@hVOʁb+~U(CFlw [Y L 9<"펶_ʮ?1A r,1o[ >ntGI[zn49J,wL`a}sV%^%,ʡgVM Elw^Srqwgv/N܋*i-!))ޙ݈)HMϷN%{:$cb*Vg |ȓ 8"{%+ގMq-)mOgZ u'%VYv=[5zQsle~)G7OCJ5Kؐ:Zo^iu" +b}* <jSf8i`bRGlX[$ӰT3,U2lFjH|23OS60}w_]&׀9dbTNo=2JBp vL!WJo,R+2rUwX[DLjs@/oCφiMe./!VPEu_EEml= s  tPra%5m 7FCSe52&R6+x~?}. P͘P_2#mQ +lXշ+K?qb$lR plM] tR78=` 춃;?@E Ifi^&V&[ T* ggbjZkHjO遮VʷG[+1?[zI3uN>Ƕ5=(K{qqlWB,J[X866%ĿD̔1˕>aU}䅔Fqg[h}ӕ͞'ZogD穭мA|'ny&,TőZ<G@\@]мRbe@Ay;kqAl^ߕoǴ||LFB~ؿo Yet*`㲺1ݞ U%TL{3?VؤbzXU+o9! pI#K.SٸyC e' xemVo4}? /"ol{RT}۸9p>T`[E9/)Q- +{Zvpܚۂo^s{{kOÆi=;YW#FJ61nfu6/;/hza9~ UPk# ̆P2f|]Ҁ--:]1 +\?^>cTރ=X Ob 636c|3y-< [cx\J +)Sћz)cz > XLۉcN8TA_s63Ḙ e8́;Te-XD -mw#7E_dtLX`Ztcïs`e7 ^b{V)ZJRx牭\́ +rѕ=|-,cwƕ`XQS7훅}uߵH( *иݷx)~PF{d}/eJ,/;N-L Qf?ab~v@L <άEgr-" 10ܹqm}-joBM?ƻNЫ! ,;ޫ3K. ?c?7"k;皬@ HVPfޝe*?9 ;1q9 ~s]` +^g* V!M/*񇨆{NX!A p8{XČ ƣ +~'6^o̜/9r?뿉>ȑfG6;rّ#͎9lva#G9rȑfG6;rّ#͎9lva#G9rȑfG6;rّ#͎9lva#G9rȑfG6;rّ#͎9lva#G9rȑfG6;rّ#͎9lva#G9rȑfG6;rّ#͎9lva#G9rȑfG6;rj7?^BAY?h/F8f|A-x z*#Yx*˾wK5c'Vx,lBINg;vͽplKWrΟzұܫpZnW/^9FuW^^s׭.^̾y |+/d?s17꥜Kkq~?hkN<ޖuӜ_=uLK$t0,ج9x$vMGձv0]ٯȎqq2;.ͽr؅9r_Ɏ)#Ϗ.ȹq_:yp=ltz… H*>]qQ)շDoʩ-#m!5芐SQ"zFwħNзL/Qkc*"!%#*VWVvZ"9K0š%\qdWW+2k? +i |n<3 g nE)Uq)Ҋ룤J$>avȂT繰S4Z"R혊ܔ0PISS["rRuHNtN"s2Z{K__JFGOIY̨w/zrZP 9ZSlƑ\?}9!$|LJ'LC/oj=qA.n6} )QrF[\Ť IP}^{J萤"glm\Eɘ8hwPӊXqC/ۧ VyMJەcj.:aaJR}z[?JY9IXؔqQ4W56? 4q#'jĚܐ0Q1=%e2^aB„L\!yJ S2I3q`^?z+N Ul31c(b-n4m.mLؘ̤l똑ڙ01 ˩q-0yoow aa z\]܈kUA9Ľ=lby.*{lCfts'& `,mJMQ%2&d1JjcX,f`ސPщ1 cK2LOOjb~`Q'5蒄UU +Jc@ w`AN`K𼄌TVr5kL ?\Dƴ3QWlwq "g:!nz!%)Rz>>mB"TtHXUao(b29aC | 꿑21'!ΑSq)(&WET U~_fF!÷گJLQB-NIfFڐ`K[䘁G@ͬ <Ȭ$ մҚ:Fg@mϘi=)*cBzBKl)p#=6H)#2)PL/\XX%"MKp13qֳͅ2uv}b.~Zz3&=i20zRzR}L.X0)W +MF..0'4'Lƌ؜[#jl{v-b^[&ll@MѷJtaL>O SqA#jZBuHτeMlCL"HĢI@۳1Pb326!iR:j{\mΆG⾨A6KLtbYB۩ŎAbe#ofXutaEbE§ND$M<;޾E۳iI# ;K,ܕKj6ԫu- U~ }@HGؙl5}P|%,⾐sI` h{jGB-.r'O{!␐θƈsֈRSCۮÆOw&17*.ү/y;.E娪P wb6y2u"JL˂$t=+;֘Wհ T^G\%$TN\y?t_tN +=[I͸_i;m}YHgM_&5b2d_v>HH +\U` gRۅle -)G*@%a1;1sp!x*uDCPS c9iNI8XU1dcwocRi^(4G- jJ/'KnOG ˆYDE&kC-jZ!H;R٧yiάcvY3"娱!jjhZĜX30ya1!0ֵġ jF.u3-w[Iz4J5EBzV"iE r(A;8:g 2EiQLhNf~PAXm"!dҐYsO|r@/ - #>nQDѐY?4 OЀ?"pPQ53ܗ@Q)I9s;IτPrKb$Gwىƒq r:3s2JXYXU;VVePYhhkx=AJr. [ < y*i ƒ [=[In}Vv0h%):#grB:4j,|e g)Ih3 ғӣf g5aSmC3lfWtT7pBooôU0*#&fyH//UT2QrcvfEt2jn|4Է Sx!x5"|nP*)[cp\V aT !T3Jb`c}KEX_EԨUPoO BhPvHPM" +Y@%Siʯ􄔀M_8j-ujx6O8)7ag`1YD&Mu~8h!p:nӂzVGMN@fqصQ-𕥥7j{qa 1_ p6H2A*W'P!lS˅[ػΩa폼k7D&!%fy +,Du4K㛘yX_"OId"jy8)Vm|3+lb~ #6|@]kxM\ۺhǩ>~x5?by: +$i[Ӯw|ixAdگZ0Ut2'iƒIݍ꣰FH4(oSiw+([QN&J7 nD#a{܋@k2! `ٙ1jjT+Du~ȶ):<#Ⱥw{{+҇ڍ +&$fr5+/*I~y2w{o,o|p[|| R?j/FL/Mւ(YX-qA1=ݞ %},9(蟤fgA4,9J~\׈_JH?N|-*j}( iF.Cf̰ +[qs8s@O.$Prग़'Yu*G"FxiwV1Wie^y.yf$yu_'Lc=9T8D]%17R{,l6sa5\2Ʉn !9ъ81SS{ԨPgX`m`#yĂxP6UWR5s}͊%^. +4^P(ƭ [swV݀pW/gdjJX<&y[/` ]*j()isZ5!%aM ?)yAm]kZvN +J j?6# ?1sjj/;3u cq+9nyvw!h=Yw-8YÃGMbN( 24jB{y2-;Ax#kw\lDF-tw08D!,tX.:>'t|Bsһ܅}{1 ,~kCg oOAe QbF!8Ԁ n2 zJǘgm8jlށsHeVB8W%ʥnSHCH΀Z ~-p~$15bhhhkj!lx6d`#`q2@ëO+8gm~6 r9Ӓ@4Sz^҈Q&Hث-$8h9EK%{UIۆrv@)r>R[;u[5 ?j5#2R@~+1A=l[EˎعH%ASkrE,]E +Y *-QRKYqAeXGL5acum&ݙ +sZ7y2VR]}kVBJUNx>ZCM̋|',2ɮUBִtK.l}0^^S ^`=j(dB[Řޔ h亴ND ꛝS +0#%aiܙ'ܐOkZPbT&ZRtxQcή k44-}31me `OdIP]5QsJ6ǙYK=Ô$}' nbƎU2+ +uQsGJ[o1&뗠Q䚢e~\O Qꛡe ;G0;tbfco<57\b2GݞPfMḎYiQ, [xd4h`oaao4SGEs^WA%x;[$guß]Kc_+mkSG)G|ū,`nnMP )agFL LFz>=Lneh XR-ت[v-/O! ٳ=#$.Q[so>CruW]q+%gU"b`ZFk^$d A`{A[_AH_9:b:K٧̋%A'N bԭsj^s7Уb'9ҧ;p hl/==}cnlOAAΠF\BH/X&ĥ!^>H#dQ{uS^@Hv9I;^muObQ[c'oYĈY6|[kEY'\;5ҸM.̲1ңQ䙤̲8poX+c_kE$qV&xӝyYmlςsnO>>بaeCFiQģR=jBcj!,yHtХWlN<*Vd دWxbm/u`5KBp嵹E'#^dw?;=1S+uqPs]JV*:fy'hiʶd'k:R¦xet^IDɊ+&ԤQ9PKQFOD"SMX LDQ̭)r2bFM+XQ>7+N *s_mKaSKS)unaLfpYA-PEQ"$4Fir-B, \=7T scm 踸O"{@wgD-bG½{_I؛{}^}+Va!> (43;0# jE䈅[(dY&1CLZ!v +ꚀQ6H;Q\ bnԴAm'k傰#hmWLBWϩpM3纰7f5M~C]s&mU*ۄl ?oqJe!wE YEC#d}CK :{25-/4>>nyJi9#^( m2YZ6^<)l+>͋eQacjy \ȩم gRZkЦsHH1M˚Cv 9PGx?d'ZCG"$#ks̓=Hw/ǞLr*v+;-uMp z)wݣ"B>Q`@QA!R;'X)fkx; ,db.CUo/pV\Mkldo#7 2#7;3 #1kc d+CӐZP~-;$9Td*O;ëU[>m4u +5~nknTM?CIDYUij16g8Aϖ85qdC@g|Do˷F};Q^7 mPf..h`%lʠ9{4,5dl a3kA5Z_4z"6乀U*ry5e~ ~?Yܭ06)Ԫ0~k[Ӡ3:.oz6S1 Y42+iؠN<7:-gqS ?I-"2<kI30f$ e_xꇢ;f؅>D42SzYرp1b8ƃ샙gr(hc?[+<_r10,۵ʫJZV`S+UcξJO GM^՜dcu`QSFC#axV{!oZA=A@{1Kb& 7fEf!|JA'7&Qa%/jl_/ CLq10٧'y&*'&p>%=;Q  ,?[HEaڴ˭k_xuGW ճ}30ԛT-Za|gV"۱rQ#%/d ie6zYȀVӽj /j"}ȵC#c5GP9Uq3`6IHu$<@!LQ6s0 轹Y. 8A=4lTkćA14g=ӱ8ت1yw4C"kyTr;sjA|d=cgNߝsns}P+!eQ>0 rI!f 8Up*1W.>_,׼^;YKč$r,vy `Ր'-bΜXj:t.ni-9M%` w;!&B Ҁ}5|'sV`Z1 =ԼQ!̥doN&nyԌ4.U8>٠V&hae+B*zY$:G}qdY>;& JPKw#{NSܪj_=\Rs q$9Uf1rMүa5`gVYصsI-bzd + q;*LгBF +l"}bɆږ^&pQ9-55:ce€FD +V2KC&f;+@f2J'YށW*U06ȿFvXebV/k_ XiK4!&mM]q3J>!o~4e l{FP9*ܜ-on E~KE!# LD 9*G; "Yt[ @ 6Fm3!{&nI,6|ZnL,H#v!7h"?"~aߋ5B&jQ̬)e(KU7\Ӕ4Y"< f>DgYm.ʀX5Qs"6" +qDE;!KՅ@KFc!,Rr.lT~y_6 (HsbY.5G[#WQL SQr*!~06<1+j!7c{+/&tȧJ&$B`S`?j2`s?=z&!foTCMA.coM]F+Ⱞ9bi!%!9nytOTT%$Q# \&wYXdȚB̨ VLiQңw};/i}^?:5|S(q`;|dD451MKgXUQ27F01B1cc_5+c:j^ٸ tĮ9~dפYY9n[%)n=!% 53&DԊX4>Е}zzaTJj)bG%b滔{tp(^+9k$gzĔ!Þ$OP;Ku]E<EDa"6ާ51O̘UhywA(uHz5ʫ!=yHAKm[tmt;d&9lɡ>V.#wixN킧! !% kuc.޵1+ ƇMc/RG ?'B +;ĄE74%5"Bz:䔈Z>iߞ95%4bĄKn伍)qk!bfZo{9^uc3շeZO!fJ!;ʗ{0͹t-E'z!/`BG$\ZH- hKϭs&Y;0;GF>b1qZ*L5514 wQGKȍv^fi2bªx31ǥBM uYā MѹrxdL+ry>'E&^dM/g~S $ rQ+hHC#V䬚+hm +Xj6$hqf9 گW bz,B6El4xj)rEhF) ؖODM|r<ГMMK; C"C6y!;)!dsàoqKuCoypcZ%粰Nqč1fg3U h/NKèiF^L-ճ/l0J:8fУ7`aȡt첥!vsJBGtTPM|Nj 0A-5Ŵ9jkM;>ۣ!$#{4{pH} +˯ܟ0]]_ H~-r2fy26Fk̂ 0~)dА0?2.daW!k<7[D+-?"b f0!|,G)1uV^Eg,XA;vIJ//813;آibQS<Yn]R͋A5M? [Z& c@2~ԢA +}6p2W? @E12熊OHH۪R6W7W=ϫ/1rJТs_k7A`$LLԶ=蘥fehdX!𣶸E@OXYa34cs(ZF6mkޔJ6D{=L =>0#ut9HcamxUS +f">n ωHQs=JF_lM3s)+[c垦ems7hɮqit6ܭd\1riE흑w +O> W8dPk +9V^? e@lLH()niC|XE h(Q%'l$ftI& D*ZMOGpjyB@/Ǭ!0X :5Q"&d{%dd 2Ⱥ2 nĩg!k0!9ݝ%gx05ik|-țc "ֆ9ӨMܙ>+fd hvd](vjہ=\XY%/d56da$y`m!# VsʼZ+6׽.>da N韏zL-1a\ݻ謬֧c,j. r"WABpԶƬ~\2 ]؈SC6~*`5,<4 $_8|?L(ya$hfm!Sm[4N6vYy䘅Q#Y<ևKԉ`dx'(=Q՞s+]eG: +ĘYp"|3t =3aEu\wSZ);qJ>;u"}2S ktwkp{k2H{6SzG^k9F{]!}WAģsMT\ y,3->A>Ԑ'4b9i{=v<ȧ^.<8=-0hC?eDR]" hkiԅOw5Ϣ?|uys y3agc#FF#?BOI 6z2 !#P#v);n>)a#25k#U ,-d#"98\(ȾN6lhGM\B!%`?9hv.%\/Ykq{MK!MHfam8=0.Q+CX0P5?l"!`IZ_<9x七K}^hY%J^0=ٯo6'X˽K ~Frg4dR-dGm\bʮj[06K=Q/vktc.Ae|~%^PMNc{wf{7 ~ {V,N9yTR_]#(I i}XfCN5>=Uv5Qu 搠4fJFkYx?'^=Qujzoxy }lz7z=ix>]S5JI>Z7ẳ`vosuBXo>f!}Uu鏹oˏ'*o+nIɛ*׸ +5FIZ_\@CVb~~eC?]rtCe>cusƿ;K$Et{ܒ([dM)n:nE!2}Pn%+5I|ԋ:9=H]=^|O9Mp!Ia5iwecyG{ٯ'/k 횠:w6HwJA ~w sIՐyQg7⻊ ʏ.E]?G}C}Zڈg -soq=r|=ZߞDVɥQfCo c\#]UV{< Ana@) "87{UZYOcD=tD*i>j|Rqg g?.ե.յZӼ[%K*Vzq#[cLO~-9jn8rVzWˏ؞lm)=D~VsP{ۃ +LcֈlLfm+90%Irϊ랔}K~wƎT5X|zujj6륎Jz^ G#o)˽K0ߔNcjq {wOy9DH9j +h9̽ؒgsQV|b{1Y㌬cs9?kt3s?uqII3wq= jkiSKQѣRoc }5q 7yY KS}9vIaGv'szxRoo+έ]<-5$ٷ裦ƌMi4e17dk/9<"ثo}V~xKLefߘ[o-v`o&$t0lkK }viXRߔ;c5qwk--\bs*;dl*T.am 3ס6pV׀m:N_ѷdiH:{a xߵ-uT^E<wz{m =e jspeEUmMHcRFHDwhxrJZQWW,kcKɁĤ=Pgv!=9?(~?o-'4g +u3fE"(+7#gtKe I_L-y?-Nʦ/KKV.="{k[,)8b _K̋onͿC?I߫kNfZ+Umޏ-_4{]ã) r6% ݄|*Y/ItM?k3(3~1H˄4Ƿ^J7@L{Wߖ%K'CuҗۚZW#Rз+sm%g[QuuksۈF胦 +D//ßf%ϵ_VFY/=Nv9GVjj7̩ ){UZ_0Y^Ү,}ޜ{SuRZvHXWbKSGߜ=!|R{â VrGŷ{Q +Yx?IVsd|Vud5ioA<5SQghLm%?[ 5]{ES+)0u/iqm}G}gƜ4[|LףϾ\ַOHJ^OO+I# ?>NR44hy^vds_EʚjN?tO'c} [;Du^zwԴ=_Ѯ}=bw~BRPS[7%o n|6){[콶֒_쯫NMs(!3NNZ܎>^q򶥝;,=bhE +"_WC}aS埩n V%eK)7ޣOX7MݣK3,>mi`}tK?0/{D&\\ -J?>Wşs="rqO4i_ s}>[)IxyUޖjh*~?Mr([|E;Y66Npk̯h^yJrszㄥIt/k$}NM550RkWǗ?/,vt⟀VZ@C䔰j}sxLZ-ȝm'^5f{Q~l|;"s-ȟɇ̴5s 0껔Kٗ6)i%GÌ'd 3ISF>PL;Nv, ٣W:0.YJX}9m~>gyW7%KWm/ +}Q_xũ?}F|w tF׈ڧmqes?sSH 5 9t꣦GY^--/V\)-R )gioɏVֻJ/+$&-`o`|AI=';UhSS>ۓ,O2sn}5@{6Ƙt 2quCS0'5*iZ`mwVJzS|8 u`.aI/2̌C/Iz+IӒ%m5'{k+ e˯6 +DP.GӒJiM/.?wxinl¥urj/웊cogot e;yY|xOyzE[Gݿ<~ƕWz1EW %g=-ݓ?~'sZ;:̝/ZqY[{g/K곾 \lsm׻Y1CMkg{71:}RrxmXQ|rWI1{ՏV`qqi/۫n|dgϽ!t[j%[Y'X'7k)[Qq!n?-[iRdKo܌`Mus/ 7?Eg9zGv\,onN)'oonr#}+փvC.{ms1p^Ke?-/uV +m#&9e=h%_鮮4nhOkk +QdSWZ'(;G݆kI7UJ{<;syW>rҍSs>}$X@F&$\f\۲=,\̻=BMv (IqF 'G׊6^]kXœi,>v/Jŝ/gJg5$4ߖsZ)3x()+ o2k~xw84#aQ-%&_zvM?[[;ii_Ny$ ;46kkwo}£;B^(i?fsևZtlM宊24丽tmd (|x{8$ak[9-pM*a.ˎ~<tuBuZ\/9Or@SR{\#Uɾ)گe `.r|>o_9@{~&~k+Nm3SҖ:.qw7%$Kb$i;3|' +Ws{[vEK6Ɏ=Xku_n)F[pu!lec} '/|b́|}Ys1^5 jEŸeg[~`.觑)yc|ОZV6 *b08po(%/ x0-[߻N [h- ?]s1U|k*|Une3YSЏI83_]3`#C`>s/e%[$bǟhxwxww8` f+ykᢴA!~ nnV|v+i xh!*k]z!s{{T5L˳ eKُwFq_N.+)t˝p *.,50q 1zUϏ8\pmyCE 7 ^S6DJtJyrnIZ3V+^8b1 +ۓTex vN/{LWzo|scMUޫqVʃ**d0e!’CZx.v~Fo Dw!}u%(ɏP OIeGsYOZ:Hcۡ|؇rWe.Xk=tV̳NP[K_vNrFw0ǜF=8SQJRlyb,^ZƎ>HvxsEml5K?29)&X$'iBCG.pؘbt*8h^z _H>=dg]<'G "k'$Z|8.z}ߌ~mVy\=I9В +J7?Z9wvĜg[Y/SȤ]91kNҲ7hü+e̵AlG*ߑ #暒 'W;Q_~FY$MԠ>6TDWQ?C-!9].xԕz7&*dgNÔT}e1b)=#Z) = F*eCFI\h%xknG ukdJHt^p(GŹ蘍aLsYb#&hk4A-bEX^=P1 cH54R27{ oL wuU皋^9e,'sԻ2vXbdoOМlc5BrLqJB3*ȳ4ǰUrJrs*EFHRN%fW: n/|#GD(%;3CwDWAŏ1B='&޾׋TTсXڥčW<}sɧAlR:obR+,4C_n#JL]NNz&eB75uUBQ6^+2Jaϯ`_vUMf9yԑx?|{]Scʳ_< jGN56(h]%bW,SIQ=L):k`-7c?blwv).®c O{2&1F/pNKbccatc kh˄8@*_-ccLOaCFmv.f_(~+磶3wFIq7'iԼ p31#u ؼgEECzyո٦띴dKO8~uywmt<Ђ E\. kZڕc,/ HJ>.w_'aN-Բ63*ŁG.GH'0Bc cMM86ë3рG_*R\U* iZsӢo(p)m=v)(žQD@>DĞG1Ֆ-|X݋r.5b߳S "сI(ؑⷆ?̵hS϶eMK~M M -S;ۖ^(2ӭf=z.ѥ`^Ӌz5󓌘X?c}cQRS^ô+|A^#Tb.?b|;R%ihSkv-3`}6F/! +tsm;Q fcdQ,3<6S$l1x `oVZ&v9hr(Ǝg; +teVpmUN| # HP? \¿'Ÿw_(??,"E Cž) X*]^IؔKWi Kf⧵vzJ3#\/¿~?Ϻ4X.fL)XA=Xcv% LUx;ӂT֭1 +̀XSC0f[kM(A5o-4W|M;#DnV~ ;{1JNߕ.MK%f8Ԃ*^͕6^j#f2gm`H`'c&AK򈑎!Az/ZoqKS)s޹G24m) BK.o,* fzTMZmw(s7=I'̹Y3Wӻ='y2j排Ux]9 9h/{;;PaqNisEݰ"bw;) lB>t +fgJCA/+yi>߭cLDY`Ŷ竽%1q%WZtIߏcUgN9MzD珎7gݮ%T +}$8d ҉ `gvreBb@7~]q +\=9$"ٰMeO"OżxrBLi\jqn휢\.}c)EoJ`An43ͤ`]5$nYyGq$_~zrۣ) ߯cI89+=Vb<@>oK[BKBz CCΙ( P oOWEOyIg +>=V!&")\B䤈O>u,-iDl蹪ܸӛDGpL vj"d, +!&-3X V.sOSRc +xr_ە3A.} mWU5\ +5ǿ8&aE`(1ƻbݒWI`y54LXxuV*g7h䜌+}_+ YxJ.$坦,=qtykWA]y7sgAr5] +HN462ȡJzT^qizNɒoǾb(9(]+@/= :s()_GelDAOoNU"η1vOXrʱP_8 z:;~W@:.~ +; `OH; +Q1RƉQ^7Z0 ̔_?.( C`>? g}sEސ!"ZD@c#*jѶ'qsȐc < (]Ы[W@/o\]<''A/'ߩ+ӍEwqLR;BӘ\]^pw,+(+P'AO.]=|Х?>y877O(Z`FX61mǾiD"#~CGD | +z%PݻǏy{+:y6p7 Zf%m-ڐ=*v6:JOSCJD p`NBE?~[Ν: k3~_ +F~M,|{Wk]T/ ++RF(+ԍUTC+ `/jJr.b"O$}up;@L|KZ^;?zlgw 0+D?j@.y'1I'^:vEe`n] +zr.(姓Ԭ }P +Zre[2;"*Uu pe'D>5-` }`~*(cO]jG +- /j+M (Ӏ_B":'g׮.]ߙ /*'XP +]ĭ1L\Ic W CT^tF88э@qc~/w7@^Y|#QhQ +_ۋ^ZqvT#n +Qs"sЇw@@/nй~=|u?Pt1ߜ,HІ (#ȵl|eEK~S uAΞ<(cYޟae8=F6ΩeG:ܛ*xUo'޾%r2˗? -`ޯ.utw@w=69T-r'<$ ݤ.JJ. K +?w_@^\=rwo5 PaX*pnX*uY%q[SS, yȇ/ż| M (]_~:s8M۷@Lz9+d⫮!O?J&FaD64VD C@GL.H-ϨUTt7[J|juFD+9cm*ʫ.&o5`8ϩ8ҋ3ؤ$"PSH_/wC^o b-JRL[ύ4tP!xZXqpbivy!6|C]ILN +]X`TsC5u QG]Т͸w#|NBɃ@{c3YM+L\ޖrJSbت,S䖜 1U&0s0];3b8!\vrK}u}XU2lJZUrʻF-u36d"R73q[[Wn,==$I]c⨰.F󯆀/4#&+EiC xjWP滧8Xۛ0w*YbpsL[ګSYmmԄy}n͐6%8bQd=dUQE*yHU5NK_J/I_U<'骚.t̔&zpvDkev4YvM X rE^-1X‡op21XS83ԅ Z$ŬUugqnxeijKۄ^qѢfV4lj>a}^ߟVMFԦ9t| VB=DY 뻲B5֍5b$ab>tɩP2j a{kfmh{umuYUI!N^[yޝⒷ ))&z{ iWdNzGͮpnz-ƺvƬa#!D:BRexļirbN7&j.`VP2ё. ,eȫ8%UibAI͙+2.cխΊmZ\leB;_aUӊK6(Kw6%;]ۺ܇nj)x< 1 `Vt䶆OҊxIqWCoPpz8g ,HWK ui+9AiQiG֕l+xbj H8?2M*tM6[@gQ)Y@C -9/z +_9b04\cN3 +\0`雟=]SKR8M]S2jb^ӝMe#8.5E)ti996ѣ5} gZ&/l`[OؖwUS$?=cCK-fؤDH;v sm 3vӥih8'AqrEgdT &jc+k^CuΔ,[[hk4]lc%9 bӊJz[̡ D| Ӳt i*bSRym cʁ_R@~sJ`NXp8$_k톺vv[I-*Hv5=%2)ոݛ#F<:H,+-?e:T +ت]5){  ܑ2{٪- е ["U6R*%ynk7ψLå> 8{z01TџtOOPK]1}@5qɪS/+s5]$,hTvdlf\rdzov@=*s誒//u<`R +dݟjB +J,hf!'fؤu):incӐ*y5kR󴸺g@ +BGMq*1[lo6 3S➭pV!6Q1=Rh¢Y:lB'3wwm>2qi>qTv?rOiZyT_9Ax`b8\R7q76{`? [Adb VV).ۡBw|ꖢ.lHJy%mWS*dCH+B>}MJ͜}ٺ_9f Y%gۣyS }kXwŧѮd|*ܡ&Ӯ ?W\pL#Htvʙsuv 5.vF̵ >fxLڔ__ng{u#cu>PXoY8_/pRg3f_ |Y(i+ j@OɜS򭱂ɲ{&bpt9cѡcs!8{zTriI7WsR|UO;jl} +5R*뵨]v4áP zlrgڝAa=|wG&&:^7Twf~[ń!6a; +bwMpEnCeQ]. 9aC/cB]jr'>v_/`yt&zgD?V~vRZbtm)9%W(]oU:AGV{m0Zs|m֭WQLԀ01?jޡSq"S HL4o:2crlEKtjq){Z|[FGn ʶz9Qr[JI`#!qg 6_z3ESs qF8)muڏq +w'e&*r85.I B8&2IbY$3؀9btURrC'˂wЯ[ķx6cCJ!3]]1a.]]rl|?*~sUp8SݺgsI5"( 8L lvrzHa xK|%mcjk;Ջn 6A."!&/uTrп[a@a.seI+Y(_(pfugeJu m ȑ|߸_}80)nlMSUm((u}iՋjKm +vWÂ{4Tmܓ2^7$98]]-ĩ&y:D6Xq[&zv @`{*rSpii;2l(&l0&Q +IX*V +-~ț@y' ɇZjپלC +';hm{}jjbm阭Irе3KC)Y.1IɲU!gBE=Smެ*'&[G-+{c`KK+xܑS2LMED5뫙(j9eyM]-4*+5Z2jGإ8$)6u((9*RYꇆ\@tnsn`NԴ*lEFJ & h[M 1}{Zhnj,xkyj}Zm.|mB'I9˽ PcIPwb`dU}?^fmJlW_leGK֟V Ŭi{fs B ~0à8t8s|pbG+$1}aahdnMmW'﫩N5xgjH1u_(Zo+ya- \j/x^VTe%M]jnK(`ٙ@=-ܖeUOz)G:X)}hQdZ?T^Xy܉M6c[SjV%(ێqLy{qNʧr."A7$X8bwڃx?DyFhW+=21h_鈹;ږ#['9^s?tVp9#ЭA Vb7 odUČ a71\m}i. yڛ'Tx4 mĽSAo!bKT.4t Ff9%wi3n}U Sjd|Y<ʚAץ&!he7RW1 ;)2!}` "Wpi[~Tl7k56ն۵l:0+jQlm6n}ҊDu)@W2[_>].y#Fx_:Mٟ3؂=*խ8&Z"#]S @}3_lӜzʡaVzҠlgWQn-{آ;\ٛcljt8&jcޏs(]O6rK1ᚪui(ճ )!CEt 㮮v]j.}cowAouTo/hWzj2^_>N4STv%is9Ta_B6A ̏[yZj!l]30;oܲcC~Y*ej̻L&a&k}mXd}/?7K`a.%8CF], \+WQf+9OgsKc5ih?G~K;#Ą!Rz/*h_׊4S T~¼;Rrz~EmHIivdlҒ/Ƣp8b;LKRg)!ss_c-^`V;Gg +:&IW>LL6 +~E)ۙ~o;@#$^|!gbTDh4qhs~A ԫ!fze*R~k=޾`r +=!t}g&l "7z.}*0; eL؝CgUihS+JmWsRxخ =TV'1ۜt, sQb2whGlrX0;[Oi&ztĥ$Z'1{|{N\Pٸ7_6\j`-@7$ȑQ;JBkZx ω\j>u_'=X Li~K-϶>Ʉ& fjn1 +7 L/'~xKҧ;㤼9.}SB]X( yUfe:ͼMKzq#71 ͹wnN3o2 +_|u؅rP6I̳AÖ:r$Gvi!gGJ#=,@.@>.4%$~9QQT[6*Lr;0./f{0oRR s!Zބ oG]nkvORӮH䴜Z~텆܀.D(5'㤤7}j/I}a*ycELs9=w%e;%oүOQbΨ(5f?Rrgaq9ANzaků¸KͥsBnx(qxq-e='iV8& lc%N G*ۓBQ3J:J7XqFPO ߝdؖg2̎yЙpI8h;4(ℝo|g#vUAoSL&j;K(<:ͥ@e9uDJՀg_#|&eW;g:ܪwuʵa y}g!.< +P!tte۾Zr^@c8Fg[Άc}~{l kD#a7GߘGQ- ,A}}(TyXIZIbN#?sYd!-6=[k/~eBk3WJ0TVYƑ-yO:ۊK??oS3nwAf +-e[jμ r0!P]p V0˶!k=O +A]Iğ cY#|Kbq~Ԑysw4~/sf92u1XVԀFR +|儬^-!jI)~OMߝĦovCW fjt Go_otYGiyQ5Fw`6PI<ϿoWN+D]4d<) 9KA8$ U54SMʷIіT"* 0H׹ɯOa#gUV6z_n|Sl2Y@ӌP,֏$`ޛ桂W[CoMlK˧Zi.%3:Q??=N8ښPCX`+ A?D_~oib ـ% % + rN+5?[/W|@9"/W{:fpV;ASS1B`쩱ZGSXQk<6 +^,dەUd olBCc|})7ީ +(Xl۴gE%3\ͭ$m Э'-sWk Egp@ǥNnrʉg[JrT3$2N.9Ћ8QlJKG𛥆at{^ya]M4 ̣cz aZ/mP36$]mqLy,~H6&F^4d=%DA c" yFq Ba@愵, zJL})NƵ;x]jjEwk4`MM? NHkc52Q᫳~\毙_3lO6ȈH3漝imkqwilG-Z#OQ;̀/ zqEE{g*Te܇&JM'`lSR{O'd7978P){8ڦClnac$Pj`vLP55{g *-`wВSL^V7G>eb^~cy7Yfu_\+*GH\~Y`'|YVN =Op0<RE5cS}Vwu\KA@~X(_Y +"ED̶=^E'Y\\+-b5[y]''_Ri^tbɹQjB{[SM]@Ibk΋{Ȕ=>g})}#4ǡ̲n/[Ugv%4ڦ^um8@YJCcC^Kk=lT+*JKi.yO%N1@rDBO۩ʜ{zprf>}lv6/?f &z,.=% QRr{S + u3!A\Lps˥bcW +aM$&CnRʭaj9IAOPx. 9vgK9GNh&g>DXB*yxGyF| +I6ܪQ◆Ib֮ #2E2hF$Hۛgj;f^2%0q7F)rnnLvh3%!1fYwZD8syU6qۣO.%U +~FTE@,V]ЭG65K CQ2QcAQ^d>zsoig9Sdj2d2I$FMbwAw"]4iJk3|c`*7֣"; }똨o|V²ĬQTr>5xH!-I ,udԸZ}3qdc1#Tc =ﴒ\HNjlwZBVqg3 n1j̀_hM)4֛S} {,$1TOJv p^xk?T'u)^q +[_fja}2h*et2{)!A5qEL[ر]aV#^O'Iϋwb:֦Z_lNcJ5 wM\֞}hvL|T o@Ŕܠ28} pCswe0k +`խd- z5[:u l1<ǔ1֧pA%h{EgR~9:5jw +hKBcX,Zȵ=_l΁Rp ?Ϭcwȇa-/W4Ć3!>6:^{$X{!yDMS7Em/GZtdt L<5V4%G2Z2/^WDЂ3)Jˑ|%A'fai`Lgs-HFXFհ̈\%ir~_5&|t!=u[ VcLdPa*buwl⾱KѰ1aHp{i-(,>팣9+sw$~Y]*a :At5VqQ=|d6Zu{f` Pv*[p o=t`m> 7ܱ5?teФs2FjUP {9LK[z#%NbOeR c w;[b3hMzN'iag}pqzvL$=`V0%#S2%DςMU]Фx`vtg;tc+tDLG !w켞KWSkw|֑iibKB̒ |Rlm[^b;c:x_36Xqů@xel[BilkХXA@ Jے产jF}圦[D7^偁g+qXc3ugL{&`GK /S;U&`_:謝%|qT+ /v[/*/;Gi}M#\_]>>=諽XD=TS:W#pjj> {;Aѥi=a†#7_}%T&|˻.)DEU +X?/O >\j%/{F[_:7׼o7ފZ}_8Y}EkrlѾ=L13YkK5A9n?5\)^+-w1XFP&xMdV베S }x*&Tnx!-&@ƴTđA۱}c@7Euvzcf6em흫Sh+дhe}w{o^o{(4'3)DOP[ ];F:zl +xBpnJYT"ip5G&h#sK$(mH8cZN4LD)?k'vf[뢪{D/s LgSvQyCOˣ97?]]1n2*_u<\jNM,Cڐ VRmJu.{zlOV+)M/$ntRq;<8f?щi9BbHw 5dg37E|,\6EXȦps2Ϯ +{N2"-5@?׮G/-7W{j_'לmz{l=<,]-UM=xccnT@5ppIHV[/}ͅIk8:N8Y#;Tm~ĨN>V!m!SLEqGIjUKkZJIb`b+lZX~P{5 ،gd#W{[ʫx5>DYC~9֏jX;@MSO<`8@g? Jy|혚; Nm6^(l^0 +.jеꁺ-7>U?DGaI>ݵA=sl2:=P[PܵpV#t}$:$`͂nS-:hoEXtuK02&w2zC3rdŶLqP) XM~GDT̿= G+z T]i=_կ>zU}ҏ }cV-X"Vy,#"oj\-.2AB~=<\{9dW}G LġSU9<ͿK5$kS 6isomg>׬Mڒ@Ru#Ѐؖa+--&f(K"hwW9 ć۞ [EbzfsW9dWm>$}=-:HV{[Fڒ*.xsC5tWxv__,CYg'/SV~H "#`/T8UD՞ajG,y6W[ +t챆ړ˷&rzm'`?J!9!9x#<όQ2/BT] EiCIDSL ͍P;Ox@ZEr2Ůxh&unMCߘxYߜ#~ۘ'ZYw71+mu۰mHNա%)Ef#c:w1HA[Cwnx׾坟e#nM\OFK0տ@)gYe)O7[23{ؚgƁ}*ds^lK3z3Q u=qξQ}}p'@ +5?I_zknMv>qKdsʖwɾߘw\g77_PoeZX'p/oK>E䄥F^UKW፰^L]Ȋ9Ye2; ic3^&HM +|YdTaieSЛO 6[14G#\GRLCjkL%M!8yP<<@D>jodbbrxVD')xdPg<X4JOe^-Ko5 +9Fܯa2b6N:'~-3Y={shCFmov1-uu5#4EXkJ?dw?dr-Wǟ>j +sݑ0su_=c +jKaµ/w xY⛫&*Q5[r택5 2? }6x+K^|˾`ݛO7fAicKSJJ=m`>iˋ== [B{Wسc IWM fJ*iٸڼ5 kT]02~YD@,baW^q+~ T>kN MwfG;_UW<}-h1 .8>'{KxݿUgVh-=X#84=< JU I;"m92{OK3a>4@ϰ=UWf_@^¿Y*>k\HKծ''3Sffޕ`_hg}t螎C_N6> Y;lݞ-bhBp -5vϞٜoµةxT0aU/7&XEOF<~ v~e}=+dv<"`=Y,SUZ޲ <1\ݓGV&)#6zT)U2z^3{f Isoǚ|>[}{G՞s<  xG'V2 +qd"Z:¯ 7*wW3;#:D,0GqKX^G߻@Ujx-YXec^qdcP5Wx/C־wr=*hM*26,Ayow{ޯZ|wŖkes8Klͻ\yTǫ8Ua֞oEW^oFZ +-⪯Z{9[n@RD}Rr-H(%%d`CF ٨}+2a^=;+jуKrh9t]>oOZF,?=Nl)¿/Nzgv5c#0с%Zo9#pOVGQ?yDФ:4EȘ֑q!5/C@OZ|Î:4ء=Q{6e[@kH-ZVŕdJjh͘dt8a[ڒ2:TqX ̶{z4,ǖk$V{o=;4OEhRZ7Fb NC0Ƣ[ yRJO @~GmW/;o>IVnGѾF)ucflxv`u ޅYh*p1#RvV=3gp(A:DQ} w 3ڟ(_B.˩[^~>K\_ٵ7lC4E{F͛/W|84{91]u& jzڟ&:]B6n8*}>sCwU1.~|ko*V&A'?OrrR{qww>uWwkct_s_Ra=#RBS5Q}SNNquaPJ+8'ۊݢ՞Q`-o̜}M>Hy^TiOV/Ȉ?8Zghڳ<'((,@ >a> 'VlU>YhήH? WT{¦\5v[P&mӄ­YTe&}s2.F Iem-uV&qg[jK;-$,&9tD}SW%\ˠ &) ek3V2%tKԞXlO F!s?78v +2L 1+qbg1,t̾)qb}tp'+ <'x v1A;C$>l]rosG2pz#fWFabZl{ZU L=h}+|""ZtغǎW{-lM>YgzXCߘ$t%4֌/4+kc^iTFAS텡O Hs$u$r[ê +<,3"#Uvrӭcm#L:{'Ә !|Y?شYbYvٛOI9NT/1/ᖥ4/H=ŮN:5M^~tw/EM387 JhG +,g#O,,f`!>?/551C(iJ{p8T|Bl=b]xiIQ߬ +u~K<.vT,OvSuoHzo}&g8 +[467HQ\w%98Kzwqk8>yEA*9ޙBWgak@PJnlMtoYx ,c__,n[Fm K1AP2W|ڕLS8&@gQm~IٳPԐ UqʮnIYQX!ek奖znsNL [9ࡷ<((CT?>ؚF=- )`5J#ј:輿<,Gsʤk{9Q-O'7H_= 5^?:mN8[-Yr2\`6fYk_d)؏~A8虑Wp]tV?Ẍim;z6}Xg"DrDwb&ټ#3vḻ(8i\pKwpǓM&3+:1M ){Un;CeV/lL5>je=yM8/yD/W6f)U{&fn.B*6>QC2JӦlaH)~S,".q!7%+ ZsATk3F^Õ)Rezᳯf;3c敒|rtMCR ?=<͏xOcЫP8Ў +s!hMZUa*Y Ir5iXwMm3¤\ast[W ;W?zsJl2HKkzSFk;j$/7曪*,:fd|UwSn ιwRf2~#6Lc_xΞ{-/HgBbJVW yfZx=5 eR +_|X wRXYP 2 ^eHgs_-Z_US5w6&ʮWzK QUD ])lGfIШ^lN&Mj_=RqwA~Z1Sz}[n̺=+9 ܘjO2btفQ[PrB*FONoc߄쎈 +ЈKx@߃z*ʨſ;3q7?h`}_p HX(vyHC/Q*WgJyS߽*|~Oq%;2dWrwT 8L.93wߨ?8z drO!Rvƨ[NA|pP;ROY魹间tQXɂDT,;Mˮ4{ej`$44=TbJc+$oڼ2a|fՅ[s<-I e~'F[x3 =3K,wM᳼2bOC^vwEO>ө1 ~h';LöYo6 }Goynq''TxGǀ{p=W<{ݺ)cRPQ{FrUs̡zlPxE5sYɐKYSk +L35FGu`E4"7!!pY+"b <НR+%{> `!J{>ɉɾEwHR-~'!Yḏ䒀ݾ@[!G Q؋buV2N)@;+ +hM@i^s]- 8d$x<#Zk&swgҖQjz4]qݘeW[$Go.we/Tk6T|ܖ2 8AWAe&"ev +_%f;sΣ~YDU\THAo(A xLPXŬr 9sGGn3P&:C7e1xnC녠놮[kL5>I:ry#<~BCՄzX#h޵ÕG] mYW +"Fc\y]5aC{W&;ue"8zدֆ4dP@k=Ԉ<EjgTĄ)uMnV I)1tB`-+jJM;\ٳs'P p$WhH4Б&%c V1(m*B_%#X72 Zk"[G-xH@Gh4OXTg|{O=u-\^|ϵOr3" wH|KH}=:tmcC>mw{(fz]>=\V!Ƽm[^fP5<5rH#$;!i*jٕf>?b )gtY^E5qx61g]|:u3Jp hiU:3h$&Ү2v{So7Ѳ7i{f*l"n-:CF:O/nИ/f'6!rpꆤ%3h-cKfHUgOHؔ@lGxӒc@|.Pj3: +{IFy[Z6ʫ~ DaP ~5t`?Yx!EeTPTGGR\[Eͯgn̷VA#^h9 ]V3;f^ׁoo&_~J mS £VTa ygbSzuK[Wqѫn}!i!YqBs:K.h +ظmD]l޶quOEׄ;k]4P`JR}PhzP@l\*ȍF**`dֹm Y'W[ {+I zf- )5Ezk_6qٻ6NjD=w)q[:RspPK}WA}H{`YmIrsߢA}=#3A9%^f[, z*Z{ڧ?ߑˠԧ 2Q`dfulPM׶$4ꮹg8fvLxc[]5aRW +ޒ55. ,^]B.ؒwa%ʙ&qǡk"i<\-9avN*ϵΌCkŽG0pf H3.PO#"ہN%\tG,.S/rG$ܱ<v]QrvHjF4]UOZ槻'ZG U#KHӬn0*I9o%\#TnWϢe:]pw`g1b Bbv S'CEk2zk)'Ԅu12m_u+cB?p:RYNN+lcHX&,Խ,`8etkW_ZX]`闖 +`닄=;ih6^W.9Oӹ|E0eW]FuU9&XK"*{pΥ>Q$yR8۬*ӍA$Ҫq*EP.A_͆TsNwV1ftc3ѕ \HыY*xndS4EP4C<颩m*y\WB<[_BMwJbڧyں)_+]ATD͘Z~w,v<0!4J G&.[&ٽx=A&8-_;hWvoB@cP!Eg឵[;g%S|~4g8O?)J||L`ot%Q~ Ot}E}o A{v[`8'%9JuusQ|q;g(+V Xihm,~K/ᱢu%%9igoQ|ÒTsn \T-ȋK>C/Q +y$Y" ꜿPU+ѕ+gʺH1jGSzfh٨G [&!-#?eLMiWa.TQϡz*9zD}YkY13k c۱@;@A[gVxO#}_ps唊wVܨPVDs[c(hk281dGJ'sdo'X+PN#pv睴_=oަ8DFpũ^6L!-}kۜ3%dUڪ|rٲ-}Y[fNmPVzfu_)k^~8vKnv=:-vQ]M[W2Guj]jYX uT' +Vcjgy%Rΰ723WǗ~?|~Hudy# +ʼ|Di-[7iՈrk5Ihnƴvlטc5*ʏydB 8!SB2;}I,;!THm){{ǘFbU4VlAɼYo(R 7i9R@|r8g)ړǁ>{q~1)z[rSxƋ棹SVVK#Rud7Sڷ]Y\=@b(3Bk\!g7Xc"6T])qxܭ +RHs2Lx+A8(qI?D^y@z.Ջћ~_y5:>|E:5;z9 `,vR}+<'`ý`kl.kQ?| +(^zjWM[ܢ~i0QZ]Y )0Nx ~ +On-6.n?TsD_o8xޏp%Wm*M&1,)Ѷ)eCW^mBx]6dN1D_AQ{im׃"˯$5rhO'cz:ZvԦJ2+&ө55Ā~ +d)r-<懨?>rLٟt- w3%q-`z\;?ުi;m"BI 4,yM[o?H;е׮wHw O%?'wS>q*f2z XPŔ`Y)5U/eud`sjز@^~#:Gto?:y~H0Boh*WGȱ/K/lv 7*(qu-4<=v'6_n~ykቕ?EPnҨoNڲ)u zI-s`#/yR[`,w_Sr[w8Po?$gWk. VT5i17a\IԉKS0MݓXA>V<G>ǍO'dA}'7^wf-eѻ\DMS1K2VV(E_YL_WSBK]2IzR*wK!&z(OI?f@=&|kK6U&mhjyUQ(D'mw6u[]:dI.I KY?횋73%MKfk:l)8$ k{<)H_?y;-*zDvӃ؂z' [)Q슦;U!81+Yby`W69>ng9뜘W6.1) ^G%#~``WFډ3I+7mYLbě%LaSMLW{v{p~Y؏Q"(=S`/;s}vK(zxVpP,;!,PTLFEy)+iA TwՕ3fT:*20Nx(dFG{;wԵb^8AlF}6z7u62ZGɆZGÍ"%/hjT5U@KO_GgE{^t- ūƸC5]W)/uq,̗ m=IИ]>5mmA=QmN(eYF{Z񤀾%-qӪvbgT1X#ZZCK(  (| +O!,Pd蘤k*6LdwV讉kmmKZ- Zя׹4KkD̤U1P_^g(!D#y;\%5mH@MnTUzmfNVTV䬹Vaf(+ΌSLZh( 6b5WF޺1If\&H0"-#M{ھCCU񉑜~0 +. +ZBF5cbU-U͒LHwgv ֖} 3X`|dU֋[{ڒg=c趦|}wjn&Nt>iZީ;*a/Eإ&5Эno$rfQj<z *=- t- rf.!/@j+c3`b:1;ZYŏtB,>AIQT[gxXbe㙥bDp:IБ3̢#=oIH]067U]5 2TmÞvP1|;wUYR]]K:ui5+#--9F\* \"?8oˍ ؊_0#&Yvpz@_JSBFNZ5ib.h˱2LMr&ϗW[O[/O|8>)5cȐ\Z+QRրLD\UtyE Mz:њ,}Q +2_LS"$5 /oyu)q42\7 +mM֎&!V>|w,$I8i:N:|mr0FM;6 + l芺eh}:)a, +#yv ŔmGhًĐn$,IY+2Zʊa_͐ֆW_/Z#,yiC %;4z̄hWGbuLZ +Bz\?-{y>Յℸ 3_ &mumkw5YGvl,>뼜i?3e& lʑhb{ YU3rԍU[^R Q5|V䥈Ѳm%,JC td(;z["7ߒ!b/)f~oAxNwx+M7ؕC|qdbBFA#iƚRެ\0B~kH-rb֬1-e\,Wn+po:jjƩ`BTU/Vd]-,B8OY| ŒK酧sJlicu)tS@,{Z{0'-pV |[(kU嬊X/tYEADiek0Gs GKcG5=Se- 6/%EJ[Mkm9~m1*@y)"h)s3-ral'i_J?ZL}ow$-ym*"/(U iKJKZlۆ)):j5?8Se%&(mIևޤ<!Ʈ# !]IVYת0m أU >hMJ9O L]UbcVH˺u_EϜA7_II }1;rRԶ{1rK泥ZDKCZeQj⁁XML fGꢨg/k7V<qv lUCv(HQMKJSc +lbK>6Ql} r,)g +endstream endobj 32 0 obj <>stream ++/j,C )!PW/#Dd(&DyoHp!JzMi M +Yc嶔}_V:2ޯe8{_mñc-EG:Ȅϸ):‚wT)jʷR4ߓ?ӕb 7 xϋ:l/Kt`w`m:r$e70a6=oU ʚÅ ,lė~ۖyj(MÁ++ +Dd}>lìQfR7uaMsa}6S(6̗#E QD:꾹,TuҳABM/ܖc7.OG!IdRO\gNHS~jn-= Oʡ69HG˲q1B_(p|UTf9BWt'c;6/NW%=$ݐQBnMV<3V&]Bh[!A=ب'*̦`dH0!Y.3 qȇUwf(55 Cl3P)FKvbnZzqNTU또uOۃi Fbҩ{d]pזT?'3l̡ߌ1R쩑u[~9P C3Mi,@dM ҟ.#}l䷉R(9ѦDF Vqώ 7vu汔 ‡>[EF6ܮ孋s;r^u^αrx =\jd멹NaY0NDRo6rʦbJqa׎'G':t'DK,mc0P[,YyA QBgәI=6r'fB݀V@,5!L>2@k"ؗY +=Ƭ2G⒳ol$zPp4ע(Aq\Ʀ:yG xu<ţP࢏- |e_e[D=k%xc˕^מn$Ft"l2N֖-Us϶?+AWqgnx"%iɩR|w.tDKpsv2F}ڗl;Hz| ¼YtTIR汾0lKroL~4_`0KmA~C1ˆ- &hK^hm30>Q73o7@죸m%>b*өy*]O}fRzo4Nj)r QD`>&ZwMIJ8uk(tSLHّ1 +bRkҳC=1a_Y"&wFgu1[ro)+ݙfA/%^|R{֫7yM屷G!wқXpo];c >#V`n;ǩ'b}w +j8k3@!s>?zF]N9ANs gFB"PkYua#Ŏ$bil$R\q"N5=]Kw@!BԁF@84T6OwKs^#m85 ΦHyFbޑ}0W{[3ߜ駦+BK;#/u:ԑ4}%1jO滙j#B$ζc<_A'30gK/oG 6?X쀹X%=iQ/i!dm~{~` +Vjo}9-n_ە=u!m48^}^Cxl^€j,d<ĄX@(X{rj/M$Xs{_"?\S2sF99!ᡮ,('춱20t9^&+( a`{beo +Gy$4檤nJAC@.Nj[<\ǹ< Cc󎴱lkB-.t1TLks'.N:ޟeQ +ǃ$;=O#WW%SL8g@v!z-J(Ř_6{!PҗAWu@(yKa9~/GV95I|j]*gZfMt<yQb﯋6UQx]ڻ3lp E^dc)+񑞜"~kI~nC=hMQm 1)ˉK>ˑA~vFPAm)]e?S8]XrM<%=1Z,.?PBBD)y>`o,X +iGr޿ObXmҟTkŒߛ >U8f S3~n`@)YV_jntЋ , +m$RpAE!o z)M{ݛ!j+R(I [BRUz4 joGxT]]9sFhC~s+oM&&tCu ,qiL9HU QvIɉ;ׅ,-I৿ZGM5:j44dGl]7U`=e|])&j{0Hߖw Z' R^[:Q'滯v|퉡Q~7mԒJ {ԇ=U.}7rNu.Ws9MZj%DK d^ gҝ{@ӓOSXߵ^JN?6ٗܙ8rّP;#BS#qJg暑nڝ<lj͍rr'i=eԚq%Ux5?-k6RDWLVdR8qM&p3`VLM >~GAI F20 _ҫѡO8?^9Ӟ9ʍxq .N9îofign# gEQt,RGRkJkfO~ړw<2As{#چ%dm>+Cpq.BޖcC5:@< Nύf Ռ̫=1smce0aK9.Wx&s*޻#1DKƓjȯĠueP_,"z{XPk=E 5e_M%ݟix4v\cu{ ,p Y/{2\xKk-ׅF0'X~1獔|(\ kEBRcL y Z>QB6=Ɨ!#oW#+S@cI@L7oIy)ywD!>fd s)y?L _kܝj"E>%/5me9٤`OKGLC;Cy#UU1DCդt}+A*ܜZ[JD}} +@xBK:f/u[ä-<uy5Sv6oz!:Y +X*‡5dM?SsG_pc6m6dȊAFGNg|Ԗżk|J'ǦnɨĪاzrwCmxj@ ['&6"B9K v0U. 3 bR,륮,e9'p7s" 69cAL|<[|"tM}yΗ[ "L&Hz!GmIW,gC#&|[UN&?W 02HO2mR;Z໫ +?,wg:hbMEI82*EIz( hX]@z.t;YĈ}*ǮKaS ` 16a\\ktM^++#m!< h]AJRU>Y+ڐ1%wi7wH~7(?iw70!6%7gjNў Z!n-Mo6Ep+@t]C=%l1s]BoCq&\뙾R=ߖ`d\ ރ\9.vfk|gWE㪁}Bxro}oZ-zIV<)U1w"n/&? +yٛq_ +97HƮB:Dm .~%\}Õۥ΂OSڼ.?!#n^QXjwʇaN1 T]槱L&:.)2 !$/?NUkЅ.b'0> +BMO$d3SgQ䍖Mw!+|gSZBNoW:.*CRZDh>djdbHic);\{{+#Xs3T;!ڗ<ߐt6RkK} 1Ӛt&%_夛#Q֧зM N{ +BԞ1VRRLHօsё5N4E2xǶHKSm0Wo 6 +ڮǥt%o)CM)n6z4N'M3ȗ3dȖG&|@ߦƟ9aJ]Eߕ'{ 1gZz;sML ; +׋+`'SmsY}!6do}#<ε<]EH!ioa}`g(rOÃjr24}\LJ؇RBLs醬ׇjJځ9.NB u. m/n]ʘk{n+˃t!K{fӾujdoI`^["T𡪂AKk@8JӞw܈;2➶2OVg=ĝH- Wd=+Жf?&m ћC(&+. m}܇$.L +{P'G)'],x/gGw- 96m@` IgzLm 6lJI1f4<<^}[݁96 hWy01'gE.rVdť#l؂SC4>I)rj!.Z> şO󯲊2^fSf{Q_^w?Vs&fKxgiC*b} ZWGc;2bd^E5UaNӭ/3>s=ysgᎴ]Dž8}s6䖒j[Ye+MxrdƉ3BJPVex5֓4^R~4ۘmgz! +~J澦(zS YBBwGME³_@;o3>Yyv}IM^yiOZ|ⱉ=f{&Rxd^LZȐ~|CI;S e5{⊒?r]a\<{ nkblK] smX}w!z?M^}O[V+dd`*oLEO=R2vrjک Qbg _lK+BB*Rk __S](C%=sK ]끻Or0aUrhS1\U4QrgGpf@o-&`S ;+kx wNtLU"Tc3w]8^tfdlHIѫBU摁mۏ򲏐՜0ݸԮ<7W^).>3RbKUAJ_Pp=\1']C $H0>: ۔mBO%!1y 3߁ hY. I- Χ `sK˅vha9:r_S9<E%^^}rށR|:٫b0u0[raЋI>d?tQJE_:Dl|^pAŅc葆)A-@?(ihsu!>iRD4ġ mU"6(﫼5eO %ώ4E )g }K`$s$e!#qT}d,gEPmiq +jXb3vQ 8$J\ebfbV_Wٖ{}I7rZ%=eI +cKH:j[RhbW= NbgW]ۃS55󛑞wudGɱw Mo6vQ+HwD :2]*y +*$vnׂo2mB>x ]0ܗWgC ekbWn܌Q~>Fg:j0:x]T2ӜXMMH0)S[0ׅ $jgVj #r}51[bU:0/ ][oDfᑹu\6prǝ'7l1!}\D){G]7s-w:i6#N(:0`73zƮg:mA.\%;Ŀi&̀SO%36=nyrGC[. +83 X'&G<t]Iy򴷪 C-ulN t, FIJJwύ4?4䱎3s톸X +N۳uظ)6||^rUOp6->vG2eS +ƪ==64,R ##Ѕ\7*@H>_,?+.1{NX@U Y.nf %!|()~L?17(k%y2}t 8|5D|Hr9Q!#-#'شv@JWaBk=ϷDGṟN(F,RV%m1~K \Wz?*S, nH)I0:s%^/.L}۾/~b&߱a.񋽩[2u1@Q=S;VrHOO3Vz-&뒟X6%:DGL<1JFƺ.8ar_$XEklWӑgK{*l>PK{ähCECY !{Hʺfu,t_s5W&7>2_luğJ]8]U}}>#&Jè!ȗ- k[0ȰĿs!b_QҗlK~-1/bCU"vFk}eai5Afl 8Wv5wsq0JL}KUs(Wrp豖_϶d<_ܒC<:dȟ \KsŪfk|җ?zu]F =lYӖr45Q#s('f!9mTLY0=eh-i/5^{$/KkqBAֺp9->SZFzlS2ׇc|;ȷY:r)KxwKq |ȁR}X xrΡj^#w[Yv)Fz8 7 ||)m(xg7ߕq9yh˪OƙPy5r,0-c7G[jZj65 5ji&=\K˫B~Ҝ2FlAG -%mmd%hQj7>܆~sҞOXb7Ņ~690]65|EP`"!b7$Ą!R~1*ڑ k㟮Іo['Zfޕ&;1REM:2 d&SSҢ]a,|[ +U>o{xt"k(eO'DOkw:Ͷ8Ͷ{ + ǰߧ .f.S!DOHZd0og04.Ä_ifJ]-nN}vGڊ!\ؑ}D3O] ǰWgB7F٧U-+RjTgߒ1יﵯ^ X RZʢr<.O1Ǫ@⏌t=%A\y$*L_+W}A<ђRcp*{e7W[fz)Woov3/'4,p9c_T7r~ҋ1֒?-e ,o$gM e, Og9˹yӗZR±vBС ݑxؔKs)uW]*BnovB?}Y&'f>ΦdnpsMoDۃny@m s$5aQ*P=9*/JXB,ҺZ–9H +BfZAWg\6;am˪5+8)3}'d).hۀГ>ʦa ߔ[eyK);< ze)%qСɦ)'|gWanKy{JrֆjC9*i'F6rO Q&Ž깈e13X܅=mzA-䦩<2U:rcMPw]e8y0 +n"i+?LЖfc&{q̄|#t>'_NHG:RE Ujfz1acIos¤O3@"vGa¤͡χf8g i)/0!X]K.gl@{$AoT 8՘fG}`籖j`.g˫+jה\Њ^MA\ք*һI6Y&:_ށ\1 iQ69nV$؈c)~lXol,WCOq )4XB>^LPf,4o tn$Z %. O'̢C39d~eA xdBֆPt V;ϧlJ排#Gxwe#yGx~D1eOIO^"mɉr] ++/G>5~1^3#Wa˝n'Ð7MwIXV@}ͩog:=TeEVyI_C(oME\CU5PZ7E"= lӗ8c (Hz;:%'"G!*r܋\;mKz&r掊%5Ef^ѾhKsƽ;{iiGVMSU]̱0{c5Ia01fi$"GFjGA:5pJbއapj(g 5"vmCMbơLȽ0?Q~SF˱ѳ[{H.;i6.2'FZ q]VYy2]rf\HQy.?J+DEM˥\ZxƄD=SQօG+/N|hn!umte ﳥ '&ZliɊ0 +s;=_V&*zdm0WYsix':|81„Kfr)' MEYNgtUt\t6N?9,sܦc{^sYf[R_)q1v=!_EpH'z\]c%l >.5e<8j(AxM4 ZfHδ8sq/O Hυ(YaFL;XL_z-xb:OI[[jAЯ;3 s\OV;"lKv%Sg:%tg}]C#M}g5DWr8`t|BLtƮ0bo77d={r\Tk{5^6?qZ觩6t๞0}8'؈31}_̖teQpυ}>53`'hI yp6Nȱi9*B}x8F;32/8 !vgddj*6>?{G ORkZ#fvt'By/f(o{vݛ/v7P0{w/2Q\ba$p^ ԠJߚ^\z^[z<;8h{o Ph˞@]~V'U_pI ٜT.⯦Ҿ[67:Zbhrp>t48KrU*^OEoc{W +jePٚ&^ذ SJkB'O;I3kҮ+3:Njc{t5 9^ צ鋣vGOo#T0y)vc^Нu\XPCkX@_E9X6duѨ<6͹CYݱ3Pᩮskz=%]W~wK|#?xr]w+v#MW.*:.򕗰aQ9Awݴrq}zkIִ ~ } ^5τ`ޣ.,e@j|%0k'A ?B*V$;7{A bGu6 F\ 'IUc=glxu$s{QD06{O@ߩ%EŒ@mjKG{w:n !N#ʏ%p768=ce |헢zjKU`Wush5$:nq&rRN>;jfJz=^(hCbE`SA&4Q[p8ؿ0kY`4}Xu8oa6_N86Z{x/۲ǹE!CAsDM|+owL)`NY1oW~91mٜlK1aJ^:As x-l5*0#&M2BZ pxk\м5%lgUnSoOnjԆ޸=/Zy ?z^|o11Ʈb+B922zr}PqsltLLJCDU) >8懭G 3#f%-3abuCwI cc~pڄm&ePXacwltDCiN FJSq&2* L/f\_9pF[WqoHFg_yr!6}VD}kVJya3w t?o=:)߁&?T + S&Kڍ~?eKadU%NuIYYT11u}30:t ]wb& ǯuBg-bF\*)5yBDmǠ9v]*z7Km]_]~s*oQ3.>kMM3>G,MqQS*F@DR~7^}& :ʩ>%Fo%1Ѻ6}%cc,;W /z_z:ְQ*ZC I c#,lTŧ]| ] +8i 3,T (x09;KB_V9˜Pl- %RNñ=lx*Z=lH %o8]!ÀۙJ S `sk}[V6NV^/-91 +?] $F {>jH#Nj@r[_>;\]t=r+ +ķj휴J81 9,EE?%'z t<ګ?mP{ +vSX'A.i81w~;?]OEԴ{!IzY"lLoL pWFw21W8 ؋;zjSD`kclHegɺ5AA!.Wμxac^RJ)*$me}Uw;kWE%Ps{ݣW9I@- ܒHv0*\$OdCR>3Aq{\1z2.66b /O 4АWٌ|X/O=i3; C.OZ$ {J^NQ煰)B} g$px6iM!%ܯTUu>q&ah +~_)AmA,4Ox^ᝦWuBbR 9]~R}s",z{X +}rcPgԃj^ŽE S*>o#/Ɯ!O+Yq62:/kąKؘ`N\b^)$LjAG%urdѵ+*ZC^5 +򁓳 {NmtҳoU]z0P)ty&X ͛cGg%q;'@Uq;6=P_ܸBp?m.rzlYMݣ66hg6J. j327gūks긝%[esꄞ40|8،EDA2O'C%'cZRmE nc +]xʛ#)3!破]) uoG:x1'8Ooؚ&y9N+8O(~'*N“ItqYqPksh"EQVKyӽo=Oھ ͱ/Ӽ>k1=%xJZ]pֺ:N,ƫ#mس2iX=#; + UF(7 ]޷..*E-iI=<`->Pfg41=E]{GSaIǥ߮<:j0Wn"6.ԑUHJٸݗRFgxݶ1B(;a3qr{P )k< +(iC/AnvU"%qRG7nOl3TO+->iv&m C~-'av԰a0bGi팑HH1 -iK΁;[ +P\|)8{-LXU .M;J8gI _->i8row}7Ǖ'>lJxQsKK-H.>7kaӤGS W2{#ec"\<'~xɼr[ qI#=mtҵѶ9p 7sWygz.+Zֿ)RU`Z`zLI`Our԰3 $asiU:0ML pc58:=0ZN&#FFY](y] 5J.yde׉_J*tw$Giuϳ,7Nƣ- =zU,÷#5K,>jj\'oMIP֟ޱ + ƯW$[Aoъ>s<<>A+ Ag>'75ưVƍYiZ$z-Q,`DttLKnh ˸w"a!d4|L 'ڥW]G:zg)`nth1Ua=3)n 7Q;NPxy o ]xp=)%0+"?E| f-qKzC*b࡭) 9W뮫975;C#-ǵu[qәOo"/XA,h Q=pBqBZX]ޚ]M]@}llBo )ա9vcCf"bTnK8ّ0i3ѲbvW@EkiPA ka w렂Zp)2 $Ō @=0 4 : CJVgLC?l8d;aj !cFRrT'Et7[ _S/xMZ8}~t<Ou{mpsmu CAޠ'=?yu|4T߁"X)ZMp +{7: _H(Q8|s{| 罦//Mhqq-C'i:NQUai]& XA3 elŘ95 +م^`Xυ590Zff-$c6u/mn-|sD<8]Պ &`+A5)ac! BA6t?jn> t+rk t4O/Zi=&$Rk.u-KQTѻ2Y7qYYä]"HXyKKXaj{tĉwtms [=EmxnYesStrz5bEnVR3{sNâcx'# +zF7#Z]˞|H cbEDG*σرK ?c7 K[ym[w=DvpauC3,bD2F.2 9at'څ]DKYa FHn%ذG5BT(fT明՞4riny\Zo0jySpZ|1JA7Xc!tj̣"V|jh-q 6n;k:9~$@'In?)i͎g,l7 +Xh@Oz5=>hZ?~s).gZZ;UR z7&%soZ: uk hܵE@HyȐڰӰ)3z7 Z>2,8HvTX3ڸO9P8/o㛄y)c%7]BnD/"n2kCj)1d5 U?XrsmY{@&fb~>t0!%i(] = ]~[.X[3r2z>"Er+nЃ>Z(&L2i-~Xy ,hݻbq VUk*jcF9בW^[ +kh /hn +,m {A,E"~~m9W2t;F,' WFZW$'t\@l0$qiM UI#4i'e]. ]Tv{~îG[Hv%ⴍ_NYI569[IX3[+ q+7e2::df)ui|qP-K۹ϙ;JFSPCkJؘcmZN[Մ4)󈑏M@P ۵$,r>S.kY3YdQD,ʹ;K,O 9? <+8zL }Ij +uy7 $,|L[Bl O^*|Nz,I;n6&FvO:t3ғzwǥ7_!D҄#oadΠobӌ: =C9v~UfzWw=Q`ykՋ O9>q|sq%a 踘IH*IV}B+4SY习 +#r/eEy|(JBCm ^P#si~q%>iA?Ls?[zz4c"l,xHMڜ_* +عW?lwƁV]#^]|rRIH( !['b/(p+ :|,bD. *u 5 p1˭Gy)wq-xلԒu20Y7{M"/%"n@Y@N/EIi;a[lچR =ޥև-_u^ko҉ŦGƱ;+wQ{uyfJxݕGi:{jk_1pi)럇_@ +ԕG,H5qzf6>H.%#4 [xMIܥmwkw>=ӡ][=_f~Q61 i#6G,͛Y=3s Pkj ާ#z + +Ye]Ćy`Ll #g~PTMO2qk=*~n;,g:nw?I'@]N&^+! -eFfL|tXE[|?Pf>>mQL;4c~\yoM_%7l6Nv^ϋP[^O$k:89PsY7 +x;ddo A~k/0WRSS65N* +*H7f&i!@_|}h87@Q* ~}Uy.[~k ϱ{ +l߭m<=/Q=A. ΰ:!棗.J<+)j5!6 m #`w,o~r᫅g tI;*s{Nf9v[Ua%z\뺨UDϹӺp#f$.K;&P"R%,uXPRsg%FVZxRS~YvooE0¶&)U`&fw (P&1EA 1{q{`ނjb}' MI(m Ik5zRcn\Q@C~ze\tǍ|J30rӷgI%yZ눤OsY>nN+D^ؙ2o$LkS?&@}+Y->:-;csqnDTl JUh[xZZuqy@w1!ղڳZsLu*l=G\ +3"Z֫h\Q3P姝S}q<A@ڒsY*W|~VȌ Q #z11 +YZ}RǥM@+Bqpױ0΂NQIX4K(v>)CI[Yy}tuqDa"J:)V17VC8sz#Soy|3nnH V6~%:6$B΢lhgQ~? 33 0/ lYv=,";7&//5)g4+ |ʌ,|/5qћGV_7 +eLRG~;ic>voI6s0*O18̮ ڰ(`XRA +h픑ޱ=}b]7%_LdhQtko[M.ߵʸ{v1ۯ"WMa/DBB"$LZ2}dmn_xI-7cmtY-;v !@RZ"ivRaly8R }%2:^후Z~ꫮvoYڟ[BfU 8ŁEL[ +Lw}1a2S.-}ҝe`H[l뭑ca-bĀ{aVrvkfPs~785ZgӒ_-x%kvq^Tf{_W~36FoNA-kEZy+\A0*$ҿ,Hd9:tqՃW~7P{ B.t=$FQ9+?1fV''Kq|wP'?ֿ q1Ν:sS#aQ⡳` ?!S`?ʆCϝ>}$E'Q'iPc )Xm~5+fdteWQ+bzZSMD̰ս5K(SsNEABi5һwmN_˶9bilXԒ*IHnߋ2^47- MC  +zMR)DdRj(1n۳c'J|MFm)7:ZKŦbfBh5zss!bv92f.& "z!\WA.]'3^LȜ“Ah395ˆ/RjV[Z+g"8`7άi>4*>4etbjDhI)?c2WgX0;sV 2ZjJmTnu1-eݘ<1Qfi!lnd{\0JIPjJbYQf="~" n('z.jZjc-2N>5S6.!c`bzbe\C,OI5Ia26.&ieV) +;ecr.' IO9[,/R6&n&6$ĖPV˼ +bnyc\iX;(KԸw"4mQ9ddMљ1:fzK\%ҜrV f>.kR3V-c2Y +iȨNJNeܴK"L]Hˀ8r!`='grRG*-oCMN0ca3fjcˆ+99%b_ ס&vI3[S6jsIi9h1=;pyg;;oRv!'Ըk~-8aw+ʸyd@yg$8lcfr}H9Ԥɣ9gM.M̼*sqi11:*;1j]JXmEَۊca=U8W܆YOj,jpDA9DGO9贍Ok'qHyr1ۓZyHCM̞7ޑ˳F{601ѻG[k>>Sy_$ n͐L11FWJO!/͑+#& }cZy|-ZxSRedpck}^wQ2ۼӽg}]gjlM' $ȝ8xأemCw2IJOڒwh!CkOXq2av%ub|JNr\;忱n::)%qjo|-8JT*ǜOjX|QW' i>AdMڬs=m&5@XvRG$HY 7iŊ[7szSF.b"f} +){vj_s`*3 +VW48kBs¼C@H] Bf'RNYHL$r_dne.17S7 +?+ Gn͝%ݜk>=FLohI(nB]hBHA'$lxIIY`4DQ;o<3qa;w$,,DCRYŧ., ynIV%e'g䦼ɸX_ӒN< +_D¿) #n6z׮ _6`]YC*5ґfZwBi )u[Bo_rIf\`p=gav֜ KYYTS'aScZNWJˇg>"W6awg8a!– +O‹ذmc6'IWS nݚS21i栓v)oy_ҵWk#<18K$gȥ1 9advzF[( ?ALXX4SzkX0"@\$r.2n•5¨P7PSۣzVGH+KjU`};s,09T7ǐ1ڍ8vUOq5#kV)ocRлy~%H7&ھ̣*JU5azNw*dRюlnBm<\JyEHʃܱRN\eʊ( +(: bm} +~&4.DJr%"j("&A -Iw.!+,^n s13$.D!7gwqE%C "rOY;sgG:YȰR*j7C7f!=ofFG҈2{ބtrvjB7 IPb6VoEE,E;+OstDT/kܚRZ>d,ONQKsΡC.9D8PsS=Wv>egaQ3r~ =u e[ *ush-4DfM&P;&V_E*۞t5ò^BIhq $0?1+ϱ#!~]A,s=mcĤY@-QzbETGOm9Օ肸ڳ d,\t@ iaf{t;E.!Gn^PI9Zud{u hW݇C +z5f7 8s`L€QuND%JāoYS=#w$8nA%(\pWW᧧c~cF/c4`UW+/Xyw_2-'}rٮI.Y @44rp#v GDjes<bΘIY*堶_pvXUJӌ{KlXSRXsX9L J}lYT(_. +;KB~rtmf~Q}o*鿷$4Si+ +)c9!n`\ LULk iII1p!-6s &3+"к|nzQ(ہ&rsy~Up2^t>'Bfi5\QxS'Ie̥TczJc.5j,r`WRcygGj~N,̮NR+a%,jiMa%tkǕW-WG.|z+|0JR@xދ֜2sP{!\- <:C*$ꈊXX3 8{B:Ă + 7 >6:a&ՄY7Cͻ7N:cgwltp&f$U씖8uzKX&JXQPre@\ `ؽe< ʃ%IߎGK- /Y& M_% Ii40+"чu魽@ɄG2iRo.&̎$(Y b``ޓSƍjiM9H$YT[Hw>!:"-H%1?Y_uE'_軙nf8pA|s$@+3:mr0@rGE]I 2;s`\-e 5nKF hyemտ΢.u%C˃#q-QJzw^5sn-ҫWDY):ۏ!1x㋛KotvoCCk>jzm] 5`'7޵^iԁbZ49;qPQP&7;qU.jGP^VQ}3~Z@kXX=q#yjm"a& )ۣm" | ǽ'jj)$ Τc2F);oKV=F@C]w!ѹ +itʂHY@Q^U&.|r IlJAƈZܐu1;,{j~! X뎈53}gL ,pHy!i'mδK*4D9WC9جy +p;|vnts 0@]q2+FPCZӀPS&[E(xw=cecR`o N6nwE,/ +-a⓳BazA"Iɸ%&j(i%5]cFxaBN8my;_, wͧ;ۯwe +֐skеIZ^-~Դֱ:Ӓ,b Df -&Ʋ97v2{n&"trpI'B lhOx𮘁7riKЯkѲGO|jMLۅg>Yu&]Gsz| 5/f:$A5.aQBX/}E[OYtM񛕿q >]3 >9Yq~qޟJ8qa3KvMC'm"Z%e}q4ɅIӠQ3۠&;QKҶiìNh01u >(LO!0.FoI/0QIoױn{߳Ɇ$;$Nb;13e13K-Q dbff1KjFsGƐg߬ -'+Fb. AM/ן, %!qaK'⺀AR典pO%5l<'BAsdZ諚6gES8^ve:s_Zbz!:0o}oRl j&ЧrJtui@ťAXlQ2 ytLTx% cT-^uC_/ 0IpZk[`e"^9ᑩ#l %8YrA$ifC^]kW|=N5#cRQƞzysi>^=ORfWUYa[Ӭ삠VL8G$:vPҝ +`{u &Xc`%tY[M)XE>Η3Aﱂz=}Z!p?C<ݙ Ʈu; 3sؐZc JZZ_2J䘵ӈ󰚅ξUppS|pRr('0@dnMΡc@LC:G&9z{PU %͡2M%w(ޅcpaRI9@1)d[*D=qq.y P> ĭ"Nݟ$UE]F~(C6Q2E1ݵ~-02q^aR`s`1|!AF/A@'d-:H}z>h+↠sQ"G*{"T[ǫʫdEMEuBޮ6 ޸Fȣ,LWC+<&W_fUЋ.gY =R3K[҂zƧP2F k:IE,8^+ +.5 KuKUUT *\ZVg&>ksۈo~حl+fw(䟘8ThMKݖX́km#塝#:գJFGC"Q\O]Ug]S7'aSy*f,[û2%%gwe!d CyJGt.{2/af1#SzV"qis(ԍ!I|p{jo|lBL :u S5M\iO+%}lTP!d4֩ǫݩzK߶_4Ɯj{ 2CJ8\,yQ`=ZJ=R:O7P:WK+ޛAٝ@)8e<ʏ^-Rz䁇34E}9Ee9*vc7-I3Wty2`wŐ8ͩҗsT? >mO_ѭ-qAޡat<as7K*xc"is]X 3*k=2fs./lKW.+b=Q1so 5~S@ -l%h0Iwy fM>-ڀER}",="[<<&cq3_^4T<~Uև,mAsMoR1pJ*ٮߒVr6$$R"8Zj?v)poSsxRx7X+|ݭbm RS?^VVYTpE¥<jZdc݇K)rAxIRPީ@Ydz4 vrM*ٟ'%:lY2z[*qJy(Ug>7K5tK:jwJgM>)=j>JK +*zJ=d+9WP sDis¼='I{6.58ȯ/y{8wp`oa69D.ۗ!#< +>#٫d#'4\UKA,A 8PnZS,kY\`HQӯ~}8) V)ҏ}ec4k5豍!"99P +.%"4WLE73!*8K7n7Wwꀶ]zɩH)+H3ZofqU$94 V8-%d+T\W3C&;Y_п/#m#}Eҽ-0).%!=c r|fcL5se@G<'O$Β<;F7{\s8GMs.2 +lsa[45O2qt0 QԠVEb_`[JmX9O)x݁N/]Ⱦh.yѠ GrёV"t-3] к3.#/yaRs$xSJVs$P:Zʅ>yԫivʙ%`-݄kA\Ps)۠܊Aҭe/]rt[XnSUV<7k[mNYqDc.:x4.]}3}M['LvG0o&Aw*ELέnk` ZJ1࠰Z"cW} +RnX^FU]7@E<^b`f«@dv8KsCjY(/RU!sk0cg@Y!J>oZRAF" L䵃E3jڭo߻l[*U7A x ̭Gçyu-VHN /U4Ax:{kHE!SUU)dKla8`y}UXi#36*6`r+|Ɏ^l?ެ7\ IGzI%؏GqE,֛+\vBAT%蠅E +.eQKFx[-`z#Agм*lwκ@LvC\$51z jͱҡv&R&ݗ{qtL)B9ţac#SKGz(w@`I)>7ݛ#C϶Gr?,P +OL"GJLȈ).)`~) If?w8Vpr|POդlU<5ςPV/ئa7YG:H%-ߩ`cAmuD5AADzTh!2jdRK.9gfp,ȯgM|Vֈؐv9xH璢s%'z&(0WsxT77֒r޴߮vjjZ~]Gpa-P]2rԛ[/ MA~_x/<6QA>ӧE'['fROJ>T` +>3h-C6ٯ&zĬy!gz=`.%.ǥGB^07T6- +^P +ZbKKޝ-{3E5e~'`~?5' .7-UZk#W0d0'z +ub_ZIŕ6=1/.ecFe/d +TuVv;^uR3Xd-.#hBеXDЙoW|wdtȩ$Ζ>eеK9`HK.(a/mY7.Y'_y 9- 6Tԉ%IY=,s'˂r,.XX iW$ ` h%lZURφ<ޟl+ +tKQ`>|0V&.e#cM[H';dC?Oٟ+} +jkdK..qKX8DSMlKEj%AW\ FBv`-A L2Y\4׫ج jkd?pya?}zB@) Y 6/lDV@5%a¦{M2ᕊP#> T(Rzh +lpO~=0/ WledMxv%*` `~NP/Kw^9PIúqͥemsl|:ȧHd}V9MыAؗ"nYG'(iBWj +䂽k,ősj Rϯ. ʫנs):B(h:‰a2-t͹Hh4X d޹CƧy՘ĠVP9^^dSOVV% aUϭ +Ʈ%!eCOXWQSJ]͖>iyYV 3;dBC@^{bSۤ\뎌nbKh|]9^ָ|JuxsiH9^=1Gf1)'ذC02r!R>Sy6dyjT7l2 ^£/ok*HFBMhٴjewwpN.š{,4:V?ި?Z=ިsE!pnК(r)A= 2P&&qx'K6TN%!ewOC+P@`|X\ .W:uL[Be _%A~ߦbj6 +xd!;aa*lԄ-BɉX\phOS!\z*c{πZv3ؘ\sd( ʫ Z/4dWEqIqDVwD4Rİ-p%s<`bj*bmx()D[ԲpY\! d1,<%&{Ӿ\[Z "d d,rO/۝*(d2m7Z!TWu\KIyד/PK{piBdg,҇͡ܛ~ CD|MA,􁒒{ai;sc0 uLT@ϡf;GRRZV * Qmy57t*[AnoglL`WJM*;YcR+ *C{ \:!P 8hhpn"=32qi^-g +)xĐ.hl>2kX4܃˭R;7~=6íB@!cOWײ)(^G`|z6s +j**}FZܟ#gl3#Z!PQqZU|q){ +/Ȟ%- h5?,֟Lz@G,!.z^7VčFʏ$'*O5sǕ~ceSϧ9KM?Z{uBV(.K\ƪfqcl[$a~ ,1(+yvCyΡkU :UU\vdWFq]Ӧ۽A?UCYޣJv)2֣, 3+An~|dd&j@.Ba vԮ̳R;@ЖϓmS5 :SsYBO*MG㸷&0,+z6KNq)9f'\nTs0zΉT +AW3:LQzHIߜobfQ>%>վHL=2fqY!vunc!rsp5"^@GGț~':SĢXa^!sslfOAJ?11 3ad/9!ԧ"g{YL{Qp S_Ղ ,'{aR=jz_/@{91ОpSQ 5|W-@^h VX('dxx׫ AL*t2ېς€ה $ȑuop8;LqoMTL0UwWK4* +i!-); 4;¢khzhhD- Y x@UQQ3ϡaë|VDEtR^4Ի͋~Ke od|FrGJ,ôC0 8z+R\VbM[t\NPѫKM!SE[) l2,D@K. ꀧ c x~hz,.i9^z\דZR>ЬW4M v\`A/3|5{уz#';oi̛{[W7s.US  ?d$SRsjFsX*ͧ2R9OͰNC} d.6}{0~}0KO'쌣huSg0궔]ٗv'8=i)*6W̧&d.RS#%ȢG@} +'< .p>zW2O,LO̰(Dy >O?X5MM(T}?-|WNp̖=s/=dcKycA]ā{*9-%fpΉlLzӳ>1&-}JZ;v ;CMu*I~dBꉑi~5`o zZ>Z7d :wP  JzLdža} +BuơBE- |/2AYBK<[eJ!+t !h'E=!˯#ygC|Txwf8TC{Rf$)έsk%sa䣀~rc|2O; z0⢽JL_O )iRyZ /Wv1h8XvHi%6fPeOCUC=0lS77mSAC&>CY)bni;w ̺M'!;fp1>%9ڹ@ǿWMPpq|F7m (^xy {U⓷'o=/2l[NHNwGIQƏYljq9''xG%ӈ~9>+%gOޭu#昅ۃ7s.fё~9%5t/bc]1|g,p`~9e;X{cDyCŷvGa w6֮(@ 1z&zG˧AAnHǧT̲#5QEBk) b#2!խ YU0s+ %$n ob^XA.q,S:/5{jn$A jx"=OL0/v͐s4 pS앳Rfs20EJWzA=y\0]FyC. "T^IN$% dฃ)IÅ9+삐 +T"I@ެFqw׻QVV%d/;{;BZʪuK9([;QR1bch+?>B} Jzg\KbK,6n`Jl3~>!sRʬгS49 G{W +m)9U%ٓ'b-ws)~hk]SpP@2]B72\34\X,j(}g $ca- 2 BkJG>˯fx\al =AN&ƮQR] \$А($>:AF>_(mfk&{H I̛Q9R]f_H^~vCU zWk{혇OvFYfmJ'`O[FpOSS硳U"Acy3AL" ئkl!9ɠ9) ql⩦)1c + iGC:""hkP>Tqz1xuwT`7F-Yg,s/ X'gաbmtiJ +="++];khO+ɹ37.61%x3GC8$[(ڟemA=F<-el*U]F7-r` ``qkb#n?01 +j \\@@<6ҝԜsXpRz'>QBk~8F<@=67C]~+Z@K%{΀s#;]ڊh~g.^?jGѕ;ۺr~wr~_7z0LmӼgx**9X 1#Q[p O7Owƈ3_,YSwG0 BZ.Q_{vq" 'qn Zڊ35䜳O +zq8N/qjj؅=(͸g &ȑ_j̽Ͽۉ<_،9ϻ7RtkgV%yEܷy{%u eo"ZKotZm/].I:<ݏx`lE>Ž04_4]XkC7_|3Lxr3mn`3S׺64Y?**2O/#tz>@?-c +ow!ngɽ^C_lkJ;H[]$HPrP|j#?bai.S|cFO5}SE(;CC;èW݈9>>,<mc_>{UzXRSxw0#u`=('G,},IW}FZ IR.1䳭Ak=7,mW4 )?+~\jKp8jytxw ^ KSѥېGv#^Ӌ~'G?)ciɽ D&I~{q0Gp +JʖN&f0k8*'0[]C6L)Pwo49g&(c?D:L܎{Oxo,pkE8~);/JV.$7 [) ݥ7 ?SZ}--#< ]W)V)n vmhgC9K{Up??8bbsUVnԵٿL}җ__?˝ovF^Ԝvֵ|瘃)F{8MMqDG2[Z7-r7d](!Hksog *=%~s0@%KS⩵KJF aLf(jW5M}iu]wدgϿ͹^[S{incOI-2'G~>~ل(k۳ +Ro6bk3(*RNI%)ΰ GsNyx[In9>פ,1ύv$+K|#5pSV7Js妢ʬӖf̣iW}e ׺Pq+V]K4_[=8j F_֬_?Z(ό'}+[ ƦKʚsQ'|ч~5D]dd'} IQU}G#ӃԈӇ\84x/eU)M]O@O"q܄ 9jfwN{E>\^{e;7(Zh&%5¯ߗ~[ [>8hf?1B\vMQFX|y3H8kQz/⡾ vE00}uUU%W]gޟ.KT]Xn?4Nik Λ[Pyq?E!Ek:C'n96u.R'k#ds%rN0)aBYfW#^-z>{}oUVTxK~aiNҐvܔ ~k*ִ}V8H,.j`vk䚩5pykc:cRqETt#'eڒuv-7mUeY-0&ٹۣ˵^ Ӈ3ʊS>mcsM}=陼~EWhj,{o@w65Lg>iS"?4~οX{_g?JK|5F~;S$Izc_v~z'*qIJ?^,M[3nO? p3N=YocΗgSTd]VUi+:R/S.wSc~Gmq؜}nE?nmu!6BeKqmˮo aWz0O `N]೯vG(}7;CКOq 3wAvr橮wsK.)qybS.YG)2ϕѧuR ~c#$>ܛ:INlayRvyY>3įÈlxEܯċ\롥Qg c.}ً|dl.hl̿^zgl)}' C/r$/&b̏͘@g ӨkΫ3L0㾪+xFR4\i p;?ST'-{-Q*_~.E|m,}ԀM:'(xB.f{Wًz_p}+粩%O--Ǧ=宒~ԋ_7zQ5/~R_g %p:GCm-<&js ɗ`GkΛSNO_}y0F{Y>roF[>:^W>frHLHQׄ|Z..Vfg2-]$_ZnfyK](eCO;O *~׀Usʬ3JqWeV|}@R3fj Gj{{r{ɵvҫsܔՅz߿~-cz1_61 C|5\[[Nk{欟s+3ΰY%хzQY&d$_j6"ˀ,U?t|:Mvj#V#~\jH[^c&moc +5x7VtWUylRwswփVrkx{mtj05iz-m6Vz>5g# ې:Oy٧'ߘ +~O^q i3BW%{^pz*k=ׇ>Fݐylڍy]rwp<⹴:R'u;=vr!R88#)vW̤))X7W%1?{˷A xҖ)}61)Ԭǟ=o %$?*AE=y=dYWjѯfcGQ Ӽ﨑csL(&nhu 7xoOaf A]gqioV{kߧռ8oaz/&ٻC΢}Gl,}3'ڦk}Lm7t&_sc䘠Jy#"ԅnlͽ`hHQ*~Y'Xa6I_?R#:h:QgseeO<٧- ܽCmҳvG9fuE֏s'iߎ3/5am Jt۪s2q7ꊴvz`wifKusS<>}i[%ͳ,>TUe^'V>b  `_la_Ҋ\s,uU*.}| +䪗GEJȼS8$.>rΒ&ԳYII>EVwiR/{O[.L>ц~2|P|NL_%x|>~d=K3/d|2`\E]Ar!1[UCεлKħ;ļ+[CansZHpøh5@+ghȺJ h3r7F)16|pNDEؠgm 8^XKl]t+$-{ o O0uuy5C]So=K5zF/!s}Mɍ~R1bs|@>K;}~1 ssrQ]1VFU;$IO>XvrILJ<x-p % 5TY܍1Zuo# ~:ꧧM7f]&ǂ뾾(vTsNHi\K/׻BSg٣4PC)_6{po3ά_@<%psٗ&YIslrѵ}@8FȠvqk}::8(YMQƛ3.-T%_0]w14 Wv♓0[ +.~rkׇ>BڼHِ[?-)Qܯˆ1TFqggȅ@_6}#ա҇Cx0/-wQӜ*#RrkΤ ajė;7jWE-򵮫S('nc_l_AGO}d}Ĩzd9qw[K\j*PAޗ2>.s=s7xo.y3R8rWrJp]٫r- +{c-V&Hqk+q^$#-l nqgvf٫=%wv[r~_ϼ\&ڦ.=Z`% rUMۀlu.z챪 u/)F?wgi*>!Hn6S~;ese,35%rLqGl}ٟaOS6 (CKˋ[i%>ENz +vi5Q7Qc~,i>2 goYpؒ񋱭mZ[<ԥ8J??/ʿohDTE!~/H=VAE{wo #vlj)^99OJ6]\ig%mO5Ld8,{ߎckU~ E|[Sꫀg&-/y5{h,99ґRfw[3ˇ>Ç~x0Thw1ᴪ6G19_1v0>ZeyqR4!v{oU-iC֌9JK]A>FYgw oc^`""F71%2 5_v~{RVV咝q\5BM%mk";IU6_(jׁ3[eOw<].Zg8E ; /'9_Oc~V5^ݟ, aZt-wo#ZvmyQK]yWIYqnv#q +ʥ ,CAF +@OV֏61[irW'Ye |01pV;YM?T<;EC,㑮xkcTxmy_ba?XXC ~wkZ7]AYXzYv3c3GvV^I-yt7 +1V0c=a.ꈸtsW`~e x9'&_P'}Zp:4 Szc-a*H*"'3r:v8oч~?LOMօ\`k*6'J*J_m$X+͍̗kfQf:HEAQHJWX9:uu]Vl*Bu7#o ~YE<"f}|u R$6@ V6;ى쳀S\Z߮XSعkŠY^ᢐ^mӼ~ՏmX=&(iF|ډJZ[Ip9'%G_Fn[RwJqww $X>G\ =}G23l#LfgRKlRbW5t̞ښ, ^,2ߖ[zS[}=$ڝ؝bVʺƶx 7#ߚbw6tkle-So)ѻ34r2x$"|&^jE&~4ˑWoA_ݽrtqߙ@o_:pJGF5ˤgR, +bN܈{3U|:Ɂ!o#K/ $D8Œ:R39$1:6%Xػ(G3nCnxk}x ԉ Z`Mw|n<^+JUA)jbqXhO0BsCNb#?xHG{An>;NNK*$b\nTUG(;݈ ҫ#8Գ~N/ZCQOGݼ +{(ᝣ?u 7;3dHZdC{[Yu1BɎFYM0n*. `B^7ƞ&88QXȗS'1ǸdCEE8l&v]]|tSyQ`j&h +ntm^Nإw'~|;o%܎Jx8 +Xfrys1u*p+Y3%/[*{2'tާwG~:8 |tv7}q|*;z?>ޡ*>y} 2 ׷BBmȏS-hs VsOx?]˧O_:qNntSLxi}7K!JQ|ܶVlrxcj^rwt  +zu2 '8Ӡ[?;Q[zYX< Y-yo@E,u>!eNcc2?Ex zy K@.]OGsys㘌ūPLJ9$Tl)PE=M# +<27dXA/\=tp(#`/;z t?AǏ%qQ]2+؜hm)z=VEEUe*ΠN~zx>g_}ƹz]`uP rF "[䔼xl{ 4UbkhqQǂ^>޿ } +M`Oe?Х3AO"~:ʼsmm1){m2mC~6 ;sy!G?Ž} |&5лgxqHF/2JȡpnPWqڲ:̛*hɕߏJxK@._$7y +5`Ooݹrw=7tbeU-b+<ijɫs݄HS)Tۉ j%܀$~uA~^:'A\=C. b`!OژgUx}RjB`w/AA> p4%$hA|Ifyɽ!&l]QIL2 R&̫U5.gVVC5%u <,vaz߿?-(г@<z4: ͠~P{k(VI}8Y`be_nC)ڹ#UķudTQ圈IG_r@O={ T|YYe +s޹yagVи`@py/-AxЄc]gd^@+KJ>?=y + 5h\`Џ_KKlȖ%Y$̒QZMYK눔S_ޟ w6%4wA>;}9>&\zL R^.y}s2vvX\@fo+XZ,[߫q+Ȭ߼?5(G(7"x䗯'^?J|t +U~E +C7l[@Lކi0uZl%Bیy?…<_hkt0׆dLHHxMخVX`QfY,KِE27YhaVxqW4ɞh.ՕR CSIۖQDrd]C5jQծJxu&`K޺ewcz+!5Ə;)geaS]P5Թ\ѳ0RU2!f27 (W':smMuQڈI> }_T&jK +aSe*UƁ[ Jb'u \؎EXA.0!fr=PcepKKXksfƨ'hbp(s%KCܜ- &٦:Ѧo5jёS LⅤ2@Bd6Ķp_Z l&FX3Ϫڝ1|(]i 9%g~O7~fƺtե.bv4D tp/lMVƨ8 SH{{-IQD6tmc f'.וAB]UagGM HTWKΏ5R[E*їֆ +>NFޖr.qEψ*ҞV~TsMCWW!`j3ca|6x١bb qskf­o:Jhq\]]s;bҥb7'pI*rsn*%eT ؎QX`V8@ZE^CĞ;#1+M)1}q:\@gZPs.y=bK6-9ĥoڞ:ejOZhbhl}:+^#D +OzUZ{wieRZE*aUTZ)8h*mkf6be a"lRV<)ȳI{5vjMN,Ky2D,_hWqV2TLu=UUK{EVK$FDՈ c" <恑_uVMI̵k猠|_=tўXt`JjYDϓTC?9KaTeŜ5+,ِnuwZظy+[wZRh..-*:ءbIi 2إm]C0=^PKR*|Sɥn^nڣa, QIUbv6Qah]L*Y9?e HW ɷu)KY_wtZ0*+ ڔѰ&^ tih nyiem $pYmj Hp`_=s-Y/fz_9f,|018N=c Tt1\iue~Gu;=uSKE+uH1\LS- 6MYQTlsc8U|ewr ݮEkh iQ6%ظM&vKJȒ7e>F>jz +!m[7U|=nS03#av!dW_V7v: 69 1מx 1MRQ"3ŕd h{FjWɲ̴Gp*1^}uӖGvBn+p(+i.9tm!x- l[B)˨n 0zڦz2Lh::2l} 4Ǥ= 6)~%rR۟mOX 56}]vSF.J 6ܭcv }5n=:*k"sw | &ΰv9̫R2 [":أpMWm(9^gv環?l6*r^"Qذk{> X`=4SO[{֟ģ@WFH ]q|GOCaނɪ!燑)rm +v#}5iڛuc0У!X"CcmMU⥅G.%*.V"ugaK5v >m[NX!fQJB,fVd ~IdY&ť(Y*vctkMQQ"m[ɨ1U뺷UKٞf,9R"Do˘йNzZ5gO]|`dS|}~Ş +~ec}s(%2 #*>l wN""e$=Z:'vq§; \6Z+ 5+ljR.1IxCEP4cC1{ ?<[oE@XEL v i UIT*0d\MMv9""6|ےbSWDKݝiߒ0!ۓ8`;h+ +m-z3 j[|Эm2ZMA5O"B2t?*>]7[Ys3b}lCBG ؔL$ȮBUDY`}<-CzvՐJ {Z`Jd@Cc3(&fz :R:EO3ɿ|i!Sv;Tw#ho_dj81mwѮa s!rwdeRٯDdgUS$ +5Jwg*($K90&Rؙٞr{`OK*w8a|]uCxMR?4p:YnI9^ jq;_]7/3]G;\_Oql;z&k.U\ֹ\;bp6d,Ȗ%KT-oSg 5=аۿꟀ~vOVnf|!+I?5l)<&)jI{CCZdW)P``jLGtYa^F/->JwH)tf:>CG_/wfܱrj?.9A+ٜ , Öa|ԥìr/ ճHH5O&Pa)2abW ]UT|A{["p4`KJ)0l2>eGW]!N]tl?"zconZB]?&:nq8(嗅\ Cw]m@;}=UD$4̩>6 Ns j\t1)kN)2_Xb?a@.}i0Yc]u@D_:hS O7a^lwXT0vNMХbBvԴ] t{-`a?UBWJ/R]cص"; br?{.,;E)J@g3]㮊yKe-Up@;Y,0Aqw?  bJNd6Ve2R%lte+$$7ٟ'6d[B 莒\= [Ij( RrtŽ +EకOşr&ΥmR݂NW2=rbCIs*q)[bt(*Dטwei-[*S-ceo%ɥZO_G+kvm l,he.5$j赩-[dy|E3Hv r@g\ c\91QO +Wۊ{.=/)gLUF)w -ෛcQ5ɂx|K'a3UɏWz`I:Xݖp< LSucKfևNtTR.( L2o'Prz;yțGYIo$lEBAe)M-~ۓKCe?¤.)/@hɂOgKQ74g۲)E)xw󡆅Whv 1ks1JZ_qU3|?q!=_B/<_~a.~џb7ٞW' Rb8,3-[ w94T "k`aa[H4p4POzdxSsfWxL|kUIWC@y`}UU2T؝l+]+U}0-lեݟ|["x] Qn 쓴V䘔AHr?"dANy6Bź65 + +.5oMvcVqN@ԯhyom#w[cO+>Y'I& +kBydWsWWkwio+x9Lqh^1i +TSH؞B9l]F4|f3Cm+ Axj?,.'Mw?ۈ NuǤSUWTn99׫ewtԕ\ÏUn䍥CS3s'SAdܽSMCdLXJ.k[g8|1BBk髙{uO̜NJwx~lm1箬2=l+$|uL|< qJEN brbg۹gr2l?뉊yF=И6~_I*C lmc|!fu^׊lA|QsK>ns ~m1씖u1^y{Hqg'cψ9!g[TmP5t'<5-tf?G1K=5S[j(5Luợj~!|G‚{zne=7邈t?o@6hykȭ!B]BG9pn <ꗑ 7А^o~ E{zbWO>6Ti.F{]2&b-B6aILu1 _}Ue>Yh+n!>\ m>1H*Y+xE >gçb# +cg&ag׻J~yQt–I8!cGVjhO9 5]thmR@l"l]T :<:aøh3 o6IKCd)7OJO$^Ur`-;ʿ()#ħˍ_~1} )~rxVW6 +^o 0:|,$4RoWmOCHѧ3 }؈e[,bo +-E[urRRbr8DC]; +jw#5$Ul":l(*)^W&*4ߜ$$.~ғc3(*-gxU}-VchҦ\SFlM[AX|fGXw*S^7$LM%'w+yO_ۣe+ye̠.qEwᵾk`_ߡ]쟅ͩw)چ[R:>ݦۙkxyu@<.&˄w+qZ, s0hQ + +pCWe>ݐsTeo-=eEG.|h(xАz:qUl W|vN"cyt()E(o* pKOE7 ϻω _=*2pk(y#'fm7zߖ0A6W1?lWY!apv{?B9{{X#',#6tT5|=6$)kM]x `GFi0ֱ7/mQl$'o}mZ.4OQa4~=V_tDΎ`VN1+ŧ:f[L~рR_#G%^/}Qaym2tY ;:W{+>B~lObRR|6JS[dsn{k U*k/Z2o Bo\ xL c=+LΞ[%* 2qH @|=ͭZ o' 5fG-tȯjİ*Vՙ[m +Vr)Ps5oeJk[?a1ofZ^A`u𷅁ܗ^=p$5w[B/r+L ݜX ;zBE6O}V]6֩d!j 5 W4 l¦ +-"SIvL+%l1]z%#\ &^T3*rwJ̹wƚ;ցYϧ3OÓ}gQj~y W&#"b=*zW'eALwu)gщR~ *C,vb䬏sJkkQՐlRxrOۍ^HZo{_.s8b`u<cKwp2vON-ޑР+E)ڒ]_җhu LS‿p` =&& pndfWMCeUme]mr]J[}|~T̎ +sϰ_w=ts iDXƉɋ:K ~M)w쐋3 )wW "l !$Xi|,lwx/5U +ڟs>x?gi*®E&8 lC&$&gmԫ yoe:&%],|a'&qݤC`Qr;Z|ή%|A72hs Jy3}؅!|y +Rya'5O,{=0 )k3 F&ީĤ[',%!6)!f${ݨ̇[ꋃ ᢮N 38(UoQQ{ vq%n}9Z)+ +^n-b{սN¥'仵TcqJ*jfn1qC룸BS"6.MƃNpNb,nDXWJ/4iGIwaqኯx k +j<.7g[zֻQaĻ]/uĊ]#:X| 9]u`M\ƞX,*Z:J2 + dƜѳ>+Yoj-;\%$\j\%~=csUOI}YB['1qk#Ȱ-1>uij({1A) j=ZRS^&)MAblWgx |[}[ރ\W?|p4eP?*J72~|s$=ttwԎKD"hm6\ѩF\$ Y.Tu [z0`;\txnW|`}?n`c)twR6A3wo-Z&E{к6jP34EcqMᇝY~Φ$fZm9|0).7xKrі 35Z,^HW0 #̇}n)yLRԳ V 1ER0!h0ƺ+MJ1ֺ_>.@c6Xjx8)+bwmQ MQ~}TƜ)xqTUL̒1{&pMza? +C~-p*Wq=؈-%sIlu.5,jmK\rn~`nt$ab +9|[hθܑ\?߄BWZP4S-gYiO581I#DTJȶ uKrf؅=KW^Yɳg [)ŀ`z UkR4l3![Z[&:9r`en`#5|xksʩ[bL`y>|/<*!r7~DSx г0V9 +inT 7T1{:vO_(ԭV9,Ėؖyn㢝1mk alLκ7F +o(:ۏ f<'@\ ]m{jj*^͵c*>"Cwtllm(((/C1)|񎡦UO0>h+[mǣbV5rS'bl]K +RKyF I[:aƽ5gPq`Ov(P8B;RH䮞iBnSr-,ⓠ8J^ӂ禫>7#:tB.-a#F9Kݥ'I7UOz_uЏ3=mU nM +zWϦp{܎sqv%6ݡkvf=4Y*Vp*P Vxx<1ʙkF]l-zQr"oj)(iKgvևsFW]S԰ϻT\DMĒ*tpf;8b{ydRmWnG_* M65["B, +z\/:x}~~T؏Lq+Y.-3;3j65 bږ iepju''N v ]ǴiH!mmݴ*毌rt3ע_m֥e@Y쫸cॽOo)I<q! *?Ĺs}M?s9 +h{a\ +3'87Kzzݦ]2C +'/}GGȍ{STQa|O~K@]7RˎШyIã qQ1Q?r]ß9CZDw>?[pQQl޼< +hZSƍS3^ؖvhW~?#X0R +W M9r:9$Nu#ۚZ)ל+@G+_KᵠaV^j͊0rLP?=XnWܟȄq7 w?a#\]*?cT +—/*VuYztMC-~0׏^PR✠*AX q} {ژ}ۑ%iicٚuH_zJ7e[ظ<K2F@| `_SoSD nm`G-Gr0Bk:vy9ӔSAc +gT6};`UuQb¥Q~(bN(wjM |ӊʛ}=YuoNY,dG9UN*v{K_47=(|C|aϩАT|/s I[ :^" ot4ց*`[bcȌ)^C6=Lذyԏׁt&QގcQ ơCnl8⦀BNjÊtߚ){V]dEO)٢.s%{ +4 .ZxIۜ\5ZYƧNv zɿ6ŝ#oh(l#%Es܎ mA42?.^I(y>D%LI{'(=VBFkI:׉=Rg%.jI^ɕ5"aNd}:N㤁JlaI3CKrBꟓ}OX][𬁔迋m`߇L@+gkΥEUU ?7Ro@݄}'`ۂ B?Nt9Zu!bs/nMt#zP }an’W'>Qm,ew_k*ח*4".e>!Yf^ +0@޶]Ŏ]ذQ*>foDG97vJ{Wdž'~;#g9 9`ӯ0aɂj@)fn߫&P?Ӏѻc y~ώQ8?ZA+xxvy͏m\DŽ _\惿-t/4w3֡pP!jD0YpiH.XʦaCo @ ~') &5†{*Oη=^n}G0fO!SswK@uhkXP|4StwiV~L{vOG8g[l-;~J`5p}l쪂]6 +zǤs J;؅W\[<즛 +I!#"yu3$NѰ?k2%֮وs +ȇe 4qE(<چ脗]ԓn3ZocO4wBO76ŔFC;lK{yW$钿;¼:b9miswBQY?{Ct 9g1*sRƻk >ώ8#B2_4О['yOlT@5@3̤ڇmx˂ڶm]N?(k6¦Zn +taw<$?ž}zgaaCԮ\{UO#vN_=O䨤X@k?I%.7u$~uaB\2W#"ន[jNUq#rȻ<OZws"Ed]D7Ɯp8)~ w>0豅W௰gMoA`j9o -eupMmQl>MB}bP}xPix2'iQAy>nYVaAZfB.*p@,i]G_~JctF q~ՠ@K8tgSU5*cМ>\=߶<:f::oqGp.JݮXi[u/z@g% K?rno 5l[%A-4{YKp|ng_23SxExMOtqfdڦ]P`R + +}?+RپMw !9oܣÂ's2%--ce\7ROtW?C7Ŵ.t6d=X7Ocm 7_Fhã3N&TԔz*(LSP_¯/~Xpr3~v [p즕vQ4&q5ݙ,KͫxŨ6Շڰ}]w,j/Ϗ|8_vJ ӠW73cQ]U 8f詋zc*zlmni`A%()*~\rqsvԼ߲Aќ,јqZO2i6hjp킺ٓC`0N-Ikf\ΪT`s6i*RpVK/+ޝf^U=[T RU4ǥMqgi/j*_^ +2`y_93]g?0y?f\fݟYi*p[em;.v')k\&}u'_3 +endstream endobj 7 0 obj [6 0 R] endobj 33 0 obj <> endobj xref +0 34 +0000000000 65535 f +0000000016 00000 n +0000000144 00000 n +0000054240 00000 n +0000000000 00000 f +0000057420 00000 n +0000057233 00000 n +0000782096 00000 n +0000054291 00000 n +0000054705 00000 n +0000064810 00000 n +0000064697 00000 n +0000056193 00000 n +0000056671 00000 n +0000056719 00000 n +0000057304 00000 n +0000057335 00000 n +0000057715 00000 n +0000057980 00000 n +0000064884 00000 n +0000065318 00000 n +0000066729 00000 n +0000078814 00000 n +0000144403 00000 n +0000209992 00000 n +0000257384 00000 n +0000322973 00000 n +0000388562 00000 n +0000454151 00000 n +0000519740 00000 n +0000585329 00000 n +0000650918 00000 n +0000716507 00000 n +0000782119 00000 n +trailer +<]>> +startxref +782309 +%%EOF diff --git a/static/images/logo_re2o.svg b/static/images/logo_re2o.svg new file mode 100755 index 00000000..bce2ac9d --- /dev/null +++ b/static/images/logo_re2o.svg @@ -0,0 +1,120 @@ + + + +image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/static/images/logo_re2o_navbar.svg b/static/images/logo_re2o_navbar.svg new file mode 100755 index 00000000..7d0063d0 --- /dev/null +++ b/static/images/logo_re2o_navbar.svg @@ -0,0 +1,133 @@ + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + From aa6fa036e8afa5374d294a9e5a6bfd41419bdc75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Fri, 22 Jun 2018 18:51:51 +0000 Subject: [PATCH 41/49] Include logo in navbar, favicon and ogp image --- static/css/base.css | 12 ++++++++++++ templates/base.html | 24 +++++++++++++++--------- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/static/css/base.css b/static/css/base.css index 6aa2dc2f..f6240970 100644 --- a/static/css/base.css +++ b/static/css/base.css @@ -35,6 +35,18 @@ footer a { border-radius: 0; } +/* Reduce the padding for the logo in the navbar-brand so the 32px-high logo + * is centered in the navbar */ +.navbar-brand { + padding-top: 9px; + padding-bottom: 9px; +} + +/* Display logo and site name side by side and not on top of each other */ +.navbar-brand img { + display: initial; +} + /* Add right colors for buttons in dropdown in navbar-inverse (else it is light * gray on white bg and white when hovered */ .navbar-inverse .dropdown-menu .btn-link { diff --git a/templates/base.html b/templates/base.html index d257464f..45c1e6a4 100644 --- a/templates/base.html +++ b/templates/base.html @@ -33,12 +33,14 @@ with this program; if not, write to the Free Software Foundation, Inc., - - - - - - + + + + + + + + {# Load CSS and JavaScript #} {% bootstrap_css %} @@ -50,9 +52,10 @@ with this program; if not, write to the Free Software Foundation, Inc., - - + + + {{ site_name }} : {% block title %}Accueil{% endblock %} @@ -66,7 +69,10 @@ with this program; if not, write to the Free Software Foundation, Inc., - {{ site_name }} + + + {{ site_name }} +

- + - + - + - + @@ -216,17 +216,17 @@ with this program; if not, write to the Free Software Foundation, Inc., {% else %} -

Vous n'êtes pas authentifié

+

{% trans "You are not logged in" %}

{% endif %} {% if request_user.is_authenticated %}
-

{{ interfaces|length }} machines actives

+

{% blocktrans count interfaces|length as nb %}{{ nb }} machine active{% plural %}{{ nb }} machines active{% endblocktrans %}

diff --git a/templates/locale/fr/LC_MESSAGES/django.mo b/templates/locale/fr/LC_MESSAGES/django.mo index 7a3646b875fa230358920fc0c20c37884a36100f..5731d645a269968470df7666c8ca474b6a27cc39 100644 GIT binary patch literal 2042 zcmZ9M&u<(x6vtg!el0%&g+iee3~5QLYQk*NL}6(W$+ihC-4G?4Mo1ONJLBv+ow285 zJ0v%RgoF^{1cGCGTzYNAAFxOq5L}SBR02+1I3XmCi0_-s?k2Hhf9AclpWl0aZ+|;{ z=qrYC0`mpTa|alk0Y1U>+M0zL?S z4n7Kg2_6P-fg|7@@Nw{akoNroR=|5D{{+e2-yog;7o>X*LirFl0@CkCv5;TKL9#mv zlHEy=?9PE?_cBQ5R>2~UQjWprp-(|N_i3sB8hi@!O^{M@2c&#_2ZqSiPax&xKNx!! zJc6LfegIPZ(^x1!=Rxv+0VIE#rF;z}e--!yxDArM&p^8O7D)Hq1Hf{y{O(pf}){WP`@jm~_u52^f?E$|v1Lc3;AzaSW5< zeG&60Cgp|(`Ff)G+F6bR^llU@y(`=*>JQJxUcu}Sim5+d#>aD*6c4=x4a!k5PM*@O z)0U?q>L@L_h@9G#Y_Hb#)w3<*9jhnCN>(>o%PnOzyC92G!pWGuZBogum^N3s0PSxG zE!vVtiEr6~V4SkT;rKvRx-gVw+LAfMz3ixrHMV({n{|~)wkWq8TQrUfo)#O~QZCnJ zE_Ea=eQzq`En7AwEf&jGq~z&#KjMMhH@KqOn!I0eaL+mwVaJEcMID%HnpkXO%}iq2 z_{fE}Nf8B3@K|oj#AK<|j;(5^5`OYjjI5ltY}LwK3#4XE1@j8&gmac>Mrmi++I9Ax z@m%DRYXkz*Z5fjbOS##Qkqa)x!Bu1e$*S>*@u|wP%uMcrhHa}jnDcELG);|Hmfmd! z^;{PI1Q&2Ic8ArOAe;^+CV6$HcJ}Ou16+oTyw8 z)&>0_O3Y0O1C{8JZMUh!mYksLrwTF~6i;IqSvzLq6I={I=P5xJG_{AzPPm>KS)yyK07i#jr~((M|b zX(?CPSGHx<+I{MNHCr}IRg@Xa=4GDBe0NFry0$3lURSc&DDqMzC>$P9(MJw@A;i7z zP+sVDbD8r*+Op7hD|Qw8F7=?`cj-jjAwyIav->{jxmd&Kvh>-CSDON*wg}bW7;2{1 zT`x@R)IWUebz>^YdPk(K9F4m}%U?yQMZ#~ft48JMp25F>Ej7ct>adFFyhaAn%*jD_ z-0*0Nx=B-yc99=l3FG9_-}zpiB9Qti&n{G(JYs}z2V1tH;4VQ kWTlS{n=`qFTSe0#<0<^|mg}+Jw+`w|AlEw&((AJS0ZFdke*gdg delta 123 zcmeyxKan}?o)F7a1|VPpVi_RT0b*7lwgF-g2moRbKM;rw7#SGCfiwpYcL3Qy1O_0z raNwAfUs^Kx42vhPv97V9f}x3(fvL8E!DJ=YJDiRR1x5J<`Na$XCTkFs diff --git a/templates/locale/fr/LC_MESSAGES/django.po b/templates/locale/fr/LC_MESSAGES/django.po index 9de43dbb..5b4697ee 100644 --- a/templates/locale/fr/LC_MESSAGES/django.po +++ b/templates/locale/fr/LC_MESSAGES/django.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: 2.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-03-31 14:05+0000\n" +"POT-Creation-Date: 2018-06-23 18:44+0200\n" "PO-Revision-Date: 2018-03-31 16:09+0002\n" "Last-Translator: Maël Kervella \n" "Language-Team: \n" @@ -30,6 +30,145 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: base.html:121 +#: templates/base.html:59 +msgid "Home" +msgstr "Accueil" + +#: templates/base.html:83 +msgid "My profile" +msgstr "Mon profil" + +#: templates/base.html:84 +msgid "Log out" +msgstr "Se déconnecter" + +#: templates/base.html:90 +msgid "Members" +msgstr "Adhérents" + +#: templates/base.html:93 +msgid "Manage members" +msgstr "Gérer les adhérents" + +#: templates/base.html:94 +msgid "Manage clubs" +msgstr "Gérer les clubs" + +#: templates/base.html:97 +msgid "Manage machines" +msgstr "Gérer les machines" + +#: templates/base.html:100 +msgid "Manage cotisations" +msgstr "Gérer les cotisations" + +#: templates/base.html:107 +msgid "Topology" +msgstr "Topologie" + +#: templates/base.html:109 +msgid "Switches" +msgstr "Commutateurs" + +#: templates/base.html:110 +msgid "Wi-Fi access points" +msgstr "Bornes Wi-Fi" + +#: templates/base.html:111 +msgid "Rooms" +msgstr "Chambres & locaux" + +#: templates/base.html:116 +msgid "Statistics" +msgstr "Statistiques" + +#: templates/base.html:123 +msgid "Preferences" +msgstr "Préférences" + +#: templates/base.html:128 msgid "About" msgstr "A propos" + +#: templates/base.html:134 +msgid "Sign in" +msgstr "Créer un compte" + +#: templates/base.html:140 +msgid "Log in" +msgstr "Se connecter" + +#: templates/base.html:188 +msgid "Username" +msgstr "Pseudo" + +#: templates/base.html:192 +msgid "Room" +msgstr "Chambre" + +#: templates/base.html:196 +msgid "Connexion" +msgstr "Connexion" + +#: templates/base.html:199 templates/base.html:209 +#, python-format +msgid "Until %(date)s" +msgstr "Jusqu'à %(date)s" + +#: templates/base.html:201 +msgid "Deactivated" +msgstr "Désactivée" + +#: templates/base.html:206 +msgid "Membership" +msgstr "Adhésion" + +#: templates/base.html:211 +msgid "Not a member" +msgstr "Non adhérent" + +#: templates/base.html:219 +msgid "See my profile" +msgstr "Voir mon profil" + +#: templates/base.html:223 +msgid "You are not logged in" +msgstr "Vous n'êtes pas connecté" + +#: templates/base.html:229 +#, python-format +msgid "%(nb)s machine active" +msgstr "%(nb)s machine actives" + +#: templates/base.html:229 +#, python-format +msgid "%(nb)s machines active" +msgstr "%(nb)s machines actives" + +#: templates/base.html:238 +msgid "See my machines" +msgstr "Voir mes machines" + +#: templates/buttons/setlang.html:34 +msgid "Translation in development" +msgstr "Traduction en développement" + +#: users/widgets.py:35 +msgid "Close" +msgstr "Fermer" + +#: users/widgets.py:36 +msgid "Today" +msgstr "Aujourd'hui" + +#: users/widgets.py:44 +msgid "Next" +msgstr "Suivant" + +#: users/widgets.py:45 +msgid "Previous" +msgstr "Précédent" + +#: users/widgets.py:46 +msgid "Wk" +msgstr "Sem" From a9cfc9aebcc96fc6d95c0d93d9106e666d01b2a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Sat, 23 Jun 2018 21:19:11 +0000 Subject: [PATCH 48/49] DNS endpoint SQL optimization --- api/serializers.py | 3 ++- api/views.py | 9 ++++++++- machines/models.py | 15 ++++++++++++--- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/api/serializers.py b/api/serializers.py index 92f54427..48988365 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -701,10 +701,11 @@ class CNAMERecordSerializer(serializers.ModelSerializer): """ alias = serializers.CharField(source='cname.name', read_only=True) hostname = serializers.CharField(source='name', read_only=True) + extension = serializers.CharField(source='extension.name', read_only=True) class Meta: model = machines.Domain - fields = ('alias', 'hostname') + fields = ('alias', 'hostname', 'extension') class DNSZonesSerializer(serializers.ModelSerializer): diff --git a/api/views.py b/api/views.py index d5245f2f..8fffe606 100644 --- a/api/views.py +++ b/api/views.py @@ -491,7 +491,14 @@ class DNSZonesView(generics.ListAPIView): """Exposes the detailed information about each extension (hostnames, IPs, DNS records, etc.) in order to build the DNS zone files. """ - queryset = machines.Extension.objects.all() + queryset = (machines.Extension.objects + .prefetch_related('soa') + .prefetch_related('ns_set').prefetch_related('ns_set__ns') + .prefetch_related('origin') + .prefetch_related('mx_set').prefetch_related('mx_set__name') + .prefetch_related('txt_set') + .prefetch_related('srv_set').prefetch_related('srv_set__target') + .all()) serializer_class = serializers.DNSZonesSerializer diff --git a/machines/models.py b/machines/models.py index 817e9d5a..50d99aaa 100644 --- a/machines/models.py +++ b/machines/models.py @@ -563,13 +563,22 @@ class Extension(RevMixin, AclMixin, models.Model): return entry def get_associated_a_records(self): - return Interface.objects.filter(type__ip_type__extension=self).filter(ipv4__isnull=False) + return (Interface.objects + .filter(type__ip_type__extension=self) + .filter(ipv4__isnull=False) + .prefetch_related('domain') + .prefetch_related('ipv4')) def get_associated_aaaa_records(self): - return Interface.objects.filter(type__ip_type__extension=self) + return (Interface.objects + .filter(type__ip_type__extension=self) + .prefetch_related('domain')) def get_associated_cname_records(self): - return Domain.objects.filter(extension=self).filter(cname__isnull=False) + return (Domain.objects + .filter(extension=self) + .filter(cname__isnull=False) + .prefetch_related('cname')) @staticmethod def can_use_all(user_request, *_args, **_kwargs): From 654da8cb04928681246a1f6b536ce1551315f314 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Kervella?= Date: Sat, 23 Jun 2018 21:36:01 +0000 Subject: [PATCH 49/49] Use re2o.utils functions for optimization --- machines/models.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/machines/models.py b/machines/models.py index 50d99aaa..fd4999d6 100644 --- a/machines/models.py +++ b/machines/models.py @@ -563,21 +563,22 @@ class Extension(RevMixin, AclMixin, models.Model): return entry def get_associated_a_records(self): - return (Interface.objects + from re2o.utils import all_active_assigned_interfaces + return (all_active_assigned_interfaces() .filter(type__ip_type__extension=self) - .filter(ipv4__isnull=False) - .prefetch_related('domain') - .prefetch_related('ipv4')) + .filter(ipv4__isnull=False)) def get_associated_aaaa_records(self): - return (Interface.objects - .filter(type__ip_type__extension=self) - .prefetch_related('domain')) + from re2o.utils import all_active_interfaces + return (all_active_interfaces(full=True) + .filter(type__ip_type__extension=self)) def get_associated_cname_records(self): + from re2o.utils import all_active_assigned_interfaces return (Domain.objects .filter(extension=self) .filter(cname__isnull=False) + .filter(interface_parent__in=all_active_assigned_interfaces()) .prefetch_related('cname')) @staticmethod
Pseudo{% trans "Username" %} {{ request_user.pseudo }}
Chambre{% trans "Room" %} {{ request_user.room }}
Connexion{% trans "Connexion" %} {% if request_user.has_access %} - jusqu'au {{ request.user.end_access|date:"d b Y" }} + {% blocktrans with request.user.end_access|date:"d b Y" as date %}Until {{ date }}{% endblocktrans %} {% else %} - Désactivée + {% trans "Deactivated" %} {% endif %}
Adhésion{% trans "Membership" %} {% if request_user.is_adherent %} - jusqu'au {{ request_user.end_adhesion|date:"d b Y" }} + {% blocktrans with request_user.end_adhesion|date:"d b Y" as date %}Until {{ date }}{% endblocktrans %} {% else %} - Non adhérent + {% trans "Not a member" %} {% endif %}