This commit is contained in:
gwen 2017-08-28 17:37:01 +02:00
parent dc02e78fff
commit 3bf7596972
112 changed files with 0 additions and 27779 deletions

View File

@ -1,216 +0,0 @@
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = _build
# User-friendly check for sphinx-build
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
endif
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " applehelp to make an Apple Help Book"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " xml to make Docutils-native XML files"
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
@echo " coverage to run coverage check of the documentation (if enabled)"
.PHONY: clean
clean:
rm -rf $(BUILDDIR)/*
.PHONY: html
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
.PHONY: dirhtml
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
.PHONY: singlehtml
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
.PHONY: pickle
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
.PHONY: json
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
.PHONY: htmlhelp
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
.PHONY: qthelp
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Algorithmique.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Algorithmique.qhc"
.PHONY: applehelp
applehelp:
$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
@echo
@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
@echo "N.B. You won't be able to view it unless you put it in" \
"~/Library/Documentation/Help or install it in your application" \
"bundle."
.PHONY: devhelp
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/Algorithmique"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Algorithmique"
@echo "# devhelp"
.PHONY: epub
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
.PHONY: latex
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
.PHONY: latexpdf
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
.PHONY: latexpdfja
latexpdfja:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through platex and dvipdfmx..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
.PHONY: text
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
.PHONY: man
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
.PHONY: texinfo
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
.PHONY: info
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
.PHONY: gettext
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
.PHONY: changes
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
.PHONY: linkcheck
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
.PHONY: doctest
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
.PHONY: coverage
coverage:
$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
@echo "Testing of coverage in the sources finished, look at the " \
"results in $(BUILDDIR)/coverage/python.txt."
.PHONY: xml
xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
.PHONY: pseudoxml
pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

View File

@ -1,291 +0,0 @@
Algorithmique
=============
Al-Kharezmi, auteur du traité "Kitab al jabr w'al-muqabala", est l'inventeur
des manipulations algébriques (algèbre = **al jabr**).
C'est Léonard de Pise, dit Fibonacci, qui emprunta le nom du célèbre
mathématicien arabe du 9ème siècle, mais l'algèbre existe
depuis bien plus longtemps (Depuis Babylone, puis ensuite l'Egypte ancienne).
.. glossary::
algorithme
terme désignant une suite d'opérations constituant un schéma de calcul
ou de résolution d'un problème. C'est un processus systématique de
résolution d'un problème permettant de décrire précisément des étapes.
C'est une suite finie d'instructions permettant de donner la réponse à un
problème.
L'algorithmique est l'étude et la production de règles et de techniques
qui sont impliquées dans la définition d'algorithmes.
Implémentation d'un algorithme
------------------------------
.. glossary::
implémentation
Adaptation de la méthodologie de calculabilité au calcul effectif
sur une machine abstraite ou via un langage formel.
Il ny a pas de parcours à sens unique de lalgorithme vers limplantation.
La quête dune implantation efficace nous amène souvent à effectuer
un retour vers les algorithmes eux-mêmes, et à en modifier des points
essentiels. Laspect théorique de réflexion sur les algorithmes,
et laspect pratique de l'implémentation sont donc en symbiose.
Un existant émerge de la décomposition structurale d'un
domaine de base. Le fait essentiel, c'est la genèse des genres de l'existant les
uns à partir des autres.
L'essence d'une forme (un algorithme) se réalise au sein d'une matière qu'elle créée
(un langage). L'origine d'une matière fait naître les formes (concepts)
que sa structure dessine.
- Notion structurale de non-contradiction
- Notion extensive de "réalisation dans un champ donné"
Deux aspects réciproques : l'essence d'une forme se réalise au sein d'une
matière qu'elle crée, l'essence d'une matière faisant naître les formes que sa
structure dessine.
Abandonner l'idée trop simpliste de domaines concrets et d'opérations abstraites
qui posséderaient en eux-mêmes comme une nature de matière et une nature de
forme ; cette conception tendrait, en effet, à stabiliser les existants
mathématiques dans certains rôles immuables et ignorerait le fait que les
existants abstraits qui naissent de la structure d'un domaine plus concret
peuvent à leur tour servir de domaine de base pour la genèse d'autres existants.
L'algorithme comme généralisation de la calculabilité
------------------------------------------------------
L'importance croissante de l'informatique comme outil scientifique
impose d'élaborer un nouveau mode de description des méthodes de calcul (appelées algorithmes)
susceptible de satisfaire à la fois le critère de sécurité (maîtrise du résultat) et la possibilité
d'implémenter les calculs sur un ordinateur.
Exemple d'algorithme
---------------------
.. raw:: latex
\begin{algorithm}
\caption{L'alorithme de Bellman-Kalaba}
\begin{algorithmic}[1]
\Procedure {BellmanKalaba}{$G$, $u$, $l$, $p$}
\ForAll {$v \in V(G)$}
\State $l(v) \leftarrow \infty$
\EndFor
\State $l(u) \leftarrow 0$
\Repeat
\For {$i \leftarrow 1, n$}
\State $min \leftarrow l(v_i)$
\For {$j \leftarrow 1, n$}
\If {$min > e(v_i, v_j) + l(v_j)$}
\State $min \leftarrow e(v_i, v_j) + l(v_j)$
\State $p(i) \leftarrow v_j$
\EndIf
\EndFor
\State $l(i) \leftarrow min$
\EndFor
\State $changed \leftarrow l \not= l$
\State $l \leftarrow l$
\Until{$\neg changed$}
\EndProcedure
\Statex
\Procedure {FindPathBK}{$v$, $u$, $p$}
\If {$v = u$}
\State \textbf{Write} $v$
\Else
\State $w \leftarrow v$
\While {$w \not= u$}
\State \textbf{Write} $w$
\State $w \leftarrow p(w)$
\EndWhile
\EndIf
\EndProcedure
\end{algorithmic}
\end{algorithm}
Exemple d'algorithme avec son implémentation
---------------------------------------------
Soit l'algorithme de factorielle suivant,
.. raw:: latex
\begin{algorithm}
\caption{Algorithme de la factorielle d'un nombre}\label{factorielle}
\begin{algorithmic}[1]
\Function{factorielle}{$n$}\Comment{La fonction récursive factorielle}
\BState \emph{parametre} : $n$ entier
\If{$n = 1$}
\BState \emph{Sortie} : 1
\Else
\BState \emph{Sortie} : $n * \Call{factorielle}{n-1}$ \Comment{On appelle la fonction dans l'algorithme lui-même}
\EndIf
\EndFunction
\end{algorithmic}
\end{algorithm}
et son implémentation en python :
.. literalinclude:: code/factorielle.py
:language: python
En voici une autre implémentation (en OCaml) :
.. literalinclude:: code/factorielle.ml
:language: ocaml
On remarque que le **pseudocode** est très proche de
la syntaxe du python :
.. function:: factorielle(n:int)
::
if n=1
return 1
else
return n * factorielle(n-1)
end if
Qualité d'un algorithme
-----------------------
- correction d'un algorithme
- complétude d'un algorithme
Sémantique
Étude du sens, de la signification d'un langage
Définir la sémantique dun langage formel consiste à lui donner une
signification mathématique.
Sémantique opérationnelle
on définit la sémantique par sa mise en œuvre sur
une machine abstraite.
Sémantique dénotationnelle
on associe à chaque construction syntaxique un
objet mathématique
Sémantique axiomatique
chaque construction est décrite par la manière dont
elle transforme des propriétés ou des prédicats.
Proposition
une proposition est un énoncé qui est soit vrai, soit faux
**exemple** : ``2 + 3 = 5``. Proposition vraie.
Prédicats
Une proposition dont la valeur de vérité dépend de la valeur dune ou plusieurs variables
**Exemple** : ``n est pair`` : vrai pour n = 4 mais faux pour n = 9
Axiome
une proposition qui est supposée vraie
Un ensemble daxiomes est consistant sil nexiste pas de proposition
dont on peut démontrer quelle est à la fois vraie et fausse.
Un ensemble daxiomes est complet si, pour toute proposition, il est
possible de démontrer quelle est vraie ou fausse.
Théorème dincomplétude de Gödel (1931) : tout ensemble
consistant daxiomes pour larithmétique sur les entiers est
nécessairement incomplet.
**Les concepts de base en algorithmique sont les axiomes**
inférence
règles dinférence, règles permettant de combiner des axiomes et des
propositions vraies pour établir de nouvelles propositions vraies.
Démonstration
vérification dune proposition par une séquence de déductions logiques
à partir dun ensemble daxiomes.
Lorsque le champ donné (le domaine) ne contient qu'un nombre fini d'individus,
on peut définir un choix de valeur des variables permettant de vérifier la
proposition obtenue par la *conjonction* de tous les axiomes du système proposé.
On dit alors que ce choix *réalise* un système d'axiomes.
Il ne s'agit plus de savoir si la définition entraîne l'existence, mais de
chercher si la structure d'un système d'axiomes (*règles*) peut donner naissance
à un champ d'individus qui soutiennent entre eux les relations définies pas les
axiomes.
Concret et abstrait
--------------------
Il est possible qu'un même genre d'existant joue dans un schéma de genèse le
rôle d'abstrait par rapport à un concret de base, et soit au contraire dans une
autre genèse le concret de base d'un nouvel abstrait.
Une pareille présentation des choses implique un tel renversement par rapport
aux habitudes de pensée classiques, qu'il faut encore insister sur le sens
nouveau que reçoivent ici les expressions de "concret" et "d'abstrait".
Les systèmes d'axiomes sont souvent conçus comme des structures purement
formelles, abstraites. Ces structures sont si profondément engagées dans la
genèse de leurs réalisations, qu'il valait mieux désigner par ces termes les
structures de base.
Un système d'axiome *peut* devenir le concret de base.
Ceci permet d'exprimer non seulement l'engagement du concret dans la genèse de
l'abstrait, mais encore les relations d'imitation qui peuvent exister entre la
structure de cet abstrait et celle du concret de base.
Dans certains cas, la genèse de l'abstrait à partir d'un concret de base
s'affirme jusqu'à réaliser une imitation de structure entre ces genres
d'existants qui naissent l'un de l'autre.
**C'est pourquoi on représente souvent un algorithme en pseudo-code**,
c'est-à-dire en fait dans le mode de représentation (issu du langage préféré de la
personne qui l'exprime) dominant chez la personne qui exprime un algorithme.
Comment rendre un algorithme lisible
------------------------------------
- Le bon algorithme utilise des identifiants explicites.
- Le bon algorithme est structuré.
- Le bon algorithme est indenté.
Complexité d'un algorithme
--------------------------
On peut approximer la complexité des algorithmes.
C'est utile pour pouvoir comparer des algorithmes.
complexité
estimer la complexité d'un algorithme, c'est estimer le nombre de calculs qu'il utilise.
Si f est la fonction caractérisant exactement le coût dun algorithme et n
la taille des données, on sintéresse à la façon dont augment f(n) lorsque n augmente
on va montrer que f(n) n'augmente pas plus vite quune autre fonction
g(n). Du point de vue mathématique, on dit que la fonction f est dominée
asymptotiquement par la fonction g ce qui se note f = O(g)
- Complexité temporelle : cest le nombre dop«erations effectuées par
une machine qui exécute lalgorithme.
- Complexité spatiale : cest le nombre de positions mémoire utilisées par
une machine qui exécute lalgorithme.

View File

@ -1,83 +0,0 @@
La planification agile
========================
Le mode itératif
-----------------
- livrer des versions successives et utilisables qui convergent vers
la version finale
- ne pas perdre d'énergie à maintenir des specs détaillées non nécessaires
- de nouvelles orientations fonctionnelles sont possibles, même tard
- les specs détaillées sont écrites "juste à temps"
La planification agile
-----------------------
- chaque livraison est un projet qui est planifié en tant que tel
- utiliser l'expérience acquise pour affiner les estimations
- préservation de l'écologie du projet au quotidien (code, tests...)
La confiance, feedback
-----------------------
- livraisons régulières
- progrès visibles par tous (pas d'effet tunnel)
- pilotage du projet par choix du contenu des livraisons
- investissement du Product Owner
- chercher la collaboration plutôt que la confrontation
L'agilité
----------
- le projet n'est pas joué d'avance
- cultiver la souplesse
- révolution douce
- sortir de la confrontation, jouer le "nous collectif"
mettre tout le monde sur le mme pont et amener tout le monde à bon port
Les outils agiles
------------------
- planification par itérations de 4 semaines
- entrepot de source partagé
- intégration continue
- tests automatisés
- pair programming sur points cruciaux
- sprints
- extranet :
- hitoires utilisateurs
- test cases
- gestion du backolog et des tickets
- suivi de l'avancement
- documentation
Le product owner
-----------------
idéalement,
- connaissance du métier à informatiser
- fibre projet
- dispo à 100%
Les tests
---------
- automatiser
- viser l'exhaustivité
- tester une cible mouvante
- migrer les tests d'une release à l'autre
Questions importantes en environnement agile
----------------------------------------------
- quelle durée d'itération ?
- comment découper en itérations ?
- que faire lorsque le product owner se retrouve sur le chemin critique ?
- la planification est faite en mode "juste à temps" et "juste assez"
- on ne s'échine plus à blâmer, au contraire on cherche à gagner ensemble

View File

@ -1,19 +0,0 @@
Exercices complémentaires
--------------------------
+ **Manipulation de chaînes de caractères**:
(création, accès à un caractère, concaténation), listes (création, ajout
dun élément, suppression dun élément, accès à un élément, extraction dune partie de liste), tableaux à une ou plusieurs dimensions.
+ traitement des chaines de caractères
+ s.replace()
+ s1 + s2
+ un exemple de regexp simple
+ **Fichiers** :
notion de chemin daccès, lecture et écriture de données numériques ou de type chaîne de caractères depuis ou vers un fichier.
On encourage lutilisation de fichiers en tant que supports de données ou de résultats avant divers traitements, par exemple graphiques.
+ **Piles**
Algorithmes de manipulation : fonctions 'push' et 'pop'. On utilise des listes
(ou tableaux à 1 dimension) pour leur implantation.

View File

@ -1,10 +0,0 @@
Annexes
=========
.. toctree::
:maxdepth: 2
exercices
surete
agile
scrum

View File

@ -1,176 +0,0 @@
scrum
=====
.. glossary::
scrum
Scrum est une méthode agile pour la gestion de projets
Le terme Scrum est emprunté au rugby et signifie mêlée.
Ce processus s'articule en effet autour d'une équipe soudée,
qui cherche à atteindre un but, comme c'est le cas en rugby
pour avancer avec le ballon pendant une mêlée.
Scrum définit trois rôles principaux :
- le responsable de produit -- Product Manager,
- le faciliteur -- ScrumMaster
- le développeur
et bien sûr, l'équipe (auto-gérée).
Des intervenants peuvent s'intégrer également au projet
de façon plus ponctuelle.
responsable de produit
Le responsable de produit (Product Manager) est le représentant des
clients et utilisateurs.
C'est lui qui définit l'ordre dans lequel les fonctionnalités
seront développées et qui prend les décisions importantes
concernant l'orientation du projet.
Le terme responsable n'est d'ailleurs pas à prendre au sens hiérarchique
du terme, mais dans le sens de l'orientation.
équipe, développement
outes les décisions sont prises ensemble et personne ne donne d'ordre
à l'équipe sur sa façon de procéder
facilitateur
est chargé de protéger l'équipe de tous les éléments perturbateurs
planification
--------------
Scrum utilise une planification à trois niveaux :
- release/projet
- sprint
- quotidien -- ScrumMeeting
quotidien
Au quotidien, une réunion, le ScrumMeeting (pas plus de 15 min)
permet à l'équipe et au ScrumMaster de faire un point d'avancement sur
les tâches et sur les difficultés rencontrées.
répondre à trois questions :
* Qu'est-ce que j'ai fait hier ?
* Qu'est-ce que je compte faire aujourd'hui ?
* Quelles difficultés est-ce que je rencontre ?
sprint
Scrum est un processus itératif : les itérations sont appelées des sprints
et durent en théorie 30 jours calendaires.
En pratique, les itérations durent généralement entre 2 et 4 semaines.
Chaque sprint possède un but et on lui associe une liste d'items
de fonctionnalités à réaliser.
Ces items sont décomposés par l'équipe en tâches élémentaires
de quelques heures, les items de fonctionnalités de sprint.
Pendant un sprint, les items de fonctionnalités de sprint à réaliser
ne peuvent pas être changés.
Les changements éventuels seront éventuellement réalisés
dans les sprints suivants.
releases
pour améliorer la lisibilité du projet,
on regroupe généralement des itérations en releases.
En effet, comme chaque sprint doit aboutir à la livraison
d'un produit partiel, une release permet de marquer la livraison
d'une version aboutie, susceptible d'être mise en exploitation
gestion des besoins
-------------------
tâches (backlog de sprint)
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lorsqu'on démarre un sprint, on choisit quels items des fonctionnalités
seront réalisés dans ce sprint.
L'équipe décompose ensuite chaque item en liste de tâches élémentaires
(techniques ou non), chaque tâche étant estimée en heures
et ne devant pas durer plus de 2 jours.
On constitue ainsi le backlog de sprint.
Les items de backlog de produit sont les fonctionnalités qui deviendront
les items du baclog d'un sprint.
Ces fonctionnalités sont estimées en points relatifs, sans unité.
planning poker
façon ludique et efficace de produire des estimations
sur la complexité des fonctionnalités à développer
pour évaluer les scénarios utilisateurs (user stories)
du carnet de produit (product backlog).
à la fin d'un sprint :
- revue de sprint
- rétrospective de sprint
comprendre ce qui n'a pas bien marché dans le sprint,
les erreurs commises et de prendre des décisions pour s'améliorer
mise en oeuvre
--------------
Scrum peut être mis en pratique avec trois fois rien : deux listes suffisent.
La liste des items du backlog de produit et la liste des items du backlog
de sprint. La saisie et la mise à jour des données est simplement
un peu moins agréable.
glossaire
---------
Directeur de produit (Product Owner) (responsable produit)
personne responsable de produire et maintenir à jour le backlog de produit.
C'est lui qui en détermine les priorités et qui prend les décisions
concernant l'orientation du projet.
ScrumMaster (facilitateur)
membre de l'équipe dont l'objectif principal est de la protéger
des perturbation extérieures.
Il est complètement transparent pour la communication entre l'équipe
et les clients et n'a aucun pouvoir hiérarchique sur l'équipe.
C'est en revanche un facilitateur pour les problèmes non techniques
de l'équipe.
Backlog de produit (Product Backlog) (fonctionnalités)
liste des fonctionnalités qui devront être réalisées par le logiciel.
Backlog de sprint (Sprint Backlog) (tâches)
liste des tâches à accomplir pendant un sprint.
Elles correspondent à la réalisation des items de backlog
du produit affectés au sprint.
Mêlée quotidienne (Daily Scrum) (quotidien)
réunion quotidienne de 15 minutes qui a pour but de faire le point
sur ce qui a été fait depuis la dernière mêlée,
ce qui est prévu de faire jusqu'à la prochaine
et quelles sont les embûches rencontrées durant le travail.
Sprint (sprint)
nom d'une itération dans Scrum.
Cette itération dure 30 jours calendaires en théorie,
mais en pratique on utilise plutôt entre 2 et 4 semaines.
Pendant une itération, l'équipe doit développer une liste d'items
du backlog de produit qui a été définie au début de ce sprint.
Graphique d'avancement (Burndown Chart) (avancement)
graphique qui montre la tendance du reste à faire total de jour en jour
(pour les sprints) ou de sprint en sprint (pour les releases).

View File

@ -1,93 +0,0 @@
Outils de sureté d'un programme
--------------------------------------
La preuve de programme
~~~~~~~~~~~~~~~~~~~~~~
Le niveau maximum de sûreté d'exécution d'un programme est la preuve. Qu'est-ce que la preuve
formelle d'un programme ? Selon la définition de Wikipédia, ce sont "des techniques permettant de
raisonner rigoureusement, à l'aide de logique mathématique, sur des programmes informatiques ou
du matériel électroniques, afin de démontrer leur validité par rapport à une certaine
spécification." Bref c'est un raisonnement logique sur un programmme qui permet d'être sûr que le
programme est valide et ne va pas planter.
La preuve de programme est très peu utilisée dans l'industrie, car très coûteuse et très
difficile à mettre en place. Elle quand même utilisée, mais dans des secteurs où le risque doit
absolument être évacué et où il n'y a aucun droit à l'erreur. Par exemple, le secteur médical
(informatique en bloc opératoire), militaire (peu d'informations nous parviennent dans ce
domaine), l'aviation civile (le logiciel Astrée pour Airbus), la fusée Ariane (depuis le bug qui
avait fait crasher Ariane 5 ces questions sont prises très au sérieux), et le milieu bancaire
(surtout le domaine des décisions boursières : un programme chargé de lancer des décisions
d'achat ou de vente à la bourse qui comporte un bug peut en quelque centièmes de secondes faire
perdre des millions, voire des milliards d'euros à une banque. Le programme ne doit tout simplement pas
bugger).
Le model checking
~~~~~~~~~~~~~~~~~~
Le model checking, l'analyse statique et l'interprétation abstraite procèdent d'une méthodologie
moins lourde de validation des programmes. Ces méthodes analysent exhaustivement l'évolution du
système lors de ses exécutions possibles et permetent de dire si globalement, dans un contexte
donné, le programme va fonctionner correctement. Encore très lourdes, ces techniques ne sont
utilisées que dans un contexte industriel de haute sécurité.
Les tests d'acceptation
~~~~~~~~~~~~~~~~~~~~~~~
Il y a plusieurs types de tests
- unitaires
- fonctionnels
- acceptation
Très utilisés dans l'industrie, les tests unitaires et fonctionnels ne testent que certaines
parties du programme et permettent de dire que le programme va marcher grosso-modo à peu près.
Beaucoup moins coûteux à installer, ce sont des éléments cléfs des méthodes agiles.
Les Outils de linting (validation)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- vérifications syntaxiques
- vérification sémantiques
- vérification sur les imports inutiles ou mal formés (imports croisés
Exemple en python : pylint
La dette technique
~~~~~~~~~~~~~~~~~~
Au bout d'un moment le code devient du code spaghetti et les techniques sont obsolètes.
Les tests permettent de solder la dette technique plus facilement.
**avoir le courage de payer une dette technique, et affronter une dette technique
sinon il peut y avoir un coût à payer qui sera pohibitoire.**
On solde la dette technique parce que à un moment ça va devenir beaucoup trop
cher à payer.
Les méthodologies agiles
~~~~~~~~~~~~~~~~~~~~~~~~
La manière dont le code est produit importe énormément. Par exemple, une
méthodologie ou le **refactoring** (réécriture de code) est permis et même conseillé
a plus de chance de produire du code organisé.
Les méthodologies agiles produisent en général du code mieux organisé. Ce sont les
méthodes de travail les plus en vogue aujourd'hui, elles mettent l'accent sur :
- Du logiciel fonctionnel plutôt que de la documentation exhaustive
- La réponse au changement plutôt que le suivi d'un plan
- Le logiciel fonctionnel est la principale mesure d'avancement
- Une attention continue à l'excellence technique et à une bonne
conception améliore l'agilité
- La simplicité est essentielle (il est facile de faire, il est
difficile de faire simple)
Le principe de base de la méthodologie Scrum par exemple est de focaliser l'équipe de façon
itérative sur un ensemble de fonctionnalités à réaliser, dans des itérations de durée fixe de une
à quatre semaines, appelées **sprints**. Chaque sprint possède un but à atteindre, défini par le
responsable de produit, à partir duquel sont choisies les fonctionnalités à implémenter dans ce
sprint. Un sprint aboutit toujours sur la livraison d'un produit partiel fonctionnel. Pendant ce
temps, le facilitateur a la charge de réduire au maximum les perturbations extérieures et de
résoudre les problèmes non techniques de l'équipe.

View File

@ -1,79 +0,0 @@
Aperçu des algorithmes fondamentaux
===================================
Les algorithmes sont partout. Absolument partout aujourd'hui.
Il n'est pas un domaine de nos activités qui ne soit liés à tel ou tel algorithme.
En mathématiques
-----------------
- l'algèbre (étude des structures de données)
- l'arithmétique modulaire (théorie des nombres)
- la géométrie (affine, algébrique, invariants topologiques...)
- les diagrammes (diagrammes de Venn...)
- les colorisation d'une carte
- comportements stochastiques
En informatique
----------------
- les algorithmes sur la manipulation des structures de données
Exemple : les algorithmes de tri, de recherche dans un arbre...
- les parcours de graphes (chemins le plus court, voyageur de commerce...)
- la cryptologie (code gray)
- les stratégies de jeux
Tirés du monde réel
--------------------
- les jeux (casse-tête, dominos, échiquiers...)
- énigmes, logique et paradoxes
- problèmes de raisonnements. Il n'existe pas beaucoup de méthodes
ou de moyens simples pour traiter et résoudre les énoncés de logique de raisonnement.
- La "marche de l'ivrogne" : processus de progression discrète (pas à pas)
dont l'étape suivante est lié à l'état présent et pas du tout à la mémoire du passé proche.
Il revêt seulement un caractère de type probabilité (stochastique) dit markovien.
- algorithmes de colonies de fourmis (chemins optimal pour arriver à la nourriture)
Le voyageur de commerce
~~~~~~~~~~~~~~~~~~~~~~~~
Le problème du voyageur de commerce, consiste en la recherche dun trajet minimal permettant à un
voyageur de visiter n villes. En règle générale on cherche à minimiser le temps de parcours total ou la
distance totale parcourue.
Il suffit de construire tous les chemins possibles et de calculer leurs longueurs.
Avec ``n`` villes il y a ``(n-1)!/2`` chemins possibles.
Avec 36 villes on trouve : 5166573983193072464833325668761600000000,
si le nombre de villes augmente, ça devient vite rédibitoire.
Résolution par
- algorithme de parcours de graphes
- algorithme glouton
- algorithmes génétiques
Les algorithmes génétiques sappuient sur un principe de sélection des individus dune population qui présen-
tent des caractéristiques se rapprochant au mieux de ce que lon recherche; cette population évoluant par
ailleurs selon des critères dévolution génétique à choisir. Dans le contexte du problème du voyageur de
commerce, un individu est une tournée, un chemin et une population un ensemble de tournées. Il sagit
maintenant de dé...nir un critère de sélection ainsi que des règles dévolution de la population.
- approches métaheuristiques (exemples: colonies de fourmis)
Exemple de résolution
.. raw:: latex
\begin{algorithm}
\caption{Algorithme du voyageur de commerce}\label{commerce}
\begin{algorithmic}[1]
\BState \emph{Données} : $L$ \Comment{Liste des villes à parcourir avec les distances entre les villes}
\BState \emph{Données} : $L'$ \Comment{Liste du parcours des villes à effectuer}
\State \emph{début}
\BState ...
\State \emph{fin}
\end{algorithmic}
\end{algorithm}

View File

@ -1,61 +0,0 @@
# coding: utf-8
minuscules = 'abcdefghijklmnopqrstuvwxyz'
majuscules = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def rotation(chaine, x):
"""
Effectue une rotation de x caractères vers la droite:
>>> rotation('abcde', 2)
'cdeab'
"""
return chaine[x:] + chaine[:x]
def index(c, chaine):
"""
Trouve l'index de c dans la chaine:
>>> index('n', 'bonjour')
2
"""
for i in range(len(chaine)):
if (c == chaine[i]):
return i
return -1
def chiffre_minuscules(chaine, x):
"""
Chiffre une chaîne composée de minuscules
>>> chiffre_minuscules('bonjour', 3)
'erqmrxu'
"""
r = rotation(minuscules, x)
resultat = ''
for lettre in chaine:
resultat = resultat + r[index(lettre, minuscules)]
return resultat
def chiffre(chaine, x):
"""
Chiffre une chaîne quelconque
>>> chiffre('Bonjour les amis!', 3)
'Erqmrxu ohv dplv!'
"""
r_min = rotation(minuscules, x)
r_maj = rotation(majuscules, x)
resultat = ''
for lettre in chaine:
if lettre in minuscules:
resultat = resultat + r_min[index(lettre, minuscules)]
elif lettre in majuscules:
resultat = resultat + r_maj[index(lettre, majuscules)]
else:
resultat = resultat + lettre
return resultat
#############################################################################
# Programme principal
#############################################################################
print(chiffre_minuscules('bonjour', 3))
print(chiffre('Bonjour les amis!', 3))
print(chiffre('Erqmrxu ohv dplv!', 23))
print(chiffre('Eudyr, yrxv dyhc ilql fhw hahuflfh!', 23))

View File

@ -1,17 +0,0 @@
let rec fact = function
|1 -> 1
| n -> n * fact (n-1) ;;
let print_fact n =
Printf.printf "factorielle %i = %i\n" n (fact n)
let main () =
begin
print_fact 5 ;
print_newline () ;
exit 0 ;
end
let _ = main ()

View File

@ -1,12 +0,0 @@
def factorielle(n):
if (n > 1):
r = n*factorielle(n-1)
else:
r = 1
return r
def print_fact(n):
print "factorielle {} = {}\n".format(5, factorielle(5))
if __name__ == '__main__':
print_fact(5)

View File

@ -1,370 +0,0 @@
# -*- coding: utf-8 -*-
#
# Algorithmique documentation build configuration file, created by
# sphinx-quickstart on Thu Mar 16 16:07:00 2017.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys
import os
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.'))
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'sphinx.ext.pngmath', 'sphinx.ext.ifconfig',
]
# ajout des cours avec solution des exercices ou non
def setup(app):
app.add_config_value('correction', False, 'env')
app.add_config_value('exercice', False, 'env')
exercice = False
correction = False
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
# source_suffix = ['.rst', '.md']
source_suffix = '.txt'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'Algorithmique Approfondie'
copyright = u'2017, Gwen'
author = u'Gwen'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = u'1'
# The full version, including alpha/beta/rc tags.
release = u'1'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = 'fr'
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
today_fmt = '%d/%m/%Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all
# documents.
default_role = 'literal'
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
#keep_warnings = False
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'alabaster'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (relative to this directory) to use as a favicon of
# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#html_extra_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_domain_indices = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
html_show_sphinx = False
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
html_show_copyright = False
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Language to be used for generating the HTML full-text search index.
# Sphinx supports the following languages:
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
#html_search_language = 'en'
# A dictionary with options for the search language support, empty by default.
# Now only 'ja' uses this config value
#html_search_options = {'type': 'default'}
# The name of a javascript file (relative to the configuration directory) that
# implements a search results scorer. If empty, the default will be used.
#html_search_scorer = 'scorer.js'
# Output file base name for HTML help builder.
htmlhelp_basename = 'Algorithmiquedoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
'papersize': 'a4paper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
'preamble': """\usepackage{amsmath}
\usepackage{algorithm}
\usepackage[noend]{algpseudocode}
\makeatletter
\def\BState{\State\hskip-\ALG@thistlm}
\makeatother
"""
# Latex figure (float) alignment
#'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'AlgorithmiqueApprofondie.tex', u'Cours d\'algorithmique approfondie',
u'INFAL24', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
latex_logo = '_static/cesi.jpg'
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = False
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'algorithmique', u'Algorithmique Documentation',
[author], 1)
]
# If true, show URL addresses after external links.
#man_show_urls = False
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'Algorithmique', u'Algorithmique Documentation',
author, 'Algorithmique', 'One line description of project.',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
#texinfo_appendices = []
# If false, no module index is generated.
#texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the "Top" node's menu.
#texinfo_no_detailmenu = False
# -- Options for Epub output ----------------------------------------------
# Bibliographic Dublin Core info.
epub_title = project
epub_author = author
epub_publisher = author
epub_copyright = copyright
# The basename for the epub file. It defaults to the project name.
#epub_basename = project
# The HTML theme for the epub output. Since the default themes are not
# optimized for small screen space, using the same theme for HTML and epub
# output is usually not wise. This defaults to 'epub', a theme designed to save
# visual space.
#epub_theme = 'epub'
# The language of the text. It defaults to the language option
# or 'en' if the language is not set.
#epub_language = ''
# The scheme of the identifier. Typical schemes are ISBN or URL.
#epub_scheme = ''
# The unique identifier of the text. This can be a ISBN number
# or the project homepage.
#epub_identifier = ''
# A unique identification for the text.
#epub_uid = ''
# A tuple containing the cover image and cover page html template filenames.
#epub_cover = ()
# A sequence of (type, uri, title) tuples for the guide element of content.opf.
#epub_guide = ()
# HTML files that should be inserted before the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_pre_files = []
# HTML files that should be inserted after the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_post_files = []
# A list of files that should not be packed into the epub file.
epub_exclude_files = ['search.html']
# The depth of the table of contents in toc.ncx.
#epub_tocdepth = 3
# Allow duplicate toc entries.
#epub_tocdup = True
# Choose between 'default' and 'includehidden'.
#epub_tocscope = 'default'
# Fix unsupported image types using the Pillow.
#epub_fix_images = False
# Scale large images.
#epub_max_image_width = 0
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#epub_show_urls = 'inline'
# If false, no index is generated.
#epub_use_index = True

View File

@ -1,294 +0,0 @@
Les structures de contrôle
==========================
L'instruction de saut
----------------------
.. raw:: latex
\begin{algorithm}
\caption{Exemple de saut conditionnel}\label{saut}
\begin{algorithmic}[1]
\Procedure{Euclide}{} \Comment{c'est l'algorithme d'Euclide}
\State $\textit{stringlen} \gets \text{length of }\textit{string}$
\State $i \gets \textit{patlen}$
\BState \emph{top}:
\If {$i > \textit{stringlen}$} \Return false
\EndIf
\State $j \gets \textit{patlen}$
\BState \emph{loop}: \Comment{C'est le label (l'étiquette)} \label{etiquette}
\If {$\textit{string}(i) = \textit{path}(j)$}
\State $j \gets j-1$.
\State $i \gets i-1$.
\State \textbf{goto} \emph{loop}. \label{goto}
\State \textbf{close};
\EndIf
\State $i \gets
i+\max(\textit{delta}_1(\textit{string}(i)),\textit{delta}_2(j))$.
\State \textbf{goto} \emph{top}. \Comment{C'est l'instruction de saut}
\EndProcedure
\end{algorithmic}
\end{algorithm}
.. raw:: latex
Ligne \ref{etiquette}, le bloc `loop` est aussi un label (une étiquette),
c'est-à-dire une marque posée qu'il est possible de retrouver dans le programme. \\
.. raw:: latex
Ligne \ref{goto}, l'instruction \texttt{goto} (aller à ) est le saut vers le label. \\
Description générique d'une instruction de saut::
Instruction 1
Saut Label1
Instruction 2
...
Label1:
Instruction n
.. important:: les sauts conditionnels sont à éviter, même s'ils sont implémentés
dans le langage cible, car c'est le meilleur moyen d'aboutir à
du **code spaghetti**.
L'instruction de branchement conditionnel
------------------------------------------
On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non.
.. raw:: latex
\begin{algorithm}
\caption{Exemple d'instruction de test}
\begin{algorithmic}[1]
\BState \emph{entrée}: $quality\gets 0$ \Comment{C'est cette valeur qui sera testée}
\BState \emph{locale}: $a\gets ""$
\BState \emph{sortie}: $a$ \Comment{La sortie est la valeur de $a$}
\BState \emph{corps}:
\If{$quality\ge 9$}
\State $a\gets perfect$
\ElsIf{$quality\ge 7$}
\State $a\gets good$
\ElsIf{$quality\ge 5$}
\State $a\gets medium$
\ElsIf{$quality\ge 3$}
\State $a\gets bad$
\Else
\State $a\gets unusable$
\EndIf
\end{algorithmic}
\end{algorithm}
.. ifconfig:: exercice
**Exercice** : Compacter l'algorithme suivant en une seule condition de test::
Si il fait trop chaud Alors
Si il ne pleut pas Alors
Ouvrir la fenêtre
Sinon
Fermer la fenêtre
Finsi
Sinon
Fermer la fenêtre
Finsi
.. ifconfig:: correction
**Correction** :
::
Si il fait trop chaud ET il ne pleut pas Alors
Ouvrir la fenêtre
Sinon
Fermer la fenêtre
Finsi
L'instruction switch
--------------------
L'instruction switch permet de faire plusieurs tests de valeurs sur le contenu d'une même variable.
Ce branchement conditionnel simplifie beaucoup le test de plusieurs valeurs d'une variable.
Les instructions d'itérations (boucles)
---------------------------------------
.. important:: Toutes les boucles concernent le paradigme de programmation impératif
et ne sont pas valides dans le paradigme de programmation fonctionnel
(puisque l'ordre d'évaluation importe)
- arrêt conditionnel (break)
- passage d'un pas (continue)
Répéter ... jusqu'à
~~~~~~~~~~~~~~~~~~~
.. raw:: latex
\begin{algorithm}
\caption{Exemple de répéter ... jusqu'à}
\begin{algorithmic}[1]
\BState \emph{locales}: $i \gets 1$ \Comment{déclaration et initialisation de i}
\Repeat \Comment{c'est le label de début du répéter}
\State $i \gets \textit{i+1}$
\Until{i == 100} \Comment{condition de fin de la boucle}
\end{algorithmic}
\end{algorithm}
La boucle **pour** (for)
~~~~~~~~~~~~~~~~~~~~~~~~
.. raw:: latex
\begin{algorithm}
\caption{Exemple de boucle for}
\begin{algorithmic}[1]
\BState \emph{locales}: $sum\gets 0$
\For{$i\gets 1, n$}
\State $sum\gets sum+i$
\EndFor
\end{algorithmic}
\end{algorithm}
.. ifconfig:: exercice
**Exercice** : Ecrire un algorithme qui demande successivement 20 nombres à lutilisateur,
et qui lui dise ensuite quel était le plus grand parmi ces 20 nombres
.. ifconfig:: correction
**Correction** :
::
Variables N, i, PG en Entier
Debut
PG <- 0
Pour i <- 1 à 20
Ecrire "Entrez un nombre : "
Lire N
Si i = 1 ou N > PG Alors
PG <- N
FinSi
Ecrire "Le nombre le plus grand était : ", PG
Fin
.. attention:: ne jamais manipuler le compteur dans une boucle
::
Variable Truc en Entier
Début
Pour Truc <- 1 à 15
Truc <- Truc * 2
Ecrire "Passage numéro : ", Truc
Truc Suivant
Fin
La boucle tant que (while)
~~~~~~~~~~~~~~~~~~~~~~~~~~
.. raw:: latex
\begin{algorithm}
\caption{Exemple de boucle while}
\begin{algorithmic}[1]
\BState \emph{locales}: $sum\gets 0$
\State $i\gets 1$
\While{$i\le n$}
\State $sum\gets sum+i$
\State $i\gets i+1$
\EndWhile
\end{algorithmic}
\end{algorithm}
.. ifconfig:: exercice
**Exercice** : Ecrire un algorithme de validation d'une entrée utilisateur
::
"Voulez vous un café ? (O/N)"
.. ifconfig:: correction
**Correction** : deux solutions possibles, une
::
Variable Rep en Caractère
Début
Rep <- ""
Ecrire "Voulez vous un café ? (O/N)"
TantQue Rep <> "O" et Rep <> "N"
Lire Rep
Si Rep <> "O" et Rep <> "N" Alors
Ecrire "Saisie Erronée, Recommencez"
FinSi
FinTantQue
Fin
::
Variable Rep en Caractère
Début
Ecrire "Voulez vous un café ? (O/N)"
Lire Rep
TantQue Rep <> "O" et Rep <> "N"
Ecrire "Vous devez répondre par O ou N. Recommencez"
Lire Rep
FinTantQue
Ecrire "Saisie acceptée"
Fin
.. ifconfig:: exercice
**Exercice** : "C'est plus, C'est moins", c'est-à-dire Ecrire un algorithme qui demande à lutilisateur
un nombre compris entre a et b jusquà ce que la réponse convienne.
.. ifconfig:: correction
**Correction** :
::
Variable N en Entier
Debut
N <- 0
Ecrire "Entrez un nombre entre 10 et 20"
TantQue N < 10 ou N > 20
Lire N
Si N < 10 Alors
Ecrire "Plus grand !"
SinonSi N > 20 Alors
Ecrire "Plus petit !"
FinSi
FinTantQue
Fin
Et les autres boucles : répéter... jusqu'à, etc...
.. raw:: latex
\begin{algorithm}
\caption{Exemple de boucle répéter}
\begin{algorithmic}[1]
\State $sum\gets 0$
\State $i\gets 1$
\Repeat
\State $sum\gets sum+i$
\State $i\gets i+1$
\Until{$i>n$}
\end{algorithmic}
\end{algorithm}

View File

@ -1,577 +0,0 @@
Les structures de données
===========================
.. glossary::
ATD
Abstract Data Type, structure de données abstraites.
La représentation des données est forcément un choix.
Il est impossible de rendre compte globalement d'un élément du réel,
il faut en faire une interprétation abstraite.
**Exemple**:
- Un être humain peut être représenté par les données présentes dans sa
carte d'identité. Mais un être humain n'est pas sa carte d'identité.
- Un être humain peut être représenté par les données présentes dans ses préférences
de surf sur internet. Mais un être humain **n'est pas** l'ensemble de ses logs de surf sur le net.
Les séquences
-------------
Les types séquences (listes)
.. code-block:: ocaml
# 4::1::5::8::1::[];;
- : int list = [4 ;1 ;5 ;8 ;1]
Un ensemble de valeurs portant le même nom de variable et repérées par un nombre, sappelle un tableau, ou encore une liste, ou une variable indicée.
Le nombre qui, au sein dun tableau, sert à repérer chaque valeur sappelle lindice.
Chaque fois que lon doit désigner un élément du tableau, on fait figurer le nom du tableau, suivi de lindice de lélément.
**manipulation** :
- `insert()`
- `append()`
- `remove()`
- `find()`
- `print()`
- ...
.. code-block:: python
zoo = ['bear', 'lion', 'panda', 'zebra']
print(zoo)
# But these list elements are not
biggerZoo = ['bear', 'lion', 'panda', 'zebra', ['chimpanzees', 'gorillas', 'orangutans', 'gibbons']]
print(biggerZoo)
- Lists Versus Tuples : types mutables, immutables
- Lists Versus Sets : non ordonné, collection simple
- Recherche dans une liste, recherche du maximum dans une liste
- Recherche dun mot dans une chaîne de caractères.
Algorithme de la longueur d'une liste
--------------------------------------
.. code-block:: ocaml
# let rec longueur l =
match l with
[] -> 0
| ::s -> 1 + (longueur s);;
Cette fonction est prédéfinie en Ocaml : `List.length`
.. ifconfig:: exercice
**Exercice** : écrire un algorithme qui déclare et
remplisse un tableau de 7 valeurs numériques en les mettant toutes à zéro.
.. ifconfig:: correction
**Correction** :
::
Tableau Truc(6) en Numérique
Variable i en Numérique
Debut
Pour i <- 0 à 6
Truc(i) <- 0
i Suivant
Fin
exemple d'implémentation en python
.. code-block: python
>>> liste = []
>>> for i in range(6):
... liste.append(i)
...
>>> liste
[0, 1, 2, 3, 4, 5]
>>>
.. ifconfig:: exercice
**Exercice** : Calcul du premier élément maximal dans une liste,
proposer une implémentation en python qui renvoie le maximum et
la position du max dans la liste.
.. ifconfig:: correction
**Correction** :
.. code-block: python
def max_list(L) :
k = len(L)
max, x = L[0], 0
i = 1
while i < k :
if max < L[i]:
max = L[i]
x = i
i = i + 1
return max, x
couple = max_list([4,5,6,9,12,5,10,3,18,5,6,7])
print Max de L est , couple[0]
print et se trouve à la position , couple[1]
Exemple de généricité : ce code fonctionne avec une chaîne de caractères.
.. code-block: python
couple = max_list(totovaaumarche)
print Max de L est , couple[0]
print et se trouve à la position , couple[1]
.. glossary::
Matrice
Tableaux de dimension multiple, c'est un tableau de tableau
.. ifconfig:: exercice
**Exercice** : Écrivez un algorithme remplissant un tableau de 6 sur 13, avec des zéros.
.. ifconfig:: correction
**Correction** :
implémentation en python
.. code-block:: python
>>> matrice = []
>>> for i in range(12):
... matrice.append([0 for i in range(5)])
...
>>> from pprint import pprint
>>> pprint(matrice)
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]
>>>
Algorithmes de tri
------------------
On désigne par "tri" l'opération consistant à ordonner un ensemble d'éléments en fonction de clés sur lesquelles est définie une relation d'ordre.
Les algorithmes de tri ont une grande importance pratique.
Ils sont fondamentaux dans certains domaines (exemples : map-reduce en database non relationnelle).
L'étude du tri est également intéressante en elle-même, c'est un des domaines de l'algorithmique très étudié et connu.
Tri par insertion
~~~~~~~~~~~~~~~~~~
Cet algorithme de tri suit de manière naturelle la structure récursive des
listes. Soit l une liste à trier :
- si l est vide alors elle est déjà triée
- sinon, l est de la forme x::s et on trie récursivement la suite s et on obtient une liste triée s
on insert x au bon endroit dans s et on obtient une liste triée
Description de l'algorithme
- la fonction inserer permet dinsérer un élément x dans une liste l
- si la liste l est triée alors x est inséré au bon endroit
.. code-block:: ocaml
# let rec inserer x l =
match l with
[] -> [x]
| y::s -> if x<=y then x::l else y::(inserer x s);;
val inserer : a -> a list -> a list
# inserer 5 [3 ;7 ;10];;
- : int list = [3 ; 5 ; 7 ; 10]
Tri rapide
~~~~~~~~~~~~
soit une liste l à trier :
- si l est vide alors elle est triée
- sinon, choisir un élément p de la liste (le premier par exemple)
nommé le **pivot**
- partager l en deux listes g et d contenant les autres éléments de l
qui sont plus petits (resp. plus grands) que la valeur du pivot p
- trier récursivement g et d, on obtient deux listes g et d triées
.. code-block:: ocaml
:caption: fonction de partage d'une liste
#let rec partage p l =
match l with
[] -> ([] , [])
|x::s -> let g,d = partage p s in
if x<=p then (x::g , d) else (g , x::d) ;;
val partage : a -> a list -> a list * a list = <fun>
# partage 5 [1 ;9 ;7 ;3 ;2 ;4];;
- : int list * int list = ([1 ; 3 ; 2 ; 4], [9 ; 7])
.. code-block:: ocaml
:caption: algorithme de tri rapide
# let rec tri rapide l =
match l with
[] -> []
| p::s -> let g , d = partage p s in
(tri rapide g)@[p]@(tri rapide d) ;;
val tri rapide : a list -> a list = <fun>
# tri rapide [5 ; 1 ; 9 ; 7 ; 3 ; 2 ; 4];;
- : int list = [1 ; 2 ; 3 ; 4 ; 5 ; 7 ; 9]
Définition d'un itérateur
~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: python
>>> l = range(10)
>>> for i in l:
... print l[i]
...
0
...
8
9
>>> l.__iter__()
<listiterator object at 0x7f78bb450410>
Les listes chaînées
~~~~~~~~~~~~~~~~~~~~
.. code-block:: ocaml
typedef struct list{
int elt ;
struct list* suivant ;
} ;
**Outils de manipulation** :
- `next()`
- `pointer()`
- `insert(l, a)`
- `remove(a, n)`
Les piles
----------
**manipulation**
- `insert()` : insérer un élément à la fin de la pile
- `dequeue()` : (remove and return) : retirer un élément du haut de la pile
- FIFO : "first in first out"
Traduction d'une structure de données dans une autre
-----------------------------------------------------
.. code-block:: python
>>> listOfStrings = ['One', 'Two', 'Three']
>>> strOfStrings = ' '.join(listOfStrings)
>>> print(strOfStrings)
One Two Three
>>>
>>> # List Of Integers to a String
... listOfNumbers = [1, 2, 3]
>>> strOfNumbers = ''.join(str(n) for n in listOfNumbers)
>>> print(strOfNumbers)
123
>>>
.. code-block:: python
>>> l = [('host1', '10.1.2.3', '6E:FF:56:A2:AF:18'), ('host3', '10.1.2.5', '6E:FF:56:A2:AF:19')]
>>> result = []
>>> for hostname, ip, macaddress in l:
... result.append(dict(hostname=hostname, ip=ip, macaddress=macaddress))
...
>>> result
[{'hostname': 'host1', 'ip': '10.1.2.3', 'macaddress': '6E:FF:56:A2:AF:18'},
{'hostname': 'host3', 'ip': '10.1.2.5', 'macaddress': '6E:FF:56:A2:AF:19'}]
>>>
.. ifconfig:: exercice
**Exercice** : Proposer un algorithme de traduction de cette structure de donnée
.. code-block:: python
[
{
'address': '192.168.0.0',
'mask': '255.255.255.0',
'dynamicRanges': [
{ 'low': '192.168.0.5', 'high': '192.168.0.12', 'only_unknown': True },
{ 'low': '192.168.0.50', 'high': '192.168.0.55', 'only_unknown': False },
],
},
{
'address': '192.168.0.0',
'mask': '255.255.255.0',
'dynamicRanges': [
{ 'low': '192.168.0.12', 'high': '192.168.0.45', 'only_unknown': True },
{ 'low': '192.168.0.8', 'high': '192.168.0.35', 'only_unknown': False },
],
},
{
'address': '192.168.0.1',
'mask': '255.255.255.0',
'dynamicRanges': [
{ 'low': '192.168.0.5', 'high': '192.168.0.12', 'only_unknown': True },
{ 'low': '192.168.0.50', 'high': '192.168.0.55', 'only_unknown': False },
],
},
]
En cette structure de données :
.. code-block:: python
[
{
address: '192.168.0.0',
mask: '255.255.255.0',
dynamicRanges: [
{ low: '192.168.0.5', high: '192.168.0.12', only_unknown: true },
{ low: '192.168.0.50', high: '192.168.0.55', only_unknown: false },j
], [
{ low: '192.168.0.12', high: '192.168.0.45', only_unknown: true },
{ low: '192.168.0.8', high: '192.168.0.35', only_unknown: false },
],
},
{
'address': '192.168.0.1',
'mask': '255.255.255.0',
'dynamicRanges': [
{ 'low': '192.168.0.5', 'high': '192.168.0.12', 'only_unknown': True },
{ 'low': '192.168.0.50', 'high': '192.168.0.55', 'only_unknown': False },
],
},
]
.. ifconfig:: correction
**Correction** :
.. code-block:: python
>>> from pprint import pprint
pprint(l)
[{'address': '192.168.0.0',
'dynamicRanges': [{'high': '192.168.0.12',
'low': '192.168.0.5',
'only_unknown': True},
{'high': '192.168.0.55',
'low': '192.168.0.50',
'only_unknown': False}],
'mask': '255.255.255.0'},
{'address': '192.168.0.0',
'dynamicRanges': [{'high': '192.168.0.45',
'low': '192.168.0.12',
'only_unknown': True},
{'high': '192.168.0.35',
'low': '192.168.0.8',
'only_unknown': False}],
'mask': '255.255.255.0'}]
>>> newdata = []
>>> for i in l:
... if i['address'] not in [j['address'] for j in newdata]:
... newdata.append(i)
... else:
... for k in newdata:
... if k['address'] == i['address']:
... k['dynamicRanges'].extend(i['dynamicRanges'])
...
>>> pprint(newdata)
[{'address': '192.168.0.0',
'dynamicRanges': [{'high': '192.168.0.12',
'low': '192.168.0.5',
'only_unknown': True},
{'high': '192.168.0.55',
'low': '192.168.0.50',
'only_unknown': False},
{'high': '192.168.0.45',
'low': '192.168.0.12',
'only_unknown': True},
{'high': '192.168.0.35',
'low': '192.168.0.8',
'only_unknown': False}],
'mask': '255.255.255.0'},
{'address': '192.168.10.0',
'dynamicRanges': [{'high': '192.168.0.12',
'low': '192.168.0.5',
'only_unknown': True},
{'high': '192.168.0.55',
'low': '192.168.0.50',
'only_unknown': False}],
'mask': '255.255.255.0'}]
>>>
.. ifconfig:: exercice
**Exercice** : Proposer un algorithme qui permette de récupérer la liste
des adresses IP disponibles
.. code-block:: python
{
"local": {
"leases": [
{
"mac": "02:00:c0:a8:00:66",
"name": "pcxubuntu",
"address": "192.168.0.200"
},
{
"mac": "02:00:c0:a8:00:67",
"name": "pcxubuntu",
"address": "192.168.0.201"
},
{
"mac": "02:00:c0:a8:00:68",
"name": "pcxubuntu",
"address": "192.168.0.202"
}
]
}
}
.. ifconfig:: correction
**Correction** :
.. code-block:: python
>>> l = {
... "local": {
... "leases": [
... {
... "mac": "02:00:c0:a8:00:66",
... "name": "pcxubuntu",
... "address": "192.168.0.200"
... },
... {
... "mac": "02:00:c0:a8:00:67",
... "name": "pcxubuntu",
... "address": "192.168.0.201"
... },
... {
... "mac": "02:00:c0:a8:00:68",
... "name": "pcxubuntu",
... "address": "192.168.0.202"
... }
... ]
... }
... }
>>> leases = l["local"]["leases"]
>>> from pprint import pprint
>>> pprint(leases)
[{'address': '192.168.0.200', 'mac': '02:00:c0:a8:00:66', 'name': 'pcxubuntu'},
{'address': '192.168.0.201', 'mac': '02:00:c0:a8:00:67', 'name': 'pcxubuntu'},
{'address': '192.168.0.202', 'mac': '02:00:c0:a8:00:68', 'name': 'pcxubuntu'}]
>>> addresses = [lease['address'] for lease in leases]
>>> addresses
['192.168.0.200', '192.168.0.201', '192.168.0.202']
>>>
Structures de données complexes
-------------------------------
Les types produits nommés
~~~~~~~~~~~~~~~~~~~~~~~~~~
On les appelle enregistrements, dictionnaires ou tables de hachage.
::
algorithme monAlgorithme
// déclaration d'un enregistrement
enregistrement Personne
chaine nom;
chaine prenom;
entier age;
réel taille;
finenregistrement
...
Personne[50] t;
début
// Initialisation
t[0].nom <- "Duchmol";
t[0].prenom <- "Robert";
t[0].age <- 24;
t[0].taille <- 1.80;
...
fin
.. code-block:: ocaml
# type adresse = { rue : string ; ville : string ; cp : int};;
# type fiche = {
nom : string ;
prenom : string ;
adresse : adresse ;
date naissance : int * int * int ;
tel fixe : string ;
portable : string
};;
# let v1 = { a = 1 ; b = false ; c = 'r'};;
- les sommes (constructeurs)
.. code-block:: ocaml
# type couleur = Pique | Coeur | Carreau | Trefle;;
# let v = (Pique , Coeur);;
val v : couleur * couleur = (Pique , Coeur)
.. code-block:: ocaml
type nombre =
Ent of int | Reel of float | Cplx of float × float
Ent, Reel, Cplx sont les constructeurs du type.
Autres structures de données complexes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- arbres
- graphes
- dates
- le parcours de graphes
- les calculs de dates

View File

@ -1,588 +0,0 @@
Les fonctions et les procédures
================================
Préliminaire : rappel de théorie de cybernétique
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Théorie de l'information (Claude Shannon, 1949), (ou théorie de la communication)
Canal de transmission::
entrée -> récepteur -> émetteur -> sortie
.. glossary::
cybernétique
étude des fonctions de réflexes conditionnés du cerveau humain
utilisation au mieux en PNL ("programmation neuro-linguistique")
ou en analyse transactionnelle, ou au pire en ingérinerie sociale.
La matérialité physique est considérée comme le hardware, le génétique (le
réseau neuronal) étant assimilé au network hardware.
Les objets mentaux (fonctionnements psychologiques et épigénétiques du
cerveaux) est assimilé au logiciel, au software.
IFTTT ("if this then that") : la causalité mondaine est ramenée à un ordre de
comportement affecté à un assimilé-machine.
L'humain est ramené à une machine.
C'est articulation entre "déclencheur contextuel" et "action en réponse de"
n'est pas une "black box" mais un "feedback" qui, pour l'humain,
loin d'être ramené à une entrée/sortie, constitue un **feedback**
utile pour la connaissance de soi.
A la place, la communication est ramenée à une **boucle de rétroaction**
(comme dans un prompt) entre un système comportemental et son environnement.
La représentation sujet/objet (la perspective traditionnelle) est remplacée
par le clivage intérieur/extérieur. Behaviorisme, procédural.
L'humain est donc ramené à
- un ordonnanceur
- un comportement intrinsèque (boîte noire)
- un stimuli pavlovien (déclencheur, trigger) est considéré comme un paramètre
d'entrée
- une instruction comportementale est considérée comme une action de
traitement
- le résultat est observé.
Cette articulation entre "déclencheur contextuel" et "action en réponse"
est très exactement une forclusion de la profondeur monadique (Leibniz) de
l'humain à la black box informationnelle (et cybernétique).
Pour quoi faire ? Pour pirater. Pour manipuler.
Le piratage consiste à
- isoler les constantes (les procédures répétitives, les algorithmes)
- les observer (collecter les données)
afin de
- les réécrire (influence toxique, pishing - hammeçonnage)
- les détruire (attaque en règle)
Description d'une procédure
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
En programmation impérative, un programme est une suite dinstructions qui font
évoluer létat mémoire, le résultat est dans létat final de la mémoire.
- une procédure peut prendre des paramètres
- elle modifie l'état courant du système
- Déclaration des paramètes
- Déclaration du corps
- Appel de la procédure
.. raw:: latex
\begin{algorithm}
\caption{Procédure de permutation de deux entiers}\label{permutation}
\begin{algorithmic}[1]
\Procedure{permuter}{$a,b$}{}
\BState \emph{parametres}:
\State $a: \textit{int}$
\State $b: \textit{int}$
\BState \emph{locales}:
\State $z: \textit{int}$ \Comment{Une variable intermédiaire est nécessaire}
\BState \emph{corps}:
\State $z \gets a$
\State $a \gets b$
\State $b \gets z$
\EndProcedure
\State \Call{permuter}{10, 12} \Comment{appel de la procédure}
\end{algorithmic}
\end{algorithm}
effet de bord
toute modification de la mémoire ou modification d'un support externe
instruction
commande ou phrase en mesure de modifier l'état du programme ou de la machine hôte
(allocation mémoire, support externe, disque, écran...)
Une procédure ne renvoie pas de valeur, mais provoque un 'effet de bord' (écriture dans une globale, dans un flux sortant etc.).
Une procédure permet de créer une instruction nouvelle qui deviendra une primitive pour le programmeur.
Cela permet de structurer le texte source du programme et améliorer sa
lisibilité. Cela permet aussi d'appeler plusieurs fois, et à plusieurs endroit
dans le code, cette primitive.
Appel d'une procédure
~~~~~~~~~~~~~~~~~~~~~
(ex: pseudo-pascal)
**déclaration de procédure**
.. raw:: latex
\begin{algorithm}
\caption{Procédure de permutation de deux entiers}\label{appelpermutation}
\begin{algorithmic}[1]
\Procedure{permuter}{$a,b$}{}
\BState \emph{parametres}:
\State $a: \textit{int}$ \Comment{paramètres formels de la procédure}
\State $b: \textit{int}$
\BState \emph{locales}:
\State $z: \textit{int}$ \Comment{les variables locales de la procédure}
\BState \emph{corps}:
\State ... \Comment{Le corps de la procedure}
\EndProcedure
\State \Call{permuter}{10, 12} \Comment{l'appel de la procédure}
\end{algorithmic}
\end{algorithm}
- les variables x1,...,xn sont appelées *paramètres formels* de p
- les variables v1,...,vm sont appelées *les variables locales* de p
les valeurs effectivement passées en paramètres, ici `10, 12`
sont appelées **paramètres effectifs** de p
signature
C'est l'ensemble paramètre formel + resultat de l'appel
fermeture
L'ensemble procédure + variables locales + signature + parametres effectifs
est appelé une **fermeture**. C'est la procédure + son contexte qui permet
de l'instancier dans un programme.
Environnement
Contexte dévaluation d'une expression ou d'une fonction
Portée
La portée d'un identifiant (une variable) est sa condition d'utilisation dans un contexte donné
(utilisation locale uniquement, ou bien globale, ou bien locale et globale)
La portée dune liaison est la portion du code dans laquelle cette
liaison est valide (i.e. où un identifiant est lié à une expression).
.. ifconfig:: exercice
**Exercice** : Que donne ce code ?
.. code-block:: ocaml
# let x = 42 in
let y = x - 1 in x - y ;;
.. ifconfig:: correction
**Correction** :
.. code-block:: ocaml
- : int = 1
.. code-block:: ocaml
let a = 3 (* première liaison pour l'identifiant a *)
let b = 5 and c = 6
let somme = a + b + c
val somme : int = 14
let a = 45 (* deuxième liaison pour l'identifiant a *)
somme
val a : int = 45
.. ifconfig:: exercice
**Exercice** : Que donne ce code ?
.. code-block:: ocaml
let a = 3 and b = 4 and c = 8 ;;
let somme = a + b + c ;;
val somme : int = ???
let a = 44
let b = 5
let c = 1
somme
- : int = ???
.. ifconfig:: correction
.. code-block:: ocaml
let a = 3 and b = 4 and c = 8 ;;
- : int = 15
let somme = a + b + c ;;
val somme : int = 15
let a = 44
let b = 5
let c = 1
somme
- : int = 15
Même code en python
.. code-block:: python
>>> a = 1
>>> b = 2
>>> c = 3
>>> somme = a + b + c
>>> somme
6
>>> a = 56
>>> b = 5678
>>> c = 56789
>>> somme
6
>>>
Portée locale dans une expression
.. code-block:: ocaml
# let a = 2 and b = 3 and c = 4 in
let somme = a+b+c in
somme
- : int = 9
# somme ;;
Error: Unbound value somme
# a ;;
Error: Unbound value a
.. important::
Lordre dévaluation dans un let ... in ... est bien déterminé,
sans grande importance dans un cadre purement fonctionnel, mais important
en cas deffets de bord
Exemple de variable globale modifiée localement (**attention, mauvaise pratique** !) :
.. code-block:: python
>>> a = 5
>>> def print_a():
... print("La variable a = {0}.".format(a))
...
>>> print_a()
La variable a = 5.
>>> a = 8
>>> print_a()
La variable a = 8.
>>>
niveau
Le niveau dune déclaration (de variable ou de procédure) est le nombre
de procédures sous lesquelles elle est déclarée. Le programme principal
a le niveau 0.
.. code-block:: python
:linenos:
def _get_config(name):
# return config value
if not isfile(CONFIG_FILE):
raise Exception("Fichier de configuration non existant")
from ConfigParser import ConfigParser
cfg = ConfigParser(allow_no_value=True)
cfg.read(CONFIG_FILE)
if name == "SUBNETS":
return eval(cfg.get('eole', 'subnets'))
elif name == "LEASES_FILE":
DHCP_PATH = cfg.get('eole', 'container_path_dhcp')
return join('/', DHCP_PATH, 'var/lib/dhcp/dhcpd.leases')
def get_routes(*args, **kwargs):
"""
Send list of reserved IP
return list of tuple (id, machine name, IP, MAC Adress)
"""
cfg = creole_loader(load_extra=True, rw=False, owner=MODNAME,
mandatory_permissive=False)
return zip(cfg.dhcp.dhcp.id_dhcp.id_dhcp, cfg.dhcp.dhcp.id_dhcp.hostname,
cfg.dhcp.dhcp.id_dhcp.ip, cfg.dhcp.dhcp.id_dhcp.macaddress)
On voit que l'objet `cfg` ligne 6 et 7 a le même nom que l'objet `cfg` ligne 19.
C'est autorisé et les espaces de nommages sont différents.
Description d'une fonction
~~~~~~~~~~~~~~~~~~~~~~~~~~
Une fonction renvoie une valeur et ne modifie pas l'état courant du programme
en cours d'exécution ni ne réalise d'effets de bord. Elle renvoie
**toujours** quelque chose (même la valeur ``None`` qui n'est pas rien)
- une procédure peut prendre des paramètres
- elle modifie l'état courant du système
- Déclaration des paramètes
- Déclaration du corps
- Appel de la fonction
En programmation fonctionnelle, programme est un ensemble de définitions de fonctions,
un résultat est l'application dune fonction à une structure de données effective.
- composant de base : la fonction
- opération de base : lapplication
.. raw:: latex
\begin{algorithm}
\caption{Exemple de fonction}\label{fonction}
\begin{algorithmic}[1]
\Function{permuter}{$a,b$}{} \Comment{définition de la fonction}
\BState \emph{parametres}: \Comment{déclaration (noms, types) des paramètres formels}
\State $a: \textit{int}$
\State $b: \textit{int}$
\BState \emph{locales}: \Comment{déclaration (noms, types) des valeurs locales}
\State $z: \textit{int}$
\BState \emph{corps}:
\State $z \gets a$
\State $a \gets b$
\State $b \gets z$
\BState \emph{return}: \Comment{La valeur, le résulat renvoyé par la fonction}
\EndFunction
\State \Call{permuter}{10, 12} \Comment{appel de la fonction}
\BState \emph{result}:
\State (12, 10) \Comment{Le résultat effectif de la fonction après appel}
\end{algorithmic}
\end{algorithm}
.. ifconfig:: exercice
**Exercice** : factoriser le code suivant
::
Ecrire "Etes-vous marié ?"
Rep1 <- ""
TantQue Rep1 <> "Oui" et Rep1 <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Rep1
FinTantQue
...
Ecrire "Avez-vous des enfants ?"
Rep2 <- ""
TantQue Rep2 <> "Oui" et Rep2 <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Rep2
FinTantQue
.. ifconfig:: correction
**Correction** :
::
Fonction RepOuiNon() en caractère
Truc <- ""
TantQue Truc <> "Oui" et Truc <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Truc
FinTantQue
Renvoyer Truc
Fin
Ecrire "Etes-vous marié ?"
Rep1 <- RepOuiNon()
...
Ecrire "Avez-vous des enfants ?"
Rep2 <- RepOuiNon()
Définition mathématique
~~~~~~~~~~~~~~~~~~~~~~~~~
fonction
Une fonction f dun ensemble E vers un ensemble F est une
correspondance qui associe à chaque élément de E au plus
un élément de F.
- E est appelé le domaine de définition
- F est appelé codomaine
- la **signature** de la fonction : `E → F (int -> int = <fun>)`
Exemple de signature d'une fonction
::
Fonction RepOuiNon(Msg en Caractère) en Caractère
Ecrire Msg
Truc <- ""
TantQue Truc <> "Oui" et Truc <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Truc
FinTantQue
Renvoyer Truc
Fin Fonction
...
Rep1 <- RepOuiNon("Etes-vous marié ?")
...
Rep2 <- RepOuiNon("Avez-vous des enfants ?")
...
curryfication
évaluation de l'application d'une fonction
- évaluter `(f x y)`
- peut donner une **valeur fonctionnelle**
- évaluation de la valeur fonctionnelle sur une valeur des types de base
::
let g = function n -> (function p -> p + 1) n;;
Typage d'une fonction
~~~~~~~~~~~~~~~~~~~~~
.. code-block:: ocaml
# let f x y z = if x > 0 then y + x else z - x;;
val f : int -> int -> int -> int = <fun>
cest en fait une fonction à un argument qui retourne une fonction::
.. code-block:: ocaml
val f : int -> (int -> (int -> int)) = <fun>
application de f à trois valeurs
.. code-block:: ocaml
# f 1 2 3;;
- : int = 3
en programmation fonctionnelle,
les fonctions sont des valeurs comme les autres
.. code-block:: ocaml
# fun x -> x * x;;
- : int -> int = <fun>
Récursivité
~~~~~~~~~~~~
.. code-block:: ocaml
let rec fact n =
if n=0 then 1 else n * fact (n-1)
équivalent impératif utilisant une boucle
.. code-block:: c
int fact(int n){
int f = 1 ;
int i = n ;
while (i>0){
f = f * i;
i-- ;
} ;
return f ;
}
Définitions par cas
~~~~~~~~~~~~~~~~~~~
.. code-block:: ocaml
let rec fact n =
match n with
0 -> 1
| -> n * fact (n-1)
**exemple** : la fonction puissance
.. code-block:: ocaml
let rec puissance x n = match n with
0 -> 1
| -> x * puissance x (n-1)
.. ifconfig:: exercice
**Portée locale dans une fonction**
Quelles sera la valeur de la variable `a` ?
.. code-block:: python
>>> a = 1
>>> def myfunc():
... a = 2
... return a + 1
...
>>> a = myfunc() + a
.. ifconfig:: correction
Correction:
.. code-block:: python
>>> a = 1
>>> def myfunc():
... a = 2
... return a + 1
...
>>> a = myfunc() + a
>>> a
4
>>>
.. ifconfig:: exercice
**Exercice** : Portée locale dans une fonction avec variable globale
Quelles sera la valeur de la variable `a` ?
.. code-block:: python
>>> a = 1
>>> def myfunc():
... global a
... a = 2
... return a + 1
...
>>> a = myfunc() + 3
>>>
.. ifconfig:: correction
**Correction** :
.. code-block:: python
>>> a = 1
>>> def myfunc():
... global a
... a = 2
... return a + 1
...
>>> myfunc()
3
>>> a
2
>>> a = myfunc() + 3
>>> a
6
>>>

View File

@ -1,198 +0,0 @@
Présentation de l'art de programmer
====================================
Qu'est-ce que la programmation ?
--------------------------------
programmation
Description dun calcul (traitement) dans
un langage compréhensible par la machine
(langage de programmation)
Le processus d'abstraction
--------------------------
Débuter en programmation n'est pas une chose aisée. Aujourd'hui, la tendance est au
"bas niveau". Souvent, on se jette dans le grand bain :
- soit en s'approchant au maximum de la machine (admin système et réseau, noyau
linux, langage C)
- soit en faisant du dev web côté backend, ce qui ramène à une administration réseau
de bas niveau (microservices, monde nodeJS/javascript, etc...)
Soit on suit un cursus scolaire traditionnel qui commence souvent par une
explication du fonctionnement d'une machine abstraite de bas niveau, puis en
allant de plus en plus haut, mais étant sous-entendu qu'il faut rester connecté au
bas niveau (comprendre comment ça se passe derrière la scène).
Dans ces deux cas, il est sous-entendu qu'on apprend plus de choses et plus rapidement en mettant
les mains dans le cambouis, ce qui est vrai bien sûr. Mais cela sous-entend qu'un développeur doit
rester le nez dans le guidon. Qu'il doit être un expert de son domaine en accumulant des technologies
sans aucun recul. Bien sûr il se doit d'être un expert du système dans lequel il évolue
(connaissance du système d'exploitation, binding avec le C, du ramasse miette (garbage
collector), interaction avec les différentes librairies, gestion et optimisation de la mémoire,
architecture par microservices, threads...) mais il doit aussi être capable de prendre du recul.
L'approche algorithmique (algorithmique de pseudo code, algorithmique algébrique et modulaire)
est un véritable moyen pour le programmeur de prendre du recul : elle commence par se placer du
côté de l'esprit humain et de ses capacités de compréhension et d'abstraction, elle autorise une
pensée rationnelle sur l'art de programmer et permet au programmeur d'effectuer les bons choix,
en connaissance de sa discipline.
Le lien est fait ensuite avec le plus bas niveau grâce une implémentation effective
des langages à partir des paradigmes de rationalisation de la penseée (modules,
objects, généricité, polymorphisme paramétrique...) et d'un outil de communication
avec la machine qu'on appelle compilateur (dont la description est en dehors de
l'objectif de ce cours).
La tendance générale de l'évolution des langages est de se libérer de ces
contraintes de bas niveau, un peu comme en sciences physiques où les lois physiques
dépendent de l'échelle d'en dessous (du niveau microscopique/quantique) mais qu'à
l'échelle du dessus, on n'a pas affaire à des effets de bas niveau (pas d'effets
quantiques à un niveau macroscopique en général). Ce processus d'évolution est vrai
aussi dans le monde de la technique informatique lui-même (modèle OSI, comment est
construite une trame IP, indépendances de chaque couche (transport, payload) entre
elles). Même la tendance système est à la virtualisation qui accentue encore la
tendance à s'affranchir du bas niveau (le niveau système), le séparer nettement du
haut niveau (le niveau applicatif).
Il apparaît régulièrement de nouveaux langages. Comment s'orienter ? Quel(s)
langage(s) choisir pour un projet de développement ? Au delà de leurs disparités, la
conception et la genèse de chacun d'eux procèdent d'une motivation partagée : la
volonté d'abstraire.
- **s'abstraire de la machine** : un langage de programmation permet de
négliger l'aspect *mécanique* de l'ordinateur. On oublie le modèle du
microprocesseur, jusqu'au système d'exploitation sur lequel sera exécuté
le programme.
- **abstraire les erreurs** : Il s'agit ici de garantir la sûreté d'exécution; un
programme ne doit pas se terminer brutalement ou devenir incohérent en cas d'erreur.
Un des moyens pour y parvenir est le typage des programmes et la mise
en oeuvre d'un mécanisme d'exceptions.
- **abstraire le mode opératoire** : Il s'agit de choisir une représentation, un
paradigme d'implémentation qui est indépendant du domaine considéré (paradigme
objet, modulaire, générique, composants...)
- **abstraire les composants** : Les langages de programmation donnent la
possibilité de découper une application en différents composants logiciels, plus ou
moins indépendants et autonomes. La modularité permet une structuration de plus haut
niveau de l'ensemble d'une application complexe. Les langages à objets constituent
une autre approche de la réutilisabilité permettant la réalisation très rapide de
prototypes.
Description des niveaux d'abstraction par rapport à la machine
---------------------------------------------------------------
Les langages de haut niveau simplifient le travail du
programmeur là où les langages de bas niveau permettent de produire un code
plus efficace.
- **niveau 0** : le langage machine. Illisible, c'est une suite d'optcode.
impossible de coder dans ce langage.
- **niveau 1** : langage d'assemblage. Il reste très dépendant de la machine
et aujourd'hui il est rare d'en faire, sauf si on code un bootloader par exemple,
la gestion de l'accès à la mémoire est en réel (le mode protégé n'apparaît que après).
Il faut gérer les ressources,le langage est très optimisé mais presque impossible
à maintenir et rendre générique. Aujourd'hui plus personne ne code en assembleur.
- **niveau 2** : langages dits de **bas niveau** : (exemple : le C, le C++)
indépendance par rapport à la machine, grande structuration mais très verbeux
- **niveau 3** : langages dits de **haut niveau** : le raisonnement dans ces
langages ne dépent plus de la machine, et ils implémentent des paradigmes de
programmation indépendant de l'état de la mémoire de l'ordinateur,
ils sont indépendant même du système d'exploitation.
Qu'est-ce qu'une machine ?
---------------------------
Une machine, ce truc apparemment si complexe, est en fait
un assemblage de bric et de brac.
L'assemblage des connecteurs permet de simuler un additionneur,
en prenant en compte les propriétés de **reste euclidien**
de l'addition.
La structure électronique est composée de :
- un ordonnanceur.
- le stockage d'un **état**.
- une pile d'instruction
.. glossary::
adressage
Dès lors qu'on dispose de ces bases électronique au dessus du processeur,
un langage d'assemblage est possible, c'est le langage de calcul sur les registres.
registre
machines ont un espace mémoire et un espace de calcul (registres)
Un ordinateur, c'est très très stupide, mais ça permet de disposer de :
- une mémoire très grande et ordonnée,
- une capacité à effectuer inlassablement des tâches répétitives
- une grande rapidité de calcul
Apprendre à programmer, c'est-à-dire être capable de
contrôler la machine.
.. important:: Apprendre à programmer, c'est-à-dire apprendre à penser de manière structurée,
pour pouvoir accessoirement ensuite communiquer avec une machine.
Compilateur
-----------
Schématiquement, un compilateur est un programme qui traduit un
programme dun langage source vers un langage cible, en signalant
déventuelles erreurs.
Quand on parle de compilation, on pense typiquement à la traduction dun
langage de haut niveau (C, Java, Caml, ...) vers le langage machine dun
processeur (Intel Pentium, PowerPC, ...)
- xml (libre office, word) -> postscript (imprimante)
- postcript -> image
- syntaxe wiki -> html (Wikipédia...)
compilation graphique
passer une description, ça donne un dessin genre ocaml Quilt < mon_dessin.txt
passer par une api qui permet de causer avec une interface
**transpiler** : transformation d'un langage de haut niveau vers un autre
langage de haut niveau.
- cofee script, typescript -> javascript
- (babel) javascript -> javascript ES 6
- python -> javascript
Un compilateur traduit un programme P en un programme Q tel que
pour toute entrée x , la sortie de `Q(x)` soit la même que celle de `P(x)`
Un interprète est un programme qui, étant donné un programme `P` et une
entrée x , calcule la sortie s de `P(x)`
Le compilateur fait un travail complexe une seule fois, pour produire un
code fonctionnant pour nimporte quelle entrée
Linterprète effectue un travail plus simple, mais le refait sur chaque entrée
Autre différence : le code compilé est généralement bien plus efficace que
le code interprété
Typiquement, le travail dun compilateur se compose dune phase danalyse
- reconnaît le programme à traduire et sa signification
- signale les erreurs et peut donc échouer (erreurs de syntaxe, de portée, de typage, etc.)
Puis dune phase de synthèse
- production du langage cible
- utilise de nombreux langages intermédiaires
- néchoue pas

View File

@ -1,19 +0,0 @@
Introduction à l'algorithmique
================================
.. toctree::
:maxdepth: 2
presentation
fondement
langage
algo
programme
fonctions
control
donnees
apercu
modularite
modules
tp
annexes/index

View File

@ -1,336 +0,0 @@
Les langages de programmation
=============================
langage
Un langage de
programmation
doit permettre d'écrire des
programmes de bonne qualité
Un programme doit être :
- correct
- robuste
- lisible, bien documenté
- facile à modifier, extensible
Un langage de programmation doit permettre :
- la programmation structurée
- la structuration avec les types
- proposer un mécanisme dexceptions
- présenter des caractères de généricité, de polymorphisme et de surcharge
.. important:: La structuration et l'organisation modulaire sert à maintenir de grands programmes,
Elles sont une nécessité
Approche historique et chronologique
-------------------------------------
- Lambda calcul (1930)
- machines de Turing (1936)
- début des langages vers les années 1950 (A0, Fortran(impératif),
Lisp(impératif et fonctionnel), Cobol)
- années 60 : Simula (classes), CPL (compilation séparée)
- années 70 : C (référence du langage impératif de bas niveau), Pascal
(procédures), Smalltalk (programmation orientée objects), Prolog
(programmation logique), Scheme (programmation fonctionnelle pure), Modula,
C++, Ada, Turbo Pascal, Common Lisp, Eiffel (programmation par contrats)
- années 80 : ML, CAML (langages fonctionnels)
- années 90 : Perl, Python, Ruby (languages de scripting multi-paradigmes)
Haskell (fonctionnel pur), Lua, Delphi, Java (orienté objet, machine
virtuelle), PHP (impératif, dédié au web), Erlang (fonctionnel+
programmation concurrente), javascript (orienté web, objets par
prototypage), OCaml (multi-paradigme, fortement typé, orienté sécurité,
programmation générique, fonctionnelle et objets, modulaire et fonctorielle)
- 2009 : go (google, compilé, typage statique, objets par prototypage,
prgrammation concurrente), Rust (fondation mozilla, multiparadigme, programmation concurrente)
Les langages actuellement les plus utilisés dans le monde de l'entreprise sont :
- javascript/NodeJS (70% du code dans le dépôt github) mais victime de son
succès (chaos complet des librairies)
- le go est de plus en plus utilisé, c'est **le** langage qui monte
actuellement
- Python, Ruby, lua, autres langages de scripting (de plus en plus utilisés)
- PHP, Java (stagnants)
- C, C++ (de moins en moins utilisés)
Approche par typologie des langages
-----------------------------------
- **A0 (1954)** : possibilité de découpage de programmes en
sous-programmes ;
- **ALGOL (1958)** : concept de bloc de code (pas forcément nommé) et d'imbrication
de blocs de code ;
- **C (1971)** : syntaxe claire et simple, programme fortement structuré ;
- **C (1980)** : le **code objet**, qui consiste à essayer de faire fonctionner
un seul jeu d'instructions sur des machines différentes. Avant, le code
d'assemblage dépendait du processeur, donc il n'y avait pas un seul et unique
jeu d'instructions ;
- **1980** : déploiement et succès des langages à objets ;
- **1983** : turbo pascal (Borland) qui fut le tournant du C,
propose un IDE (Environnement de Développement Intégré).
aujourd'hui le turbo pascal a pratiquement disparu mais pas totalement,
il est soutenu par une communauté open source autour de **Lazarus** ;
- **depuis les années 90** : deux grands groupes de langages. Les langages à
objets, et les langages fonctionnels. Les deux mondes s'interpénètrent (les
avancées actuelles du web, les microservices (Erlang, Haskell),
viennent du monde fonctionnel, le NoSQL, etc).
Les grandes avancées architecturales (système d'exploitation, linux, etc...)
viennent du monde de l'impératif.
Approches par modèles de programmation
--------------------------------------
- **le mécanisme d'exceptions** : il est possible de rompre l'exécution normale d'un
programme à un endroit et de la reprendre à un autre endroit du programme prévu à
cet effet. Ce mécanisme permet de gérer les situations exceptionnelles.
- **le paradigme impératif** : les entrées-sorties, les modifications physiques de
valeurs et les structures de contrôle itératives sont possibles.
- **le paradigme fonctionnel** : manipule les fonctions comme étant des valeurs du
langage. Celles-ci peuvent être utilisées en tant que paramètres d'autres fonctions
ou être retournées comme résultat d'un appel de fonction.
- **le paradigme objet** : La représentation du programme colle à la réalité en
reproduisant des entités relativement proches des objets réel. Attention, le piège
est de croire qu'il s'agit *du* paradigme universel puisqu'il reproduit en miroir le
réel. **C'est en fait un processus d'abstraction comme un autre**.
Sûreté du langage, typage
~~~~~~~~~~~~~~~~~~~~~~~~~
Tri par ordre de sûreté croissant :
0. typage très faible (presque inexistant aujourd'hui) : 42 == "42" == 42.0...
1. typage dynamique faible : (javascript) (possibilité de changer le prototype
d'un objet pendant l'éxécution du programme, c'est la fête on peut faire
n'importe quoi)
2. typage dynamique fort inféré par le comportement (behavior, duck typing)
(python, ruby, PHP) Le contenu de la variable détermine le choix du typage
`var = 0 -> type int`
3. typage statique déclaré fort (Java)
`int var = 0 ;` (pas mal mais super lourd, pas **agile** du tout)
4. langages à types statiques muni d'un moteur d'inférence de types (Ocaml)
sûreté d'exécution, agilité, sécurité.
La syntaxe, la lisibilité
~~~~~~~~~~~~~~~~~~~~~~~~~
Importance de la lisibilité (notamment par rapport aux méthodes agiles).
- courte (python)
- verbeuse (C)
- l'importance des mots clef du langage
- délimiteur de phrase, de blocs (parenthèses, accolades, tabulations, blocs...)
Langages compilés ou interprétés ?
-----------------------------------
.. glossary::
langage compilé
une première passe est faite, des validations son effectuées **avant**
la génération du code objet, cette phase est faite par le compilateur.
compilateur
programme qui transforme un langage de haut niveau en un langage de base
niveau
- phase danalyse syntaxique (source -> syntaxe abstraite)
- phase de synthèse (syntaxe abstraite -> code objet)
scripting (langage de scripting)
langage interprèté
générique (langage)
Langage à usage générique, qui peut être utilisé dans n'importe quel
domaine (par opposition au DSL)
domain specific
Domain Specific Language, langage destiné à être utilisé dans un
domaine prédéfini.
paradigmes
représentation d'une vision particulière à partir d'un modèle théorique
impératif
l'algorithme ressemble à une recette de cuisine,
c'est-à-dire à une succession d'instructions à exécuter
les unes à la suite des autres
fonctionnel
l'algorithme ne dépend plus de l'ordre d'exécution d'instructions
pas de mélange entre les données et les traitements
objets (programmation)
le monde est découpé en catégories
qui permettent de créer des objets
**développement par composants**
les objets sont organisés entre eux par composants suivant des designs patterns,
(patrons de conception)
garbage collector (ramasse miettes)
la gestion automatique de la mémoire apparaît en 1989
machine virtuelle
portabilité du code (mais diminution en optimisation et performances)
JIT (just in time compiler)
code objet, programmes fonctionnant autour de machines virtuelles
- **le typage statique** : la vérification de la compatibilité entre les types des
paramètres formels et des paramètres d'appel est effectuée au moment de la
compilation du programme. Dès lors, il n'est pas nécessaire de faire ces
vérifications durant l'exécution du programme ce qui accroît son efficacité. En
outre, la vérification de type permet d'éliminer la plupart des erreurs introduites
par maladresse ou étourderie et contribue à la sûreté de l'exécution.
- **le typage dynamique** : la vérification de la compatibilité entre les types des
paramètres formels et des paramètres d'appel est effectuée au moment de l'exécution
ou de l'appel à certaines parties de codes du programme.
- **le polymorphisme paramétrique** : une fonction ou un objet qui n'explore pas la
totalité de la structure d'un de ses arguments accepte que celui-ci ait un type non
entièrement déterminé. Ce paramètre est alors dit polymorphe. Cette particularité
permet de développer un code générique utilisable pour des structures de données
différentes tant que la représentation exacte de cette structure n'a pas besoin
d'être connue par le code en question. L'algorithme de typage est à même de faire
cette distinction.
- **l'inférence de types** : le programmeur n'a besoin de donner aucune information
de type à l'intérieur de son programme. Le langage se charge seul de déduire du code
le type le plus général des expressions et des déclarations qui y figurent. Cette
inférence est effectuée conjointement à la vérification, lors de la compilation du
programme.
Les grands paradigmes de programmation
---------------------------------------
Le paradigme des objets
~~~~~~~~~~~~~~~~~~~~~~~
- 1962 (SIMULA) : premières notions de classes ;
Pui, une dizaine d'années plus tard :
- C++ : intégration des classes pour le C ;
- turbo pascal : intégration des classes pour le pascal ;
Tous les langages actuels ont intégré des traits objets mais de manière très
différentes :
- perl (1987)
- python (1991)
- Ruby (1993)
- L'implémentation des objets en python est très proche des notions initiales de
classes issues du Smaltalk et présente une tentative très intéressante
d'unification des objets et des types depuis python 2.2 ;
- Java (1995) : très grosse réussite industrielle en surfant sur la vague de la
programmation objet, et des machines virtuelles, mais en fait et avec le recul,
doté d'un support objet lourd et alambiqué.
Le monde Java est lourd, avec des outils consommant beaucoup de mémoire et
qui ne satisfont pas à la règle du KISS (Keep It Simple, Stupid) ;
Il n'y a pas **une** POO (Programmation Objet), il y a des POO.
Les implémentations objets dans les langages sont riches et variées :
- objets obligatoirement construits pas des classes (Java, C++, ...)
- objets sans définition de classes (javascript, Ocaml, go, rust)
- langages à attributs (python)
- langages ou le type des objets est défini par leur classe (python, ruby)
- langages ou le type des objets est différent du type de leur classe (Ocaml)
- objets sans classes mais construits par des prototypes (javascript)
- construction d'objets possibles objets sans classe du tout (Ocaml)
- encapsulation des attributs des objets (Java, Ocaml, C++, PHP)
- pas d'encapsulation des attributs (python, ruby, javascript...)
Le paradigme impératif
~~~~~~~~~~~~~~~~~~~~~~
Un programme est une suite d'états de la mémoire de l'ordinateur,
c'est la suite logique des machines de Turing.
La plupart des programmeur aujourd'hui raisonnent suivant ce paradigme,
et ont une très faible visibilité par rapport aux autres paradigmes existants.
Seuls les programmeurs cultivés sont aujourd'hui capable de raisonner
suivant différents paradigmes, ce sont des programmeurs chevronnés et
cultivés.
Le paradigme fonctionnel
~~~~~~~~~~~~~~~~~~~~~~~~
La notion de fonction que possède sous une forme ou une autre la plupart des
langages est empruntée aux mathématiques et non à l'électronique. D'une manière
générale, les langages substituent des modèles formels aux conceptions purement
calculatoires. Ils y gagnent en expressivité. Certains langages fondent leur
paradigme de programmation sur l'abstraction entrée-traitement-sortie, donc sur le
**mathème fonctionnel** et pas sur la boite noire électronique. La fonction
mathématique apporte un niveau opératoire dans le traitement de l'information.
Approche par fonctionnalités
----------------------------
Plusieurs domaines de l'informatique on proposé/imposé des méthodologies,
des manières de faire. Ces modèles de programmation on fortement influencé
en retour les langages. On reconnaît aujourd'hui :
- Le modèle client-serveur
- Le modèle de programmation concurrente (exécution de processus légers, threads) :
- Le modèle de développement d'une application de bureau (MVC, ergonomie d'interface)
- Le modèle de développement web (communiquer sur le réseau Internet, API
REST, microservices...)
- Le modèle de programmation système et réseau
- le modèle **Dev Ops** et les méthodes de développement virtualisés
- les langages présentant des **fonctionnalités agiles**
Conclusion
-----------
Les langages de haut niveau sont caractérisés par
des concepts tels que :
- déclaration de valeurs, types, expressions, portée
- expressions, variables, instructions, structures de contrôle
- fonctions, procédures, fermetures
- encapsulation, modules, objets
=========== ============
Paradigmes Concepts
=========== ============
impératif variables, procédures, modules
objets classes, méthodes, héritage, surcharge
fonctionnel fonctions, fermetures, modules
logique prédicats, modules
concurrent tâche/processus, communication
=========== ============

View File

@ -1,200 +0,0 @@
La programmation structurée
=============================
Un langage de programmation doit permettre la programmation structurée.
.. important:: La structuration et l'organisation modulaire sert à maintenir de grands programmes,
Elles sont une nécessité
Structuration d'un programme
-----------------------------
La réalisation d'applications importantes oblige le programmeur ou l'équipe de
développement à se poser des questions d'organisation et de structuration.
Aujourd'hui, on dispose de deux grands modèles d'organisation dont les avantages et les
particularités sont distincts.
L'écriture des vrais programmes consiste à les structurer pour les présenter
comme un assemblage de briques qui s'emboîtent naturellement.
Ce problème se révèle fondamental dès que la taille des programmes devient conséquente.
Si on ne prend pas garde au bon découpage des programmes en modules indépendants,
on se retrouve rapidement débordé par un grand nombre de variables,
et il devient quasiment impossible de réaliser un programme correct.
La programmation raisonnée
---------------------------
Un **programme** est le codage d'un algorithme dans un langage de programmation.
La programmation consiste à modéliser un problème du monde réel sous une forme
symbolique (pour faire résoudre ce problème par un ordinateur).
Certains problèmes sont **indécidables** ou **ouverts**.
On utilise un langage de programmation pour décrire la **solution** du programme.
La sémantique du programme est le sens de chacune des constructions du langage.
**Comment passer de l'énoncé d'un problème à un programme de bonne qualité ?**
spécifier
décrire de manière complète et rigoureuse le problème à résoudre
modéliser
proposer une représentation du réel qui soit accessible au calcul
algorithmique
transcrire
La transcription du modèle algorithmique se fait dans un langage
de programmation cible adapté au problème
valider
La validation du programme est une étape qui permet de s'assurer plus ou
moins fortement que le programme produit les résultats attendus.
La validation va de la série de tests unitaires (validation faible)
à la preuve de programme (validation mathématique forte).
Conception descendante
-----------------------
Une vision **centripète** : du général au particulier.
Il s'agit d'une méthode de résolution d'un problème. On le découpe en tâches
de plus en plus fines, de plus en plus détaillées, qui aboutiront au programme final.
On met des *trous* dans les algorithmes de plus haut niveau,
c'est-à-dire des phrases en langage naturel.
.. ifconfig: exercice
**Exercice** : **Calculer la date du lendemain**
.. ifconfig: correction
- l'algorithme de plus bas niveau
::
lendemain jour =
si jour [est le dernier jour du mois] alors
resultat = [calculer le 1er janvier de l'année suivante]
sinon
resultat = lendemain_dansl'année jour
- les algorithmes de plus bas niveau
::
lendemain_dans_l'année jour =
si jour [est le dernier jour du mois] alors
resultat = [calculer le premier jour du mois suivant]
sinon
resultat = jour suivant jour
::
jour_suivant jour =
jour + 1
et ainsi de suite jusqu'à ce que toutes les phrases soient calculables.
Algorithme vague
--------------------
L'algorithme vague, c'est quand on pense l'algorithme en se plaçant du côté de
l'implémentation en premier. On a le nez dans le guidon, la vue d'ensemble est
difficile.
Voici, tiré du monde réel, un exemple d'algorithme vague
("ce que doit faire une fonction"), placé dans un bout de code
(souvent la **docstring** d'une fonction).
.. code-block:: python
def upsert_route(*args, **kwargs):
"""
Create or modify an existant DHCP route
param tuple (id or null, machine name, IP, MAC Adress)
return True or False with error message
"""
# si id présent alors modification sinon ajout
# récupère la liste des réservations en cours
# y cherche la variable sur la base de l'ID
# modifie les valeurs
# applique la nouvelle conf DHCP
return True
Voici un autre bout de code avec l'algorithme en commentaire,
et l'implémentation effective de l'algorithme
.. code-block:: python
def del_route(*args, **kwargs):
"""
Delete an existant DHCP route
param tuple (id, machine name, IP, MAC Adress)
return True or False with error message
"""
# récupère la liste des réservations en cours
# y cherche la variable sur l'id donné en paramètre
# supprime l'entrée avec vérification que les données fournies
# sont bien dans l'enregistrement à supprimer
# applique la nouvelle conf DHCP
route_to_del = (1, "host2","10.1.2.4","6E:FF:56:A2:AF:17")
routes = get_routes()
if route_to_del in routes:
c = creole_loader(load_extra=True, rw=True)
c_id = c.dhcp.dhcp.id_dhcp.id_dhcp.index(route_to_del[0])
if c.dhcp.dhcp.id_dhcp.macaddress[c_id]==route_to_del[2]
and c.dhcp.dhcp.id_dhcp.ip[c_id]==route_to_del[1]:
c.dhcp.dhcp.id_dhcp.id_dhcp.pop(c_id)
config_save_values(c, MODNAME)
return True
return False
Les deux grands paradigmes
---------------------------
La modularité
~~~~~~~~~~~~~~
Les données et les traitements sont regroupés au sein d'une même entité à deux
facettes : d'un côté le code proprement dit, de l'autre son interface. La
communication entre modules s'effectue via leur interface. La description d'un
type peut être masquée en n'apparaissant pas dans l'interface du module. Ces
types de données abstraits facilitent les modifications d'implantation à
l'intérieur d'un module sans affecter les autres modules qui s'en servent. De
plus, les modules peuvent être paramétrés par d'autres modules augmentant
ainsi leur réutilisabilité.
Le paradigme objet
~~~~~~~~~~~~~~~~~~
Les descriptions des traitements et des données sont regroupées dans des
entités appelées **classes**; un objet est une instance (valeur) d'une classe.
La communication entre objets est réalisée par envoi de message, l'objet
receveur détermine à l'exécution (liaison retardée) le traitement
correspondant au message. En cela, la programmation objet est dirigée par
les données. La structuration d'un programme provient des relations entre
classes, en particulier l'héritage permet de définir une classe par extension
d'une autre.
En programmation objet, un **programme** est une collection dobjets qui communiquent
entre eux par **message**, le **résultat** est un message envoyé à un objet particulier
Comparaison entre les deux paradigmes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Il y a dualité entre ces deux modèles.
- On ne peut pas augmenter les composants d'un type dans un module (pas
d'extensibilité des données), mais on peut ajouter de nouveaux traitements
(extensibilité des traitements) sur ces données.
- En objet, on peut ajouter des sous-classes à une classe (extensibilité des
données) pour traiter des nouveaux cas, mais on ne peut pas ajouter de nouveaux
traitements visibles de la classe ancêtre (pas d'extensibilité des traitements).
**La combinaison des deux paradigmes offre de nouvelles extensibilités pour les
traitements et les données.**

View File

@ -1,313 +0,0 @@
La programmation modulaire
===========================
Il s'agit de décomposer un grand programme en
morceaux (**modules**) connectés entre eux par des **interfaces** bien
définies.
Ces modules doivent être aussi indépendants que possible.
module
ensemble de ressources liées sémantiquement
interface
mode demploi du module, avec en plus un principe de masquage
des informations (partie publique, partie secrète)
Signatures, type abstrait et langage de modules : la programmation modulaire
permet d'aller très loin dans la programmation structurée.
Définir des fonctions dans un fichier séparé
--------------------------------------------
Les fonctions peuvent être définies dans un fichier et le programme dans un
autre fichier séparé. Dans ce cas, pour pouvoir être exécuté directement avec
la commande python `nomfichierprogramme.py`, le fichier du programme doit
importer dabord les fonctions du fichier dans lequel les fonctions sont
définies.
1. Fichier de fonctions
~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: python
# Fichier foncmaxliste.py
# Recherche le premier élément maximal dans une liste ou
#dans une chaine de caractères
def max_list(L) :
k = len(L)
max, x = L[0], 0
i = 1
while i < k :
if max < L[i]:
max = L[i]
x = i
i = i + 1
return max, x
2. Fichier de programme
~~~~~~~~~~~~~~~~~~~~~~~~
Pour utilser les fonctions définies dans dautres fichiers, le fichier de
programme doit commencer par les instructions qui importent ces fichiers de
fonctions ou directement les fonctions de ces fichiers. Dans la syntaxe
ci-dessous, on importe une ou toutes les fonctions du fichier `foncmaxlist.py`.
.. code-block:: python
# Fichier progmaxlist.py
from foncmaxliste import max_list
# ou plus simple:
# from foncmaxliste import *
print max_list([4,5,6,9,12,5,10,3,18,5,6,7])
couple = max_list([4,5,6,9,12,5,10,3,18,5,6,7])
print Max de L est , couple[0]
print et se trouve à la position , couple[1]
print max_list(totovaaumarche)
couple = max_list(totovaaumarche)
print Max de L est , couple[0]
print et se trouve à la position , couple[1]
Au lieu dimporter les fonctions, on peut importer le fichier qui définit les
fonctions avec la syntaxe qui suit. Dans ce cas, le fichier de programme sera
changé comme suit :
.. code-block:: python
# Fichier prog2maxlist
import foncmaxliste
print foncmaxliste.max_list([4,5,6,9,12,5,10,3,18,5,6,7])
# la syntaxe indiquant le chemin dacces a la fonction max_list utiliser .
couple = foncmaxliste.max_list([4,5,6,9,12,5,10,3,18,5,6,7])
print Max de L est , couple[0]
print et se trouve à la position , couple[1]
print foncmaxliste.max_list(totovaaumarche)
couple = foncmaxliste.max_list(totovaaumarche)
print Max de L est , couple[0]
print et se trouve à la position , couple[1]
Lexécution directe du premier fichier de programme::
python prog max list.py
Lexécution directe du seconde fichier de programme::
python prog2 max list.py
Définition de l'implémentation d'un module
-------------------------------------------
Tout fichier qui contient au moins une définition dune fonction ou dune
variable est appelé un module (une bibliothèque). Le nom du module est le nom
du fichier enlevé le suffixe `.py`. Ainsi, un fichier de programme qui contient
au moins une définition dune fonction ou un fichier qui ne contient que des
définition de fonctions sont des modules. On peut importer un module ou des
fonctions ou variables dun module dans un programme, comme nous avons vu dans
les exemples ci-dessus.
.. important:: on peut importer un module, ou bien lancer un module en tant que
programme executable
.. code-block:: python
if __name__ == '__main__':
main()
Pour faciliter la programmation, Python définit un certain nombre de **modules internes**,
appelés les builtins (la librairie standard).
Par exemple :
Lors de louverture dune session interactive, on est dans un module interne nommé
main . Toutes les variables définies par affectation au niveau de ce module sont valides
globalement dans la session.
Dautres modules internes sont string, math, random
Dans une session de travail sous linterpréteur Python, la première importation dun mo-
dule qui, à part des fonctions quelle définit, contient des instruction de programme fait
exécuter ces instructions. Dans la même session, les importations suivantes ne font pas
exécuter ces instructions. Pour les exécuter, on utilise la fonction reload(nomdumodule)
(sans sufffixe .py).
Exemples d'interface
--------------------
::
type: son type
arguments
arg1 : description de l'argument 1
arg2 : description de l'argument 2
préconditions:
arg1 > 10
postconditions:
result < 19
raises: TypeError, AssertionError, SystemError...
test: tests nominaux pour chaque cas spécifié
- L'interface racine carrée
::
racine:
type: float -> float
arguments x: float, flottant dont on veut calculer la racine
pré: x >= 0
test: racine 25.0 -> 5.0 ; racine (-25) -> raises TypeError
- L'interface `lendemain`
Il faut définir auparavant un type spécifique appelé `date`
::
lendemain: le lendemain est la date qui désigne
le jour suivant de la date passée en argument
type: date -> date
arguments :
d: date
description: la date dont on veut calculer le lendemain
Le langages des modules
-------------------------
.. code-block:: ocaml
module type PILE = (* signature (interface) du module *)
sig
type a t
val create : unit -> a t
val push : a -> a t -> unit
val pop : a t -> a
end
(* implémentation du module *)
module Pile : PILE = (* le module est restreint
par la signature PILE *)
struct
type a t = a list ref
let create () = ref []
let push x p = p := x::!p
let pop p = match !p with [...]
let rec print p = match p with [...]
end
- `struct .. end` introduit une collection de définitions, valeurs, types ou modules.
C'est une **structure**.
- `module Nom = struct .. end` permet de donner un nom à cette structure et
c'est ça un module. C'est une structure nommée.
- `sig ... end` introduit une signature de module : une interface pour un module.
On restreint souvent une structure par une signature pour "cacher" certaines
définitions. Une signature de module fournit une **interface** entre l'extérieur
et l'intérieur d'un module.
En dehors du module, on accède à ses composants grâce à la notation pointée
.. code-block:: ocaml
let p = Pile.create()
Pile.push 45 p
Les foncteurs
--------------
Si un langage possède un langage de modules, on peut aller plus loin : on peut
considérer un module comme étant une expression de base du langage.
- La signature d'un module peut être considérée comme le type du module
- La structure du module peut être considéré comme sa valeur
Quel est l'intérêt ? On peut alors définir des **foncteurs**.
foncteur
"fonction" d'une structure vers une autre structure.
On peut ainsi paramétrer un module par un autre module.
.. code-block:: ocaml
module Nom (M1 :S1 ) (M2 :S2 ) (M3 :S3 ) ... =
struct
...
end
On applique un foncteur à des paramètres modules, pour
obtenir un nouveau module :
.. code-block:: ocaml
module M = F (Titi) (Toto)
Contrainte de type par signature
------------------------------------
::
module M =
struct
type t = int * int * int ;;
let make d m y = d, m, y ;;
end ;;
let d = M.make 8 5 8 ;;
module type S =
sig
type t ;;
val make : int -> int -> int -> t ;;
end ;;
module MS = (M:S) ;;
MS.make 5 1 2 ;;
Type et signature
------------------
::
# module type A = sig
val a: int -> int
end ;;
module type A = sig val a : int -> int end
# module B = struct
let a x = x + 1 ;;
end;;
module B : sig val a : int -> int end
# module C = (B:A) ;;
module C : A
# C.a 2 ;;
- : int = 3
#
Module auquel on impose une signature
-----------------------------------------
::
module type DATE = sig
type t
val make: int -> t
val get_year: t -> int
val get_month: t -> int
end ;;
module MR = struct
type t = int * int
let make x y = (x, y)
let get_month (x, y) = x
let get_year (x, y) = y
end ;;
module date = (MR:DATE) ;;

View File

@ -1,72 +0,0 @@
Avant propos
============
Introduction
~~~~~~~~~~~~
| "**Que nul n'entre ici s'il n'est géomètre**"
| Maxime apposée au porche d'entrée de l'École de Platon
- L'accent est mis sur l'approche **algorithmique scientifique**, dite algorithmique
algébrique. L'algorithmique est un sous-domaine de l'algèbre et des
approches modulaires (arithmétique modulaire...)
- Le point de vue mathématique étant assez exigeant, **aucun formalisme fort** de
l'algorithmique mathématique ne sera présenté. Aucun symbole mathématique donc, et
seulement du pseudo-code.
L'approche mathématique forte utilisant le formalisme mathématique de
l'algorithmique algébrique est en général enseignée en France uniquement aux cours
des grandes écoles.
- L'algorithmique présentée ici est donc délibérément pseudo-scientifique mais en revanche
ouverte au **multi-paradigme**. En général l'évocation d'un algorithme en pseudo code est toujours
réducteur car limité au style de programmation le plus à la mode actuellement, c'est-à-dire le
**style impératif**. Nous présenterons un éventail des plus grands paradigmes de programmation
existants. Nous nous limiterons à la **programmation impérative, fonctionnelle, modulaire,
générique et objet**. Nous envisagerons les structures de données et les structures de contrôle
spécifiques à chacun des styles évoqués.
- Et parce qu'un honnête programmeur doit avoir une vue d'ensemble de **l'état de son art**,
nous évoquerons un panorama des différents langages existants -- historiques et contemporains --
en les comparants les uns aux autres.
- Durant tout le cours, nous souhaitons proposer une pédagogie par l'exemple, et nous
limiterons l'exposé à deux langages d'implémentation des algorithmes : le **Python** pour la programmation
impérative modulaire et objet, et le **OCaml**, car nous évoquerons aussi certains points
de programmation fonctionnelle et modulaire, polymorphe et teintée de généricité.
Intérêt
-------
| "**Il ne suffit pas d'avoir les mains propres, il faut avoir l'esprit pur.**"
| Thalès de Milet ; Sentences - VIe s. av. J.-C.
L'algorithmique en tant que rapport à la vérité et à la pensée juste et vraie,
en tant qu'art de découper un problème complexe en tâches élémentaires,
en tant qu'énoncés de compréhension et de sémantique,
est la seule chose vraiment profonde dans l'informatique. Le reste n'est que 0 ou 1.
Cette notion d'algorithme est profondément enracinée dans le désir humain de
transmettre des méthodes pour comprendre des problématiques,
qu'il s'agisse de processus scientifiques ou mathématiques, de secrets,
de philosophie ou de divination au sens des anciens Grecs.
De règles linguistiques, aussi, chez les Romains.
Objectifs de ce cours
~~~~~~~~~~~~~~~~~~~~~
Il s'agit de :
- maîtriser et concevoir un algorithme de base,
- choisir une représentation appropriée des données,
- décomposer en sous-problèmes et affinements successifs,
- savoir organiser son code en fonctions et en modules.
Le développement raisonné dalgorithmes et leur implantation
permet d'acquérir les qualités suivantes :
+ Analyser et modéliser un problème, spécifier,
+ Exprimer une problématique, une solution ou un algorithme,
+ Traduire un algorithme dans un langage de programmation,
+ Concevoir une réponse à un problème précisément posé.

View File

@ -1,476 +0,0 @@
Définition d'un programme
==========================
Qu'est-ce qu'un programme ?
----------------------------
- Un **programme** est une suite de **phrases** ;
- Une **phrase** est une **déclaration** ou une **expression** (*statement* en anglais) ;
Production d'un programme :
1. on écrit le code source du programme ;
2. on demande au compilateur de le traduire en code machine : c'est la compilation du programme ;
3. on demande à la machine d'effectuer le code machine : c'est l'exécution du programme.
.. important::
L'introduction à la compilation et les différentes phases de la compilation
d'un programme sont des sujets qui ne seront pas traités dans ce cours.
Dans un programme de base, il y a deux fichiers :
1. un fichier contenant le code : c'est le source du programme.
2. un fichier contenant le code machine : c'est l'exécutable.
Que peut faire un programme lorsqu'il est exécuté ?
Le programme doit communiquer. S'il reste isolé, il ne pourra pas
produire quoi que ce soit. Voici les trois moyens de communication qu'a un
programme :
1. communiquer avec l'utilisateur,
2. communiquer avec des fichiers,
3. communiquer avec d'autres programmes.
Les expressions
----------------
expression
Une expression est une valeur caculée du langage, une opération arithmétique
qui retourne une valeur (entier, texte, valeur logique...).
C'est donc une suite sémantiquement correcte de **valeurs de base** et **d'opérateurs**
Par exemple, la ligne suivante est une expression effectuant une addition::
5 + 6
Expressions à partir de types de base
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Autres exemples d'expressions :
- 5 est une expression de type int
- 4.5 est une expression de type float
- 'c' est une expression de type char
- true est une expression de type bool
- print ('c') est une expression de type None
- raw_input est une expression de type string
Les expressions se complexifient avec la complexification des données et des traitements,
mais le principe de l'expressivité d'un langage reste le même.
.. ifconfig:: exercice
**Exercice** :
Le parenthésage et les opérateurs booléens::
Variables A, B, C, D, E en Booléen
Variable X en Entier
Début
Lire X
A <- X > 12
B <- X > 2
C <- X < 6
D <- (A ET B) OU C
E <- A ET (B OU C)
Ecrire D, E
Fin
**Que valent D et E si X = 3 ?**
.. ifconfig:: correction
**Correction** : D sera VRAI alors que E sera FAUX
Les déclarations
-----------------
Un autre exemple d'expression :
.. raw:: latex
\begin{algorithm}
\caption{Exemple d'expression}
\begin{algorithmic}[1]
\BState \emph{sortie}: $l$ \Comment{C'est l'expression calculée renvoyée}
\ForAll {$v \in V(G)$}
\State $l(v) \leftarrow \infty$
\EndFor
\State $l(u) \leftarrow 0$
\Repeat
\For {$i \leftarrow 1, n$}
\State $min \leftarrow l(v_i)$
\For {$j \leftarrow 1, n$}
\If {$min > e(v_i, v_j) + l(v_j)$}
\State $min \leftarrow e(v_i, v_j) + l(v_j)$
\State $p(i) \leftarrow v_j$
\EndIf
\EndFor
\State $l(i) \leftarrow min$
\EndFor
\State $changed \leftarrow l \not= l$
\State $l \leftarrow l$
\Until{$\neg changed$}
\end{algorithmic}
\end{algorithm}
Exemple de déclarations :
- `a = 1`
- `b = 'c'`
.. important:: Le signe égal est utilisé de deux manières
- lors d'une déclaration d'une expression
- lorsque deux expressions sont équivalentes
Suivant les langages, il y a deux symboles différents, ou alors
ils sont identiques.
Il s'agit de **renseigner** une valeur dans une expression nommée
- en javascript :
.. code-block:: javascript
var b = "blabla" ;
- en python :
.. code-block:: python
b = "blabla"
- en java :
.. code-block:: java
String b = "A";
- en OCaml :
.. code-block:: ocaml
let a = 1
Grâce au mécanisme d'inférence de type dans OCaml, le mot-clef **let**
signifie ici véritablement l'instanciation d'une valeur au sens
mathématique du terme : soit `a` l'entier tel que a soit égal à 1...
En OCaml comme dans tous les langages fonctionnels, tout ce que nous avons l'habitude
d'appeler des "variables" à propos des affectations, sont en fait des **constantes**
au sens du paradigme impératif de la programmation.
.. important::
Par voie de conséquence, le symbole ``=`` est utilisé à la fois pour la définition des objets et pour le test d'égalité.
Pour les autres langages, on utilise `==` ou bien `===` (javascript) car
le `=` est sémantiquement déjà utilisé...
Toutes ces notation, apparemment anodines, correspondent donc à des paradigmes de programmation
Lorsqu'on ne déclare pas les types des symboles déclarés, c'est que soit
- le typage est faible
- le typage est dynamique (calcul du type en fonction du contenu de la
variable)
- le typage est statique et fort mais ça ne se voit pas
(var le système les calcule automatiquement par inférence de type)
Assigner, allouer, affecter une chose à quelqu'un ou à une autre chose.
Exemples dans la langue française :
- Le traitement que le budget **alloue** à ces fonctionnaires.
- Un système d'exploitation multitâche alloue le travail du processeur aux processus en attente, pour un bref laps de temps, à leur tour.
.. glossary::
affectation
Une affectation, aussi appelée assignation par anglicisme, est une structure qui permet d'attribuer une valeur à une variable.
Il s'agit d'une structure particulièrement courante en programmation impérative, et dispose souvent pour cette raison d'une notation courte et infixée,
comme ``x = expr`` ou ``x := expr`` ou encore `x <- expr`.
Dans certains langages, le symbole est considéré comme un opérateur d'affectation,
et la structure entière peut alors être utilisée comme une expression.
D'autres langages considèrent une affectation comme une instruction et ne permettent pas cet usage.
Voir aussi :
- Les déclarations de types primitifs et conversions de type
- Les types de base::
Octets (8 bits) byte
Entiers courts (16 bits) short
Entiers (32 bits) int
Entiers longs (64 bits) long
Réels (32 bits) float
Réels longs (64 bits) double
Caractères (16 bits) char
Booléens boolean
- Déclarations par lots::
x1 = e1, x2 = e2, ... xn = en;
Exercices : algorithmes sur les affectations
.. ifconfig:: exercice
**Exercice** : Calculs d'affectation::
Variables A, B, C en Entier
Début
A <- 3
B <- 10
C <- A + B
B <- A + B
A <- C
Fin
.. ifconfig:: correction
**Correction**::
Après La valeur des variables est :
A <- 5 A = 5 B = ?
B <- 2 A = 5 B = 2
A <- B A = 2 B = 2
B <- A A = 2 B = 2
.. ifconfig:: exercice
**Exercice** : Calculs d'affectation
Quelles seront les valeurs des variables A et B après exécution des instructions suivantes ?
::
Variables A, B en Entier
Début
A <- 5
B <- 2
A <- B
B <- A
Fin
.. ifconfig:: correction
**Correction**::
Après La valeur des variables est :
A <- 5 A = 5 B = ?
B <- 2 A = 5 B = 2
A <- B A = 2 B = 2
B <- A A = 2 B = 2
.. ifconfig:: exercice
**Exercice** : écrire un algorithme permettant déchanger les valeurs
de deux variables A et B, et ce quel que soit leur contenu préalable.
.. ifconfig:: correction
**Correction**::
Début
A <- n
B <- p
C <- A
A <- B
B <- C
Fin
Il faut passer par une variable dite temporaire (la variable C)
.. ifconfig:: exercice
**Exercice** :
Que produit lalgorithme suivant ?
::
Variables A, B, C de type entier
Début
A <- 423
B <- 12
C <- A + B
Fin
.. ifconfig:: correction
**Correction** : dans un prompt python
.. code-block:: python
>>> a = 423
>>> b = 12
>>> c = a + b
>>> c
435
.. ifconfig:: exercice
**Exercice** :
Que produit lalgorithme suivant ?
::
Variables A, B, C de type texte
Début
A <- "423"
B <- "12"
C <- A + B
Fin
.. ifconfig:: correction
**Correction** : dans un prompt python
.. code-block:: python
>>> a = '423'
>>> b = '12'
>>> c = a + b
>>> c
'42312'
Interaction avec l'utilisateur
------------------------------
Il est possible de communiquer de la manière suivante avec un programme :
- lire et écrire sur l'entrée/sortie standard
- lire et écrire dans un fichier
- afficher (du texte, un nombre...)
- lire (du texte, un nombre...)
- interagir avec les prompts
.. code-block:: ocaml
let x = read_int () in
let signe =
if x >= 0
then " positif "
else " négatif " in
print_string signe
.. ifconfig:: exercice
**Exercice** : écrire un algorithme qui demande le prénom d'une personne
et renvoie "bonjour, je m'appelle <Prénom>"
.. ifconfig:: correction
**Correction** : (implémentation en python)
.. code-block:: python
# coding: utf-8
prenom = raw_input("quel est ton prénom ? \n")
print("bonjour, je m'appelle " + prenom.capitalize())
La REPL (boucle d'interaction)
-------------------------------
.. glossary::
REPL
Read Eval Print Loop : outil principal de communication avec un programme
ou avec un système. Exemples : la console python, le prompt OCaml.
interface
outil de communication avec un programme.
- interface texte
- interface graphique
**Exemples de REPL**
Le prompt python::
Python 2.7.12 (default, Nov 19 2016, 06:48:10)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> dir()
['__builtins__', '__doc__', '__name__', readline', 'rlcompleter']
>>>
Le prompt ipython::
Python 2.7.12 (default, Nov 19 2016, 06:48:10)
Type "copyright", "credits" or "license" for more information.
IPython 2.4.1 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]:
Le prompt OCaml (utop)::
Type #utop_help for help about using utop.
─( 09:21:24 )─< command 0 >──
utop #
# let x = 1 in x + 2;;
- : int = 3
# let y = 1 + 2;;
val y : int = 3
# y * y;;
- : int = 9
Construire une boucle d'interaction avec l'utilisateur en python::
#!/usr/bin/env python3
error = True
while error:
try:
entier = int(input('donnez un entier : '))
error = False
except:
print('une valeur entiere est attendue')
print(entier)
Lire et écrire dans un fichier
------------------------------
Les descripteurs de fichiers (file handle)
Exemple en python
.. code-block:: python
>>> fh = file("test.txt", "w")
>>> fh.write("un contenu exemple")
>>> fh.close()
>>>
.. code-block:: python
>>> fh.read()
'un contenu exemple'
>>> fh.close()
>>>
Linéarisation (serialisation) de données par exemple en json
.. code-block:: python
import json
data = dict(a='essai', b='essai2', c=range(3))
with open('data.txt', 'w') as outfile:
json.dump(data, outfile)

View File

@ -1,101 +0,0 @@
Travaux Pratiques
=================
.. ifconfig:: exercice
**travaux pratiques :**
Ecrire un algorithme qui renvoie le résultat dune mini-calculatrice. Cette
méthode aura
comme paramètre deux nombres et une chaîne de caractère qui vaudra « + », « -
», « * »,
« / ».
.. ifconfig:: exercice
**travaux pratiques :**
Ecrire un algorithme qui renvoie si deux mots (chaîne de caractères) passés en
paramètre
sont des anagrammes lun de lautre. (Lettres identiques mais dans un ordre
différent)
.. ifconfig:: exercice
**travaux pratiques :**
ascii art (ligne d'étoiles)
Concevoir un algorithme qui, pour un caractère imprimable et un nombre n
donnés, imprime une barre
horizontale de n de ces caractères.
``****************``
2. Modifier lalgorithme pour limpression dune barre double.
::
****************
****************
3. Modifier lalgorithme pour limpression dune barre dépaisseur quelconque
donnée.
4. (optionnel) Transformer les algorithmes ci-dessus en fonctions.
5. Écrire un programme Java implémentant la dernière version de lalgorithme
(épaisseur quelconque).
3.3
Triangle de nombres
Concevoir un algorithme qui imprime pour n donné::
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
...........
.............
...............
1 2 3 4 5 6 ... n
.. ifconfig:: exercice
**travaux pratiques :**
code de césar : faire un programme pour chiffrer et déchiffrer par décalage
exemples : Effectue une rotation de x caractères vers la droite::
>>> print(chiffre('bonjour', 3))
erqmrxu
>>> print(chiffre('Bonjour les amis!', 3))
Erqmrxu ohv dplv!
>>> print(chiffre('Erqmrxu ohv dplv!', 23))
Bonjour les amis!
.. ifconfig:: exercice
**travaux pratiques :**
::
écrire “Entrer un numéro de mois”
mois <- lire
selon que mois est
cas 1 : écrire “janvier (31 jours)”
cas 2 : écrire “février (28 ou 29 jours)”
cas 3 : écrire “mars (31 jours)”
cas 4 : écrire “avril (30 jours)”
cas 5 : écrire “mai (31 jours)”
cas 6 : écrire “juin (30 jours)”
cas 7 : écrire “juillet (31 jours)”
cas 8 : écrire “août (31 jours)”
cas 9 : écrire “septembre (30 jours)”
cas 10 : écrire “octobre (31 jours)”
cas 11 : écrire “novembre (30 jours)”
cas 12 : écrire “décembre (31 jours)”
défaut : écrire “numéro invalide”
fselon

View File

@ -1,47 +0,0 @@
RST = python tools/rst.py
TEXDOCUMENTS = $(basename $(wildcard *.tex))
RSTDOCUMENTS = $(basename $(wildcard *.txt))
SOURCES = $(addsuffix .tex,$(TEXDOCUMENTS))
DVI = $(addsuffix .dvi,$(TEXDOCUMENTS))
POSTSCRIPT = $(addsuffix .ps,$(TEXDOCUMENTS))
POSTSCRIPT_GZ = $(addsuffix .ps.gz,$(TEXDOCUMENTS))
PDF = $(addsuffix .pdf,$(TEXDOCUMENTS))
RSTSOURCES = $(addsuffix .txt,$(RSTDOCUMENTS))
HTML = $(TEXDOCUMENTS) $(addsuffix .html,$(RSTDOCUMENTS))
all: dvi ps ps.gz html
dvi: $(DVI)
ps: $(POSTSCRIPT)
ps.gz: $(POSTSCRIPT_GZ)
pdf: $(PDF)
html: $(HTML)
${DVI}: %.dvi: %.tex
latex $<
latex $<
${POSTSCRIPT}: %.ps: %.dvi
dvips -o $@ $<
${POSTSCRIPT_GZ}: %.ps.gz: %.ps
gzip -c $< > $@
${PDF}: %.pdf: %.tex
rm -f $*.out $*.log $*.aux
xelatex $<
rm -f $*.out $*.log $*.aux
%: %.tex %.dvi
latex2html -local_icons $<
touch $@
%.html: %.txt
$(RST) $< > $@
clean:
rm -f -- *~ *.log *.aux *.out *.nav *.snm *.toc ${DVI} ${POSTSCRIPT} ${POSTSCRIPT_GZ} ${PDF}
rm -fr ${HTML}

View File

@ -1,268 +0,0 @@
\documentclass[ignorenonframetext]{beamer}
\usepackage{graphicx}
% Internal links only wors with second screen on the right
% \setbeameroption{show notes on second screen}
\usetheme{Madrid}
\usecolortheme{dolphin}
% gets rid of bottom navigation bars
\setbeamertemplate{footline}[frame number]{}
% gets rid of navigation symbols
\setbeamertemplate{navigation symbols}{}
%\usetheme{Warsaw}
%\usepackage[french]{babel}
%\usepackage[utf8,utf8x]{inputenc}
%\usepackage[T1]{fontenc}
% Replace babel
\usepackage{polyglossia}
\setdefaultlanguage{french}
%% Require XeTeX
\usepackage{xltxtra}
\usepackage{fontspec}
\usepackage{xunicode}
\logo{
\hspace{120pt}
\includegraphics[width=2cm]{img/cesi.jpg}~
\hspace{113pt}
\includegraphics[width=1cm]{img/logo-cadoles.png}~
}
%%\setbeamertemplate{background}{\includegraphics[width=128mm]{beamer-skel/img/banner01.png}}
\title[]{Algorithmique}
\subtitle{CESI alternance}
\subtitle{promotion GMSI B3}
\author[Gwenaël Rémond]{}
%\institute[E.O.L.E]{\includegraphics[width=2cm]{beamer-skel/img/logo-eole.png}}
\institute[Cadoles]{\includegraphics[width=2cm]{img/cesi.jpg}}
%\date{{\small 8 avril 2013}}
\subject{Talks}
\AtBeginSection[] % Add a TOC with current section highlighted
{
\begin{frame}<beamer>
\frametitle{Plan}
\tableofcontents[currentsection]
\end{frame}
}
\usepackage{hyperref}
\usepackage{hyperxmp}
\hypersetup{%
colorlinks=true,linkcolor=blue,urlcolor=blue,pdfpagemode=UseNone,
pdftitle={EAD3},
pdfsubject={Présentation technique d'EWT},
pdfauthor={EOLE},
pdfkeywords={EOLE, J-EOLE, distribution, GNU, Linux, Éducation,
nationale, Ubuntu},
pdflang={fr-FR},
pdfcopyright={Copyright © 2017 Équipe EOLE <eole@ac-dijon.fr>}, % Require XeTeX
pdflicenseurl={http://creativecommons.org/licenses/by-nc-sa/2.0/fr/},
}
\parskip=0.8em
\begin{document}
\frame{\titlepage}
\section{Introduction}
\begin{frame}
\frametitle{Objectifs}
\texttt{
"Il ne suffit pas d'avoir les mains propres, \\
il faut aussi avoir l'esprit pur."\\
}
\emph{Thalès ; VIe s. av. J.-C.}
\begin{itemize}
\item<1-> maîtriser et concevoir un algorithme,
\item<2-> choisir une représentation appropriée des données,
\item<3-> décomposer en sous-problèmes et affinements successifs,
\item<4-> savoir organiser son code et faire des petits programmes en python.
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{L'art de programmer}
\texttt{GEEK SUBLIME (Vikram CHANDRA)
Une vision esthétique, littéraire, mathématique du codage}
\begin{itemize}
\item<1-> Programmer, c'est abstraire, prendre du recul.
\item<2-> Abstraire, par rapport à quoi ? Par rapport à la machine
\item<3-> Les niveaux d'abstraction par rapport à la machine
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Les langages de programmation}
\begin{itemize}
\item Qu'est-ce qu'un langage de programmation ?
\item Les grands paradigmes de programmation (procédural, objet, fonctionnel, modulaire, générique \dots)
\item L'historique des langages.
\end{itemize}
\end{frame}
\section{Algorithmique}
\begin{frame}
\frametitle{Les algorithmes}
\begin{itemize}
\item définition d'un algorithme
\item implémentation d'un algorithme
\item représentation d'un algorithme dans un langage cible
\end{itemize}
\end{frame}
\section{Algorithmique pour la programmation}
\begin{frame}
\frametitle{Qu'est-ce qu'un programme ?}
\begin{itemize}
\item <1-> Les expressions
\item <2-> Les déclarations
\item <3-> La REPL (Read Eval Print Loop)
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Approche générale des fonctions}
\begin{itemize}
\item Les procédures
\item La portée d'une variable
\item Les fonctions
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Les structures de contrôle}
\begin{itemize}
\item Le branchement conditionnel
\item L'itération
\item \dots
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Les structures de données}
\begin{itemize}
\item Les listes
\item Les dictionnaires
\item Les arbres, les graphes \dots
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{L'état de l'art de l'agorithmique}
\begin{itemize}
\item en mathématiques
\begin{itemize}
\item algorithmique algébrique,
\item arithmétique modulaire,
\item \dots
\end{itemize}
\item en informatique
\begin{itemize}
\item en informatique fondamentale
\item en langages de programmation
\item dans touts les domaines où l'informatique intervient\dots
\end{itemize}
\item en sciences physique, en biologie
\item en sciences sociales (réseaux sociaux, auto-organisation\dots)
\end{itemize}
\end{frame}
\section{Programmation modulaire}
\begin{frame}
\frametitle{La programmation modulaire}
\begin{itemize}
\item La programmation raisonnée
\item Le paradigme modulaire vs le paradigme objet
\item exemple de programmation modulaire en python
\end{itemize}
\end{frame}
% Not present in TOC
\appendix
\begin{frame}[label=thanks]{Remerciements}
Je remercie la communauté du logiciel libre pour tous ces
merveilleux logiciels sans lesquels si peu de choses existeraient.
Cette présentation a été réalisée grâce aux logiciels libres
suivants~:
\begin{itemize}
\item Le système de composition \LaTeX{}
\href{https://fr.wikipedia.org/wiki/TeX_Live}{TeX Live}
\item L'éditeur de texte
\href{http://www.vim.org/}{Vim}
\item L'environnement graphique
\href{http://gnome.org/}{Gnome}
\item Le système d'exploitation
\href{https://debian.org/}{Debian}
\end{itemize}
\begin{center}
% Do not mess with graphics
\hypersetup{hidelinks}
\begin{tabular}{cccccc}
\href{http://www.gnu.org}{\includegraphics[height=1.3cm]{graphics/gnu-head.pdf}} &
\href{http://www.kernel.org}{\includegraphics[height=1.2cm]{graphics/tux.pdf}} &
\href{http://www.debian.org/}{\includegraphics[height=1cm]{graphics/debian.eps}} &
\href{https://fr.wikipedia.org/wiki/TeX_Live}{\includegraphics[height=1cm]{graphics/texlive.pdf}}
\end{tabular}
\end{center}
\end{frame}
\begin{frame}[label=license]{Licence}
Cette présentation est mise à disposition sous licence\\
\href{http://creativecommons.org/licenses/by-sa/4.0}%
{Creative Commons \textsc{by-sa 4.0}}
\begin{columns}[t]
\begin{column}{5.5cm}
\begin{itemize}
\item Attribution
\end{itemize}
\end{column}
\begin{column}{6.5cm}
\begin{itemize}
\item Partage dans les mêmes conditions
\end{itemize}
\end{column}
\end{columns}
Vous pouvez obtenir une copie de la licence
\begin{block}{par Internet}
\href{http://creativecommons.org/licenses/by-nc-sa/4.0}%
{\url{http://creativecommons.org/licenses/by-nc-sa/4.0}}
\end{block}
\begin{block}{par courrier postal}
\begin{quote}
Creative Commons\\
444 Castro Street, Suite 900 Mountain View,\\
California, 94041, USA.
\end{quote}
\end{block}
\end{frame}
\end{document}

View File

@ -1,133 +0,0 @@
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: cairo 1.14.8 (http://cairographics.org)
%%CreationDate: Tue May 16 12:20:58 2017
%%Pages: 1
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%BoundingBox: 0 -1 232 85
%%EndComments
%%BeginProlog
save
50 dict begin
/q { gsave } bind def
/Q { grestore } bind def
/cm { 6 array astore concat } bind def
/w { setlinewidth } bind def
/J { setlinecap } bind def
/j { setlinejoin } bind def
/M { setmiterlimit } bind def
/d { setdash } bind def
/m { moveto } bind def
/l { lineto } bind def
/c { curveto } bind def
/h { closepath } bind def
/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
0 exch rlineto 0 rlineto closepath } bind def
/S { stroke } bind def
/f { fill } bind def
/f* { eofill } bind def
/n { newpath } bind def
/W { clip } bind def
/W* { eoclip } bind def
/BT { } bind def
/ET { } bind def
/pdfmark where { pop globaldict /?pdfmark /exec load put }
{ globaldict begin /?pdfmark /pop load def /pdfmark
/cleartomark load def end } ifelse
/BDC { mark 3 1 roll /BDC pdfmark } bind def
/EMC { mark /EMC pdfmark } bind def
/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
/Tj { show currentpoint cairo_store_point } bind def
/TJ {
{
dup
type /stringtype eq
{ show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
} forall
currentpoint cairo_store_point
} bind def
/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
/Tf { pop /cairo_font exch def /cairo_font_matrix where
{ pop cairo_selectfont } if } bind def
/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
/cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
/cairo_font where { pop cairo_selectfont } if } bind def
/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
/g { setgray } bind def
/rg { setrgbcolor } bind def
/d1 { setcachedevice } bind def
%%EndProlog
%%BeginSetup
%%EndSetup
%%Page: 1 1
%%BeginPageSetup
%%PageBoundingBox: 0 -1 232 85
%%EndPageSetup
q 0 -1 232 86 rectclip q
0.290196 0.247059 0.454902 rg
133.668 16.757 m 133.668 16.757 133.25 1.257 148.941 1.257 c 176.328 1.257
l 170.723 3.749 168.633 5.874 164.891 10.585 c 150.969 10.585 l 147.234
10.585 145.441 13.222 145.441 17.538 c 145.441 17.538 145.492 75.363 145.414
75.445 c 142.301 82.999 133.668 84.519 133.668 84.519 c 133.668 83.995
133.676 39.347 133.668 16.757 c h
133.668 16.757 m f
41.039 38.73 m 41.207 38.808 41.25 38.921 41.457 39.109 c 41.5 40.347 41.375
41.511 41.164 42.823 c 40.625 46.238 40.664 49.726 41.207 53.07 c 41.125
53.214 l 41.043 53.366 40.914 53.405 40.914 53.405 c 40.664 53.48 40.414
53.554 40.121 53.515 c 35.613 53.366 31.141 52.577 26.758 51.265 c 24.457
50.702 22.16 50.14 19.863 49.577 c 17.984 49.015 16.688 48.152 15.812 46.913
c 16.062 46.839 16.145 46.691 16.23 46.538 c 16.48 46.464 l 16.395 46.238
l 15.98 45.863 15.812 45.409 15.895 44.886 c 15.977 44.738 16.105 44.698
16.188 44.55 c 16.523 44.327 16.859 44.101 17.062 43.909 c 17.234 43.988
17.234 43.988 17.355 43.952 c 17.523 44.027 17.816 44.062 18.023 44.249
c 18.316 44.288 18.445 44.249 18.57 44.21 c 24.836 43.464 30.973 41.999
37.027 39.933 c 37.152 39.894 37.281 39.855 37.242 39.749 c 37.324 39.597
37.449 39.558 37.406 39.445 c 37.91 39.296 l 38.91 38.995 39.785 38.734
40.75 38.698 c 40.914 38.769 40.914 38.769 41.039 38.73 c 39.117 40.687
m 38.117 40.988 l 39.078 40.948 l 39.16 40.796 39.117 40.687 39.117 40.687
c f
49.855 72.859 m 49.855 72.859 54.316 79.749 63.262 84.269 c 13.684 84.269
l 0.484 84.269 0.527 73.152 0.527 73.152 c 0.527 17.499 l 0.527 17.499
0.117 1.984 15.809 1.984 c 64.07 1.984 l 58.465 4.472 54.559 8.597 50.816
13.308 c 50.816 13.308 15.844 13.296 15.891 13.308 c 11.449 13.308 12.086
17.542 12.086 17.542 c 12.156 69.034 l 12.156 73.109 15.902 72.859 15.902
72.859 c f
69.723 45.148 m 69.723 45.148 66.891 28.866 79.219 23.05 c 84.949 20.351
89.504 19.945 95.855 22.363 c 99.852 23.882 103.457 27.659 104.977 31.769
c 106.496 35.878 105.191 40.874 101.199 44.757 c 99.793 38.538 98.297 33.53
92.91 30.741 c 89.711 29.116 86.457 29.386 83.211 30.995 c 79.961 32.605
77.473 36.48 76.484 40.363 c 76.484 40.363 74.473 47.585 82.195 59.417
c 75.809 56.718 70.875 52.245 69.723 45.148 c h
69.723 45.148 m f
0.945098 0.792157 0.0745098 rg
110.621 8.773 m 117.836 13.503 123.312 20.792 125.211 30.261 c 125.238
30.429 l 126.707 37.968 125.305 45.933 121.43 52.601 c 117.527 59.308 110.711
64.777 102.098 65.82 c 102.074 65.831 l 96.797 66.464 90.988 64.273 86.93
60.507 c 82.406 55.163 80.273 51.816 80.387 44.03 c 84.254 49.132 94.043
54.202 100.949 53.523 c 105.414 52.984 108.629 50.445 110.898 46.542 c
113.168 42.636 114.066 37.445 113.184 33.058 c 110.383 19.085 94.641 12.073
81.125 15.976 c 62.398 21.382 55.426 40.464 63.086 58.038 c 72.824 73.859
90.422 80.905 113.074 77.519 c 105.887 85.03 93.703 83.984 93.703 83.984
c 82.363 84.874 61.398 78.519 53.613 63.808 c 42.234 42.316 52.059 11.566
78.055 4.062 c 89.188 0.847 101.344 2.695 110.621 8.777 c h
110.621 8.773 m f
0.290196 0.247059 0.454902 rg
194.387 67.495 m 185.594 67.495 178.215 64.179 172.285 57.597 c 166.355
51.011 164.41 42.503 164.41 32.046 c 164.41 20.98 166.184 15.999 171.609
9.894 c 180.992 -1.075 203.68 1.32 210.367 1.402 c 217.055 1.484 219.438
1.644 231.012 0.57 c 228.027 5.839 220.824 9.495 218.348 10.011 c 206.766
12.195 193.328 8.179 181.414 15.484 c 176.691 19.57 175.734 22.14 175.559
29.62 c 223.012 29.62 l 223.012 35.269 l 223.012 45.374 219.598 53.257
214.785 58.945 c 208.164 64.816 201.25 67.409 194.387 67.495 c h
194.184 58.421 m 199.434 58.421 203.531 56.702 206.484 53.245 c 209.438
49.788 211.941 44.956 211.984 38.745 c 175.684 38.745 l 175.715 44.808
177.715 49.339 181.262 52.972 c 184.805 56.601 189.109 58.421 194.184 58.421
c h
194.184 58.421 m f
Q Q
showpage
%%Trailer
end restore
%%EOF

View File

@ -1,1277 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg3118"
version="1.1"
inkscape:version="0.92.1 r15371"
width="308.26666"
height="113.06667"
xml:space="preserve"
sodipodi:docname="Logo EOLE.svg"><metadata
id="metadata3124"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs3122"><marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"><path
id="path4626"
d="M -10.666667,0 -14.933333,4.2666667 0,0 -14.933333,-4.2666667 Z"
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.85333335pt"
inkscape:connector-curvature="0" /></marker><linearGradient
id="linearGradient4664"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4666" /></linearGradient><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3132"><path
d="M 0,600 H 800 V 0 H 0 Z"
id="path3134"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3248"><path
d="M 205.131,405.857 H 559.926 V 579.858 H 205.131 Z"
id="path3250"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3260"><path
d="M 0,600 H 800 V 0 H 0 Z"
id="path3262"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3288"><path
d="M 205.131,405.857 H 559.926 V 579.858 H 205.131 Z"
id="path3290"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3304"><path
d="M 0,600 H 800 V 0 H 0 Z"
id="path3306"
inkscape:connector-curvature="0" /></clipPath><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664"
id="linearGradient4668"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientUnits="userSpaceOnUse" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664"
id="linearGradient4676"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9"
id="linearGradient4668-8"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientUnits="userSpaceOnUse" /><linearGradient
id="linearGradient4664-9"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4666-6" /></linearGradient><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9"
id="linearGradient4676-2"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
id="linearGradient4706"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4708" /></linearGradient><linearGradient
id="linearGradient4711"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4713" /></linearGradient><linearGradient
id="linearGradient4716"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4718" /></linearGradient><linearGradient
id="linearGradient4721"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4723" /></linearGradient><linearGradient
id="linearGradient4726"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4728" /></linearGradient><linearGradient
id="linearGradient4731"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4733" /></linearGradient><linearGradient
id="linearGradient4736"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4738" /></linearGradient><linearGradient
id="linearGradient4741"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4743" /></linearGradient><linearGradient
id="linearGradient4746"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4748" /></linearGradient><linearGradient
id="linearGradient4751"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4753" /></linearGradient><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9"
id="linearGradient4880"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9"
id="linearGradient4896"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient4896-1"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
id="linearGradient4664-9-8"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4666-6-7" /></linearGradient><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient4880-2"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
id="linearGradient5022"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5024" /></linearGradient><linearGradient
id="linearGradient5027"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5029" /></linearGradient><linearGradient
id="linearGradient5032"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5034" /></linearGradient><linearGradient
id="linearGradient5037"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5039" /></linearGradient><linearGradient
id="linearGradient5042"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5044" /></linearGradient><linearGradient
id="linearGradient5047"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5049" /></linearGradient><linearGradient
id="linearGradient5052"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5054" /></linearGradient><linearGradient
id="linearGradient5057"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5059" /></linearGradient><linearGradient
id="linearGradient5062"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5064" /></linearGradient><linearGradient
id="linearGradient5067"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5069" /></linearGradient><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient5090"
xlink:href="#linearGradient4664-9-8"
inkscape:collect="always" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3289"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3291"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3293"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3309"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3315"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3318"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3321"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3324"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3327"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3330"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3337"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3341"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3345"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3349"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3353"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3357"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3361"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3375"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3377"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3379"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3381"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3383"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3385"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3387"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3389"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3391"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3393"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3396"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3399"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3402"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3405"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3408"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3411"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3414"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3432"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3434"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3436"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3440"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.43531,-541.69844)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3445"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.43531,-541.69844)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-5"
id="linearGradient4896-6"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
id="linearGradient4664-9-5"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4666-6-3" /></linearGradient><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-5"
id="linearGradient4880-3"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
id="linearGradient3288"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3290" /></linearGradient><linearGradient
id="linearGradient3293-8"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3295" /></linearGradient><linearGradient
id="linearGradient3298"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3300" /></linearGradient><linearGradient
id="linearGradient3303"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3305" /></linearGradient><linearGradient
id="linearGradient3308"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3310" /></linearGradient><linearGradient
id="linearGradient3313"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3315" /></linearGradient><linearGradient
id="linearGradient3318-7"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3320" /></linearGradient><linearGradient
id="linearGradient3323"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3325" /></linearGradient><linearGradient
id="linearGradient3328"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3330" /></linearGradient><linearGradient
id="linearGradient3333"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3335" /></linearGradient><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient3363"
xlink:href="#linearGradient4664-9-5"
inkscape:collect="always" /><marker
style="overflow:visible"
id="Arrow1Lend-7"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"><path
inkscape:connector-curvature="0"
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.85333335pt"
d="M -10.666667,0 -14.933333,4.2666667 0,0 -14.933333,-4.2666667 Z"
id="path4626-5" /></marker><clipPath
id="clipPath3132-0"
clipPathUnits="userSpaceOnUse"><path
inkscape:connector-curvature="0"
id="path3134-4"
d="M 0,600 H 800 V 0 H 0 Z" /></clipPath><clipPath
id="clipPath3248-3"
clipPathUnits="userSpaceOnUse"><path
inkscape:connector-curvature="0"
id="path3250-5"
d="M 205.131,405.857 H 559.926 V 579.858 H 205.131 Z" /></clipPath><clipPath
id="clipPath3260-7"
clipPathUnits="userSpaceOnUse"><path
inkscape:connector-curvature="0"
id="path3262-3"
d="M 0,600 H 800 V 0 H 0 Z" /></clipPath><clipPath
id="clipPath3288-4"
clipPathUnits="userSpaceOnUse"><path
inkscape:connector-curvature="0"
id="path3290-0"
d="M 205.131,405.857 H 559.926 V 579.858 H 205.131 Z" /></clipPath><clipPath
id="clipPath3304-6"
clipPathUnits="userSpaceOnUse"><path
inkscape:connector-curvature="0"
id="path3306-1"
d="M 0,600 H 800 V 0 H 0 Z" /></clipPath><linearGradient
gradientUnits="userSpaceOnUse"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
id="linearGradient4759"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4761"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4763"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4765"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4767"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4769"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664"
id="linearGradient4771"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4773"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4775"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4777"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4779"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4781"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4783"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4785"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4787"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4789"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4791"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4793"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4795"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4797"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4799"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4801"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4803"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4805"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4807"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4809"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4811"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4813"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4815"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4817"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4819"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4821"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4823"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4825"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4827"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4829"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4831"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4833"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4835"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4837"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4839"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4841"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4843"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4845"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.43531,-541.69844)"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4847"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.43531,-541.69844)"
gradientUnits="userSpaceOnUse"
id="linearGradient4849"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4851"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664"
id="linearGradient4853"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /></defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1678"
inkscape:window-height="1028"
id="namedview3120"
showgrid="false"
inkscape:zoom="2"
inkscape:cx="234.31834"
inkscape:cy="117.22431"
inkscape:window-x="0"
inkscape:window-y="20"
inkscape:window-maximized="1"
inkscape:current-layer="g3126"
inkscape:snap-bbox="false"
inkscape:object-paths="true"
inkscape:snap-global="false" /><g
id="g3126"
inkscape:groupmode="layer"
inkscape:label="logoeole1"
transform="matrix(1.25,0,0,-1.25,0,113.06667)"><g
id="layer1-0"
inkscape:label="bateau"
transform="matrix(0.8,0,0,-0.8,3263.1972,1017.0386)" /><flowRoot
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.23999977px;line-height:0.01%;font-family:COUTURE;-inkscape-font-specification:'COUTURE Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.85333335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="flowRoot4297-1"
xml:space="preserve"><flowRegion
id="flowRegion4299-9"
style="stroke-width:0.85333335px"><rect
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:122.87999725px;font-family:COUTURE;-inkscape-font-specification:'COUTURE Bold';stroke-width:0.72817779px"
y="645.2547"
x="5058.6104"
height="354.98666"
width="928.4267"
id="rect4301-6"
transform="scale(1,-1)" /></flowRegion><flowPara
id="flowPara4303-0"
style="font-size:122.87999725px;line-height:1.25;stroke-width:0.85333335px"> </flowPara></flowRoot><flowRoot
style="font-style:normal;font-weight:normal;font-size:10.23999977px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.85333335"
id="flowRoot3677-9"
xml:space="preserve"><flowRegion
id="flowRegion3679-9"
style="font-family:sans-serif;stroke-width:0.85333335"><rect
y="-627.65375"
x="5665.9272"
height="85.68248"
width="658.91034"
id="rect3681-4"
style="font-family:sans-serif;stroke-width:0.72817779"
transform="scale(1,-1)" /></flowRegion><flowPara
id="flowPara3683-3"
style="font-size:34.13333511px;line-height:1.25;font-family:sans-serif;stroke-width:0.85333335"> </flowPara></flowRoot><flowRoot
style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="flowRoot4653-0"
xml:space="preserve"><flowRegion
id="flowRegion4655-9"
style="font-family:sans-serif;stroke-width:1.06666672px"><rect
y="331.22806"
x="4741.1704"
height="300.37335"
width="348.16"
id="rect4657-1"
transform="scale(1,-1)"
style="font-family:sans-serif;stroke-width:1.13777781px" /></flowRegion><flowPara
id="flowPara4659-0"
style="font-size:34.13333511px;line-height:1.25;font-family:sans-serif;stroke-width:1.06666672px"> </flowPara></flowRoot><g
id="g5567"
transform="translate(-81.066665,-29.439999)"><path
sodipodi:nodetypes="csccccccc"
inkscape:connector-curvature="0"
id="path3238-6-5-8-3-3-8-2-2-0-1-4-0-3-3-0-0-1-3-0-9-0-0-8-1-9"
d="m 223.64477,47.315777 c 0,0 -0.44523,-16.533333 16.29322,-16.533333 h 29.21227 c -5.98037,2.657493 -8.20768,4.9232 -12.19893,9.946666 h -14.85334 c -3.98336,0 -5.89333,2.812907 -5.89333,7.417494 0,0 0.0533,61.678716 -0.0299,61.769596 -3.31946,8.0543 -12.53045,9.67808 -12.53024,9.67808 3.2e-4,-0.56032 0.0107,-48.185703 2.2e-4,-72.278503 z"
style="fill:#4a3f74;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.06666672" /><g
id="g3276-4-2-8-2-4-8-6-2-1"
transform="matrix(-0.24101235,-0.49825763,0.72298939,-0.16609682,125.97693,71.485057)"
style="fill:#4a3f74;fill-opacity:1"><path
d="M 1.7934243,-0.96970754 C 1.5691998,-0.79961828 1.3331053,-0.8164976 0.87787922,-0.65822353 -1.5218484,-1.3975491 -3.7083721,-2.3133919 -6.1451141,-3.4323038 -12.488224,-6.3457762 -19.225905,-8.5326385 -25.903247,-9.9575472 l -0.247882,-0.2029018 c -0.25648,-0.208217 -0.273442,-0.400249 -0.273442,-0.400249 -0.03366,-0.381227 -0.06736,-0.762456 0.138575,-1.126553 2.283231,-5.891302 5.781359,-11.321624 10.249609,-16.300951 2.100325,-2.689577 4.204242,-5.37796 6.306738,-8.069263 1.9162051,-2.131222 4.1509802,-3.29873 6.9218717,-3.669328 0.033842,0.38312 0.2866489,0.589194 0.542211,0.800166 l 0.033341,0.377443 0.4698516,0.0336 c 0.90753081,-0.310177 1.85073987,-0.242743 2.8272897,0.202131 0.2526397,0.204184 0.2699367,0.4 0.5180682,0.60574 0.2831425,0.588942 0.5687898,1.179944 0.8453212,1.575714 -0.2263115,0.172761 -0.2263115,0.172761 -0.2095992,0.361956 -0.2179629,0.175237 -0.4171267,0.536997 -0.8678447,0.693713 -0.2045063,0.36702 -0.1874599,0.559997 -0.1708311,0.748247 -1.33185938,8.799057 -1.22651547,17.893566 0.074677,27.2596895 0.016798,0.1901409 0.033847,0.3831197 0.2594176,0.3992467 0.2552276,0.2071871 0.2721071,0.3982738 0.5082015,0.4151532 l 0.067266,0.7615089 c 0.1344498,1.5220696 0.2521035,2.8540008 -0.1044352,4.15579 -0.2086962,0.1749594 -0.2086962,0.1749594 -0.1917332,0.3669921 m -2.9158252,-3.8077224 -0.1346165,-1.5239637 -0.3531155,1.301094 c 0.256313,0.2063246 0.4877324,0.2228697 0.4877324,0.2228697"
style="fill:#4a3f74;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.06666672"
id="path3278-9-83-5-1-8-0-7-4-9"
inkscape:connector-curvature="0" /></g><path
inkscape:connector-curvature="0"
id="path4310-6-3-5-4-1-7-1-6-2-5-3-5-0-5-9"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:144px;line-height:125%;font-family:COUTURE;-inkscape-font-specification:'COUTURE Bold';letter-spacing:0px;word-spacing:0px;fill:#4a3f74;fill-opacity:1;stroke:none;stroke-width:1.06666672"
d="m 134.24391,107.15482 c 0,0 4.75958,7.35189 14.30219,12.17301 H 95.663964 c -14.080107,0 -14.036267,-11.86123 -14.036267,-11.86123 V 48.10415 c 0,0 -0.435413,-16.550293 16.303147,-16.550293 h 51.477446 c -5.98027,2.6576 -10.14496,7.057813 -14.13611,12.081173 0,0 -37.304323,-0.01067 -37.25547,0 -4.73792,0 -4.057706,4.517867 -4.057706,4.517867 l 0.07467,54.922883 c 0,4.34826 3.99584,4.07904 3.99584,4.07904"
sodipodi:nodetypes="cccccccccccc" /><g
transform="matrix(0.81587728,0,0,-0.81587728,-701.65987,1291.3573)"
id="g3550-3-3-6-3-7-9-3-8-0-2-8-8-4-4"><g
transform="translate(-43.249218,364.84503)"
id="g3586-3-0-0-2-0-8-5-9-6-2-3-7-1-7"><g
transform="matrix(1.0404262,0,0,1.0404262,-71.883772,-41.905465)"
id="g3402-8-5-9-6-1"><path
sodipodi:nodetypes="csssccsccc"
inkscape:connector-curvature="0"
id="path3359-6-74-0-1-9-6-9-6-3-7-6-2-3-6-2-7"
d="m 1120.3633,1119.4763 c 0,0 -3.5568,20.4619 11.9327,27.768 7.2005,3.396 12.9255,3.904 20.905,0.8664 5.0224,-1.9118 9.552,-6.6569 11.4611,-11.8215 1.9093,-5.1645 0.2732,-11.4417 -4.7449,-16.3195 -1.7695,7.8156 -3.6493,14.1069 -10.416,17.611 -4.0225,2.0444 -8.111,1.7045 -12.1907,-0.318 -4.0796,-2.0228 -7.2085,-6.8927 -8.4528,-11.7715 0,0 -2.5254,-9.0737 7.1765,-23.942 -8.0225,3.3894 -14.2234,9.009 -15.6709,17.9271 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#4a3f74;fill-opacity:1;stroke:none;stroke-width:23.74341393;marker:none;enable-background:accumulate" /><path
sodipodi:nodetypes="cccscccccssscccsscc"
inkscape:connector-curvature="0"
id="path3359-8-8-4-6-7-8-1-6-3-1-1-8-8-2-0-1-1"
d="m 1171.7557,1165.1847 c 9.0667,-5.9443 15.9456,-15.1034 18.3323,-26.9986 l 0.036,-0.2122 c 1.845,-9.4715 0.083,-19.4824 -4.7861,-27.8592 -4.9017,-8.4311 -13.4688,-15.3007 -24.2922,-16.6144 l -0.031,-0.011 c -6.6322,-0.7981 -13.9274,1.959 -19.0297,6.6892 -5.6838,6.7137 -8.3619,10.9192 -8.2233,20.7045 4.8592,-6.4111 17.1623,-12.7819 25.8393,-11.9272 5.6097,0.6749 9.6503,3.8646 12.5032,8.7716 2.8528,4.907 3.9787,11.4322 2.8727,16.9447 -3.5229,17.5582 -23.303,26.3651 -40.2867,21.4627 -23.5286,-6.7915 -32.2906,-30.7698 -22.6684,-52.8538 12.2398,-19.8825 34.3524,-28.7354 62.8183,-24.4779 -9.0335,-9.4406 -24.345,-8.1228 -24.345,-8.1228 -14.2495,-1.1222 -40.5898,6.8652 -50.3766,25.3512 -14.2965,27.0046 -1.9507,65.6469 30.7149,75.076 13.991,4.0384 29.2641,1.7151 40.9212,-5.9275 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#f1ca13;fill-opacity:1;stroke:none;stroke-width:23.74341393;marker:none;enable-background:accumulate" /></g></g></g><g
transform="matrix(0.84351752,-0.54896555,0.51910062,0.8920468,307.56423,30.76431)"
id="g3240-2-1-4-4-7-8-0-7-9-2-5-6-9-2-7-6"><path
sodipodi:nodetypes="ccsczcccccsccscccss"
inkscape:connector-curvature="0"
id="path3242-2-6-6-9-6-6-7-4-5-2-2-3-5-0-0-6"
d="M -51.831427,47.326395 C -59.895364,42.363849 -64.893573,35.32236 -66.817364,26.26606 -68.739856,17.209458 -65.984036,8.7300195 -60.40346,-0.33818968 -54.49654,-9.9366965 -50.210652,-13.255154 -41.97748,-15.484843 -27.515019,-19.70367 -7.9836824,-4.8218392 -1.8943856,-0.97576512 4.1949112,2.8703089 6.2927392,4.3529194 17.480784,9.9551429 11.932455,12.839158 3.3756816,11.947763 0.82595055,10.996623 -10.961104,6.3524792 -21.140137,-4.7136447 -35.966514,-5.1033549 c -6.512982,0.8784234 -8.76316,2.5650242 -12.915824,8.9552297 l 43.5206803,26.7826232 -3.0155866,4.900207 c -5.3936837,8.764517 -12.7311517,13.673383 -20.1799837,15.890713 -9.204896,1.353089 -16.931596,-0.298964 -23.274199,-4.099023 z m 4.660181,-7.983573 c 4.814882,2.963078 9.488296,3.783934 14.043484,2.454391 4.551634,-1.331826 9.427718,-4.109627 12.783662,-9.471337 L -53.638108,11.836745 c -3.208293,5.274169 -3.790195,10.333683 -2.479019,15.483935 1.312201,5.148586 4.29059,9.157276 8.945881,12.022142 z"
style="fill:#4a3f74;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.83779979" /></g></g></g><g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="bateau"
transform="translate(0,-1486.9333)" /><g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Calque1"
transform="translate(0,-1486.9333)"><flowRoot
xml:space="preserve"
id="flowRoot4297"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0.01%;font-family:COUTURE;-inkscape-font-specification:'COUTURE Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"><flowRegion
id="flowRegion4299"
style="stroke-width:1.06666672px"><rect
id="rect4301"
width="1160.5333"
height="443.73334"
x="2244.2666"
y="2077.8667"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:153.6000061px;font-family:COUTURE;-inkscape-font-specification:'COUTURE Bold';stroke-width:1.13777781px" /></flowRegion><flowPara
id="flowPara4303"
style="font-size:153.6000061px;line-height:1.25;stroke-width:1.06666672px"> </flowPara></flowRoot><flowRoot
xml:space="preserve"
id="flowRoot3677"
style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion
id="flowRegion3679"
style="font-family:sans-serif;stroke-width:1.06666672"><rect
id="rect3681"
width="823.63794"
height="107.1031"
x="3003.4126"
y="486.73111"
style="font-family:sans-serif;stroke-width:1.13777781" /></flowRegion><flowPara
id="flowPara3683"
style="font-size:42.66666794px;line-height:1.25;font-family:sans-serif;stroke-width:1.06666672"> </flowPara></flowRoot><flowRoot
xml:space="preserve"
id="flowRoot4653"
style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"><flowRegion
id="flowRegion4655"
style="font-family:sans-serif;stroke-width:1.06666672px"><rect
id="rect4657"
width="435.20001"
height="375.46667"
x="1847.4667"
y="1685.3334"
style="font-family:sans-serif;stroke-width:1.13777781px" /></flowRegion><flowPara
id="flowPara4659"
style="font-size:42.66666794px;line-height:1.25;font-family:sans-serif;stroke-width:1.06666672px"> </flowPara></flowRoot><g
transform="matrix(3.7418697,0,0,3.7418697,-7508.261,-6259.3333)"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#4a3f74;fill-opacity:1;stroke:none"
id="flowRoot3442" /></g></svg>

Before

Width:  |  Height:  |  Size: 53 KiB

View File

@ -1,318 +0,0 @@
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: cairo 1.14.8 (http://cairographics.org)
%%CreationDate: Tue May 16 12:15:46 2017
%%Pages: 1
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%BoundingBox: 0 -1 1660 851
%%EndComments
%%BeginProlog
save
50 dict begin
/q { gsave } bind def
/Q { grestore } bind def
/cm { 6 array astore concat } bind def
/w { setlinewidth } bind def
/J { setlinecap } bind def
/j { setlinejoin } bind def
/M { setmiterlimit } bind def
/d { setdash } bind def
/m { moveto } bind def
/l { lineto } bind def
/c { curveto } bind def
/h { closepath } bind def
/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
0 exch rlineto 0 rlineto closepath } bind def
/S { stroke } bind def
/f { fill } bind def
/f* { eofill } bind def
/n { newpath } bind def
/W { clip } bind def
/W* { eoclip } bind def
/BT { } bind def
/ET { } bind def
/pdfmark where { pop globaldict /?pdfmark /exec load put }
{ globaldict begin /?pdfmark /pop load def /pdfmark
/cleartomark load def end } ifelse
/BDC { mark 3 1 roll /BDC pdfmark } bind def
/EMC { mark /EMC pdfmark } bind def
/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
/Tj { show currentpoint cairo_store_point } bind def
/TJ {
{
dup
type /stringtype eq
{ show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
} forall
currentpoint cairo_store_point
} bind def
/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
/Tf { pop /cairo_font exch def /cairo_font_matrix where
{ pop cairo_selectfont } if } bind def
/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
/cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
/cairo_font where { pop cairo_selectfont } if } bind def
/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
/g { setgray } bind def
/rg { setrgbcolor } bind def
/d1 { setcachedevice } bind def
%%EndProlog
%%BeginSetup
%%BeginResource: font DejaVuSans-Bold
11 dict begin
/FontType 42 def
/FontName /DejaVuSans-Bold def
/PaintType 0 def
/FontMatrix [ 1 0 0 1 0 0 ] def
/FontBBox [ 0 0 0 0 ] def
/Encoding 256 array def
0 1 255 { Encoding exch /.notdef put } for
Encoding 32 /space put
/CharStrings 2 dict dup begin
/.notdef 0 def
/space 1 def
end readonly def
/sfnts [
<000100000009008000030010637674203eb93108000000e8000002546670676d5b026bf00000
033c000000ac676c7966e2f9cb840000009c0000004c686561640e24be09000003e800000036
686865610eaf07730000042000000024686d74780796006600000444000000086c6f63610000
00980000044c0000000c6d6178700647062d0000045800000020707265707c61a2e700000478
000007a700020066fe96046605a400030007001fbc00040126000000060126b6010805890204
002fc4d4ec310010d4ecd4ec301311211125211121660400fc73031bfce5fe96070ef8f27206
2900000001660133016600bc00e90000013d00a200fa031f00020002006601660002000200ac
015400ec00bc006201660181048501540166016d04a400020166007f04cd0000000201330062
00710000002504a401bc00ba00e500660181018d0548055a0166016d000000000002000200f6
05c301f0053902390058046d043d04b2048104b2016601750466048100b00466043902d1049c
047b04cf047b005801330166014c0166014c000200ac009a014a0123009a029a014401190144
02cd00c100000166013f019a013b05cb05cb00d500d5015000ac00ac0077020a01c701f2012f
015801b2012300f600f6011f012f0135023501ee01e70133009800d10358050a009a008f0112
009800bc00cd00e500e500f2007304000166008f05d5022b05d500c300e100d700e50000006a
01020000001d032d05d505d505f000a8006a00ec00e1010205d506140721046602f800ec0183
02a602f80123010201020112011f031f005e03cd046004c7048900ec01bc00ba01020333031f
03420333035c0112011f05d5019a009a00e106660179046004600460047b000000ec02c302b8
02cd00be00dd00d50000006a025c027b029a00dd01ae01ba01120000008501ae04600762041b
009a069a045800ee009a029a00d102cd019a015005cb05cb008b008b063100f6040600f0034c
016004a800c10000002505c101000121074a06120096014a078300a800000337007b00140000
00c9010005c105c105c105c101000108061d00960427039e00ec0102027d0133009800d10358
017900cd02390362009c009c009c009301b8009300b80073000014000326b707060504030201
002c2010b002254964b040515820c859212d2cb002254964b040515820c859212d2c20100720
b00050b00d7920b8ffff5058041b0559b0051cb0032508b0042523e120b00050b00d7920b8ff
ff5058041b0559b0051cb0032508e12d2c4b505820b80128454459212d2cb002254560442d2c
4b5358b00225b0022545445921212d2c45442d2cb00225b0022549b00525b005254960b02063
68208a108a233a8a10653a2d0001000000025eb8b54203fc5f0f3cf5001f080000000000d3d9
0a2000000000d3d90a20f772fcae0fcd096500010008000000010000000000010000076dfe1d
00001021f772f9320fcd00010000000000000000000000000000000204cd006602c900000000
00000000004c0000004c000100000002034e002b0078000c0002001000400008000005ed0221
0008000441840280012600fe000301250011000301240121003a0005012400fa000301230016
000301220121003a0005012200fe00030121003a0003012000fa0003011f00bb0003011e0064
0003011d00fe0003011c00190003011b001e0003011a00fe0003011900fe0003011800fe0003
011700fe0003011600fe000301150114000e0005011500fe00030114000e0003011300fe0003
011200fe0003010f010e007d0005010f00fe0003010e007d0003010d010c008c0005010d00fe
0003010d00c00004010c010b00590005010c008c0003010c00800004010b010a00260005010b
00590003010b00400004010a00260003010900fe0003010800fe00030107000c000301070080
00040106b2972e054113010600fa0003010500fa0003010400fe0003010300190003010200fa
0003010100fa0003010040ff7d03ff3e03fefe03fcfb2c05fcfe03fb2c03fafe03f9f84705f9
7d03f84703f7fa03f6fe03f5fe03f4fe03f3bb03f2fe03f1fe03f0fe03ef1e03eefe03edec0a
05edfe03ec0a03ec4004ebea0a05eb3203ea0a03e9fa03e8911605e8fe03e7fa03e6fa03e591
1605e5fe03e4fe03e3fe03e2fe03e1fe03e0fe03dffe03defa03dddc1805dd6403dc1803dba0
1e05db6403dad92505dafa03d92503d8d12505d8fa03d7d61405d71603d6d51005d61403d510
03d4d30b05d42003d30b03d2d12505d2fa03d1911605d12503d0940c05d02303cfce1405cf26
03cecd1205ce1403cd1203cc911605cc1d03cb1403cac9bb05cafe03c9c85d05c9bb03c98004
c840ffc72505c85d03c84004c72503c6fe03c56403c4901005c4fe03c31c03c2fe03c1fe03c0
bf3a05c0fa03bfad1b05bf3a03bebd1a05be3203bdbc1105bd1a03bcbb0f05bc1103bbba0c05
bb0f03ba0c03b9911605b9fe03b8fe03b71503b61203b5fe03b4fe03b3fe03b21703b11903b0
1603afad1b05affa03aead1b05aefa03ad911605ad1b03ac911605ac7d03abfe03aa2603a9fe
03a8fe03a7fe03a6fe03a50a03a4fe03a3a20e05a3fe03a20e03a24004a1a01e05a1fa03a091
1605a01e039f9116059ffa039e940c059e1c039dfe039c9bbb059cfe039b9a5d059bbb039b80
049a8f25059a5d039a400499fe0398972e0598fe03972e0396911605961e40ff0395940c0595
2003940c0393911605934b039291160592fe03919010059116039010038f25038efe038dfe03
8cfe038bfe038afe0389fe038887250588fe0387250386fe0385fe0384320383960382fe0381
fe038019037f0a037efe037dfe037cfe037bfa037afa0379fe037776a60577fe0376a6037574
1b0575fa03741b0373fa03727d0371fe03706f2c056f2c036efa036dfa036cfa036bfe036afe
0369fe0368630c0568320367fe0366320365640a0565fe03640a0364400463620a05630c0362
0a0361601505619603600111056015035f0a035efe035dfe035c0111055cfe035b5a1b055bfe
035a0111055a1b0359fe0358fa0357fe035601110540ff56fe0355fe03541e03531403525119
0552fa0351011105511903504f190550fa034f4e11054f19034e11034d1e034c4b14054c1503
4b4a11054b14034a490e054a1103490e0348fa034746140547150346140345fa0344430e0544
0f03430e034241250542fa0341011105412503403f0f0540fe033f3e0e053f0f033e0e033d3c
0d053d16033c0d033b64033afe0339140338fe0337130336351a0536250335341405351a0335
c004340a0d0534140334800433320c05331403334004320c033130a60531fe033001110530a6
032f0c032e13032d2c3a052dfa032c1525052c3a032b64032a640329fe032815032717110527
1e03262003251e0324231105402b241e0323110322000d0522fa03210f032140042014031f0a
031e1e031d1c19051d25031c0f13051c19031cb801004091041b0d031a194b051a7d03190111
05194b0318fe031711031615250516fa031501110515250314640313110312fe031101110511
fe031064030f0e10050f13030fc0040e10030e80040d0111050dfa030c32030b0a0d050b1603
0b80040a0d030a400409fe0308fe0307fe0306050a0506fe03050a0305400404fa0303640302
01110502fe0301000d05011103000d0301b80164858d012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b002b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b1d0000>
] def
/f-0-0 currentdict end definefont pop
%%EndResource
%%BeginResource: font DejaVuSans
11 dict begin
/FontType 42 def
/FontName /DejaVuSans def
/PaintType 0 def
/FontMatrix [ 1 0 0 1 0 0 ] def
/FontBBox [ 0 0 0 0 ] def
/Encoding 256 array def
0 1 255 { Encoding exch /.notdef put } for
Encoding 32 /space put
/CharStrings 2 dict dup begin
/.notdef 0 def
/space 1 def
end readonly def
/sfnts [
<0001000000090080000300106376742000691d39000000e0000001fe6670676d7134766a0000
02e0000000ab676c7966f9f1ddd70000009c00000044686561640d13be360000038c00000036
686865610d9f076f000003c400000024686d747807580066000003e8000000086c6f63610000
0088000003f00000000c6d617870046f0671000003fc00000020707265703b07f1000000041c
0000056800020066fe96046605a400030007001a400c04fb0006fb0108057f0204002fc4d4ec
310010d4ecd4ec301311211125211121660400fc73031bfce5fe96070ef8f2720629013500b8
00cb00cb00c100aa009c01a600b800660000007100cb00a002b20085007500b800c301cb0189
022d00cb00a600f000d300aa008700cb03aa0400014a003300cb000000d9050200f4015400b4
009c01390114013907060400044e04b4045204b804e704cd0037047304cd04600473013303a2
055605a60556053903c5021200c9001f00b801df007300ba03e9033303bc0444040e00df03cd
03aa00e503aa0404000000cb008f00a4007b00b80014016f007f027b0252008f00c705cd009a
009a006f00cb00cd019e01d300f000ba018300d5009803040248009e01d500c100cb00f60083
0354027f00000333026600d300c700a400cd008f009a0073040005d5010a00fe022b00a400b4
009c00000062009c0000001d032d05d505d505d505f0007f007b005400a406b80614072301d3
00b800cb00a601c301ec069300a000d3035c037103db0185042304a80448008f013901140139
0360008f05d5019a0614072306660179046004600460047b009c00000277046001aa00e90460
0762007b00c5007f027b000000b4025205cd006600bc00660077061000cd013b01850389008f
007b0000001d00cd074a042f009c009c0000077d006f0000006f0335006a006f007b00ae00b2
002d0396008f027b00f600830354063705f6008f009c04e10266008f018d02f600cd03440029
006604ee00730000140000960000b707060504030201002c2010b002254964b040515820c859
212d2cb002254964b040515820c859212d2c20100720b00050b00d7920b8ffff5058041b0559
b0051cb0032508b0042523e120b00050b00d7920b8ffff5058041b0559b0051cb0032508e12d
2c4b505820b0fd454459212d2cb002254560442d2c4b5358b00225b0022545445921212d2c45
442d2cb00225b0022549b00525b005254960b0206368208a108a233a8a10653a2d0000010000
00025eb862af5a3e5f0f3cf5001f080000000000d3d90a2c00000000d3d90a2cf7d6fc4c0e59
09dc00000008000000010000000000010000076dfe1d00000efef7d6fa510e59000100000000
00000000000000000000000204cd0066028b0000000000000000004400000044000100000002
0354002b0068000c000200100099000800000415021600080004b8028040fffbfe03fa1403f9
2503f83203f79603f60e03f5fe03f4fe03f32503f20e03f19603f02503ef8a4105effe03ee96
03ed9603ecfa03ebfa03eafe03e93a03e84203e7fe03e63203e5e45305e59603e48a4105e453
03e3e22f05e3fa03e22f03e1fe03e0fe03df3203de1403dd9603dcfe03db1203da7d03d9bb03
d8fe03d68a4105d67d03d5d44705d57d03d44703d3d21b05d3fe03d21b03d1fe03d0fe03cffe
03cefe03cd9603cccb1e05ccfe03cb1e03ca3203c9fe03c6851105c61c03c51603c4fe03c3fe
03c2fe03c1fe03c0fe03bffe03befe03bdfe03bcfe03bbfe03ba1103b9862505b9fe03b8b7bb
05b8fe03b7b65d05b7bb03b78004b6b52505b65d40ff03b64004b52503b4fe03b39603b2fe03
b1fe03b0fe03affe03ae6403ad0e03acab2505ac6403abaa1205ab2503aa1203a98a4105a9fa
03a8fe03a7fe03a6fe03a51203a4fe03a3a20e05a33203a20e03a16403a08a4105a096039ffe
039e9d0c059efe039d0c039c9b19059c64039b9a10059b19039a1003990a0398fe0397960d05
97fe03960d03958a410595960394930e05942803930e0392fa039190bb0591fe03908f5d0590
bb039080048f8e25058f5d038f40048e25038dfe038c8b2e058cfe038b2e038a8625058a4103
89880b05891403880b03878625058764038685110586250385110384fe038382110583fe0382
110381fe0380fe037ffe0340ff7e7d7d057efe037d7d037c64037b5415057b25037afe0379fe
03780e03770c03760a0375fe0374fa0373fa0372fa0371fa0370fe036ffe036efe036c21036b
fe036a1142056a530369fe03687d036711420566fe0365fe0364fe0363fe0362fe03613a0360
fa035e0c035dfe035bfe035afe0359580a0559fa03580a035716190557320356fe0355541505
55420354150353011005531803521403514a130551fe03500b034ffe034e4d10054efe034d10
034cfe034b4a13054bfe034a4910054a1303491d0d05491003480d0347fe0346960345960344
fe0343022d0543fa0342bb03414b0340fe033ffe033e3d12053e14033d3c0f053d12033c3b0d
053c40ff0f033b0d033afe0339fe033837140538fa033736100537140336350b05361003350b
03341e03330d0332310b0532fe03310b03302f0b05300d032f0b032e2d09052e10032d09032c
32032b2a25052b64032a2912052a25032912032827250528410327250326250b05260f03250b
0324fe0323fe03220f03210110052112032064031ffa031e1d0d051e64031d0d031c1142051c
fe031bfa031a42031911420519fe031864031716190517fe031601100516190315fe0314fe03
13fe031211420512fe0311022d05114203107d030f64030efe030d0c16050dfe030c0110050c
16030bfe030a100309fe0308022d0508fe030714030664030401100504fe03401503022d0503
fe0302011005022d0301100300fe0301b80164858d012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b002b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b1d00>
] def
/f-1-0 currentdict end definefont pop
%%EndResource
%%EndSetup
%%Page: 1 1
%%BeginPageSetup
%%PageBoundingBox: 0 -1 1660 851
%%EndPageSetup
q 0 -1 1660 852 rectclip q
0 g
BT
115.200005 0 0 115.200005 1659.494566 0.0000456218 Tm
/f-0-0 1 Tf
( )Tj
ET
0.945098 0.792157 0.0745098 rg
158.102 787.356 m 160.379 829.535 l 190.289 799.809 l h
158.102 787.356 m f
21.06434 w
0 J
0 j
[] 0.0 d
4 M q 0.380357 -1 -0.775998 -0.295156 0 1266.965088 cm
471.528 27.38 m 435.436 6.755 l 471.344 -14.188 l h
471.528 27.38 m S Q
58.695 757.856 m 80.516 721.688 l 39.07 729.465 l h
58.695 757.856 m f
18.464385 w
q -1 0.699805 0.543047 0.775998 0 1266.965088 cm
-278.556 -404.865 m -310.193 -422.942 l -278.719 -441.304 l h
-278.556 -404.865 m S Q
10.25 623.512 m 41.414 613.496 l 14.113 596.141 l h
10.25 623.512 m f
17.112694 w
q -1 -0.121862 -0.110002 0.811158 0 1266.965088 cm
75.757 -781.871 m 46.436 -798.623 l 75.608 -815.637 l h
75.757 -781.871 m S Q
101.438 509.071 m 70.375 498.742 l 82.148 528.875 l h
101.438 509.071 m f
12.576204 w
q 1 0.937579 0.772771 -0.802194 0 1266.965088 cm
-330.318 558.711 m -351.867 546.4 l -330.429 533.894 l h
-330.318 558.711 m S Q
0.290196 0.247059 0.454902 rg
161.094 604.578 m 161.094 604.578 152.773 561.961 192.316 543.309 c 210.699
534.641 225.316 533.344 245.688 541.098 c 258.508 545.977 270.074 558.094
274.949 571.278 c 279.824 584.461 275.645 600.489 262.836 612.942 c 258.316
592.989 253.516 576.926 236.242 567.981 c 225.973 562.762 215.535 563.629
205.117 568.793 c 194.703 573.957 186.715 586.391 183.539 598.844 c 183.539
598.844 177.09 622.012 201.859 659.969 c 182.059 644.739 164.789 627.348
161.094 604.578 c h
161.094 604.578 m f
0.945098 0.792157 0.0745098 rg
293.059 497.508 m 316.207 512.684 333.766 536.067 339.859 566.434 c 339.953
566.977 l 344.664 591.156 340.164 616.715 327.734 638.102 c 315.219 659.625
293.348 677.164 265.715 680.52 c 265.637 680.531 l 248.703 682.571 230.078
675.531 217.055 663.453 c 202.543 646.313 195.703 635.578 196.059 610.594
c 208.465 626.961 239.875 643.227 262.027 641.047 c 276.348 639.321 286.664
631.18 293.949 618.653 c 301.23 606.125 304.105 589.465 301.281 575.391
c 292.289 530.563 241.789 508.082 198.43 520.598 c 138.359 537.934 116.312
599.153 133.5 657.778 c 160.254 711.746 268.816 729.453 286.945 734.754
c 280.277 744.656 213.539 742.957 213.539 742.957 c 180.559 734.364 130.008
728.141 104.754 682.086 c 53.828 589.199 105.188 506.442 188.582 482.371
c 224.301 472.059 263.293 477.992 293.055 497.504 c h
293.059 497.508 m f
0 g
BT
32.000001 0 0 32.000001 1361.895445 368.012451 Tm
/f-1-0 1 Tf
( )Tj
ET
Q Q
showpage
%%Trailer
end restore
%%EOF

View File

@ -1,779 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg3118"
version="1.1"
inkscape:version="0.92.1 r15371"
width="533.33331"
height="533.33331"
xml:space="preserve"
sodipodi:docname="Logo EOLEienne.svg"><metadata
id="metadata3124"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs3122"><marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"><path
id="path4626"
d="M -10.666667,0 -14.933333,4.2666667 0,0 -14.933333,-4.2666667 Z"
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.85333335pt"
inkscape:connector-curvature="0" /></marker><linearGradient
id="linearGradient4664"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4666" /></linearGradient><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3132"><path
d="M 0,600 H 800 V 0 H 0 Z"
id="path3134"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3248"><path
d="M 205.131,405.857 H 559.926 V 579.858 H 205.131 Z"
id="path3250"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3260"><path
d="M 0,600 H 800 V 0 H 0 Z"
id="path3262"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3288"><path
d="M 205.131,405.857 H 559.926 V 579.858 H 205.131 Z"
id="path3290"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3304"><path
d="M 0,600 H 800 V 0 H 0 Z"
id="path3306"
inkscape:connector-curvature="0" /></clipPath><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9"
id="linearGradient4668-8"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientUnits="userSpaceOnUse" /><linearGradient
id="linearGradient4664-9"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4666-6" /></linearGradient><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9"
id="linearGradient4676-2"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
id="linearGradient4706"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4708" /></linearGradient><linearGradient
id="linearGradient4711"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4713" /></linearGradient><linearGradient
id="linearGradient4716"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4718" /></linearGradient><linearGradient
id="linearGradient4721"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4723" /></linearGradient><linearGradient
id="linearGradient4726"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4728" /></linearGradient><linearGradient
id="linearGradient4731"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4733" /></linearGradient><linearGradient
id="linearGradient4736"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4738" /></linearGradient><linearGradient
id="linearGradient4741"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4743" /></linearGradient><linearGradient
id="linearGradient4746"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4748" /></linearGradient><linearGradient
id="linearGradient4751"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4753" /></linearGradient><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient4896-1"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
id="linearGradient4664-9-8"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4666-6-7" /></linearGradient><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient4880-2"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
id="linearGradient5022"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5024" /></linearGradient><linearGradient
id="linearGradient5027"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5029" /></linearGradient><linearGradient
id="linearGradient5032"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5034" /></linearGradient><linearGradient
id="linearGradient5037"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5039" /></linearGradient><linearGradient
id="linearGradient5042"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5044" /></linearGradient><linearGradient
id="linearGradient5047"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5049" /></linearGradient><linearGradient
id="linearGradient5052"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5054" /></linearGradient><linearGradient
id="linearGradient5057"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5059" /></linearGradient><linearGradient
id="linearGradient5062"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5064" /></linearGradient><linearGradient
id="linearGradient5067"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5069" /></linearGradient><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient5090"
xlink:href="#linearGradient4664-9-8"
inkscape:collect="always" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3289"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3291"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3293"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3309"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3315"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3318"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3321"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3324"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3327"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3330"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3337"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3341"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3345"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3349"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3353"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3357"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3361"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3375"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3377"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3379"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3381"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3383"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3385"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3387"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3389"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3391"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3393"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3396"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3399"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3402"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3405"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3408"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3411"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3414"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3432"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3434"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3436"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3440"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.43531,-541.69844)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3445"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.43531,-541.69844)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-5"
id="linearGradient4896-6"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
id="linearGradient4664-9-5"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4666-6-3" /></linearGradient><linearGradient
id="linearGradient3288"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3290" /></linearGradient><linearGradient
id="linearGradient3293-8"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3295" /></linearGradient><linearGradient
id="linearGradient3298"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3300" /></linearGradient><linearGradient
id="linearGradient3303"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3305" /></linearGradient><linearGradient
id="linearGradient3308"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3310" /></linearGradient><linearGradient
id="linearGradient3313"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3315" /></linearGradient><linearGradient
id="linearGradient3318-7"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3320" /></linearGradient><linearGradient
id="linearGradient3323"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3325" /></linearGradient><linearGradient
id="linearGradient3328"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3330" /></linearGradient><linearGradient
id="linearGradient3333"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3335" /></linearGradient></defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1678"
inkscape:window-height="1028"
id="namedview3120"
showgrid="false"
inkscape:zoom="0.1767767"
inkscape:cx="2217.3454"
inkscape:cy="1337.1815"
inkscape:window-x="0"
inkscape:window-y="20"
inkscape:window-maximized="1"
inkscape:current-layer="g3750-1"
inkscape:snap-bbox="false"
inkscape:object-paths="true"
inkscape:snap-global="false" /><g
id="g3126"
inkscape:groupmode="layer"
inkscape:label="logoeole1"
transform="matrix(1.25,0,0,-1.25,0,533.33333)" /><g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="bateau"
sodipodi:insensitive="true"
transform="translate(0,-1066.6667)" /><g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Calque1"
transform="translate(0,-1066.6667)"><flowRoot
xml:space="preserve"
id="flowRoot4297"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0.01%;font-family:COUTURE;-inkscape-font-specification:'COUTURE Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"><flowRegion
id="flowRegion4299"
style="stroke-width:1.06666672px"><rect
id="rect4301"
width="1160.5333"
height="443.73334"
x="2244.2666"
y="2077.8667"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:153.6000061px;font-family:COUTURE;-inkscape-font-specification:'COUTURE Bold';stroke-width:1.13777781px" /></flowRegion><flowPara
id="flowPara4303"
style="font-size:153.6000061px;line-height:1.25;stroke-width:1.06666672px"> </flowPara></flowRoot><flowRoot
xml:space="preserve"
id="flowRoot3677"
style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion
id="flowRegion3679"
style="font-family:sans-serif;stroke-width:1.06666672"><rect
id="rect3681"
width="823.63794"
height="107.1031"
x="3003.4126"
y="486.73111"
style="font-family:sans-serif;stroke-width:1.13777781" /></flowRegion><flowPara
id="flowPara3683"
style="font-size:42.66666794px;line-height:1.25;font-family:sans-serif;stroke-width:1.06666672"> </flowPara></flowRoot><g
id="g4708"
transform="translate(-234.66667,-661.33333)"><g
transform="translate(258.11647,292.41513)"
id="g3750-1"><g
transform="matrix(3.4040263,0,0,3.4040263,-5864.8164,-2849.7877)"
id="g4763-8-1-4-8-8-28"><g
id="g4707-6-9-0-7-9-1"><path
sodipodi:type="star"
style="fill:#f1ca13;fill-opacity:1;stroke:#f1ca13;stroke-width:13.69999981;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path3438-4-3-1-5-7-4"
sodipodi:sides="3"
sodipodi:cx="1546.047"
sodipodi:cy="712.37"
sodipodi:r1="15.609281"
sodipodi:r2="7.8046408"
sodipodi:arg1="1.0427219"
sodipodi:arg2="2.0899194"
inkscape:flatsided="true"
inkscape:rounded="-1.800643e-15"
inkscape:randomized="0"
d="m 1553.9121,725.85296 -23.4742,-13.4131 23.3532,-13.62269 z"
transform="matrix(0.22906783,0.6022449,-0.46734074,0.17775615,1770.4985,222.63478)"
inkscape:transform-center-x="-1.8039821"
inkscape:transform-center-y="-1.1274589" /><path
sodipodi:type="star"
style="fill:#f1ca13;fill-opacity:1;stroke:#f1ca13;stroke-width:13.69999981;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path3438-6-6-2-8-8-7-96"
sodipodi:sides="3"
sodipodi:cx="1546.047"
sodipodi:cy="712.37"
sodipodi:r1="15.609281"
sodipodi:r2="7.8046408"
sodipodi:arg1="1.0427219"
sodipodi:arg2="2.0899194"
inkscape:flatsided="true"
inkscape:rounded="-1.800643e-15"
inkscape:randomized="0"
d="m 1553.9121,725.85296 -23.4742,-13.4131 23.3532,-13.62269 z"
transform="matrix(-0.52791029,-0.36943435,0.28668023,-0.40965724,2360.5301,2170.4693)"
inkscape:transform-center-y="-4.59347"
inkscape:transform-center-x="-0.15719734" /><path
sodipodi:type="star"
style="fill:#f1ca13;fill-opacity:1;stroke:#f1ca13;stroke-width:13.69999981;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path3438-6-4-8-6-1-0-7-83"
sodipodi:sides="3"
sodipodi:cx="1546.047"
sodipodi:cy="712.37"
sodipodi:r1="15.609281"
sodipodi:r2="7.8046408"
sodipodi:arg1="1.0427219"
sodipodi:arg2="2.0899194"
inkscape:flatsided="true"
inkscape:rounded="-1.800643e-15"
inkscape:randomized="0"
d="m 1553.9121,725.85296 -23.4742,-13.4131 23.3532,-13.62269 z"
transform="matrix(-0.48926443,0.05962255,-0.05381995,-0.39687094,2528.6554,1547.0921)"
inkscape:transform-center-y="3.4869151"
inkscape:transform-center-x="-4.1484718" /><path
sodipodi:type="star"
style="fill:#f1ca13;fill-opacity:1;stroke:#f1ca13;stroke-width:13.69999981;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path3438-6-4-9-9-7-6-6-9-8"
sodipodi:sides="3"
sodipodi:cx="1546.047"
sodipodi:cy="712.37"
sodipodi:r1="15.609281"
sodipodi:r2="7.8046408"
sodipodi:arg1="1.0427219"
sodipodi:arg2="2.0899194"
inkscape:flatsided="true"
inkscape:rounded="-1.800643e-15"
inkscape:randomized="0"
d="m 1553.9121,725.85296 -23.4742,-13.4131 23.3532,-13.62269 z"
transform="matrix(0.35956287,-0.33711877,0.27785959,0.2884392,1004.6201,1710.9855)"
inkscape:transform-center-x="-4.1631714"
inkscape:transform-center-y="-0.057200996" /></g><g
transform="translate(-19.751502,372.32158)"
id="g3586-1-2-5-3-2-7"><path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#4a3f74;fill-opacity:1;stroke:none;stroke-width:23.74341393;marker:none;enable-background:accumulate"
d="m 1808.1526,986.76492 c 0,0 -3.2597,16.69338 12.2298,23.99948 7.2005,3.3959 12.9255,3.9039 20.905,0.8664 5.0224,-1.9118 9.552,-6.657 11.4611,-11.82157 1.9093,-5.16452 0.2732,-11.4417 -4.7449,-16.31949 -1.7695,7.81561 -3.6493,14.10691 -10.416,17.61096 -4.0225,2.0445 -8.111,1.7046 -12.1907,-0.318 -4.0796,-2.02274 -7.2085,-6.89258 -8.4528,-11.77144 0,0 -2.5254,-9.07376 7.1765,-23.94196 -7.7559,5.9661 -14.5205,12.77754 -15.968,21.69562 z"
id="path3359-6-74-6-4-2-1-8-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="csssccsccc" /><path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#f1ca13;fill-opacity:1;stroke:none;stroke-width:23.74341393;marker:none;enable-background:accumulate"
d="m 1859.8421,1028.7048 c 9.0667,-5.9443 15.9456,-15.1035 18.3323,-26.9987 l 0.036,-0.2122 c 1.845,-9.47143 0.083,-19.48234 -4.7861,-27.85914 -4.9017,-8.43109 -13.4688,-15.30069 -24.2922,-16.6144 l -0.031,-0.005 c -6.6322,-0.79814 -13.9274,1.95899 -19.0297,6.68912 -5.6838,6.71374 -8.3619,10.91924 -8.2233,20.70452 4.8592,-6.41106 17.1623,-12.78189 25.8393,-11.92722 5.6097,0.67502 9.6503,3.8646 12.5032,8.77162 2.8528,4.90695 3.9787,11.43223 2.8727,16.94471 -3.5229,17.55819 -23.303,26.36509 -40.2867,21.46279 -23.5286,-6.7916 -32.1648,-30.7698 -25.4329,-53.73354 10.4805,-21.139 53.0027,-28.07465 60.1046,-30.15118 -2.6116,-3.87866 -28.7525,-3.21222 -28.7525,-3.21222 -12.9196,3.3663 -32.7194,5.8024 -42.6107,23.84314 -19.9471,36.38183 0.1691,68.7974 32.8347,78.2264 13.991,4.0385 29.2641,1.7152 40.9212,-5.9276 z"
id="path3359-8-8-4-2-1-4-6-6-02"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccscccccssscccsscc" /></g></g></g></g><flowRoot
xml:space="preserve"
id="flowRoot4653"
style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"><flowRegion
id="flowRegion4655"
style="font-family:sans-serif;stroke-width:1.06666672px"><rect
id="rect4657"
width="435.20001"
height="375.46667"
x="1847.4667"
y="1685.3334"
style="font-family:sans-serif;stroke-width:1.13777781px" /></flowRegion><flowPara
id="flowPara4659"
style="font-size:42.66666794px;line-height:1.25;font-family:sans-serif;stroke-width:1.06666672px"> </flowPara></flowRoot></g></svg>

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

View File

@ -1,927 +0,0 @@
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: cairo 1.14.8 (http://cairographics.org)
%%CreationDate: Tue May 16 12:27:36 2017
%%Pages: 1
%%DocumentData: Clean7Bit
%%LanguageLevel: 3
%%BoundingBox: 0 -1 300 165
%%EndComments
%%BeginProlog
save
50 dict begin
/q { gsave } bind def
/Q { grestore } bind def
/cm { 6 array astore concat } bind def
/w { setlinewidth } bind def
/J { setlinecap } bind def
/j { setlinejoin } bind def
/M { setmiterlimit } bind def
/d { setdash } bind def
/m { moveto } bind def
/l { lineto } bind def
/c { curveto } bind def
/h { closepath } bind def
/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
0 exch rlineto 0 rlineto closepath } bind def
/S { stroke } bind def
/f { fill } bind def
/f* { eofill } bind def
/n { newpath } bind def
/W { clip } bind def
/W* { eoclip } bind def
/BT { } bind def
/ET { } bind def
/pdfmark where { pop globaldict /?pdfmark /exec load put }
{ globaldict begin /?pdfmark /pop load def /pdfmark
/cleartomark load def end } ifelse
/BDC { mark 3 1 roll /BDC pdfmark } bind def
/EMC { mark /EMC pdfmark } bind def
/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
/Tj { show currentpoint cairo_store_point } bind def
/TJ {
{
dup
type /stringtype eq
{ show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
} forall
currentpoint cairo_store_point
} bind def
/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
/Tf { pop /cairo_font exch def /cairo_font_matrix where
{ pop cairo_selectfont } if } bind def
/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
/cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
/cairo_font where { pop cairo_selectfont } if } bind def
/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
/g { setgray } bind def
/rg { setrgbcolor } bind def
/d1 { setcachedevice } bind def
%%EndProlog
%%BeginSetup
%%EndSetup
%%Page: 1 1
%%BeginPageSetup
%%PageBoundingBox: 0 -1 300 165
%%EndPageSetup
q 0 -1 300 166 rectclip q
0.32549 0.286275 0.529412 rg
197.438 160.944 m 171.461 160.944 148.402 148.244 134.059 128.76 c 154.211
128.76 l 165.531 139.28 180.707 145.713 197.438 145.713 c 214.016 145.713
229.07 139.405 240.355 129.057 c 260.641 129.057 l 246.285 148.385 223.293
160.944 197.438 160.944 c h
132.855 37.463 m 147.086 17.01 170.703 3.549 197.438 3.549 c 223.234 3.549
246.145 16.073 260.508 35.323 c 240.219 35.323 l 228.949 25.041 213.953
18.772 197.438 18.772 c 179.809 18.772 163.918 25.92 152.438 37.463 c h
132.855 37.463 m f*
4.26191 w
2 J
0 j
[] 0.0 d
5 M q 1 0 0 -1 0 164.490509 cm
197.438 3.547 m 171.461 3.547 148.402 16.246 134.059 35.73 c 154.211 35.73
l 165.531 25.211 180.707 18.777 197.438 18.777 c 214.016 18.777 229.07
25.086 240.355 35.434 c 260.641 35.434 l 246.285 16.105 223.293 3.547 197.438
3.547 c h
132.855 127.027 m 147.086 147.48 170.703 160.941 197.438 160.941 c 223.234
160.941 246.145 148.418 260.508 129.168 c 240.219 129.168 l 228.949 139.449
213.953 145.719 197.438 145.719 c 179.809 145.719 163.918 138.57 152.438
127.027 c h
132.855 127.027 m S Q
q
0 164.491 300 -165 re W n
% Fallback Image: x=0 y=0 w=300 h=165 res=300ppi size=2580000
[ 0.24 0 0 0.24 0 -0.629491 ] concat
/DeviceRGB setcolorspace
8 dict dup begin
/ImageType 1 def
/Width 1250 def
/Height 688 def
/Interpolate false def
/BitsPerComponent 8 def
/Decode [ 0 1 0 1 0 1 ] def
/DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
/ImageMatrix [ 1 0 0 -1 0 688 ] def
end
image
Gb"-V#C$t`_Z+TWTnl<<&Yt88b,Xs2W2ka,:g=(M65>*n8eDZ2(mhN?N"B_H["+5<Td>p+.A
<))6]`'+5R]f?:_V:#om[bNcc\tLR=!98HgXVBTBGt8j6i'dBC<tac]?jCo@I=Lzzzzzzz!
.]34EcP)sAiqcX3I.W;#64`(!,s5e=ZKP9VjpGjG[U!^D4?SS0)oG'_AsdcRspj>B!VHZ0u
LnW#DWd,0R#dci1=3U^ZdGoX-LFj.hBC\rto0E=uRLJqe*Nd:%%]!1bkYap\`u6@:BmK-Uc
5g>UMEJ*k$.Wb'gn1*Bef>o]]:Gf<3sE'j1,Z"98E%!&0DO@_$gHB)L'Jd6!Aj>dd-Z_$Ql
d+#\((^Rd`c/[fRU`nI`_piL1([`;HJIf)B3o]8[)<\0UO[:\OWQsK50rk*LSHE-6H(]XO9
!:U!!3I)DRYO1(c,'*K$Z_hXXmCRIJh`4t(:28U0V"0sgf<f6I8p&]OrBeM`L_(SS?0&_Pq
bJMD\fp@Ll=0kq!!!!&6;C;Dl'"]N[N1?0Zn$*)jNrGcH?>aIn(XcMmBtP)dsQq(cBtn\H2
-ejdIEsMkN,QH!<<*"5Y>p3hSflS@s5hHL[>Ke]mN)Ki3l?M/+8!@)GsdeGPc7$nF4f8>B`
KSSN1h\h?j5_!!(_jVI]&NHW"r`s,kM$opdIgQ1As^O41hr(fC25`[kI<^ACIfRIp,&e]/a
3!!!!592!Ng4*5X76qkD[jh8;)k1N:RG:Uc1kEcj;q^`)F]/=2%HqJFjlE^Qm!!!#c/gi%@
k`Kr0(@N15CNtoc;jI)4o!!?so'>tn[.0o?O'M\)ab5S"4;\%u!'n8<1F6O,FSrf0c%?8Fj
borfRLUph%NDc/FRI]^HVa4c?iU0,!&!GT;Y&uCZ%2q<ICf#1hY`[?*e+(&$^re]mImKgj;
Vg5cSY\&!!%8Jo^o3eHV]A!D&UbOQtBN@nnmQhJH:lpU>f'L1K:!!z$G*=?SD2;1:qmR5>?
\hkb/8-_Y@)?*Lf5KZ.nB9C#ljr*TE%PGHZe#)BHQ^=D85";1#r@Lhe^MUT1*Nrm_,-TXSQ
`:!!!"\5NV!0iXVLg$/3n@lZD57Lq$9qm6#N'i49#;:Zgg#WBQ4@!!!#/]GoJO2Qf2&k1B)
4/]T=/42duEWO;d$OisIW*PRrY2cp(\!!$-aE`2IcLmUL,6Tc=`.;q-jT;?\jOi%AU=M&>*
NU,@D(]XO9J<p5$ds`IqUmF%`SrNZdaX0cnX&i1uTDJTg!!&P1L%Ep6_fl%SIB`:r64.<m>
ohRAcLRgDP:kZfrGDT8!!&\9okUP$(C]Lr3H^d<Y'L/Lj4S+aT`-*M<po(]WrN,"5f&SRQ*
V\bDRe#eekLD+.<3eCo'dSZE5C]0Z'cK_Wo#N2!!!#c_IE>eULXE.,!3.KX1X&r@PAfc`s%
E.*j[@\0@-Bh4Tk`b!5KRecWln:gP13,3Dk(^+N3Dao:!="p6J>fY,d"9!<<*"YYf"Ep82s
;#PAU)hCiD<i4lBcm_lGohlqY>[R\;JBBQ:DLB.AT!&3^)l,t59S%`Vn??rFk`(ojnoFD@d
4IL.[ot(Y5!!'f%V5It.MqmLOH^=4,6&<E6W*dWc[0JKD\]GHa!!(qFcCML$II`g[\LeFCW
:=Wa5C:C>^9n:J!!&s/Yup]fs#FoB6I/-dCB>[%e&oSSDs625qbC>)+#!Zp!8puDkuhe'mH
`SN](0/mL_HZ;5GtW>Lri36;Z0>o!!!#i^Vk1pB22aU1J\>)NL-RCXQ^ZV?+cm->mgW4!9?
qrNh#\[]%F?OTCTrc+YK#1NCWi+>]qm]U?ZqV!!!"\J&E?g45=J2o$ooI/tG<,6=P,Wo9E;
U!!'fH\N+r)2oP^B@tsR94X'VJ"*t,hgN"PmO0T)m!!$+E1F%6X6qm>M;j8s"$-AP0[e&"i
jaUfPjf!X3!rr<$c7V7CCJ!`MYM+q:^5OEbhrgV=:0\jSS$!(u!!#,X7XEY6d%0f-66)LJm
/rY-h49t%Xniq9!!!!YMp..H'bN00WN:KX:.Tq1kI)&@_fjI.!<<*r^sPpaEN4E:ApigtXm
'PfWilj3!!%PEAS'sS>J."XgBl#hjb/_Bd\U6bb%5p?EcP/e-NF,H!(Y,RZYW`bTUXPDj\'
S[Ldl]4T"8LN+U\f_"TSNf^33oQahHZX<5/8WKG[DODSPRpMGnrbzb]bTjEQF44PV9QR+ZA
Cg5Kl<=n?hJ]#QOi)@#d%@0)H)`XF-F1#a('j,G.,I=nNL5!!!#'h2U`7;^XuAo'fSl\gE)
tP1GU_cBtmq,ro9(eHGpQ!3f49:>UkaR#[cuPV9$C+f<;\Q%+&2:2U+A!!!"#&[O"e].SZW
(XdsJ]B9!ne+^j-W4q*g!!!"&cCDI.CsYN1Me>A4_r<a'o^%trWinPc!!'gJDPgsgR'O/Cj
,qL9b_-N4Vfe2c1BZ7*V.QaA%KQP0!<6K4r3^fuD!/5?PV8:.+UZ\pI=SgAL^O7a!!&\=l'
"\kqLp>)*YUl1,X1)Vcg_$D!!!"tOI;4oHcF(V:&'Mt+YJil%bt*S-DT],DpHSN<dg57!!#
7b'!j+&H`&=8(Z'fVVp..@->d'2X86!'!!%QIn']/o_gN:L?N:a+>TtDA??A1V=nQnF!!!#
p;dQ&,q9n*dRuL:ZmNmOr:cbs#]6_G&m]$Bi!!%)24`f^lIHN"cmLhik1d_Jk4eHsnop#pc
!!)g\DJid*fZpp"7k7s.&jfhai\D--GAD(kT'E?p!!!"(f]eSkhS!PN?ec8\nkJuRS='q<6
1qVp!!!#%-RU9#FRE0N1d_O'4lX>a0I07qA5lq!!!!#W1/@amnV8/APV6SS+o++rH3Tp(Q)
+7k#64`(B4nLI[3?flm2)O^Y@%Y[q**e9'-=S<09?#1!WW5Y_3-G,)"Q]LjU5-V8:eq!^2k
oGqd0='!8M3W<1K;Q^[h%I+f#+86d'Ib=7&q7'a+L:J?qe\OZ)Kk--DRRKTH6VE?Ps],Loj
`!!!!I[O:pt0'rb*Y>,BI7&3JfJA$:B<*pFB!!&Z]G'<;t^ic6.e?;M:Ia7,V-U:ogihA8B
k/Q2H4Or%S!!!!Ye:khV"*t,$?]Gaca91JYB@b$0f2Z0,!<<,X+PSdrl-OI@nl7(]eu"/d#
nTV(UZ]/S;/rV>QN.!cYck.0S>d/GPqP<-+iId,,thLQ<*q]f!!$CCB2;n6U&,8[CJI2%Yp
t15s*!PSA^sjY!!!"dCua4Om@0)4^=ji#8bf6gX%-F/2Qr0AI2rIk!.[)8ZZE%'?_r.48I-
K&R6G>-:/7tWCFT;a!2Nl1SFTUNfuhp4KFhTb#4r8:FRb+N.k:T"!,QarhoX/\-R`>%&jhD
2&XTnXqbO3*^&e97^cE7S?f?od[drod^7HU'&CVjVDW,"c`J"d%!!"Vp,<]hdn8RL484!Te
CI\67-oEkLobA8C!!#(*S[n<>fBLFZO+\)(J;DD)q8@'KYIac7!-kI@J"6$!oN/bE,_Q_a`
N,:(J\<F2?[VqT!:Tt=,@^El.NtSfVKLp]X+&s$qAKbB!.b*7S!+XJ0iIg6OUshn7U-/:`D
H7#(]XO9J)*f?nF<*RI!nNk+j0Cpms-A(l)Lr0!!!!&gA/[&gae3m6LNphc;RN28lC(S"on
WOTX\&9+b\XC%P>_XbG4>Q1]RM@J[9gurmm'!.UNXJr0.[C`dZMcd(@W*@07=))'1ta6KIJ
N)]-cV^+pmEmAbS3Rh"nCMA(pJ"+*fj`*^$<e#/?]?FYG3-PJ,gq7hq39b`)%DbPcX_(?T9
M*[G_mgbo#20euoao3e\q^rmME5@'2_;2aN[qe$.q<jIEPh&PuDHLsFolV/Q!2-!h=T2JXH
].G`+E>AJeRj3DShl0!/..ma))cEf`jH%?KbS\#b2nlSX;nVqG%O5;V$kn9`?jr/NaKD=hn
kJR8`NkJ%M%mTrAQnr5\u?<Mo5c4!!!"BQ(*srEU4%oCHph>C#*=\pKa\T2EEX5h27#UQsK
5p:0l/hbZ9/kg+G6?j2@Q+GATFQD"4[mP?*V8g>f4_SrM77eATHR/stGh(B=HNIaZ\#LCIL
]I+:`W/a]$ena82Kd^U%N@6:6.*(rD<2)i!0/B]itZf7%:hmiBqlkpa2DscCqMXk7CS1m;8
/kAX[<.21V!!)(I=0JFllT%o>HB1$Q\p7!knaiLNZa]:WMA)Q1_M9'0^\"nWj$sd7YMMKZq
M&F2(4OeG]^g\DS0:,hQuV5.MX&Y(!!"-K3HOJk-mm)<H:1cEZjR`=',EWQl^m<)Y?t(*I6
P6*o82)-CcF7]b$+8jZW]<HL1:BGhfP6-qBSk8!<<*Ra-#"1gc`[LZqrmdmBlHRlhg(nl''
^eD*4&)l%\JE0V?G3auOe/h"%;Ra,Po5j1tmQ?EO-d*BC%o1^!dYE-Zs"rj.$Z1!3RA_u]C
EjQG?Gf">.Tp[1UD:ZH54G'EmglE9NpI[e!If/M0C++<.9Zu8-?h]<i8$31'6]BC9Ug3tbK
q7;U=2?3Sp@_h3h4/1_4P1*F'E<V\BXPsco#"3Y%3(`op60t$u9h'!SE^]R<#64b^OuBM)D
;CS_dH/]%fja<pJIB?4Fsb.7:jo(s?5G8"?b:(1R,R!E4i]!9<JWfdb/8/bb'g9c1]RLU(D
F&e(XI]WB+YC@a7"Wsc/3[q/ho#?]CNO`S=JBPZ"HC8DYgM/T^q]0QlGRE>T11PodL(F!8o
Wp"`IGUKHk**Q&"7Y!HV=1`*?&0<deSrG%XQU?8R0/J6p(7cR<73B$],NF.<41!45l[QKaT
6.poh!q6Xikb'.ggg/\#f>Ye:H>/<n!0&B\O^3dqO\ZJ!lPb2PU5(O@l.B3@J!"Y9[B:1`&
L%7)?O\,F^@n-8Hh6Q!9C2/Lg'+4GuHm<M,lM\Ks4,dC6\U(-3?Y,q1!WW5U7o[ugdE@fYe
qe0Wjl%T@b-ill1,H7:T1X(0e=.=k<poofh`8j*_ZCQo+*ftgljCHY%KHKJ2_(ink52=16g
&>]\o^=48He_)Bb2>oo@qPhQ(OA\L5[&`Odhi<qBQ+B!,r:>U.uR(]CH[TYps(Ordb*4EJM
i>5(2@2//F.'0uW>(TuC-q-RuAN@tod%k"o"X!'igt<^^D&UjR#K%&S1-Oi)UaG!s;\BBQ9
YGMqgC1U8sCO8\l]$ToAJT-]iG.,Uj8<<*"qOGUBlB]#Z/=(T<@\p'SU*k(\:[8b[h%:%5U
M`3t7DYgBXGibhX0bV6pMfWq6CFB/_:_8J@3c`jcjm+Xq)^"PE]=&gAc74p?Q'J[ac%5lO"
Xu[4M/Gf]Z@q\F!W[b&7T>t!IM'_(@RMGXRuRsq^&6B:9<(c'j>RD8(BO[_`<iF>,UXKJo4
p<S'`\4J*#?_);oZ"=^'5em997@s_o$Yp,c@\,;imVW^RcoMZYj*5Q(RR,@@9)u"j^$L!!!
1R=Ro.X]LM_^MqfE#7O*Wt>d/S<ERpt*R,"4ED-N%ue7Z5\o:J-!djM9[H2mpFo"@%>2_&0
YOaH*@aD]ji#X7#OKb!N4q=@DRQ+n-VrL#NkKBfcF!!'fp_WG]6^>^>\Vfe2c'?@7H4F:*$
W<)q;Z+.^a5;2SDV#IJ^m`ta`>?%45!!!"BZ#!"=o!K7DPI=hWRPo0YV$kmTT,5;V:7\mOc
7boW#>\KFU+BWT?1iID!!$E4[4D"Aq[k2Iqds>iVld^[,t7Ju!GFKcG\sbdau2s`.=]O&gK
Ck'YNh;Q!!'ek4/1^s)t@\Up$'hDgt^g^2m0'X4sL'&/ghskS@Z/r(N`[MC$"<_F5'RBB*8
27J-fZqS772O4RJSt%LLjRH8@q]klB?[l-bQA1!BC90'*Z]o0WaXX$.O(!!&gb5+1Knl*#J
G<KJF@p1&i4oDMVK")#qb&LXpUpJ_/hLR-s5i\.5o(B=F8Ca>Is5JN_eHqdV&1YaAEoVj+d
-N[\Q_m*kReT[&E2ci:?QhCFrcLViZ!!'h-,i;/iY"PGYePq*ZGFr#n&+[P!jBL"nNqMg$?
25GA^o$;H;m0P(<IGV_!!$+E,<a5^pFK7o67l.i``t.RFU?h8'kaeM4p_3NbKI5n?bO3ia%
=G2F9OK!^C*Y0b>`m*!!!!9P+.[0bM\)s=&9&SS_Hnq>lKM'rDfHkJE(0OjXck8X^0E'b27
^Q0]H!&S'(s?!!'NZ^kn2rf1lK$SrNXL7P@P/:02l5!B%#b:(_CFjmU+hQmq&sWBU(W!!#'
GK^M[NC+<m7cn"ndd6uMT*`2=`r_pMBrMKKE=jRedBUA!/%fcV!:cl-,jai/HN)qP0'bN0G
H$fi3poiJC4Ro<4csj*I[qEO6B;6&C2]YqIj8f5\*[(IGH+k3Z^h'4sPjtgLLbJ6_Q]mTQr
5t4'*>`_c(]Oh=IFnQ#!<*M6-LB/E5l"$OJ7LpKi+$bS`#$d?@.25+H!63&d\U6bV2I93+*
.D^JH&5;bP\'S%-;9#Je0S2s2a;On.B$CTU_P-Y^,!W1`<.fc!(b-]A%8'W>V^s3<0&pIi_
bV4![f$lDPh9\51c-.k.J/38f*XT1g0M.p2UO\0,>7TS<;$)?9b6DJ%ffjm/Xg+"pFiNGB'
)51G)jbK\:9'"Xk*(]71]m[5q\KBf3@!!!A5bo:,WYDDatHj>F5:.eQ8W.Fm)6K5Br"6M(_
;s4$o=E?b#T`tJs"]Rhd"`EU@f6$X)[s$:c$_O!mb[[n[`7q;?o.eDFi;#?L\`GIE!)VYN[
FD?"-RiC1jl?+G$,(AIDkR5UOa-<ZTRJ',hra_ohfP52r\^DG3!0/2![K-@G>Nc)GkOa"cZ
+>=%^7mM`NhURG?[6B@^cd44"!*O=7pP;!!!2A[#(hX=MoNhIM([pnaW3sY>>7T3LOic2pY
I2>Gd?dV>:H"!.Y,Z?0"32/"_3W<ZZ^Jk&99'%Y01CAnHrVV>L[^?PC!J&(O/e!!))$7us0
Ue"jcDb/"S&"n()adZN0<WXgaZE,CYnoCDNTIsK.[&c^"05K97Y!!%P_ge>iRju$<;ROA,H
`6X?>P1*DQ?D*t'S<V5Vmd1VV0+RNU&(QFO!!)(I(<^'66Ph7[mGtU\DDEthmT']+RfT$HD
Jl%j9=FE\;gr`-B,U-DM!H#\!&.]sU0Ypn3Vb3h]*'J!?Vl/Y!Sf4!^o;65n>%Y"ZTNWEl2
qCo!:lCbEJ^feN)[O4a\VFK\L]lq;tY\Fn6d]el+[X5W;JuETCSU-W#k%.WW3%7*2tkQ\p'
U;I"dc&,*ltZ=7&q7;uu4(bHlj)D=VM=rh>Nndc7AWia4+6%kI\\E-W5B?R(=X;80K\2sJa
S+R\`%eOL@);*1N3g,C+Kr6g^G,6!;5(K:D8J>AGB1!3QTq'Ot3B3i'<UABrQYg2Ks8Njh[
Wr)p]Do*;i!<@Y/K_Ppl^F8SI7l;ap,F;tRAue+k!,RdhQH;kHbt@:K,EEj*VtuJV!!&@MO
e1+hT@9%.BC\>lH2*)Km8SKr!D'ItrXs-[^8>X;\p7$4+jg8i^]n;(LFZ`RjF_Phm=/O48_
"%ZJ2qd@`I6EKXRZ`l5)A+C`I'rd!!$,4c-!`Bf.d"C5BNN;iV[iK#8;WU:7k5Fd@%2;RZQ
W(q1:'r!&3\K_PO\87k7r^\9^US>EY,?V>=R$0]2P=W<7GM/&008HJ11nFo5pIl@TBC!*m<
h^5i%!?UpC+oZ:n>o(Y$\ODftKV=3>=jd-le:\RUH5nsA"kR/6@>kttMV;p6B7-NF.WXg<S
]?AC("AXnTIa)m*%/3oC(K:D8J;+MK%Ob\h\9(o"poTJ0Vtr(KE1HF%S]\,uXrb<M$31&Ik
00gJm@0)4^0G[6Lf\LjoUi,o,616g\Fs=r-6nd_Jm:7oeN:ne;um!7I53UbqfMj4q-(a[o2
V:Mg]dm0YkCKbftKIrb@c15GFEP.KeKA+!.b)ZZN!PYWta/[O0>E+T"V0#(]mOucf5hQZjT
]Z3HEpapBfjfWW3%WNi7qmPcmkf2uS%,?+YD]oe?TBhM(RQ^ZuN2r1`8`q0ctal=1)"!1^o
[`+pAsN`3YOERFQ+cVI3Y<.,/U3/a7T)2%d@.).ULB_[0/!!!S9ZZ>p8$rXepERB^a&WrWT
X83Y7E%[QHfo,!2$OPNTCrklVHW;.Q!!&[Z=:Yi('hiF7aNR?o^-`&(zzzzzzzzzzzzzzzz
zzzzz!",`i-SDNWL`s2Qma,+e#7q'dPq+:f2]X6R-13I*>6"X'Vm^Ni$3-.2Li(hVl%nU,L
k=j:itmrPr2uMhbP%kuJ,fQLcpCBj#qZlacr+FA9*G:qE,r<bRF"j*">*V#Zr@#*!%190Pm
K#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P=4F<@5
(P!!)H.cH]HR"oJT1iZ>I+RF"j*">*V#Zr@$UEr5Rtqr!);cC[>ii9b,fAK<gR-nHpna2b)
XX&^mgr,SoC[2_:6#`4Cpldi0W5CS"3Y$Du'BMbj:\]Di_eWY#+ZrEI?;P=4F<@5(P!.\6-
0elHfq.-0cKkf2?H1'HJ]5Hrg[;0jGbk^M$T>(*[MsAin(G8t&d/PDLWa.!&gGX!,4DNBEc
CI&3rV#!,5Q5o$qp8705tdIL/JUn);Ir0f"TTqb'bs`K<2ht8Uft0@#mgq3gYBf.)t,FJZr
G(mrUndM%g4KW*jen7cr-P?/QF.);uhFuU,,",fOO[*PH%W`*^>,/ITrVE3WiQc[:lNpTqt
'^>,k80W;loE<ifD#U-shC2O*dob9&ikclO.&V)eodWjQN>181O2$!O?&BW1t3`sW=c/R#N
[7S,%5[VU&-[-?>AV)eodWjQN>181O2$!O?&BW1uncX^X"?G#=IV+ZZ%M7<LF4[!*D]`-O<
\T?T_h6fn5:o6pS*BSG3]4kHKPG"aUMj>h+=t5c0V94IW$32\(0/)ehn`(2n&X+S<p@7\;d
A'4\VG5rts8CZZCHq^_ZXq=GeQDO3/6T8neZ*Q%q.B6\c272"2g+E8SND$V^:a^T#2XiBh1
p:Jd7;fl?Z4rTBrOjZQ>/!TW_@**:kFu_'3Zjc\:fD8#JU01gS/C#lurZE]=X!X.L+e9AP6
oYY.aR=il$[kDJiM";!dc<eZ6r`!%l_mcr-u799ff8'hZhNAO9#n!132a^\uEWEbC#^'e9b
20]:Tg@s6Q05<hBe-<@3MYpE&/QnenMWfs*P>)S[r'3ZlMTV]eaQ3mUE_#Z.\[_d_+[r1"_
2E'.Aq0RI8CM`Y-Vk5"cA4Z7M`?4dYMA@eT@)2p?C!]bK">//-ZrEI?;P=4F<@5(P!,r5SC
T4eR]=[h%djHFf7=OA7Ma\&NZ)u`fCS*_7;Z+WW4*FT%:uPi4X@SHt1M>!tS.%""8^LA;78
&mP/JUn);Ir0f"TXnIi0J[nN>a\Jn)#cYo<)B2C2BV5M\`:kWH\@2fs>>We>`&D5O@Op2LY
FDRE<fRSHLOp>-q7scr-P?/QF.);ugkD8m5u'>;n3=\T4Ojbbn1)p:ueZjn/9?cHFDCkKdd
OA9`BF4n(s6PUNeZlW0Fqcr-D;/_+%3<12*2T`crI-F?_PE!`OJC8"kfE6Xh/16_J&n[X.n
OH:$5*uR:lr&kRl&c["$U.$idpktI'1h`l>U8?"cQ3npOWA:0D!e<p?fM[FOV+W0],fn3E=
0GqS7]TXripPX7FamrPW`<N?GCE0V<ga9L7S@k:ZrChg;Ir0fKbCalRF"h4^a0h9WUB3BAc
KMXT7-FtVk:]8le1X,\)+^re%*JTTCqjK']Y!qEotR`K0OMFfWgl&CPn`&0OTFUS%]gneOe
+cX[PmJ#qZlacr+FA9*G<^T\EB1f<6j]T>k/^Y?nm\*?@:]hRjq[r:.JphU?`9bJOGd"j-*
t7Ri-9YHR^sX+!Z7gX"3l@^4!jq@6]/PG"aUMj>h+=t5c0V94IW$32\E\#"QQq<(cf.,*[^
=gQt0isk$#[;tBO3B9*Cg-NcPV)eodWjQN>181O2$!O?&BW2!i&km5CG:Zn&Ug1HN#)d4a7
"i,Jj^>Gp-UCD5(+iN5ZrAG>99ff8'`_KjrE?5jkF[6)WD^]+95W7]R>F#eGdLEt5teU$/Q
F.)<%(%*PmK#W!*k+]>H4oWs*c3M<%V+MPW_5&S"6*umFjE&I%8ig>3beHf@/0r*4@l*iX@
F3k09C;aiX85MHOVl181O2$!O?&BW2!i'("FPKn''e?b.ghLlRL]gsD<:<u*GqgoFM[:HnT
MC=T?Pmd>9'03Y_r[;+511hb7JGOP%jE)Bme[ri48/bSc#dm68c?[_Ut>Aq2tcWum0GiB%W
g01n!20S?=?+Y:%ge1e,KS5#H1M?FKgUC%T7Wn"GH1AiiT7?k9>.&+Ys8MmiRPYm=B[H>3b
:d5:I.r[]^86^.l1S9S_$;'H044_HD3ZYT;B5GNN>qcipoIW)`nDAZ3<h'8-F?`#5tdIL/J
S7jJcf1k;GrZ+M:u/G6m&[Nr1':I7>hq,G^'oO;FG^Z[u'p.n\l<=Y3+m/9((MPNc1n2Bkc
%n9mc?BpY=QZ%.89"b*Dkumk7kH\MGtr\T?q_q;mq]2/3u].<3^!rqPLk1M5GAoqfQ0Wi5h
-&J="R.TWX<_:QGDl-`mE?:H"#lU\B^RF"j*">*V#Zr@$E#nCXJ_FG\rUq;BUp@bq<f^.tk
ace):pY9foCVp%M=0Ff1l;TKuj:45VV5C/g%i[FnWMc>nD3m[Yn'\%*;GrZ\o.cA@d,06BN
KM!)\=_u8!sT/F#?:S]agY6-`A2f6lk`uQ_5<S!58l@l&/uR(at"g"Q7<PO.[6U&b(Q&f!%
u)B/QL:*h5,IR%NVVh1Fam>Puh:s\LH<.N3d*=(7?1b=A)r-C/qZVe`:rMM'nl#%1P1+8u<
0MDq_R4O$33(r2satCoKpb*3!/OY5C+E'E@gAs)$>jnn$0GAO9%D'!tW+cr'n[,rhcu:7aR
NGMV,gH#nV5M+6Ogk?#04@JR3JLRXd&\$rikXhb#i2('bAP^VSamkphhs8M#sPan,RPa%D%
N>e4p?Q*HYlKm31++<cY'.;85@70/N=e_b8KU)rkBW3b\V#l0?E(in>bBr%[qe)OLAn7k4o
Q1TS&!L26]p^cl@bWJPm+kPq1G`7DCh\r9ma@qig:Jh?^3mJ7mFq9d[0O"JV>C#`fjd3glI
<@jor>PUWE!W2181O2$!O?&BW2!i&ff@uVb`qf]3H-];0SP[e5RZ"EL$(YVk8hjD!__d[A@
JHAVjRCDjPtMkpMt`-7L5ejioaA[,8%BcaK-Sn35C2q=s!2*Up;/LS:QeKU)rkBW3b\V#l0
?E(inF5('m.>.n4RG1qRN/=+kh>FX+N[!6nC>5L<^qmFqd]Y([igY-e"h;$d$04&JLoONao
\ODDlG29S'g!EVE9UK5V=nV1:f,h-"&[YN*cr-P?/QF.);ugkDNbPJ`3d&kVW;#N'6[K@d+
!6\-J\KO,7pEBRp1pWP7Z;<%r]^/=PP71ae,^Q9rpFE999"gd1B)qORh[P\Gh]ZDG']^ed8
FOB98+"c<12*2!Pg!@VPP3A/a_2q@l6`3M2?4rG;m8&J)Z;4hLGS([VacVo%U$9RsObmM>t
QiNu'HUr5]I#et7,#WFE%?5*eXeS52BJ<0Z^qd*Sn![r0j&@EtB'rVH2f<2l%s?1-:GRgh0
\g"E]EXh>C1fU"XAl?IPu1i:sRDV_nM5QAA*pQDh^V-^cWX\+j.#"O.0[F]eRHpU.d`5s.5
mD=PbI=6NZeZ*3Ma(s;0XlKl,ZrEI?;P=4F<@5(P!,r5SBW9apD)8Ii?bUp`_a__lbr'`u*
Dp$E[VWK``JXO7JLUj9h5t\W`^[r[hL"]Sj83MNQ7=r=)fNAtA?)Ar*^4uH@=sBm<1uV^h*
FFL5(3:7[?It#]6<QM*JQn7C=K1:@D[\=kK_mJaMj&RkK]XQW`?*/`JPNQc)R)`ZY*&YA(I
_aF7nhK%i]'Feub[^)Au&ekH8Nu181O2$!O?&BW2!i&ff7r5Pse'h=Z'P_M+2:OrcMJE,`%
D7=N45'fU!`UcY2[bEeDF>LplG^]4;F_0r[\9:[eIL@,I=[@B6uVX@8^Y?j(aGl.-tA*kOY
',MHtj?Z-#md@g'^A%Y]_u7NqoBWTpQ75a%G>.$K2)[ADaKP&Zp$.g-Q)-WCDJlV>&&#aNe
lr@AAg1EY9PCD%JsIl"=t0N^"FIW-8WtLc0$Xj\H61,E7M$m-fk6r-*MGfR$@i'NVnlO'fs
Bl3`uinR;`$Rg".J(EF)l;CpKDYej#pQ[eX'Tg8UJ6njiSI?K^ukVqJ4n'?PN#!n8PF_]mT
X]mYb\iV7(-h8p?GN#7i^PROG1*DADiKhhg(u/QF.)<%(%*PmK#W!*k+]>O(:kP7?Ao`n/i
:@=s5fL?eb_WD]Q&*&q?Vgt&T3BB2!_#4H89H:senJ%k@+rr);8>;^#7FL:HgY?\WdW\J@0
oB&alhamG7pU=T#f3a#5HWYnPou)\#\u0Fu"q@ZF(\G+Nf6"bS4D<(a)tmG>/QF.)<%(%*P
mK#W!*k,H>,iupiWlk]^8"f8@M^Y%Gh>j]^]2%9#iisd[pbGJqtAP\\RW[?7YW\3V:M\K:O
BmD?@'_Jhg9P2dRAN8n%\nZg+f]E&e^r9ZJ0aW+gY@P\$rj?39$_sFm>4!dgHKidN2HL6Nq
X"99ff8'hZhNAO9#n!1.)&9?kT#M2mT;3HF12YIpSmjukbLmej:D',)%%n)Gl)TP^<"9h@q
(rS?%7O$/f#Sut/>\Lgg'G29?=cBp?(L0`ZJGH^_E[;+6t@9BQIq'<'O:Goi1XHm&'H?JUp
^AdtE)l>".-1-%R(F`8Cg9k]SN,1:RW_@**:kFu_'3Zjc\-1WRqX1uam^^Z@9q0_9>8J%j(
).JDj5\Uf;lBKbl\e*-4k'RjT+Y/r@FL]$AW#m]F6:]OH1sgi*j%N<OmdafgJTCpSub(YWD
]QJ1,<\#jl`4^:1Ifn2`FUjD&_.6MoAT.I!P+mHh#&kD'%T!QF_SGIdKFSh7Imc2T$"F3bX
SeB$D7K7^`aX<@5(P-p^Lk#qZkl>_6id[C:u+-Yc=NpP(Jb55OKfRl>3@r<jDok^HP'gMaj
W*QQs$g87R`mEo+FC1ZuhGO3sZHgp7_BU]7Y'c.[a]ldcA^k"D)Db<Y3#RJcuUgh<#<dc4c
DH!H.eK0+n\8es:C`?QX9PCD%JsIl"=t0N^"LTi3e'h6BH<%"HeK1E$gU<9K5f8<c[5VOT:
;>r"eE<HR?@0'De#1s5^S=8XdN1M!.*1PeFbPO'Bl@:5M2AK_HrF4KDNXD;WKYR_e9u^`QS
)Q[*o$t,<12*2T`crI-F?_PE!ZkUlML%bYPi7`Unf9l5pf9m+Sc?Q)`CB:'CP;V\mJ/hZ)(
dAIU2]K\2$3bk007IK+At`eE4Siq=s_uDnT8X@PU`s0r:_\qWb-8K@k@VY1nsX4fU[?B:jT
aoADO"V94IW$70Ab181NGJ4i_h;B%Q4S<fJ<4h$tDGNt2%'br%j$ER@76?aqMNp*Q59l-du
^(fhnjjhm^%2q(M*kY"(*g/1UL/+:#Bl@;Jp._Ek<8DIp2f.-nk1<u7H`=Dgf9U[cX@5dI#
qZlacr+FA9*G<^i:rUAUe$WA6\cS*cA7T1V-^oc?1J^iGOD!h<`Z>+V*0Wk/ToaPAO^$!qe
4ZgV;t:L621!$X]r9#).1+S?Fb*q][tRI'e31EGm19<99ff8'hZhNAO9#n!12X%QMT!!+!!
=[^u4"fNutPg>-VPUjBmK)ltkKllTY$]`0NH$g,(<d:ci@?W0-_1qG=B/p6t^+-%D+/hbjt
*3b7)_BoCE99?XsLetT"`KU)rkBW3b\V#l0?E(ioIF)u-DTRi4q]%h/tnDW*=55!E(VS!0\
9:")aORBSb9l-g.rr1K^\7YX!P>@u]d>*&<`>>qkro9&(b)A"2;KqTdD;K&BM\7=.aLhT*U
8?"cQ3npOWA:0D!e<qJCJ,E(oX3:W'4pdraceX,D9.e^g>c8<?JUh^iL+>MdGE6+&L4YQ0X
7J>G&r"Ws8D\g?dXY/<iqhaepmMW(RagT>O%M+>>0AmD,R0#&Xc_9>-q7scr-P?/QF.);ug
kDVRP&QV+T:==0H8_T(D-k^Nf:CbhR;EC5j,h9R.4"<N;k.TjN<J<I4i^>O'S/6`k^Sc1^t
rT1cqn%ooGu(%&.'r:A5ij3+p]p$:5!pKH;1n])`<Gm19<99ff8'hZhNAO9#n!10A5;P/@-
aThcHUIL5Hh9rQ<8'sd2%j!iNgphY$k&'"i4Y\\=@^2:X2pi)BkP"Ps:ReX5h0Za0qtk/i?
t)e%oCLEPb22K2pS8]bC1qPaLECu,).1+SDV_nS][tRIcTLfXbU['Q>,k80WDJ24.MGu8!4
W0fQ>5%/XD-/^L8HEWi60BieU9Vq?soZ$+==Nrh0VWES!TJ.oS`QB[;+7?hKnA1SRog-DlG
HG1$608[P7#glitj8AO9%D'!tW+cr'n[,rfs=SMtJYmZLoNTrYbfP*0pr&fr*s4c"qH2'aG
8H`4f8$ig"^O5>&dAB>J+QW1kX++C0%GER.eQ>``M:7TZP60Qt+U]"O!ET>'\]E6ZYV94IW
$70Ab181NGJ4jkDQ>5KeQdO4.P$9[34iG$\pM(4J@S>5l8iV>"]]<D"ioT9u]k`e'ig+M^R
@0JS^KY'PBT^LaSI-rK-F?`#5tdIL/JS7jJhsmcF6Ch_cV9cjICeK?`f(e1]9TEuYA+SW@S
?[kcTcR8ZY@l8ah:_dnDM-oH["c).@\AEDlH'W$5KoQnb)R_H%sV!Q7<PO.[6U&b(Q&f!%u
*U>H1N6I!P,DFm[m_EYGQZ\(9D([;+66#;NK[k2k^hhT\VKCUp!:-8[PYHe3q]F6D7>^*tZ
,dn`3Y*i+)Qju1Q4g!EW.6;*"FZrEI?;?=QZ3-e/6e>SN'oZEFLQ]mVCoD#;aWOeA!<NB03
j-\IsKt;EmC6/)_^]3-P>uiI!+[LJ,KE_l(fK?ks/TnjZ!SW0j-rD0K3SEOd3Ybhu9PCD%J
sIl"=t0N^"=J,eUIL6k/N'S1YI8`Sfs>>WN^%7+,i*H^>H1\aG1CG$DJj@^naSO+[6bXe7J
HD\@df=!5Ao6NVR4j/L^<B6"EESV2FD+E99ff8'hZhNAO9#n!12X)/N#.5::Dm$G^.k!G[=
_5Rr?$?49!?c-Zt3mD5gQ!"EWta[CW\Ze#&+AH`^P>/mWSnm]3P*Z>FPZ>&$Z%9$sA%[E!R
lq<'Oi1MrVW;k^&1KU)rkBW3b\V#l0?E:T;E]_q?D\ts#`RPd!^4CcA>h2t.l0f%8PmG#%h
.8ls4<`YO&M.L4.PV-6FHU'MK[k1gmfW`uMrVl]_\hC\J4553QDG!P:55F7Qh+<VD0uAY_3
ZD8&9PCD%JsIl"=t0N^"Qs^&'.6Q)m0dAV;GpDo)E'<)Z!=h[\g("A3n;;bZ*CRF6g`U8bP
:_@FmGndTU>c,UIVH?CM/`mP>e;M(#?R(>.*Xl9:)_#goQf&B?hLQ)&=Z!AEhO=f"V41KpF
2%=t5c0V94IW$32]pq-0ktT=Vd>'L)Nkj,Ap*K4A6&I_Bplg:CdOm2@OjVb`r9*UW0r^G`g
XHhQgR*Di\@]m<pgSFL$YKV+m/OhH,/[F[$9\7!k.B!p-q['V3PGX?V/,tjP/[;(t$YCX$Q
V94IW$70Ab181NGJ4jk\Q7D\+qALe?s7jW!Y$JZ:450N%kML^^>pBF]*BM^.$r^)'h;$em7
k7iSn:hAkN:41BrJb`BjH2sPN#?-sNK,Z!^-$Q'<!V<=8Tb!1T75M8hGpOQ`Msa!XHr^LiN
l9!pM[eAk/NB"2SB`QV5L4E?G(O=\okI[\3*rp9PCD%JsIl"=t0N^"IEf$U'!UNbVM^<6`!
D?B$Qnqrqll=&WL2@PUTBkootT4b*=Jie^I!f=0JbgAr.-Hr;HR'hK:1m-:S\R,?):hj$SP
0q=DosNJsBnQF:MV-6F>%qXs0d]=WtCT/1,?nNAbKjN3Spm[C)*c'gLo^OCTSG..+3\[f8^
^EPVn;FQl%I9c4]O$32=f</DSUSIGOnoRA;40j)!hJqSq2/1M"n])^f5MiMH2hSFl*A(8<Z
rAG>99ff8'`_Kj9=.YA4?VD,?RU$^F-s(6\+]Fb'BO#kb*B;GcQ58tGe8.db*FVpI$"0qk?
Bg]k09A7**IBU[VacV]"2Lu)H!"^`pD6VQgkC>);N-IUOW=C@eTs,!uELj0Q#ONZ"(fa*BL
QOn(nKm2QTr]gASe[rR\g`-$Oa<-5tu-n%</\Y*CVF\n0'NhVR,KV40PjmVfl=2K@_EZ'th
#%d_W?b?Jnu-'#V*+N@WcY]/PfX(Ec9f(m,e+,H9;f@P5pUe)^Q+Z!cVS1nBgYJ:(jY@#$[
/R$Z*=nDV3#hQ7ehgR5d2Hm+SBW4g[Q7<PO.KHs]=)"X#LCP?+XUI*$D91GqN>st,L(.jH6
ocP>jb4LW0R`EXf;r+2M'HN*A&jTmqWO[afXnauePZQj-9,C6jiWjpdu1;cQ7<PO.[6U&b(
Q&f!%u*A>&&A0qHImOjabKMZXuoN^1MWTe>XW\MHI9[8sLmj%N?3#BB82PP$WJ!-(BpOX<g
N*)#mRA.BIBc2fIQ#p!m+a0X8ff0AG_[ej`;t#qZlacr+FA9*G<^i'K"q3-44U[;+7Y=r&S
gXD%4-KK=;CB[sOTqs6*`_ld=ZqN48hZ.&^/k3hYTnCt7GoCr"2^%%>DXDOq'6:/PqcTZ.5
M+'j%g#M2E78&mP/JUn);Ir0f"TXnI=tTEN>JIIkrqYaEe.eo^W?QDmg[jUS)gQhQ*W>j-1
H=r[%3'3BB#f@0@q0B4ECmKKc+<qURW`.-9E"2-=_I2a?3^Z=Rf:/B5tdIL/JUn);Ir0f"T
XnIE\6sf>7XO*jHEA5Y6f@;ekJh3Pan3k6,j:6:f*8DOcLMEB&ji52@Bm#PMC@")`MZ9>e.
0=p?iFF>,m[SSF#M)BtoMtl-m].Qdd-]W_@**:kFu_'3Zjc\-,lLWBs?TcJZNkc2%U6)!@f
hI`fgU11b>R=0=CT:"&7hBWFTt92"mMp+BCIQmmB1&*"1U[?E+BY&rsYakiZh[CN+@(5q:`
hgRBV,U7(Br:mbcBW3b\V*YJlW_@**!8nJp[&)Up)]L<Yp6+g9@DdhsJ(XG<R56Eu[*UF1i
r?];o;2tLa2Q$*C"()U4#L`!m^_Kr/mN)XMdW%1]6Ac$l)47=Waa3+[;56g^L)#9=0Grtf<
=(AO$.+7grbj11M"Q<;dM_)d8FOB98+"c<12*2!Pg"kFA';aa,V13St<oZ(UpC\PUKD'D;2
MMr\i4T#7hmRm^qr1Pq2UE$&E%=1O+:p]]_sCpQBQ@GCT5/2o#Clq_`0?jQ5Kk[F_8e03sV
[4j'*EDtDiA-G!aD\okth=L;a=;Gr[71DF,;jN*I+lI<(aDPB#'o[6B>IJ).G\T>/#Rql*4
<12*2T`crI-F?_PE!aY.ak&B&pA7%o'2o>M%dquSUIK5:^#8_LT,51KcC?mQ4DVqpU&aW=^
HXD+Y\2:R*ZcBk^AG(s-DJ(0D;*L(nc/CENsQIHZu=k$Dh%YRp8rk;HKqI?5Q"?b^WDZe7n
#kCV59S8!W1!`bn]jBp%<1W\8dc`<OAB$;lj(UEH"/=kTb(pJ,]9,d*U-La,W0QI@iK=+t+
k<CY,_m^]&PI11`:S-n=gmDnX]3F6?Dq7R]d9?Fb*qhK(K)Q7<PO.[6U&b(Q&f!)Ot)4oO<
TKBq*j>I%d2=BO5(V+\cl+$+Kl,9oSKeElV_`JXs2*8%T1O4`Reldq&ELl[Tm8kN"STG\DS
AS!/5,`"SreQ(t,peUG+7un]+s5UM&f::pR_)H8e&8.H!fVVB4`$D+QUZ:@ncC[=nR[U7&C
(Ed,PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P
=4F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.);ucmu-V$gp#qZlacr+FA9*G
:qE,r<bRF"j*">*V#Zr@#*!%190PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff
8'hZhNAO9#n!!$tYZrEI?;P=4F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.)
;ucmu-V$gp#qZlacr+FA9*G:qE,r<bRF"j*">*V#Zr@#*!%190PmK#W9$gII6;%I^!,utc<
12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P=4F<@5(P!!!!H7n]*R/JUn);I
r0f"TSOAEjSf6cr-P?/QF.);ucmu-V$gp#qZlacr+FA9*G:qE,r<bRF"j*">*V#Zr@#*!%1
90PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P=4
F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.);ucmu-V$gp#qZlacr+FA9*G:q
E,r<bRF"j*">*V#Zr@#*!%190PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8'
hZhNAO9#n!!$tYZrEI?;P=4F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.);u
cmu-V$gp#qZlacr+FA9*G;3Fm7>NjQ'k%ZN/nhZrEI?;P=4F<@5(P!,t@E)&_nWqsGDA]TJ
GCUj=Wnm#IA]'3ZlMTV]eaQ3mUEa'u;qkg6$M/N%=p4EKYDl59W,03YALBW4g[Q7<PO.KHu
K@Ddg7]$%G+5'uYK1"DHh?q7S'RF"j*">*V#Zr@$E/W1Du/mPo*U&V0@q==FVm8H/*!;8`P
PmK#W9$gII6;%I^(\5TgIm!SkUP0bb9URZj[V\r+5lc'o99ff8'hZhNAO9#n!*=1>r;"L#.
mL84hH$pmaiMOoe^FY/5$Fs[BW4g[Q7<PO.KHu3['[2!hKVD_U>GV8cTeJ%.0/te;Ir0fKb
CalRF"h4_"h+aQ8WU6:f2cFMj>h+=t5c0V94IWMYo%h4oNa$6[SOn=gr9SA7VM2cY_FFM>q
nmjN6cTCt5ioN#FZpTPd3kp%;<J9`XlR99ff8'hZhNAO9$Y5'-8R`MH4op?U>6If9,h4S+N
OP2>$N]mBA:%3%4lhnT2C"Ug>45H]>#^k7>qL:Xq+Bq3E,ruF=Q]]s24YTm>O9PCD%JsIl"
=t9)uoB4FqQnY4?]mBE;Tu4AI'e4=hcsb4i3B(j2:q]63Ir4)W]m0),g(ebYUe.Sa$,F8gW
A:0D64$hq9PCDEFaNiKC#?XQd@s'H/uSFo;5-J%Q7\l+U/^S$$G'06:6dJ>?K59B;PZj&E3
KGAZ$Q*.0k84Fl-^k=3niG[")pJ.W_@**:kFu_'3Zkj='T"ckF[6A@QD-ZHgeYg""9j88kM
_Cg9n==C.LmOl.\p+9O,&Eh>$O#]6<Qkh?&a&rqP:g?+G!Pl!":`Mj>h+=t5c0V94IW$<NI
`T&-YX5BD=(WaYJZaf>(P"\rB1hA9OHTlF6O.opK.OsQuD[r1$5g2@4".\Hnr<@5(P-p^Lk
#qZlE-S@#Hq\Mr'gV%sClCCCqo>;)'BUk:*M\hG1Lp4pChgG#imC*0L'i9LJ.MGu8Pb=kqK
U)ts&f)6`Z=HO*4/e1+?@#39:8>U]N/Z7G-cK:tmFnskg,(ArE)*c>RF"j*">*V#ZrFPs=g
M_N]=XQd61k[+2GEdmUVP!rc0aB$qZBX87j!/$_hJWogGCJsE)*c>RF"j*">*V#ZrFOBIt)
t87n23bfO@06K'HW3!TiM-GL$Ru\od0W4*K8!UU4"93RL`96;*"FZrEI?;W/6T6:0``Wk5l
iM%V,9qN8@3l`/fa'PP>!_08(-:o6pS?+Y:5H],71^cBe?AO9%D'!tW+cr/j#eui:o_sMh?
+nb?o(ccWtqXs/MT0Ag8RsSe`o^qdN7urQ-IDUXD?[r#sN>aYq2@+O$KlYA&/UQQ@8'7)I[
t"F,#AfEd$90D:W_@**:kFu_'3ZlUgk?+PSppNMX8;)\r6PDeS2p2\N>omHEoP#oET>(;rU
56Nq_tsX)IL4+fm^O;(pnGOf#*7R4(_^(<5:NA;Ir0fKbCalRF"jjbUaN&_hJV[pXAEXX8i
1rmkS)]Fk,*qpNA3-d\M_&3s)o!=t8I#BW3b\V*YJlW_@**E+Un<bV3@#^\dH2N/S0D[[W_
S3bHSQ<oYTYBW6N'U8?"cQ3npOWA:0D_J(;D-^QJnhFKkRGB]ZBHa`58!r2jK'lZpT<12*2
T`crI-F?`3XT8M.(oaH&MA04#BT_T%)O6ncIc/"mLkpk[TV0Dj-Vp0fBuZ)L9:%9e]6A0c8
rD?5=Y,kSf<1Z.I6&Mp6-L]'->))FFW35TfX#5:OX!BEdaDY1ccO:cO,k)EX^Ah,.On'g_p
P5L1G^i3R_0*tm&ZSuY$JZXc>MCF:&M>bVqR!`,;1_=jN3U$euY8sCY"_!;Z["%VG3Nq()F
>ga,UND/ss@5-Z>te=]pLj+'uBlfl+Y(2IXIUWDf^PGEDU'qtBDM:/4hIX5!*6ZY.UAdn.3
g`EBQ^djB'(mG>N\r:@I?kJTYc27IpCA7WWu`emi6p?^Jl6lJ:=r9_sIq=<Y,IlH]R-lUC$
3?p-X@dE%+M'FFW^0nd/X]r8l=39<g^5$r;Knb>.H[C8@p"(d"[f#3M:[6H/oBE0F[Vjp4H
hZr\"q;4.f]LGJ*C$faTr#nbQ3npOWA:0D_Dto8HM,ZU+#VJE7u\F`HEoTM$<A^#qXj%Dg2
!l,/mMLg?XA3WjdnV^Y$/6umQ2'9K4n\Cr:*9rE:Df%K>"q155aoflIDpO.oo@@V(Q,h]SD
8tGeqAacH'%(gpeNYT3]'PIH?_q*dF#`2`J4gPq+e1g2tQ+0uo=s\)71V3,p-)4T*f<Ihe/
]fW\f/RPhLF8L,W`Z!p/l-[gAi7+]N*cF2Wc*_*N.l-lOhCY%j/-_A\PWgK]^Vl)M=f<8O?
A\5N*<P4:VX<c]#j5]0Lq;mqR557D'^kng5hEg-47n,u%muWD#N[UJb5s]_0GD[1iY5P)O2
qJEj][4B@qga1sEAlNbD@[su%8fd;[7._A[3+WZrnj_UX#=nQ>dW+rHhWt/Y#A4rk005<g7
S)ZA"J/GkqBdG6F>@?Ua/mIq`qc:mHW,r9=]*)Zk(jG*e4+XO$EVgi4smo=0?X1Oae3OW_@
**:kFu_'3ZlUP?<qc=ZlWB+9,/#;_=`@N>OD0\`]P?^)X^Y<"H5<^3&V&=YgYjbl\1\L_[3
t-]=8TSO[YQ7P&+>KA3nUirccUQ'Jb%nRAcWe6TZC1M4=HogG,\V-\V#04):>k0U#%+44lH
PURi`Z\%Ct?[_UtmbPM:-YA%a:trEqXa9XCn`Rk:j_k=(gJVlBGOA_j-Bjpg]4fTdpYL8Cg
+A2r1N_j-.p&lE^)DLWHLL4X^OO+R$16HS'.m>W]i4.GWW(1)mfWk#Mg('VoX(/PHa[kM^/
d+s]2bk1WF*DhU9<34J_8W-YJ:(JABC!8D-+BkU=/J_A*3VU>Zepi=K>ISgKob!8sLn!jd0
=lgU>AF\J[e.PmK#W9$gII6;*"Gb08'dnr6VRnhKo44ibaea:O8?Z(@(\%R'C(,JAHu[d&u
9%ho]l<46UGR@-02e##hQ',0hN-oj;5q!d7n4uqgJFm@HgL"b[[4am2!M_DeXedgQ3If9+?
;,NL36UQ6K]SD8tbRBCD.FPP8:RU+@3_rCS]mB?E0>/X;h(iQa9URY)jqiWuVb`ZZ>E4IN*
AA`a`9+UE]6a.M3"rCl]8d+G<ifD<C9"ZT3-XdqgU:t,Is%edr+sE6*A:a3.0"%<IoFjt=&
8gl\AQqM=+43$U8?"cQ3npOWA:0D_?heu[`lfRiQ!$i<'A\8'1JcfN>cC\LFQ9%Y[kigRJH
XQpm<q,q`Xc9PO$i([ob1j]e-*rb*ZX<r7c/)fs\4WNZ9cb%M'dbcL'>n1]7uDiWU;\DO`/
H6E"(qC.q<[D)60dQC<u"o&Z3FR^Mem%3!msi8[+U#+7?.LM>8:O]e=-^16-=Ka)HYB>b#s
Hsl=EJqJ[tHgEIc[U-+A\VGTL_]WrM1B"Bpeui:/1F:f&;Ir0fKbCalRF"jjKY4t1F;G609
9usNGF*,(HLtnHcNN)l1o%d5qrZu#fJY%f[a[XQ9''8q]k-W!@[BN!ZXIM6h,8/)'u7b!C0
FeEZY%J+SRI?f-,RR;D4$:QQ?qoM1"1Uk?EID=KS0II?4@.H<2!pKRV(BM7pI@Q]tM[]hQU
G+N)(QX41fRscK7ke>Z$-*Jo#d"Q7lVE^b<[M&6C7.s'ieM>,k80WDJ24.MGu8S5!$bQBAr
VmaS5"lC$MP@^5Rie&U8*d+t-IBk#i1BC4MQmA+^[_D^1EehJbad&kXFcC-W6L;S"l)`MZI
s8MohQsm7/`Ki)[B'juq[a]a&p6k\K^q3UK>4pCE;qAZ$NbPIZX]i-nMpKY;2a@)q"4QGAI
J\2?'1bnpDqqk-kn>IelY6tN*,P!M,#5%+*dP]rajdCpe(U4WJsIl"=t5c0V94IW$>6\^gG
U;BK[#uFX.JRhHM6]>qJtd@/R,ZjiCe>Hg/<X&SpJQ5cY>MBV&$YMEh5:4VR;3>DIQUaVi#
ei=JGic`ue>V8RY8OO,oY*;R<gc[;0"DrCVjQ<'g.<R9PH'MJC%GVKA(Q<Qa6t3-'(]Rl>8
'q?647>-t5.Qi4"eXI!:CfcDs>o('*Z-qU,/b(Q&f-"s85Tr#WZN#=E@GEG_)>WLtmrnqYR
a,d^MEp.rS#7e+aDQ__lL$md/>ICetCoN,+rC1qod\YM9OkW8MC!iZ/]k@,W$SR;gCj]9`>
3_qWQ`=&dB)8Cnnb(L@>BPlEfi!MA1M0`H]fX0Ce>cM!HVCD1P9pLsd&gM2HVE@8'e31mHM
+;Sq#gg'fP)7f-;Cf50M/"8b(Q&f-"s85Tr#WZ(g1XRqQ&t<fsu1%BIe70&`(@Lc-=tg_7F
_]/RH*"<F=F#E(_d)lRUCmUK3sAs'b<PC_SI)Zr3_m0>@4U_++ghn^C8u)5!1WQ7>Lm[5U$
njH2rIe>Q6PC/s*Qr8(/\IB:!pO+U[%dn`3!P*0:%H?U3RFI*HT=__IK$Pk:tC05JlXB;a%
316n^&\>fnB?89>1]E^^cTLem_hJW>aBcE$mG,7YVl+0["q=mep!niR@DM#0P=_LFb(Q&f-
"s85Tr#WZ<3KV6G>Vf?%:JQH,9rsqc'ej'6\PmaY#hg`kg?.A/R#MugU8+aFt?q1<3-1+Zt
N=26j\Ku<3BKZWlNTP[T"t3Z.f6AUQ<.bk*mM]LA:ZCc^H`WpYUI-Z=M(Q8X'#Ckp,dmY$/
5Jp$:3_+<Y(N_M-1"0+SBs)E)D6rVH2Hp\LRNLDo&Q,:up^Cn!>"]Y2"tT$E]X,:kB^c'gM
!R6>idA2-"r0<Z0uGepD.XAc#lG':;oVi@(A_':QJo-6bc4F[5'h&cm8FQnsUmH^sjDI`lI
DiK5m;b9Uk$k+sPPaJ$Zm@HD;*BnjQS@8]@0jVD7D;u_>eSV:ph`Dp/pn?n2iX^sV[^\ATG
PA+;X$T->`!P"o;^\V0`]R\H"G:d-j1p3J<o"lhFMj\5HVU+m2*=!Kldi1bp?^JFH*_a6MD
onVmbR3[Xa>7RMiE_HSNpXnU;<>_55F9'ic6<)fA.O'\T[A/\1AKp\?_TngV/+5FJgDX89Z
KP#5n2LD`(!W:J]l]HabsYT7?k9SaX%FT5q`"DBF\#.MGu8Pb=kqKU)tCP+.qVA@Z:==7,@
sf@SWqi_$:a]63F_k006KN?]4qU(81/DPHkCT:p-qmEq\amN<)R&QV&.7MJ!M5JOO;cTZ/1
nUDGSp"@MA^MJ:1F^(kJ-Q=$q*"M")dh)2jp`tQJ%3+Sm.GbH,9&I:,o3m9-V>g,OdiX);E
S[>&qsHOu'@Uft2Vc_QgXW?+`Bho-L%=?Kc^m:(UL5Dr-hloV96VB7pYUHZ3&fZZqYg0GlO
G*Ke%0\f%,M6DWjDZ->JGplqqqEkAE6(d*cSc5k>'hf;c6N3qn6:IG0`>GS<69ZjK@k/![t
3-g7Qu&Y[Bc-EohCuC>HJ/mZ_f(>`BXZNZL?`43el+D)d"Bph-4Ip76Ea1&b,6U8?"cQ3np
OWA:0D_Ps%hIG2bW-R0j'oh>DOb*=KR9:+5#F30Rk=05Y;AAF0D2]DJtg`qkBP*hVME0@**
<8k]J$^E2Ad[cjUZh*>(1\g:9T76W.G<j">LORK_WOI^6rJuI+_oN7YGiFQqf<,u2<h'T0"
,_.H1,@;!B\U"7f.F"31kQkrFaQh>EbFa*?@#1J*/oh7HLtn,d2FiT?uU"\[+*iNEcO3am&
3!)_5\$-04)<DaI$P^QF5\+cUL)A&/,`;k2rPSoqFm5cC[>Ya;/8q@s*]EOWm4Nrqbq=h-1
=-C$YL,#P$076T4k8.;5\9Tqt'^>,k80WGj=k[VX>sDE[U81TIAK^BP2iX?0jq68M_&DVMC
(6h00TFbfAA^V@Scc"a5-h)[g4/(3$UHd2?2k2k\Bq&NC9=I?o*c#'GhBDC;,hs&FjO>W)a
XC&`Vp/$GN(LFRgSaf9@6q$66cerkc*8FGq>e-U+2;=!'.pfl5dJ0*dIf$88bA6V94\T[kJ
).^%ll0lUTfo(,n*b165`<VPlDq,R%TpGmq7*poj7BX8Vl-H\":S>\gU:tRVYcL=;56Tp&#
0$.L_iHsVq%H:b(Q&f-"s85Tr#W*)#:jq-oJ$&q-RUUC#ms-e##jGG3#<h+PgHpgG8OcAJ8
:Jd%EZ,mEn<*Yj1a5U4MUtm(`T!DhFgQhGXBbeHLmo@\[u*b!quUZ$Z4_h4a]=m;))7Fam3
=W)4caj#FQFlJD6Tc-=M5^Z5u);cB<<rd!m>%Ghf?gm7f'Z0t>oD;3Y"BH&mJe/cfih*!e[
g8[^_Q]R<%gF0i7nk3bRmGG[np6ahjeK3]&B:m`LnJ>P[dFLH]M3]V)=t5c0V94IW$E#Xlc
5bY/=2Tb%<DW5$N7=nPhKd.rB-<'Rq;?l9F9eEsDk<*=b\a=KIVlQAq/YKtAnPcBhHm'RRl
1I@ZU[Y'/mc2(jL^UFG$Oc#I:^Tf[GaTYnaZ/'^ZL"3Z,_fNJCD=d<V-I^bo&(apR!p[U@t
fuI.;oQED1;MK'mK-??tWIK0tJZX$)\$Gjo*VB5$)H5Q@gup#<rK)ujfm*LAEdf"SUqiPL;
P>e-R`K(]Z#%)*OJ%4tR,ZrAG>99ff8'i&>oZt[+0Y%GqIWLi7%[;4AhGIG,-n$[*&f[s<^
cdoO<dDEt$k-id/2fJ!<iQBkY$0cnPYYL`M#)BK_9,3&2K=+2b3d'_`4\/mc?H%d:[0Nu%_
(g02pu@FC8)CL\L[H:FCoIXL*70+*Xa4s1*QcFF,tjQR(q+PNd^cp!]&VG<V>g>WYM*Kt]=
V]fB'PD?QBnD]O+hKMda5-UV#?qcq&eu1FRIr;[ZP\?G^+JC`fJ`P=&8_6D19^66F9^[cr-
P?/QF.)<&bU;:QRF4EB(SQcHb"SDj'X.ofsUJpn@EV@Z?hJSut/8\Lgg+qsCl##OKm8McBl
Uqtk.>=K5=LK1"=qV2?M#H^Eb?Sp3U!6bb?11"miX2W(*;`/##Z,>Xab8Tt_9[T)(s<k36^
)a9-ugIE?6UcnMCj2Z9IYt%IC[;2-&R"CHUXb`RF4-%,f2VZ6mc0fEF9*ShebaI00%iI,jj
2Z<Bii>tR9#_t!j<SE<181O2$!O?&BW5r#'.-E"?1p*nhH]_1s'sBH4h=Q42f>/0-B*=6Fj
$(&]&T17;S.,>W]ab=VG402E;fY+\pKm9S8;^aqmBD>gY5qVSpU5"eJKGP+@,hEX&lKBoCR
.>o@Ua'GMPP)fi":rBqi9mCX:5:%3.?(HZ14E9s[>_c-4B_>e%$3YhHi?]WGDIDVB`--rE>
.aY/fD6US7/:pt1C,N%""+Peu^p:gllgt/]DeZ*E9XKcVg9$gII6;*"FZrEI?;W1TP:S4f%
[.sFVO&]!I5E'tLq8A+'17Pdnj+cu:G3$`,]&T17;K_GQo>rAP=>f%,j2Z:Lbk(#D)]?f$/
bS&<K=^ZE11c?_#TYsJd/J#<0/&fm-dF[<_*@e[,MbX*fhut-O$%XS>aks/$k1W,I)LgQ\q
AY1V$^5&<7)b1p?^JDK=q3[le6tJDVWm!\Ja#&?U*oaI/`s)2@lCJR]8N\p4HqcD;1rdj*,
`mGhDKQ;Wa^Mb(Q&f-"s85Tr#W*(qG!VjMtrY@cSRinlsMT[u?Hq5F^M-FUusUDng/>J/K4
B\mN=6O,l4TP[.L.?='5kP=`Objr99l?@2&sm2n:d'U&>>-RW[??F+6<h*E%3;Nm9,Zo96M
5()#FnTAbfAu&hgWMSm/Qp2]95^NY(Q>q+mf,eJds'tL\^oBHhp2(OkXKa([B^@=U\&>5%`
$:-SHP^JIJA&s/5XhrN?j#b)n%JII_2_e5"@T9^ZMEY(qsij"XI7W4m'V*+labm<]]ZM3rF
RqMhKuAm\T9(H`_P9sD1r@Zr.]>$_@n=(hd?lt6`jP"KZd!r3UL*W>U7NsAkZU3EWSl;>_&
Zn#qQgY'J(c^<2icLGFAKM_SSXL:.9X'mFehDn5bu9D+\Y5ED&HDr4$]u2/:VPgJdB"0J%/
--*(j]"R=dcJ,]8A^rORD>57-X;PZhqC'T`1W@TRjW(N*l4fCfLA?"(f-5S48+Pai_Vba94
'YAsX=K5H+/n0%*JFHHA-Vp<JgL,R6"bmL-HM=S!Nf.;EEWSl;>_&Zn#qQgY'ULI[V@Fl/(
GF(Gbl8m"C4%qJG6"U="nT@p^6@H1=A->HiIZ$$A]pASgJdAu03>;]@;/5K9-$*;XDn'eW`
@7/ZOmc]_Oi[e8P)Lj*Aj4]Z@!sp.d#mUe07nue,]XU#WFhjnmp\pLk/GcW9W_7#(qL'c'$
fUqtga;aYF>&=)$6efo@(7<1P(5!jGWaJY`E#^f'7sQ3p:mlAKd60M\F=.b+,ZVG3O,Ik0#
?O)sF*7;YG49;PB]._u82PURj4k/E5p=kZa-;Q1$l$@IauX?lWf7R6b3Vdq#U.a+=;Wm[V1
$YkeR=mF(j,DDVX0O]QP$S:TfWHt1qNfFm[YLS3(i?9?fe@0W*q!Pc_aN]q=NHcZJ99g/m.
c:@Z<DHr$^ncdGNMX@]QqbREU^BG:FE>j(7Imq)1)?]=:Tq:)H?jcB2^lKF.oiSpgnop1.W
s./I/3>Ep0!]Z1t<p01fUu;7^H'[AZ&L]jm?cI/Ci>&<k);4V)gUs$+H!@7h3Y!pok;L*%Y
uOX+7[g2mpr(THI)bW+I;VY$Al"&,5\e;f?;(!_\dl==W51/6,GQWPI#Vr^KIuG'<"RAhoJ
\i?D@,?7gXW/5J]hKnTglU:@&V^OKV#5m\l?\T29?2GM+fWS\Y*c^m9U41KM'T($BPJE^19
SXl<k\ssWX/Tq!dn\WOK/_.\R6+DWcKaUO%N#c84?ZE\^"eIl(`_n:s6[%qT?08TdkKcqAU
llPF;$:"$SA8#'(LX4_!_W]o7_<j2Vuqd*!seBL1RU;UldDV&j_n_b[VaO-&KMlDg^#H2Ao
27U/n/U.AsV+_9u0`,_ec)NlJfd@NRR"5?s,/)A1^g,Du,?!$C31,pW`Bsf,$)H>ilfOrUn
e:n)(1T=+u4%apBU6Dul7S-a6QXC.t6`SN9^u;l0tG&fA$M0(h2>eh$W$Tg%'UnB5)eYZ.$
uV1nc9l8RUJPM'TZ5Ok4%DdI/`Zd'6!*BSG?(2:(?\o-=bC'Rb0r5TMCp_E\cD.mVHUe-b\
:AXV=GMbQ5r`l;5.L[k.:11&O$a<SjJY`EHK5p&"CY,`ZXcmL"2E!Ja\$B\p,2oX<-r>HJ#
V8tfD/#CsDk:qFV+R#qm'H0;]bCCHg6=!_K%`Mc=mGkVl]'BZbimfj0==?7[FD<_[o,:)'G
Mgd2F_.b@RTQu(!)t0HX^HYKZ].PY#qr\\eMOP'e32Pp%;=4QVrC2apBU6Dul7S-a6QXC64
RCR@+q8S1o?cE5$J'C=Pqd67XQ:q-3[\YJ5b"_QkpG/6-;!Bc0'[ZuGp8lIF)EZRh;mX]r:
&Q"gk)VKU="Q?r>q@GqY-*^4tMhVS&&nKYG4PI8n]kKZs!SsPe1K\G'-;P]+f!V>L#=7>Xl
If3GFnHOX)baC7m\oc&^1FI<@B&o:cISk6.WilIsPnR7LhuYH0:11':"DQGg)0M%&042FhT
0@6GP.KX]Pq#epDhYbQg9tikD$6.SZaR6JB[K/VI7m4+JWE_O'OS.VM4F.te#6+gi<kVe4f
ZSX=PhJ+gU!iGXJJ+-p5HTW2Jq.nWRIqFf8QU#_A%7hmbPg<'+5U/9\l?*fX5L]O\:D)apB
U6Dul7S-a6QXK$9iOT4O*<IJS&G74qiT:q4.X3HBNHr)q;lP*2!Bq;rXTXc+8^QJ)g"<G$)
^TrpX;DVR4&O&Nf:(c#WXSFY`.eaU8!pF<JBYcohH0?ZG$mSm_$Otg*4NJi_<SNF<",GRbi
QIKVL3d'^5>X82[m8Y`'5p@Ks*$$%M<id_)UU4"!:dNe[a-)"MapBU6Dul7S-a6QXJinP^S
7U7#I/3@/q"X>.o$jX;e-_6Y5;$R^2fIQKDSk5cS_=Q)<G$*I4F6Wj\8d+iS!uYN,=db.rc
ktojc'3b@9TUnCpTXPN)6?Ykg6"qD+bcoCT2uZIelXGOd\.C8uR`?=gM]H(Jq>D_3gT,<GP
DH@\$`3D#*%F+,'NV$Mdc=R,u.^jTLkV\,]0e'3H_<9j4uAaYHC@2`KnWU^mqFcB0?,E-_E
Yool]gl77sLVb`p_gOZ3DX=]]erqT'oEPd>5%g6'DR54"&p$7bkPRhnJalU^4/%)Ksh7<o2
le??mNK9-%C3("AAP4%#BTR0XKNkp'8LTX^K*Mob$Qsqo?3)NAb^/!MBe8_R$9pMD33Z@BJ
Y`E#^f'7sQ3p;!Q?>Mm=LN#`Y9KGoD(8dpJH?!!,9s$B*Z#V_?/;\NKaKA*_,=jqQ@cq\T[
!pKW`1G+Y>&?9GTkiD@IW3kdOJ3!Wr%_l0g_jV;&<EY`quH:;moYkBmrR4*%@RD7RBF.W&*
74=BMM'J?#,!E?]>X]Y_?tfs7G/97j"_#qQg1!L>2_YZ,#!&4[rP7NI+mqssUHSiqG1'M2R
WL+mi>>\T2PgY5XGB3ad-Q7B5L'Sn@J\"&FpEK_Jor)'s9E_:\)H:f\c5*I?i(+ue9oB&Y^
MoFA!pu."lk\-g$-l,ai<.BCIlC/B2o&T?7p6JMu,LgYsZ5NVG=9Vj5A;P9WW`QBAb^*ZrE
WSl;>_&Zn#qQgY/=SP7U5j_$0JbM+EH*^^L%!m3U]-L>042H&Dr6Fh3?TGpA^8C:2f>k,#"
t4a>On,a9e'/C,ht.`hnFNgVP[%T6>`W?j2Sa]N-a<BF'c\:3:#2":Ycu.l'0nl=A7CG$,?
H4)g1VWCtV_"f-21S*2j$?X]dS-,XeI1<$a(H9R)FER8^AI"dUVcYZ/CA=K7n,;LurQOH<;
@=uGRV.#%$@Z]>t[7_sY(E,b<@7>pTjV-G./QBp%S>.8B$C'kOs7-<Xoe7O40q.I\O@Au"t
,7nW%DO+,/E+,%7rTr2nQH?s(FQbtB!=>UFjSJQ8eCms*>,Ba285n$_AQ/54=AbHqV/G/&R
:Yh=?+O!%OXpV>#3O'nMcrBpVG3h[U/\-Y<J9g63HF17k/7P0<&oN+!\V8djTLkV9UQ8)0!
L;t;lNs.lMgbZj_U%f3QNUsjN*H49>K36g'[jC;(%[H\od2R\7S$);Guu?]ij'"?ORO4R[/
?snm/hK8Q9PeNfG[R+oB+uD;2Lq[RU&<J,\KolRSu7q1OES:^\dVZD:C5NeN1@'e*%6\j`=
qe##itNK$qKU[4AXV%WHrY/$OobEmI3(+iG+Vu$/V:G%+db:gWCI/-["!`VU5)X=t\o,=qP
=K7n,;?7SAWH&&5"X_NN&L1D45\[3!YMSQpWriG+fsd-+ODs7"%:XDCT'Bih(5/Uh93$K>n
]1P$mtI5<#RG,$^-,,)`5gP\BS3-nUg(<G/CU5?qXeLki5$rRR[KSK&&MIuY=sKagrbm4M9
7Q]S4[a>n?-'/\od0lET0BkT4M._Z:U6,TqS10VT;ndk007bkKaP6c.ojN)>?Vfg9hG33[A
-rb1Eh(4$#D\CY%jnOX$SaB]>>Hbk;*b$E[OA^3B%;W&d:468i]7FR@d>J\QL(ll#K8LD7J
ujr5Mf&fqjMLkn$0i'?bf]a"ub`;Z`QgU?qRq2*p.>0+a<]2ke&)*.)B"dUVcYZ/CA=K7n,
;LsZ<*ZeX_7Ld@G=B`"CcX*YQXeA+;g=b0HhS#BeQ-!.ombPKVY$<.MR>c8IDVVa0_#eCfl
fQH](G&ZBZZ`;9IQi#GJE<1X6N6oY7un]c$HQnphVR,<Vb^rN(GuA^pE*=bV.Kp//TM>_,E
hIb3b!eUc^l.5AdnPK))uT.W;]t'=g?RMLA+*%af(]!-^fC"6EZR-[r8mh\_5]jeu`.8Fd]
$irqJi[@>&(,L9X]XZ=HO9cl'TF+Vd1jrd;bH*W>m0s7Y2cZ[MXE5[\Z/o!2iMZL86s##hE
p4ad%/^V>81D3FpUW:ATLCBk7bOEUFmicLo<L$;fVA7T6Ho&\R!hJ^1-[VF>BEX@6gCTaJ/
,\$DdNusuSF(U=G/Q1HJS2G)JE"+@6Au1Y<:EJMbY-+pg*^.[4$O>*/:J]=(gUBtK33dJ``
i4m5e?3)HEOWm)`/ru8A"&mV]=YZgcXm#^.WKHJSN:m+m`Y(6s":`_3P\PS"I9D)!)&Rj==
Q"QaJas,-B!2SbhU)7@o*N.48%pkn'Iaqa,V/Z2/;d>GMe8R3"[--3tR_#6D6`".TNKJZ!t
\"q=9C@Ck2Wk`;XNCiPUGF7>jd:1OoE%5Q:Ff]mB?T[r+p!K:GKns".*B6tUrKrV,3-4Vh\
US.Sb!\T6fQC##R[Rt_@k<iJuNm)a@!5WhngMh_c_P-?IBI6#ct(<LaAeseO4<i8\5Z8]k`
aR&B7I[OU?Q:`::/n*?Doda%B<6^jhM2er[fs3nr#%Z<tL!9=Y?+Y7p/g*8=S=BZoC*;,3K
aJR[eud]t$`!uI%?d_HHbc5;a7p'7]#PQ,<C>8\c^m9N:T?oT7sfK*r;?04eG@;O_/t>E!g
Y;`YZ/CA=K7n,;Lp/SHhONDG>JDt^ns<f)]p1%l`\&AVk3J@bCBHb;:OHTV5heOFmI!>Q`t
Dc5#JLh98;QUgpA=Q,uG2.=K#$RPEShr/Uiu)N>mf0'q2@+K!i"oE]Y^5eZ)WE(-jKJ`^`X
3o'G$cQ6"uKkkN\hP:M[7G_ZbLL(>@iCXt$u4$*ZP#P,pr5EKA<@).<Tc's2_e\;IO/F,n/
99g/m.c:@Z<DHr$5V$*NF=H6g1rb+:"\+fC8n:7frQ^rq@WrhD<E6VPkp!RBWVlA65=VU@q
Xs/`$ZgB1;mqFU7un!q0eP)]7>hr(DDWU!*[5>3+g"j]9MA-4"q?gO:]H'8R2O3/eSEa;;5
o)Q*&qnfAV]pBdmrdtIer:V;9)3kYZ*W6V#i9b;WS%I$8f]ggUBVb^SV^(o?TOKr`n"Eo&n
>KqXeJ.q[Jjk*fV'qqY^/qfZp?\N/;,*)k!p+#G"Ir@Udf`9bja\S:oCOP!.L0F__.>qGjJ
XR&*5%QC@__VB^+>.^u&LLO]@&Q_fE_99uMU5Uq[-/Rk\InV7-#Eqo-4Z,]B^YZ*W6V#i9b
;WS%I$FE5u:f+cImF32+Un^81$B2a7]Qis5V-d2[(+jjk_?FX8%@4",N>jgB0O\Zb(+rk53
(p8.,Y[f&Gl%%]qrCURg:)"HZ;DgG*BSFDC85-)e5ndOZIIqg'0E7jq-1=GAZW`$ff<Wh-'
d]O^H],\:S0hMr@EB#?G.U(+IU#CjTLkV\,]0e'3Ha2*(`^nldi0_*i/'D,V=<4jE^Xr/Rs
&L+X)e[e$/Gm:Hus(C(Q]2#!I;)Ll.'&gWdr%HhOPn8[R,Y1rP>X\o^MO-6c<O/6S-UUBZ@
ehVMR%drBJOAD[LCZIIqg9E.\R1*q'tB;LtVFXh_I[r1#2=j0DT%3%4$(3'3HEL!u(K$5Sj
,Qg])'3HaB!\@>H@&ZDd":#0m))EUXhRokK7e5`g5A\uVf<8P>Wf7Fnh;-mcf&2W]Y$ANYR
$6X.0EGR\b!M+>qbKlOKS>*lj[ia"6U?2!nOL]$H$OZaAK:&Dod#$4IU;P_HVt\@E[5uLR^
:KX4?YimIJVRDdSa$FdF$A&[\Lk@\Nk]Ie0eJ_baG7$G#N,*Wg26$aHQal.OVH"^]di?SA8
$RV?mY>,\*NGV+N0u%O#`B[VacY)`P&R>EBa%rr0@7[`!55f.^aV&32tKV?0Cb$ZXAm#7`S
+ekGkb^'Y`$:S0gVc<3Hp`JYPML(.XbAQ5%]KiTMDSs5P^aN-r:-HVZd]6sGFe##k:o]_Rl
9qORqp5_H;:h3W=b*FXVcThGcP%BVVC@[]MMmmW^?F+6<q>6-kH?(O":kOgiO,],.3=4g!O
R<'TB_C/kF&YeLhnHcJ>>,:4-dS;CPAr#k21VOG#qQg1!L>2_YZ.7taEWXP?2j]d0554qV*
[B&X]r8/Rl1ET#:idnnRr.4#F;4\;Q3^!g4BJ97*Y6GN4Z]K)aRN->Uc\h=0Gp:2b74^0d?
c)$kR<?W%gq,<(fqCkQ_V>&-o1@]fPhBOPt3FeudQ-?QTjl+gtb+q"XBSMi5cNJ,Un5%>u#
UDIHs.J,]B;kKagX<2uaEJ:KY$k1$A/LTq7D1UHrNl]Y3Ec'pYUP*4mBRN0e%oB+T(=&818
X=;>Qo]ah;p$1*%mbK*H$F-)W]QpjQBt7j#)@8Q1[r.aUZd-kA&t7&Ng%1O_>oGkP["O:l.
TWWAY"Dbsf<DJ53AlJEL6>c&V5:#AVoO]0.:R145(!"iP:'.\LPI['OkdaoD>ZWuq2\F3j,
aqXHhZsh4I!/oj9&&?'3HaB!\@>H@&ZD(q"jjTfs>>6PUSbAoOu[Ka`lWjQZ8Of2fE"HUs5
Af-SdQ.r-0u+4EKYD^V@P;Kl,YWp$]ZqDV)$30dBRuTgFG?(+`RnABCiOWtHKtQ;*+P@\57
Wl!V!M<'Ga,FQ15q"Uc*uf[u9oH,kpc]63Gj^OL`;>?`I&VfV%H.JWnA=Q8B$n(bI[G4!ui
'./f\Empm[M6-[NKpjl7P5gl=3TRps1M.'C,uQ48=]5(jq=u$nG`ZV!Y[PG*%MP[RfW\eB(
+hRhkWjN7e>Q6)NfI2D>Z"=Z;^%`Qp?^HY99t\=P0K-Veui:?AT.MEo?X4ep?gW/mbN6<Ue
/M,DVr1QjlJdl`Q-#3f</DtprH&+gMahaB[EDmjiV,c<N9#Tr+GTXOM*Srlr\9PSN:nNgoh
DF+>GUubKF]"qXp%":[Zc6(V'Y"Y?sNUn<$p!\Qojl,q!cV.<PFYC&'WJ97+R2%HJFiVQ8C
VB5cA&R=g-EW8HL_"-tDaYZ/CA=K7n,;F)(LN,M'M6=dgg#tuEIQ3mW=2c3FLkK]X)\$riT
[VjWq<NTH48sLlkp']+Bq=Bq$;1eR`UIL7>p?fJ:n`%HA&,Z1unLj`hJ>LBp//<+)Q7=8d;
uhH?J>E;IF9sKu:11&O$a<SjJY`DJoE6][!2)tmWH&&5"^HSSapBU6!2(]IW;lp(!_\dl==
W51/6,GQW;lo]!D<RrkRq!tSA8#'(LX4_!_W[skQt?@!'lmd;WS%I$Fg(/PnR7L!'j>q;?6
d/"I:MbYZ/CA=K7n,;?6cD!gX/ncm>nq3J"".0#1BH"I9ApckEW_!.Z\QV90)q'lX2>.OVH
"!.^YkV#gX=#qT(O@&\YaYZ*W6V#gYh"=t8fTM&[lEWSl;>_&Zn#qQekTI4-H!!$:+99g/m
.c:@Z<DHr$!!#._9*G=Z&m20(^et1L@&\/J9*G=Z$!8YW5aT8ajTLkV\,]0e'3H^a5Yo0n!
<B\6Q7=8d<58Z>Wgpk&!<@G_f@RLD+@CkliE[Z.!/LiF.OVH"^]di?SA8#'z9H707SA8#'(
LX4_!_W[s!!!!QEF>bd!_W]%J>LBp//8-b!!'gQJYgKq//<+)Q7=8d;ucmu!!!Z;Q7=8d<5
8Z>Wgpk&!<<*"!)+A7Wgpk&!>f.CEWSl;z0QCL"EWSl;>_&Zn#qQek!!!#7`.=c-#qQg1!L
>2_YZ(T&!!!!4#F6heYZ/CA=K7n,;?6at!!#\4=K7n,;?7SAWH&&5"TSN&!&/D#WH&&5"^H
SSapBU6z^r1f#apBU6Dul7S-a6PMz'*jgQ-a6Rc"^%dp^et15!!!!m**B52^et1L@&\/J9*
G:q!!"]m@&\/J9*JRNV90)q'`\46!5QO(V90)q'lX2>.OVH"z!##U'.OVH"^]di?SA8#'z9
H707SA8#'(LX4_!_W[s!!!!QEF>bd!_W]%J>LBp//8-b!!'gQJYgKq//<+)Q7=8d;ucmu!!
!Z;Q7=8d<58Z>Wgpk&!<<*"!)+A7Wgpk&!>f.CEWSl;z0QCL"EWSl;>_&Zn#qQek!!!#7`.
=c-#qQg1!L>2_YZ(T&!!!!4#F6heYZ/CA=K7n,;?6at!!#\4=K7n,;?7SAWH&&5"TSN&!&/
D#WH&&5"^HSSapBU6!!$!8f@Tchl-kZQNl-S\Z`p[l>n0\nW2M+?:X?.I[n`JT[:@7;#7hm
:>nPF&YZ*W6V#i9b;WS%I$31'`&/#UrjiS;S(RMo:rjtmo2C2"^ba+!%^\sIBJNtsLio2"B
HK=&D0miW\mbPM,XBF#rbUi/?hR$u1mi$c6J>LBp//<+)Q7=8d;ufUXf\"h4B?o/agJ=4mA
a.X>QS2]@8kS)KP]Zj$r*3N5kKK>MCY#Qr)`G?UpPsGd9(M&bPAGid;G@:7&RE"lD:u4+;l
<ArZtRk/P:+J+-FT':r9$;]LDuNd'F0pR-a6Rc"^%dp^et1e9t"lk;RUDpF@4sNeZ5<+I@>
@oU'V8<*B\RccC?oDp*E4h*.@_XrUf=fn*6,<QDt84j\qpDNHBrQFQq4kDJl3&JY`G."&"m
m==W51/6,GQW;r;.'.-DoD"LB]cIpm=GC^t5nDQarb*=dK:5'#iI!g<df;J\R<7>L9\om*)
am9#\g=ihk"\T$=#F6heYZ/CA=K7n,;?8I/gt^\<#Jaq`B%O4nk?TDJ#(rUPZY%)1C!`N(V
OqBo!L@K[>e>/2h5d:gEHcV>C^l[;N"7I>:11&O$a<SjJY`EU;@or\?bX2B!17/3DU,jl-B
9-19'm!pn(taj/!UJne\l1NV@E2\XAGSl\H#c9K;AY0"&"mm==W51/6,GQWELZ555kbG%j+
")/ebI0n(p2CXilt[=%#FZmpbMi+$Q3k3s,]tjB\`i@&`Ar#mm<^R_lt[NDiMQ=BN/dU,0^
1bDW2_==Q!gYZ*X9[-mS#?.TY:bfaY1*N$\Oji#^2m+IS/LhZ#)'0kdXn*f^@*Hs)@]$q!e
,#Er`4*RuhV:gXQHth-2'h_o&2/C4D;RsS@drFm860`I)E8cCgMXg?2A2t/,*Zc@R%Dl"on
U[M\HB%*YQb4t)[=G(tHHl97&#eYU/6->E_(F\dqWcV3]SiW8\8c#E^=9,\LNfS8JYf6]Ub
)2]Pq,NE<OQ_HY-';b_GYsTJYaQ:%4i5[1`'8/(?Ei96]AqIB@!1>/s]8EG3rE.o)%mjo<)
%FYgdc^PbgQlqNU6=b*MG9OWuCd_GYsTJYaQ:%4i5[1`'8/(*kRf:ggPe</MJFY).FDkK]X
AU'<Dcbhud+>[XPq0I]Xh9M@!<X;J>dEp8\oOJP6F.PO&j<(*p@V':`X!_^e,=B\m+O6NH3
PB`G9`9Z$YF6Ch#gm=NkF*`1[o<)%FYgdc^Pbf!>:7OkWVdmc-N30ooJan;f,'j\L'gXYm=
DHFJq=EdfBESfYeZ)V:6UQ-cai_JS$\cpQ=gM`1Y#,4-WTc)o9-oouPq#de&($4N0,RoGV#
oZZ91AIk==So90!NhVbO+&nbEXUPeYDs3cTf0io7hI?iZK<=e]4&`B?rbenmo`T.SUmbC-#
&5;NnlnZ;3*FY?"Q0CtW%%DQu,(9*N<?QAXl`YZ(bQ>[XO6RF'=-H1U1KW)4f$+;1BK=0LK
'Pq-?R@X+4dKfaMHo^(8;8<G)Fh'l0n5hE/EY@#&i].V'QV5D-5/X6kd)nUFhl37\9Ujd/Y
[;+7FZY,2E3!#<PN"7HSd;*-h#bnlF;?7q%3gq%"1:lURLb])<#;]+OUFflQkqGh)9dMDEN
a,U^;,Pb*%SHuF#F:8226^$_d9L(Y!,)O<C-#&D;Ioo&"i^e5MWcq%<!:TR@&X->"^#M#@&
^eS"F:09MWcq%<!:TR@&X->"^#M#@&^eS"F:09MWcq%<!:TR@&X->"^#M#@&^eS"F:09MWc
q%<!:TR@&X->"^#M#@&^eS"F:09MWcq%<!:TRoPLS"5CYk:ie3knS[GluT7?jnZt[tn?hjT
ohlWu]VG3QBmdC)NokWDq-N!T5*'\o-aiS8no][SjN[30KmFuj[nDWEINLM\7b+_=_<ifE.
Dr3`S:X@tW@,AlF,!J3ilIDr9=0K';Z0BW/6gN=*;iXE?k0;YfC"'D$cUj<I\[]/>4*N;>4
IgW#'OkN\/mc1]cE8<XL7"I"Vf\_C_hOs3rVH2V3HO>c?+\1?<H*l9[o?^AhZF)nO>Ct:_M
+1$:F>8#Xf^u\3HJ6(>e+Fh(=IVOF&7%<U4B);qoIO$D`p3Fa;oog2orfZk99Z9jI08YB$K
ShVh9SQN80-.aN+Ss*ZR4_Lg8HQQ7\RfGAbQ+eA$M5^]+(f>U/;t3dg_l_hSbf?2Z6*/rn_
"aM1>7LCPVSr^MkcV-KVQg?d:d&%Tr&gU>?@meeC;//?QJ@&XF+\`hI>,9e>QpoS,NQ8s$K
UfL6h:n[q.4$A&jfU,)s7n<%(]=3"QhIXlrALTC"6A5csX]p"bJ-!i[00ascHq6eaKWQUK-
?c:Q7[OO+G/oU`mFntkT0GPM2pKRjaJb8H3pC-P;Nc"r`:8QY68W&K^5rBbSiqE]GOCt[Dd
J`i<39>hN5f5;GThRc`j+%Gf[u`VGENH%/mXpBKB.\27uF7c`f1poOr+T3q)'j8JsK$i9DD
J6rqncd;iI"\+!4;(s+(7WQ7>m,q!W:baAK^$rE6I=&XcXuq[!Q8[r:/IE,b$oZY,OQ<O-8
`c>j7(aM#/[SN>i?k3VI4o]]:g>:6m;ik/gNN;"27h"f&%nac8)[r:0dc'ug\B[3,.$Pk:4
EcN@jfZB=)("[O&^etcX#*t,hRZ#HB2)$_'p?^I$MA0J=)PuJ\?[a/N*4:RTY@#$c4*GFk!
X5A7R1\FE6\Z"hF`i-(jpbf0A7S>M<gs&c,;_6A%*XSE/LmZNA]g7*0O]Q`X0,^<;RclcE0
];sU@!jT04o=8F:d^)dA+agB@#WQTXL]nq>$!h2m-8f@M1_haq$`75RnQ,'fhO5@Y0n<`(.
>/Rl>7@2FY#QH[C*[EKr(XP5XU?5]jDDa,YB4hGpT-`3tJLR@BZrEa'c+9C<an$Aa\$F`_`
$mek9eB5)'O>Z.Q7Og7>$:7TtLH#ou=P@Hm2R5Sp99U[ePn(tb#5(+RT==U&s^etb4F4#uD
'($m<'Lg#4^]!l\UIUBp-o*2!B[itX6s/Ldq,MnBoiLkC7;YbrV%Tb4]6:=;D[b&kUIG]DD
&L/faT/VO\T0HPOXEqrfs><=,U>p]5s7ju(^qoqXAJDUP<]*F;d(KAaPrL8'4PU&qXfpA(i
XS=oTUe'W`5slCgg>E<Y\WSM%_6d=0=)qUH*DX*&hc*b[37A',03WgmU-<.]8H`[;1u<`.J
<eJ""mfQAXl`YZ(bQ>kDI(c^m;sl)107$k1RH.p&n8bEjaVU[%:']4Lu;8B#[%e]5^c'Vf'
f`f(c[YW5]82(C(jnDM+ip8)otefR,*PYd3/Q5U>Id@io4"Zo8B3HM'N9#Ld(Pu"AWV(Q)e
.'9ft5($2%Uji:=0bt<:(M@5f_u<mqQ%f_e9)^^>eu`/!lI8\2P.Gf%8h37UYZ+#oJYaQHk
+VrN4`]USTgFHt)B5K+W(h)EXS`E^&e5j=9T9D.@3V"0]V%ZL'$>BWpkZ^$e[*c@^qfg>lR
U_VCgVW0Q8%ch)O=!UEkQel'^su=_hZ33+otfG,37%?Hi*O(&j!(VV39#iAa<c5@4bZi:jh
TjbEm_OlBU"-6#+]1/!kj!$m.Z<quKXp==U&s^etb4F4%RqmbYW]fs*h(a?VI@3a,:4Ocbd
ng9jk__R,\^V&hjMS8h^UG0J1SK\o^,a\r*8r2NbtVJKU;WE$!bfQiDj[o@Ad./T3P.`RnR
(RD'8j:^4ZGH]ZEWar*\Y@"2F3]K*$NN\C@+JL@N"J.GaP2\@g>%S&+MWcq%<!:TR1i93>:
S(PS*R@]rG3pdTd9g>`D;2L!]>@OW>O&1dVfLtGXa%UL1he/H>r=/j/1aKJa2g'bWDb0AVj
?>.3dpjH2>T`Gq'($k6suu$OuI=9J,fIK<+jace=8O?;SO%oJ"Y6!/#eX(a\@q0-]iiTe0s
86_hXtHKi5]a&\SC7MBJ@GFtM8!gUhF`_J0Ji1,<Lf*,.h[k<\!)pfctKf<8a\&"=FmB$:h
C[,RBDjO#qo0=\O%YZI[&V7q9K8r^"g#Zau,U@u$+@&_:HUIL6AW$qAbWaVkXmpl(YgK3q4
An9c2H.5H(h7CS8hO,c!(+bi?R)j_!'Ej_ZkV]SD"OUI2C8hLG$&oi\')PISac[t9e>ZB\I
/,mMnqd.8R@+rifJ40P%hGo[Q75b0=gM]\4*DT!A4ZI_h7Igq7`;WB`JTU=)0</adNBE6MX
<'j8<G+HW`::9rUIoMM.D&-DpFt>0>)GH/Tpm[jm69O=gR7@!<]2mR:9fA2f[iqhS"9B^Qr
*2B[M?\!62%'[FC<`8$_lOe60P8rDp%(2/_3:\4jGRjmqNVQe<J8gY7Y?gQI,aI[.Qko+ii
W9\QNYe8L#g,/I.b'e2VS%WXUAFqYoXFK"[u[qsa7^:>^nWq>W/DpkFQjP$+dGr#3AhgbYh
j(HJO'OKqS?naEOdY,:NG0#BWIMA"MQAXl`YZ(bQ>Vp2pAB;U^cTN-[=^,+&3HHN"/hUuKD
r/-0]65e'P`3"beREn+/;9ai+SHlm.p&mdGk#6oj_m][NupT`5+fsE;AUrjaOjVsnJqi>#;
7a6F9dL2*Ze(2nP2hS`6_G[6maf[>ol=897?Ku(#u@&mFnu>o^pA[!nk8B%NQbeb0gP->K4
Mo[+*a\=I(tf.TNLU@`=4k0>I(=HW!bie#-!NDr5GBA!='n7MA-kC'rjGo*m^taUO6b-.;c
0qXNUdgUD)S>-s+aokJO0^O?!FYsK4!D;;Y+Xf^u^4aT_:kq;&8`'g>NLCYIRG7P&hMj.ja
KV'k&$k-ZoKVi>(QIi9FbLcmLkc%LY)Dl-Cd`?q>!sFK)s/`F]Oohn/nrH>jVG/!fCe,%+l
-cC3Q;T"qc$0L.#F:8226^$_d9O%lWFVZ"Y[Bb_JO/2-I>+$c+=$7_)`Ed4*_U:ocHbcFNZ
C3IV+i]l,eh:.JEFRoqh/26AZ<DX^&l'NV56Y@)J!O%?=_1aQMQrj>&)Zl?)\hf6fn:DpJ^
CM0OY$j.<71"mV2nWp&+XW_G0.5O^lLr-1$[5^3fTl`f(d(MA.3UN/39tr00l_WB^=MK9MK
4FW)lQUYEG,1S`k+p"*Q0's^pkfed2SjCIlQnfkPeJ\N'dHoQ8,`;[2]fcp@62qcd[q=CR[
jiWi]^tJVWksK<=>`r$`:;(`3:<&bcWUT#mQc.e'+4RK$5OEbX&n\FI$<SdPf>(8r7!$bMV
:sSS;!T:KSNE1C_7Op[ZM^k)[VT*dKk\WDL?3D:@WnYFT4[Q%a]^1SZ_RKrpS\!?.LcP5p"
$6Le;fbC<Jl3r)&?(T]65c!;[Q\XFikM7^ZH(lF`VVfn3Lc!ED*^J[MC_&q6O_[aA%W)a1h
B3S)E44Q3NV^<0mB[mlhF7;WR,nX,ILn49:VuU]eUjW=S\5(bgJg*cJ>?8Ne@mQ6[Q"s8G1
AV\BB%MWcq%<!:TR1hWe]TqO#%I?#@3>#_h=.*M1CkI,6^=BZpoHtlSJA(c?39YiP;Pmjft
-K,h)Gd-8.P,TjCWE*&#_G0.5Ob<M%Cg+n.rO:[5'5mE.?[cEt8jQ+HI^)/H`SO*kA8t8-Y
ZT#bLC[PUT2&-V/?KfC;FcZ_6/C=f4aTT)ftMl]i<Cf6Y5Hfhf:+^;KKi![C'f<LNfJ:*FV
Xd&"bEKoH4;D?5r9D&=mCkZ/#^EDB[B#]n6keG`RL2V1lqtcb8[G\r:?!%$;JuI(G&ZRD5q
3mRO\8nRY"G'lJpnlrNSiY(Egh,ln[tgHl4+-X72nKWU0uC`bqchHhS:n8pGnj'*4CKTgG%
a?&KIM=IM"BV32LTqH<n[X2R!_lg%4BP3qM_V\q^DmbBh]:PjBb`,pO+,'j\L'gXYmbunep
HM)qA+Tq]_2f;0"3A)qe7ZA>9Spkf/RC&JIH^<AVX]i+f:)l[@">//30N>,U;7N0e3HO&jH
WP#r7A5sB;Q'65Pq/3.L[kBAo2">24Zkj*N>U,BT07NJTpnLUQ7ATFkih5NjiRn=S0LN6QD
pdABrPufDSd>:GCF6:!;,R,9=X)+ldfYFeGfFDKg0_<^]E,Zjo?qId;*-h#bnkCb>Nb9I"[
!5,'<(t7<89)%:n_&XfX1_&U/GC29I_hV;Ah.O4oW%[C(\5MF&ab,s+r5SUUP68ZQgb[V`l
5Nu^<Jg5(?H8j,ff*#tdIe<n$LV%lS8?F$iLh-`oLmF\\=n:iJF/>T\$r:k9jQM^==POVR>
6A7WMC+3]B!LAW,26^$_d9O%iWT;rbC*hAt<s=D<M^r,H\8_<s>IG5`Ug_/q_CZHN;C(XE&
aYmXV9YJbLYC%U>IPl"<YUEn.QJn;F640S8+Q*n^:q=u/[MO?W1]tb+8[To\FB+Qc_Yd8BY
[NB'hN<-e0iuU%2qWOa(Uc2)PKoF-[BW`LPH9+NB24IAGjsMldpjVl-Q,V]MA&!QAXl`YZ(
bQ>dS(A6\Z!]/u*+-U5[RjAd3A]RJcmP$S7f?4?'Usl;NiCgS,!XlL2Lf0&4ND5Q)k0Z_C:
7;Qj?9,2<HDf[$0S9.hu2p<Ll1?G&8*"U-K#p[6kS9bGO4.<G=UA]am.!jGYGFgc2D>.AR<
/(\I#qWQ<OlA#67r$8aY]m=gPQ?267Sai<OqXnW=8W:"CR1ul)7'D0<,)GBU/P@Al-fHiAI
soQsme-5Ebj=AN+$ZWOI,i5+dV:Qq94dpMA)bF`dQ/lc74a`#;X.>5;IQJHmFoGE;jSA%cr
*)Wr(-cD/_cV9rVH9WDmDU-_GV]33G[1siPos$bXqcQcY/V:I4;RGl-aV+DqVFmE;LMS9dM
lV3h$f9LZI$^i%2o<!1&N+26^$_d9JM=W<S!+3\$4FEGdgbI!hl`(&3NRqMGsFdA'4[C,7_
?IJNF[[?4b,G"M#$-krr9dA'2>2c@D>I2<c#Y$>,>IB!]*BW9)^0D_M3I'uCt%YkQ::/">l
Dr1i9;C0r*B?qXaY4MA\(2h'(Q:c;bC=T?+\Mes:q.J[[^O"D.;kg,8TL"2T7ujOW%[XK:;
A$SHQAQfRMhWc?0JJSl`nnCUj_osd<r7IP$SqVGL(,*#77pmM`RHH(AN"&`PfS`TLo"9Y>#
Mu-.T`cX&["r59D.rLUqVVRNj<6>&mp_YbHVu$;C0pd%$\?hcCI$Egka?/Fl:&de.&D"TgO
Sj<jcGX%e^Zo8!AEKahM<UpP,]`;A$SHQAQfRMhWdJANEuf&YK-sldls0b(pWS1A`WqWR6+
hnjtIXe1>b&`f8J;"Q&*;&4J.XDV_nRm\n9b'.8G`<7XqR'.-D7:a^8;DV_lAg&A\m/6-_]
iSibF?+4tB<oHN,AuU:XnHX2(Wj7'Mp5Dut-72XjYt.CQgpt%@msaEC)3b#5'paa@26^$_d
9JM=WL#8FVNrBB]tAHoC=Pq$.plSL+GBt,('oCjcMLP;AuWt>/JE#q5_0!"4"CY,/=$'"Y1
aHM'!>&N99"mhCso,9jFV1!Y.\`/3mrh_N@G2b<H=Wu*cpD`+l*(N[;1I80q+r]3D1)qoB+
;)/aUcR4"TiEB;A"V)GX%&Eb8f[$!8[Of>(8r7!$b;V4K_jMHYb<YHRj5Fme$fGUqhc1AgG
9q=B;)>HV3kab?.OV9YPh:Ul*6A]dR3X=+dfe?WZ/;YQ$Jm,#E[\3e.dPn4iP>-D6q3Fs!Z
>^4u0Be2&,.h4+1:8uaBc^$4k0&2'+/=$(gW7n=W[k>#@W6`cq5cu+H)]P!0SICgAkV]SD"
OUI2A?!V0*M\o4'GMgB6c<Yk[j&&(r/r@!W5B7iKpeC+rq"H#_C\`i>Zl)[7A5O6(+WFE\k
c;EpqNZ&5RoXDRi*\EM\`_0[nfOcOALI<@&\0=V4R1"G':_S(sPsZ<NAUFOK)jb>A=Mp0.2
IqOX!Ao:7WZVWi%DP<(*p@V':`XU*3/mGO?HYN&P\3aPTh+G3ssld]H`_bW`XbokNcB7.RS
,e1?kG2Che-PdI$>71i0-?I.+,S3;4"\3cH32>PDug>pa8=KnIB0!o<>6BUFK(kJMUY*0iF
lD(B?Z4_&nBU27r`CXo/4?S9IFE_p^:nW?/9p!7IB[EDJT0CBS?#kIl,'j\L'gXYm%9_uhl
dr+IgqS>Gre?k#D_A\frr)_,p=W``G#=1qq!k,d_G&3Pa[$_\+`H5MdX!AY74bioq=<$`U+
/*>g^pVb4\JKm+<Y(QaH9pZr_5n>&g\S]T\i``!L>4G:6sRs2Jh"ggka?/[:-t-e.&D"Z"(
hQ7='<-P<6"m%?\76q3OkU*g7!`("$f)W<f6/BZO(SQ;4r3l&trReZ)VBGUk[12OT!elIDr
b,#=gp/Zg^*ZW&\NVD]WDfc<p<@]=M8e.HTZ]C3ILTI*-70/YQB^3r([g,(h)/:[]upTIo:
P$\M1=K:FCa\er'3pORgVDH82Z!t[O]f,?7\\hP7rr)_*5+e>q="\NoQbV"F!D>lR)H\J@B
J(4/e>T;oC)PMSs/?QXbF:Gon5^MK*&@E$YHKUeaMj&R9<6=e/G8)GPLN(7]Y(%_<YUEn.e
QC%6%]@ZTe?Haa&5ilMi6>p@u'.&L8n=Y:0LJoR*:)W9!7d4TgR=87o_@o=YEc_XoRKL\pW
MU#tmoaC"*(po&Rn[?*%'Q@&\rg"%u&obsb!c8gn#Y\8W=\7urtHM>R&9;`cN-NY8b@2Jq/
=X3K-Fp$q(_e4*tDnA9u*Q9&j70]>Ki1hgEP^'J+?921+F&VC<!-GsH\Ytg(iQT7Y=99ia0
Fm?;L%.>M[bu1H8T.[dA8sLmJhhpF7Gq>Y.iPL.sJ]=l2QAXl`YZ(bQ>dS(A^]4;FE#HFgn
r(^d\@T7L48\Bt1P$=cc-:r,SiqGoQS52j/PXJf8L%2[))Z/nKV"&i&PI7gF;/Vg:n^3FT#
3H,>V%`9EYFg#F!gQ!R'[PZ>#anNBjdp'l_NC7^An1ZC*Q3Se8<sK$#df,bUaq^6N2_h+>u
-$oB+<I(CDoQ@`/Q4<sqYioGUg]JnQdjZIC=%V?iNN1M>!`J,hU!kgZSqn0SJY/o33Y"Bnp
?GVO>b$,"q@J>l[$J\'?CR5/=d',)[6<YUEn.a].!4umoZUtU5/J>8s<&/>pKG'/WS-)`mT
Ksb^JW`foa<EbOGQC]U.0&aeR<eX;fBU8MYd3Iq2[Vt%UIm`Kerm`uNl;ZNHD6mm$:@1[]j
I\6eDa`+UQAXl`YZ(bQ>dS(ALCYK(<jI&EC<>iJ"U4#5SQiW&G4!ui2r`r\74g8bNZ8ig?5
-V8$!QVm;5:)WS2bLTCer$ELo!R/6r8[,K*Mof].X4^/[\EK6:N@J4?VE=`eL#$e3d"o9@Z
XBWR?Z/Y[@KS^F`ToK\DI6/2\RoTlAu-_AhdmZ(q4+)$0:="SEN)<2NE]C?4qnWJFj_919E
:79c&r'buue?U!F@lIDp_r*-'!e>6.NCY#S\[_oD^?c@m;hn=@aW]Us%eG]:=;qj%DkYVpb
-+%@56F`RKH1JUmnNuX2A-UR^F6:\\Zsle%4@rg$Z=qX[Wn%/CPu&X7Mj>kpNk4,\]tLC>)
9l%cSND$2hN4.nR;qA(;hUo9O-VA%QFchUeu``K_I0@!?3<hh&C!XJQ:`:B6S2onQ7W_Q%L
`as;P]+fbLs47J,Apk[AgQLf2@ONp17eKp8.:#5CQ:S/_Bc`)AX+.19Z_l5GouBW@Uh\>?P
+.g(sdG+B-J\o]_RelIin"41--h7-YKe99i>IXfX0tVq%_CK;C#,>,mL=$[#\7%]ROXN5N\
s+7%O^0AIeHhF<k_4"[[97'D0<,)GBU3D3q/kdO6R1?%3N@Tsm1BFqR_F)uDgVT?ikFQq6'
f!9^LoXB>MrW5=1`Q#n=3,kO3kKZ)/k+oFtHqPc-ldh'L<9;8f<OER</G8u=pFM4mONjcV(
BFR=!iWM4^3nUIob\*l++O2c\/prSFX.&^'jKO[.p#goeRj*^2qb^,)B'MdI?92f@)2n52J
4"9]m<+Qprq(1c^6#p;A$SHQAQfRMrlQJ0eoqB`JW/k>.8Ai',/:?m"uN.W,31"(L)*,G%P
GBQ'sRGNZC44_80R'Q7]8BY2hf@S2dcBM\[iGZW+G:lB*;]=DI0KT`[#e`q%'BPbf#H[V\\
)$Sg=?]6:1'(BIX($m%ELUbPLd4'&j4lC+2_J>J.'mJd(]`JPD*mP/b.#n@GWC!`659'G*C
2g'2pZY(Z[?DY)D"M/^>,2=D`e;RN@//?QJ@&XF+\S08d$1$3HVq.(!bNk7K^Y`n`\<5nI"
X9,re('Vd)0&-33Yd=+V37G$W`=tR]O--`jis8RN"q4:5tbdWkr7@`_=36m,NLD)6(InnN>
l=k7=Dm2=0>fJ*7bT:0L3.>HhZs-[rke&HXR-h*2$%lPesqMiu$N-ZDIQtn%XepjS%ieLJb
Fn$Fr<+]66oJZA"u)>\iC6(m^'C26^$_d9MpAe2ha;FAmb:T0Hti-QsY,>.&)r@hn!gkK]V
3kZU5:^qbL'=dgQ$h7Hb<IDago]3rI,N/]=h(J?(@fWg(6_Yj6$:S']%a2`t?jX3iq3&ilS
C=Ge!k::5FKN>3Y0m9I:l-aY8b^'6f4aZ5XhS!uSGOO.e+&N6.,q7=5o?TX"X"%,LeG8_!W
D,O(qGbu9#1Dd^rVEqG9aJODWPAE*S)X1=0k846<g!bmWgB&Rf</DY4">q.7>e=ag2(:m-*
VTh7#;OTVbRu71:<aHhtHHlXf\^`'e>S'?Tr$Oc\uSeV?qH7_KT.'J>FH9%4i5[1`)u><@'
C>0:b7QQ@7;olIDpKQ+1el!Z@;ZKn]@!qN?CR)3+:Vh4+79:b(Vijq=O$5(<DhbBo7A_95`
uStXGiRhg&2RP\_6ET4p=>ITc$FR.L0173I^lBS9FkG:h<gt^[sba:\NUVsT=5=1C'5QT#2
lGJAfW='?8KcFR]d=;,ffB1>Ic^[":p[6iR04'b.gqS@=qXs0P:S6LRE?j^aqtBE,pu)J"4
#mK0DjRH1C"()Ld?0saRD#BOZ=Q[<b(Bp0-<HD<2/RR)g*KukSih9t>qMD^;UqF\jiX!VA5
#WBgEJR24$1&!7ujC8G`Nn/+t"GBd9XJ6H2$a_j2[4a;Pf8LY,tp;Nd^pHhbr@EGse-*3\<
@4jJZ:lmdT2Qf<8OWG1#^3\">m7:3I5[`ejYVs+Xdb;l37Qe>ZBC8sRhQQMd.i1#rE1nF2P
8<=ebb)cEo1p;I)+7J%L#.Y;=d)RWNGOTM;C;5d;7acjNM]=YCCI&%%\/<rJTa6^r%JaV@+
$Z'*O9-k,u<j+/j&c5rZ&Pi^;agaYBOiOi(rR.N8NuL$<N8#5HP2$_lfUdCu2f78J<:@bg`
@Y)0rqu@`;;]>1hbjc]<in-oXrn;M(Tq<Jr;#F"$5Y<WAB9l(kKcfb.CCh>F6?:h8<CE`U]
=%VoGUg]JnQdj[FCS2QmPOr(nl]Nfs?$MGf[FH*'8?1gMaha6E(qV24=8g@;45m=]8_WMH_
PJE*?@GW7RS>2K%:uW\>M:+-q,LdmF$tisXQO*^'5_+-RAggt\D:l\ZE-[VacBq!d5u?T<N
4q!QtMaaU\'Yp&PWpr1FhH1OGs:+WVK"fYJ#;IEn*W;Y&];Mdp<lIF&`4+oZBZ)+:.g:o:F
[d:qh'@3428,[Qf/hW/h;s?LF<EcbCU"l5L!g\`-26^$_d9O%oWQALR,:['7]\54kZF%H[G
OPP+it&Ojj_Lj;CAu"CZq+S^@)X^_5e:=7G&<MUPKJOb'>t[;UIPhlS#B5]9#a>V*NR\b<6
WS1aD!<9GG9Va.RhIB,mDl;ap]ng8r/FbCtc7qgA>FMi5*9AUjXO4/`b-Z<iqgEKuK]NK-j
Bc4Cu["q=Ed5s(cCc9Dk5XSj.^R`Ysdr/R]!j<(*p@V':`XU1m7praLB,'cZ7"L)(-P7K1K
e]mD&`&*[[bg<-5X?bEFMW<S!k`l:JO#H9h1OQj<UL8?5H&_0@1)QD5W'Za*OCfSD#^A6n1
p.]Ysgc8jh_hJV!Y>ZkY))=Us4r4AR<=utFrqhH]+%k2c]IYr9Ml?XSqsUQQ(?+H,hnFN>l
IN:i=V<,2-qK?2-NG\4d;*-h#bnkCh,4RJhnO*^YbC'GcCI&+PEV1CpQ,?*GhgE)-i<Z,?_
g4)Q84=4.lMM5d*nmgPJQ+iIJ\]tf\G8PYmcmK2$Fd4(K%LL0sY<0Nm+r1P,/d8+sNsYK$'
cr`JP;.EclM9T07#1N#<L;@$rNI%c;^/S_1tQ,lgT':SUC=,lcrMd8H1C]_(aghg_]9B*oA
',k.,&LPLY2RnhqC=0C8m;A$SHQAQfRM[h9qq9*_gq!d8/j)un:rqN8BlfA^S]RB\NW`?)h
Num,kI=!0l5Q14QmFnstrUj5b91s&9CM.9m0/'N9Ze=^#\Pp"Snj2uO;g3h(9-miVHF7M<W
X9c+s'totl'ZB`4\JLXmFnt,h^XHDX"TI<5gC@hl(c@7PO>c>OccZhk`n)FhFj1fak>X3^f
'8ZcCaXea2c0<8`'Jp/N&6!gU<@q;*q*bjQl-$fle`;R\\A$;]u)[8@p\!"I=r/26^$_d9Q
<PW@;)bGd1l*RPM?C#1ukP:?=5nT]5%n,[>`3If1+Q;VP(UZ*CS*k05DUW0#4JP"MWISMJr
cg6S3*ASGFcC[569E[fP0'T*\[/p[;,@Y--=#A8E^RX@rb?DOD_JH@2pSs6dp):>piG3RFD
]e96^qsX:Jhj:nR9u0_k^H@qapYUHN50%p,_M&0M12,@HV6ZR`9A-U^7BQ3^+L"g5YCWMoL
utEZ925C@2=$8C4+@%j-OJNO5%SMFlf[FYoff'1F6Cg`mK38iZpq:L'M'Hik0/rJaV?fm`"
3*,pI;C:']-NM7ns]m^YKSU>-pYP%Qen&'UTMjKnP*^GB\7^R:M+SBDf#Nl-cC`ld(OD[;/
!QoLM`<7%nNl2&H`4+$Lt5G3@/A1Rk=5/4ATGo]X+tK.nW]W@<pYVl!4[>.SfiRCe:1D;)F
8lfR=Vn6KV:Kq+C(7ZA>!'K$boMWd"'<!:TR==f^GV"\gpo$_9DSt6TB9_eGHT;g"WPUotC
HhZsHD53l$V/=ChFR%@I\1amaY@_U.$lqKEaE\IR*Fug2rVH2$e#'NhfofoqbO!og'<uE3^
A['1Mm$I#9!.1MoB3u=\T-Ya;LM.91.FEVrqs]k'7]uRf6mDbZ&Cf'(GFXF<NAul7W$kdl1
*fSU/n+$iROu1/hSaY#7bRsTE.pJeEq^-"Wng.++&A3qXs0\<6bb(pLVO6`Q-"LgFluk-#p
IK$2dnQm+=&O;_^6k=B]A9r;;Qr4Z\)lHn-]tEg57l.Nqklp$1'4%2uTpkK\m>#cTo_/&]B
E:i@S9TBa:T3ub_?OBW1)g_`JC>VG/)*\h,WZa97U#7jq&%"@a+"lo4JU*0J>OYT+MrbR6.
Po6f*7'D0<,)GBu@]>eC,UDI!V+X2ck0BMZA]b]B"rK::gl*+,*$$&\*'*TVfeXi`U*N+k/
68j>n0$oL\T>F,Um$n%5a7.jlK[Y,Ne3gmh9;9Cao>YQAe"QS%N[`'#)^n6#>GH_AM7E),g
tu?k-f$TWmpI<?+W"+]hrhHIJilfaAn@b2VG%<[l6=b"oaJ5rIP1\lI;dXH!Hn%GOG1lgQT
?A7Re;uG9DU<W2Rat+.kN4K#lm4c'r!D>f_al1j7073TNC9kM!\#^SduB=BHF/9)1`TJi@W
)>eG=/h;*MPlIBF;baLD)n`%M_:/5$&DEW+*&G_q^I/"hdnUQ,idLL8*7<FgiWMQHQh7Ilr
h#e:?V':3p//:H-(Yr;qDBNF=iGhWdm+E]b9EVR[Y?nmdRPSd4Ya-kFIfKB@!X!B35?4jk\
T?rZe##jo]mFs:BIN?'!T8gL^]0`[CKe2b/`FZN,,`3Sp=lTIX%_\N'3H`Yf>(8r7!!pUC'
'%(5[D@CHM-R9b67Yb3&m;(X1,S4h(Lm?rqsZh&)lL+]^#X77#?n_]mBA:qXs/%:7TtKGOI
crr3J\A#'K4\q=+j#C=R(S\8durD7XoXC27Us@Ddhh2fG/C"U.OfoGUg]JnQd@<)#&rrd="
_o&IcOk?TD7!!!H191AIk==So90!J=JLlRMPZ=Sslkt7J9S>^Ko&WF%_,ldoF]`LhqoGUg]
JnQd@<;!bIodZ*Er;#sYmbN6ep?`LL4F6MT60HOa=l+(s=gOu+VL\dK!+;82;A$SHQAQfR$
S5:@*#osH\Ra6j<<j$UChICiGOODcp[8=l#H(f!JGd/MAl"pVZ#J[=k09C%ph:*$f<=Af9`
P.nq>ch=kV]SD"OUI^WTqm;B29;Zbagh>d@s'&Pq)IO2rCiTBj,9&XI503^q72Y!!'A8//?
QJ@&XF+\\M+nUI'YAd]?@]AnGWk04*_q<r`4#RKo.9kV]SD"OUI^W@AJs(ha%@--VrDRs/3
?!!)3`==U&s^etb4F+L0f`1]PRN1d*O#7aF"9&eZ.!!!"F!1&N+26^$_d9L(Y.PZ#,9XPW.
n%\lt2u+'d!!",Z==U&s^etb4F+L0fKXnY(H@B&)B[Nqd\+8r2!!!")!D>lR)H\J@BJ-Mg2
)#jU`JYO6_bY@:c>@E8*>fX7]8HXh!;$IH("$f)W<f6/^f"/V3&l0;[V\0Sp+0+;La%:OY$
ANZP:-8&q!d\h!!!"I!_YuS)H\J@BJ-Mg[7O%cI.6(1`f1pm%NS`^DV]mJ$aQ79Z!t\rc->
FrRs4Pj<QpU/!!#8a@&\rg"%u&oblsDJI"Hs%DVr1qiSibTij*t-njSHP:&2Yb))LXGm+/7
@ZZ"a8.p&m$r:lCuV#UJqZ4O6>7'D0<,)G@_9*G:q!'i:j("$r-W<f6/^et15!!&)h91AIl
==So90!J:T!!!!E_bq*F#*t,hRL:Y]zafn`4^O`4*Lunb3"TSN&5Val*d;NEl#bnlF;?6at
!0@U^7J%O$.Y;=dYZ(T&!!":^;A&j3QAQfR$S3"m!!!#@YZ+$*JYaQHjoS0Z!!!!a1+X0fD
d]OMU:J';!<<*"O:4cNoG^m^JnQd@;ucmu!$oH[&cDp"MBJ>q//8-b!!!/j-be?k/nV5q?J
Omp#17i?5Bt6GnktB)Y6*99*]KWL0&^_-Lctl5"TSN&zTIR3$na)*n:Z,M3zzzzzzzzzzzz
zzzz!!'gALl.-Si,Ji2Q(X2s]T4!3z!!)5KFXp70CUY-hccCZQ"8tT4+#a0"z!73*u1%Ab/
\o:_8D.UWcVZ;N&z!!!"t_lFUQ4Y6!2X.Qge7+M;>6ko\%z!*$dEqc3(@Vn(_%<<*"!z:^M
cjnB[nIgq?L)q<ou:INc@b*WQ0?zk`A(0d!jf:F8%lC`OaBqpHG3o+$BT(z!72nP:Z(=fI9
Ok!IVX<SWW3#!zTE5U]%WIau/S8CO(!jSlGTT'Kz!!(@b&`M-TqQ8m4I9K<oX6!+uqX?\!!
!(L-rk16p2d\hG"n,@i!!!!A"g<8kX=X->T,,nVj-!WuTCG*q!!#sVr94Ggk=]jX9\Yu"AD
hkE!<<*"?n,u95/VerU=&V?>]TMs'A`s*!5KJ)+aM\jbM;PWg<K-dCEgWjGooKU!!!"d&Fj
`Hj$mqI5"a49X=W^u*4X8j(]j]IOdM6;B),<lpEK"%7gJphO5BIlMuWhX!&-Fi]F+#UE=)B
EMK\$on[nm`WWA4SLlRLb2e*Zu>EG_'@*];=LCjLd!!"@gTtNCqO&\$-V$m";a!L4=MuWk<
&JG"edTBT=2]kb,i@GLe`<QAC!.`9I(^tJ_mbg9<d<+MEgDM"HbPOg3!/uKTgRo,\S@II"1
``k(5=`Z]5*>mG!!"]eJj2[4m'20>\4+lO*P!=I+H6&W"9>CD_u"?W=Q+-H.m5HNT0C9\Vu
Qet!2+DnW]0[GMq0\_V^%L*"[L+5^[ea5Vkr0e2-S=grKqd=zXK5TOK_st%lQIM*X-^%W%0
/HMJB&,#0eGW`oCh-c;ucmu!3d+O)*;T[>4,l;XbVjFp[#DE@2K!U+X&#VH.<5hpD+c[eDP
J3TCFrlz`:;o^:\XR+gda+\Lr5qhYqbd]O!aom/g8''ViT`PrKa11o]isI`Np)fO!ao-!!"
jtG1VZ-#;c4tpqJ]jqM4W*ScAcTGX(^=g35FKRu'=Lr:""K`tJFQ!!$1K0d19%hcL+[R1/B
Fq!e8ehM2dF+GEb7me*ql_YlBeO"=L[JG8R:!!!"L[L)R:*RGg"/LZf(*UJh.]YjW.!WYV"
+.p'onMp9TLMem$g,UVq.nTmD!!#8:[r4CLCmGE?\_Y)hkW%Eh'`^M^;c(D3>BfKo%Gdg]V
kpS(#4OgVzcj<o8?/RoZd8S$pF*[NR,O_B7!"e/SU\E>f<cPl[kUEEih;`o_!<<*"TH=d[P
@dSD`dNN8VtBBAE94rHh?Oern.c@djJ)tKoWY^cI\Y7gQJ3G@I:*'U!!&ZNJj4[lmZ!hR'[
?o\;t4i6]T4WEi;XB1(:@iL*ptrlSRq.aQY=%rz!#9a#ruG-:<BN/a2W3h,!)/%N?>kVl>J
pEJTX3R!;ucmu!3"&3*S7e3Gk@=d?'_$GI@p8="X$I%R#n[to*$WPHkE9(cCX[fI<Ybm!!&
[)$jOVd=WZA=4M$KHrLrF'/C4@s#Q-f>:9es%IM:(><\6JOqsXXe!!#:a6q51T*U:LijJ0o
r20ds+a7"9q@0!SKQd.bZf@>HLjfcjd)mqCY-D'rD"onW'5aK4SI;j\:jkRm@\r;o.h'V;@
#mlI$%l+.]-TX;+e^>\tYBmlo@#l'%+$t5pA,lT0!+[8@gjFYh\CA]tZ**QQ"n=dt!9fgu%
t-nX=i^JMf5#\SY^bU(QM3ZL!!!!aQ=KAYbbV%DH?WP=o\^aB_8,q-"/%S^A)]GL4,r^^<6
_[8GBk9CzA4;;=/RNmeqcHDHR5TMPYKnTQLDg0knDp:h(i*dPQaXW7g>OIKisYnf!._.D>[
5.AZ*)kP7/BZ^:.l+Bgdk&SO/`3$,!%2sPOf[iKW93mNSb?jO#QA*!!!#7P<f/p5s67!O,J
+PC#e"+j%!)LV"4!1f-:JZEPITXTAfb#KSDnc52#u:!!!#@O7'dKBt8ookXbI4eT&_!D--3
O"TY9QN/UoGr##1o2_1\JVkl&=qt!#0z!<:+8dgrr!OKqFV*kqXDK6Os=2uq[jp5S7QqQ8n
/fk,q?=kI#pns&kL#64`(!;IXZ\mOG\9ZeQaZ<4bOq6>bFB\pcL!7SpE04`IH&+3M7f#b`k
2gHKdzJFjZeaXc]gE??W@SIFqoo%^5A=K2RUFMu2;Dg/hGX!:q<0OC8NTAY.M!<<*"!5;2p
6K7>\41L?<Z;`01Fa`u5O8"bA^f7gbo>RXoCUmf>=XjekmS6GLidKkgz1*n,,HL+HEm\?X1
'e>3]X-Oe5$]X.on,_I(T5QF2-19Ap<f?@d%8i7m]FR1+zKb&VU=I[>*);&H<YsW^K'C^na
aDs[=`O`09f>H%.qdl/F19BB%:I,T*O$<UE!!!!4:EKAjV(aM>43Zg3bnn$R56+0i?nbhFo
3c6=bi6ehIChPQIMoru'EA+5!!!SHod`hM\$tB]NlmfY1Nga-<u=(%STFPVbAj:8EkgD8Ap
RS5s*OJtmo'2d!!!!a1oHAij$&^MZE^^>>I460d)U+^B)r"Tj8Ho?k+lkLYHf\uEdP?EiA'
f-z!'ha?[p@rVTZYFABt;0-eVVZ"8DY]q!6X6co4cmP"'-380<VCH,PuEN4qRbp!!!"0Z/4
^ZpG#Y`:VX%B]=2(&NfN.J/c[#bTTA&IQ64"k"Pg?>m3;"?!<<*"!'i.@K>D!D!U_0_A8n`
;L\BP]NK*+L7K=QkM"#*P%Hi%[>0?df6In1=2]-e3&-)\1!!#WQOH;GGqG-J=.thG(n!/\%
hMdGFWr`_A()jU:ojY[RbILt>#`8MmI7["L;ucmu!9f4%kd\`a]5f!)+XquC!YZsFA,)pDV
u(RB`r0@4;Y&/pmI>0&][$rczKaA9JZ5KouqcF4tc/;nYp[#C*q)O3(W<'g7_s`$CRcVS9=
P@i25`jJhrnB:[17%[6!<<*"!2'ZB_4SbM4*)K`+_fE/X+U;(F2=ImGb6!!X7Q1!^mFkD0g
Ch8A]!Y*T-Ni2('"=7!;&t3a7)rYf5VmV+mIG(ElhM*j1[^LGb6*$/+W>[qh;@=YeH&&`b*
/DYg=fT-O9\P!!%Q7"T!n6(uW>\oS$fad=_]'m.S$b#1Ieu,ES"KGicg&C#c[A5P(#@ArO-
=8FU9KV[3>'!!%P3nFm;.eo*G?0c6'V`X[,OHLME1XT9m`)A7>2j2UTfCUg#%87i_o^aUr[
N;&_Az?rZ!t$Q@f9-23N=,*5)R*OiRc#kSYhIBikOnDp:(_kI7#*6H,T]`/mTp](9o!6CVA
Gni<C`sV7p0gn!%(3U'uH/,t+!_Xg@ai)3=T/lH1K[H:!T?dd#6i4%[o*si1aoDDA!!$uuj
`CG&h'&fPaG9jlHZrf6Cqr:M^-81E2k7csY*BPeI?.O\zOQCcd113pS8+'kCKJD<;gF`25p
[u^*j5UeuT0'i1q&BufieZbs>BauJl@8S9/=OcOrbM!R.KBGK!'gm0?O%)*NH\>ZQ9dYS2`
[LUrA&otklXV8KS7:u2kD[j^TXQs'(2YG+t=fA3;J'>];P]0!!!$!%ptr)R.XOUYo19)pU2
Ror'GY#7"?XKDhGK9^4<DV1n'O/f*5Wo,QIfE!.YLQ]al18%kCRl2-(KNViBSSr:&OHcm[b
K&hkAX!FbkLhln!'Jbp=@8BtmakFdmp]MBgRz'8;Bi7h&eFIE[GeM3WeNN!W^L*kW0akqhc
A$E/[)gRnWi2opQYZJ^5T+`]>]W!fIj!rr<$!"]@/Wgiof=!qlKEo8j)VU5VQK>IGAYPZ?2
UPIb7eOaRHC^:K,jF(V@zBE056Ih,o4IJegJQjKNHmr6&6gtRmW%e&usLa+&dn_^s^SQDGf
m^%fJM1d:E.5l&UiR,<a0)ttP!!(8/`_L%I`I/GU.%VTq=0>\Tm)E&oaN,4TB,M7)cp.0h8
M>if#PqXVkC2,-MJ(5AS^Gi)][&>5zNBp$1A/rR:/;L0gmd9D=NSh$WlfG%*h^9`tnNPdEI
u+Gl^4,mWoBI!6VH;YXZ=#oJ3sGZb!!&)b)+Q8_G_#[I%T,=d\h1C\]D'BtgTOrg,UME3@&
">NQf*#Tc.:,U-B3/UZEWA<1*C=EXlFD+AH2]1!!%$^UFGA+-b,6'&>Q):eac/8pDht0o=;
>;@KM!g<J?7uke"<1mb2u4cI<lJ3\BHBck3$al_Y&72&lSr!!#8JA5'Dem3;;P*Fes=m^.)
UKWXY]c<\3UoMZ;:bE*5(r>4<4NZG^CEp;O;f$<'3/7SNZ=Y)b@k6CB2&HDe2!'jU*3H,of
1THW<n1K5O_tpL?T=<-Vqpdbe?U.eK0c9mOrR'.g:L)MDSN_K1IPB%+l!\:Urq(WqB-dNX!
!%NZ\T6YKYDu8cO7s2!al$JUkKVYeFjl&&B-4j8mN3A]che.4`daO9+O'HNbCb.ZY$$3qMN
(itXq'4t&7QjJf@Aj;]<?LPU]:Ap!!'UlnO&q"4]ZMDocYY!.uVBA#-V5jb@A_mo4Lhrqsa
U>TTA'C>b3f-+Xt2ko\Q-??_$a*S.lRVY^WY1]F*SFc2mtG!!)4&^\>Qo%E:.@#ZH%l>[fK
uKAG=rS"7kFhLFkFjepFrp]c6EX9j65NfN^V)g(i*b7dB.[r/pa_Z%o@$!W2X>D&>g&]TbK
\M<;X3:@Luz+A37])DuB%480=0U>>IGZl_$<M4@"mkNl@;G^P;DV5":a>e0A!rk17o?MODI
#`T+N<n1`UULF<-_T90um_-/WnHna44ZfgWY!9PPi@$-h_WX\r]&T1Z6rrGDgDL_DX55iFz
!7DGqQ`t#:IdZ5]7,R7\D)ma3^PB"b1tHg3Uht1Nmp*G3s)P`(cDs^9`dQnCXd^u>`bk[be
GmX)`Na!4%bT+^7m9I-:)^AT^4&WAPs%1\F71$An#T]9,U"=npO*q[!!!!Ab@*(AL_4SJ%3
c(0Qqj_6(@Tt'=UU:t!rr<$!9f^^7m-=bPk!4fG6%u$A5)Ge9<VZL_Y^JEz!0Zg.H\70)&H
p58):i`NbNJl;n&GD.!!!#Ws7$%"C--G<pJE,d+:+<-[<2udrlk77$ig8-!!*"Rkib"<\U1
lJ'bLR7N1<m@O2T'bn@f,0zJ?N?7(q.%^['JUSBLEC70g_rmljiBm_>Ddkz!%;*coV>:GA_
]e:889j/&q['EIbg=I^%IQ_*>\\U!!!!Qn`ki.L]L9+a,gRY+=^sXaGkY__7]6Ez!'g\G@8
ZWnn)QZq6kBJu4HB,j@UnDChdlfg!!!"LBTeMe41AJ'ZEW@QUdPas;'\:Um>i:!bPUE/z!+
^*<cDs5o*P%4_&HkC1Aluf*hG8NEhbsOU!!!"L!dkCbRpt^'I>!G"#U2:8VJHbPNT>LH"TS
N&!!%lg+.p("knNl3-6b[A0c8#IZ*IKEA^gIn`$F46;#gRr!!&ZSQS1JhgXUlPQkMasKJA+
*3b#W;z!.Enno4c)*c.kg\#_F2Kbau*bpsWm4G>/&;!!!"l3q;`sS"7l-=n!Mb+p^&N_DuD
/7gJoS40BG0#2])Iz!+7oODnd:?HR8Ek."WR4\r7Kao^pOXhY0P@z^k'joaEc6YEZ^Df#_J
klIbqfb&M^reNW9%Z!!%Ng#".st4Z@^k0&\uN71^`&VbcJe-]WHB^*s*`zPMkPDs"W*MgrH
?!Jn3P.Z$#Yb+3aUg#QXZ"g:R*W.-j$Hj8WG<Bd[-R7O<=O1UE9jVL+Ls\ThCJn-0V@W>uR
J;+a,*2&-Or2FGEgK^qGR/hH@0cCT$Q1T+qB%Jdm3HHl=G7hL0@msI=*m'?[GK(Sa0D^mg/
O\1dk\]KopmAN#,j%oaVpg)-=m;oUlJkrM3`^o]n.?8i<5tM%Vr/pcF^63/(nC^f>Af&QmO
ZmOVHM^(%GlRi'%]<+2k"Lg?T490YA94>Is(,,Uk]746J5N2AVq6j,P(pD9er"-,[Ek9B!8
rEVh@Q/6D-cYQ<`0./?rlgnk0'Go2#mVG]t5qtHMjtB#;21)Rm';fj,).G)#sZ)j4r>]"ga
)=cao9oWenXdKbi"hde_5=ct=0q!#[2I(t_]*Cs)PNi7#*0;:4IpH0(lFrVajbV\]=5RB4*
(F32;)i7"m*&`+I"._`ZF/bFl'!5Ot`8e(4ErPeEL<sBb!-&o]P9j:^!l1r03cpnfN!+X6\
T5Uk0B4^RX=OP8>P*NXnrP>)[5%k-#J7-Y]?[d"Ok2<SNUu8raI-H@;O.jlF!!)e<EZhc&f
?"mD<t4Idr(-UN>ghH6,AV%o)cJ1MisPk&#]esOpR8api7#!-i@L.W]4()XY-+AC-P-7Xr4
\KZmhX7(&q"_c1^q(.FPEXMSY8h"!!'NaA27/3i,$^2B^cU;dR.beG#A49k<g=L!!$s[ick
7-Q.8ZWX<@9t/SPK[q8DR@>poLGPG-;>!!%6Tf<9=`6u+-/b7-X=9DXQ8Z>u]DeQk,I"Vh#
f;6R+0j3=FT6B0P06dPI(#.3CW?/Jre3V6GU!!#CNe;8)[cJBCcfTpVd^%QJlm&MY1cOU!U
GUS`seDWd>o:FYII.3GDcPFj]Er'<^k[O\p!$8_&JRhJtj0LNKK+Hq(I^aSuD5d?mgu.*uk
gKS5!/=9V?[pVH-_I!92Y]Nil.9sQ8#n.9H%[gN!+T%lT%LILZg>c%i5<)^`d;ku@<t.4,R
-T-$31&;?I/#qD=?$$Ht%6f6!YC]c(8(JJ'Vj+.0'AG7Qd9p\*%kYoP!`f>oFsL9T)s>4CL
GX!.[;\fA"&apD:/KHFB"/&=].p<)_W:rMKVqn0b&fkC`Z#SpT1(ejr0`id"bn4unrL8;4e
$!<?O"8Is86EVbALRt;1E;?ld5P);&&>kIPA!!)L)%1Wl>q4dQLIr#WZj@c8Q860X-ZJ?=+
5DHn;!<=7k[($!5\8'pN$2MEXIVDcG^0-?Febo3[NR7DP!!$Q8?b5[lW&XMCPdS>/!,9B;1
HeoJ>'K"QGNeo=!!(#r6t2h_^tD05Z7>g&Y:lk7h@N=,4WFb.!5`Dbm>)NW:EH,EHomDk2K
_@cb2noFHjTiR,K.hG[s)]hCi4Dnn7CQBH6i,i5T.sj:N*2eH(t1:4S2nb!!)rJi8A!a;u=
`!Q'95L#2^GsLYA!_q9.[LFhAl`9)3-<!!!l#3]jpq9C$Vq7>%cVdZCqWp;X+n:]Adb-hMf
k!!(fH<9h4OX[W\uV`e&lI'\q6@X$^TR_GR&]lj__!2EfnXn[I\B3okW/GPs5i@)%hn/KJQ
n`iahe5SC#o^mmPP5kT5+nklrCEI@Uo'D=Pi2_WTcPFg_\81tSSK2"0mi)6,i8I;)#+JAs7
9<MS)-Iu-'9R`BcEq8!aX=2,Y(jYf!!%Q.et3d=FlM.5GuZXIXpVn4BT2[rAG*Nc]hN.nP0
$\e3s,H_#V<ZlSj(gG/Z?+\C7*29ZmL4[V(]U_rab6i!!!!9EI-Z%@s)/?0AAYgnWgrb(M.
R39O1^4Xnf9m;KBQ'VZ6_4^%E`W)GaWi.BJq#e"`3cABi@Og0Aa`I.QH!b/_U(!!!PnqodS
@GFj'Hn)]\5n8"%R?'25D,n%n><#f[hmI3uN!!'eGqPj(QrDdKr]tS"Qhu#U@ma4ssf<!)p
C8h$0qc5iOPm[QlA@VWW^q$f=je[)Q5@5>Napl&rBnS<W>jg#VhqM14+)AFHB6jRYJ0;FA`
K)sr8tn1aZ\sER8IEoDB8Y.S5l*7Gh;'%HH3=3Jpn'(o>s#:bbj#pi4EDt3S"!]jIeCFMLK
eZQ\/kFW!rr>2[uRLp7r$AP?bQL8S<De\Q2Z)n`oXokJ*Wu+6g;kfViIq,f,"De^k:saflO
eL[^EVgl([pLN6`$KE9U.VA)aM4?N'AgnqOJ`0#d;OKt`QI!!%c1^d,3u_UX;9Rb"\!^\G>
kPK%nCdKjU1q#"3"-n?aJq5!.hHX!Bq+9;HB@ng<KJ#qa(p$Paoo;Z,aZYB!*H,2GI1"Fb[
q+DO;\$>F1H7`uLm77__6=1<)!!"67It.%;`Qn=tkKC?c/ULu_k6;H6Of[=A3@26)I(ZS_^
>VUUHX!DU'EA-k^@_'i``fMbg>B8K6g_LhJ$`TaZ.E4[A<Y'sh;(XQb3G!.DJ<nR80eC+s*
k(M!+_PZ5cV/cX1>4Cp;#APd^k^e/!he<S,-5Qn?"BP;^^YPJ#<"3=$J6mel;'"EP*IgrT.
h:Ut80=!!'l,De.J'Fas#U&"bf!Wct'bg\>K/H[YR`&*?!b5%@oG9lK#!Aei(pUge1Iebbg
Hn(VnE]oAo(jfY(9U&Xoh!!)f#;Q7JOf=P6?>\uOX<e'mlFlfUimiO-<f&XUCYOoiDB^Y"c
e(-sn!^CFEl@f)g1Y9AuJ*U<3\#8ud:$W==q#8\5*d[Ht9DYjj?2Mt(\)O+]+TVQC(d@J7U
8t>mZ_OS'[3O7CjibY:`uAJXC7B"=)_6-(fN)$[?<VQ^NJ.Vd9CCWek#J7Eb$SAB^\?>e.O
hIpos]<JhN7_(CA4@&s7H6ZA$P0np2@\EiR5]joTr4#dGB*loQLfGzzzzzzz&Dhm:o`9!?~>
Q
Q Q
showpage
%%Trailer
end restore
%%EOF

View File

@ -1,585 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="104.75715mm"
height="57.028595mm"
viewBox="0 0 371.18675 202.06983"
id="svg2"
version="1.1"
inkscape:version="0.92.1 r15371"
sodipodi:docname="Logo-PCLL.svg"
inkscape:export-filename="/home/yohann/Documents/stage/Logos/Pôle Logiciel Libre/LogoPLLGrand.png"
inkscape:export-xdpi="200.87115"
inkscape:export-ydpi="200.87115">
<defs
id="defs4">
<marker
style="overflow:visible"
id="Arrow1Lend"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend">
<path
inkscape:connector-curvature="0"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path4626" />
</marker>
<linearGradient
osb:paint="solid"
id="linearGradient4664">
<stop
id="stop4666"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
</linearGradient>
<clipPath
id="clipPath3132"
clipPathUnits="userSpaceOnUse">
<path
inkscape:connector-curvature="0"
id="path3134"
d="M 0,600 H 800 V 0 H 0 Z" />
</clipPath>
<clipPath
id="clipPath3248"
clipPathUnits="userSpaceOnUse">
<path
inkscape:connector-curvature="0"
id="path3250"
d="M 205.131,405.857 H 559.926 V 579.858 H 205.131 Z" />
</clipPath>
<clipPath
id="clipPath3260"
clipPathUnits="userSpaceOnUse">
<path
inkscape:connector-curvature="0"
id="path3262"
d="M 0,600 H 800 V 0 H 0 Z" />
</clipPath>
<clipPath
id="clipPath3288"
clipPathUnits="userSpaceOnUse">
<path
inkscape:connector-curvature="0"
id="path3290"
d="M 205.131,405.857 H 559.926 V 579.858 H 205.131 Z" />
</clipPath>
<clipPath
id="clipPath3304"
clipPathUnits="userSpaceOnUse">
<path
inkscape:connector-curvature="0"
id="path3306"
d="M 0,600 H 800 V 0 H 0 Z" />
</clipPath>
<linearGradient
gradientUnits="userSpaceOnUse"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
id="linearGradient4668"
xlink:href="#linearGradient4664"
inkscape:collect="always" />
<linearGradient
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient3315"
xlink:href="#linearGradient4664"
inkscape:collect="always" />
<linearGradient
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.43531,-541.69844)"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient3440"
xlink:href="#linearGradient4664"
inkscape:collect="always" />
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend-7"
style="overflow:visible">
<path
id="path4626-5"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3132-0">
<path
d="M 0,600 H 800 V 0 H 0 Z"
id="path3134-4"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3248-3">
<path
d="M 205.131,405.857 H 559.926 V 579.858 H 205.131 Z"
id="path3250-5"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3260-7">
<path
d="M 0,600 H 800 V 0 H 0 Z"
id="path3262-3"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3288-4">
<path
d="M 205.131,405.857 H 559.926 V 579.858 H 205.131 Z"
id="path3290-0"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3304-6">
<path
d="M 0,600 H 800 V 0 H 0 Z"
id="path3306-1"
inkscape:connector-curvature="0" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.87885425"
inkscape:cx="-47.520975"
inkscape:cy="52.746356"
inkscape:document-units="px"
inkscape:current-layer="flowRoot7052-4-9"
showgrid="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1678"
inkscape:window-height="1028"
inkscape:window-x="0"
inkscape:window-y="20"
inkscape:window-maximized="1"
inkscape:snap-global="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0">
<inkscape:grid
type="xygrid"
id="grid4138"
originx="-168.73733"
originy="-76.130441" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Calque 2"
style="display:inline"
transform="translate(-168.73733,-774.16196)" />
<g
inkscape:groupmode="layer"
id="layer4"
inkscape:label="Calque 4"
style="display:inline"
transform="translate(-168.73733,-774.16196)" />
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Calque 3"
style="display:inline"
transform="translate(-168.73733,-774.16196)" />
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1"
style="display:inline"
transform="translate(-168.73733,-774.16196)">
<g
id="g4172"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4174"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4176"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4178"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4180"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4182"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4184"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4186"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4188"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4190"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4192"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4194"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4196"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4198"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4200"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<flowRoot
xml:space="preserve"
id="flowRoot4381"
style="font-style:normal;font-weight:normal;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"><flowRegion
id="flowRegion4383"
style="font-family:sans-serif"><rect
id="rect4385"
width="164.5"
height="46.75"
x="242.75"
y="422.36221"
style="font-family:sans-serif" /></flowRegion><flowPara
id="flowPara4387"
style="font-size:40px;line-height:1.25;font-family:sans-serif"> </flowPara></flowRoot> <g
style="display:inline"
id="g5969-5"
transform="matrix(0.74333811,0.11129858,-0.11129858,0.74333811,-1135.4668,488.39488)">
<g
transform="translate(0,1500)"
inkscape:label="bateau"
id="layer1-1-2" />
<flowRoot
xml:space="preserve"
id="flowRoot4297-8"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0.01%;font-family:COUTURE;-inkscape-font-specification:'COUTURE Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
transform="translate(0,1500)"><flowRegion
id="flowRegion4299-4"><rect
id="rect4301-4"
width="1088"
height="416"
x="2104"
y="1948"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:144px;font-family:COUTURE;-inkscape-font-specification:'COUTURE Bold'" /></flowRegion><flowPara
id="flowPara4303-8"
style="font-size:144px;line-height:1.25"> </flowPara></flowRoot> <flowRoot
xml:space="preserve"
id="flowRoot3677-8"
style="font-style:normal;font-weight:normal;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"><flowRegion
id="flowRegion3679-2"
style="font-family:sans-serif"><rect
id="rect3681-7"
width="772.16058"
height="100.40916"
x="2815.6992"
y="1956.3104"
style="font-family:sans-serif" /></flowRegion><flowPara
id="flowPara3683-1"
style="font-size:40px;line-height:1.25;font-family:sans-serif"> </flowPara></flowRoot> <flowRoot
xml:space="preserve"
id="flowRoot4653-7"
style="font-style:normal;font-weight:normal;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
transform="translate(0,1500)"><flowRegion
id="flowRegion4655-2"
style="font-family:sans-serif"><rect
id="rect4657-8"
width="408"
height="352"
x="1732"
y="1580"
style="font-family:sans-serif" /></flowRegion><flowPara
id="flowPara4659-8"
style="font-size:40px;line-height:1.25;font-family:sans-serif"> </flowPara></flowRoot> <g
transform="matrix(3.7418697,0,0,3.7418697,-7038.9947,-4368.125)"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#4a3f74;fill-opacity:1;stroke:none"
id="flowRoot3442-6" />
<g
id="g3550-3-3-6-3-7-9-3-2-5-0-9"
transform="matrix(0.9986786,0,0,0.9986786,450.44451,-1197.2567)"
style="display:inline" />
</g>
<rect
style="opacity:1;fill:#000000;fill-opacity:0.94117647;stroke:#483e7e;stroke-width:2.5999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0.30000001;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.94117647"
id="rect8980"
width="0"
height="0"
x="0"
y="0" />
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.95999995;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#534986;stroke-width:1.83099997;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:0.30000001;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.61711713;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4682"
width="0"
height="0"
x="0"
y="0" />
</g>
<g
inkscape:groupmode="layer"
id="layer5"
inkscape:label="Calque 5"
style="display:inline"
transform="translate(-168.73733,-774.16196)">
<g
transform="translate(5927.9137,-1112.2775)"
style="font-style:normal;font-weight:normal;font-size:118.38638306px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.96078431"
id="flowRoot4401-3-7-5-3-0-8-5">
<g
transform="translate(-11640.668,-327.21498)"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="flowRoot7052-4-9">
<g
id="g4868"
transform="translate(-10.35097,6.2783949)">
<path
inkscape:connector-curvature="0"
id="path4648-68-3-6-1-9-9"
d="m 424.11349,770.54724 c -32.4719,0 -61.2945,15.8724 -79.223,40.2273 h 25.1918 c 14.1484,-13.1505 33.1176,-21.1917 54.0312,-21.1917 20.722,0 39.5416,7.8864 53.6495,20.8217 h 25.3536 c -17.9453,-24.1609 -46.6833,-39.8573 -79.0031,-39.8573 z m -80.7259,154.34754 c 17.7878,25.5659 47.3097,42.3949 80.7259,42.3949 32.244,0 60.8846,-15.6536 78.8356,-39.7185 h -25.3596 c -14.0868,12.8507 -32.8325,20.6887 -53.476,20.6887 -22.0376,0 -41.8989,-8.9359 -56.2509,-23.3651 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#534987;fill-opacity:1;fill-rule:evenodd;stroke:#534987;stroke-width:5.32738733;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
transform="translate(5712.7543,1439.4925)" />
<path
sodipodi:nodetypes="ccccccc"
inkscape:connector-curvature="0"
id="rect4696-6-3-6-7-6-2-4"
d="m 479.57959,820.58324 v 96.62434 l 68.2492,0.021 v -23.1886 h -41.3604 v -73.45704 z"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.65;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#534987;fill-opacity:1;fill-rule:evenodd;stroke:#534987;stroke-width:4.89254045;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:50;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
transform="translate(5712.7543,1439.4925)" />
<path
sodipodi:nodetypes="ccccccc"
inkscape:connector-curvature="0"
id="rect4696-6-3-4-3-0-3-6-4"
d="m 384.46959,820.53914 v 96.62444 l 68.2493,0.021 v -23.1886 h -41.3605 v -73.45704 z"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.65;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#534987;fill-opacity:1;fill-rule:evenodd;stroke:#534987;stroke-width:4.89254045;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:50;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
transform="translate(5712.7543,1439.4925)" />
<path
inkscape:connector-curvature="0"
id="path8859"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5997.4772,2262.256 q 4.1525,0 6.3525,1.5125 2.2275,1.5125 2.2275,4.73 0,1.6775 -0.605,2.8875 -0.5775,1.1825 -1.705,1.9525 -1.1275,0.7425 -2.75,1.1 -1.6225,0.3575 -3.7125,0.3575 h -1.7325 v 6.71 h -3.465 v -18.7825 q 1.21,-0.275 2.6675,-0.3575 1.485,-0.11 2.7225,-0.11 z m 0.2475,2.9975 q -1.32,0 -2.1725,0.082 v 6.49 h 1.6775 q 2.5025,0 3.85,-0.6875 1.3475,-0.715 1.3475,-2.6675 0,-0.935 -0.3575,-1.5675 -0.3575,-0.6325 -0.99,-0.99 -0.6325,-0.3575 -1.5125,-0.495 -0.8525,-0.165 -1.8425,-0.165 z" />
<path
inkscape:connector-curvature="0"
id="path8861"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6021.5801,2274.301 q 0,1.705 -0.495,3.1075 -0.495,1.4025 -1.4025,2.3925 -0.9075,0.99 -2.2,1.54 -1.265,0.55 -2.805,0.55 -1.54,0 -2.805,-0.55 -1.265,-0.55 -2.1725,-1.54 -0.9075,-0.99 -1.43,-2.3925 -0.495,-1.4025 -0.495,-3.1075 0,-1.705 0.495,-3.08 0.5225,-1.4025 1.43,-2.3925 0.935,-0.99 2.2,-1.5125 1.265,-0.55 2.7775,-0.55 1.5125,0 2.7775,0.55 1.2925,0.5225 2.2,1.5125 0.9075,0.99 1.4025,2.3925 0.5225,1.375 0.5225,3.08 z m -3.41,0 q 0,-2.145 -0.935,-3.3825 -0.9075,-1.265 -2.5575,-1.265 -1.65,0 -2.585,1.265 -0.9075,1.2375 -0.9075,3.3825 0,2.1725 0.9075,3.4375 0.935,1.265 2.585,1.265 1.65,0 2.5575,-1.265 0.935,-1.265 0.935,-3.4375 z m 0.495,-10.2575 -1.2925,1.4575 -2.7225,-2.2275 -2.695,2.2275 -1.32,-1.4575 4.015,-3.85 z" />
<path
inkscape:connector-curvature="0"
id="path8863"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6030.0131,2281.781 q -1.485,-0.028 -2.475,-0.33 -0.9625,-0.3025 -1.54,-0.8525 -0.5775,-0.5775 -0.825,-1.4025 -0.22,-0.8525 -0.22,-1.925 v -16.555 l 3.3275,-0.55 v 16.4725 q 0,0.605 0.082,1.0175 0.11,0.4125 0.3575,0.715 0.2475,0.275 0.66,0.44 0.44,0.1375 1.1,0.22 l -0.4675,2.75 z" />
<path
inkscape:connector-curvature="0"
id="path8865"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6032.3747,2274.3835 q 0,-1.8975 0.55,-3.3275 0.5775,-1.43 1.5125,-2.365 0.935,-0.9625 2.145,-1.43 1.21,-0.495 2.475,-0.495 2.97,0 4.62,1.8425 1.6775,1.8425 1.6775,5.5 0,0.275 -0.028,0.6325 0,0.33 -0.028,0.605 h -9.4875 q 0.1375,1.7325 1.21,2.695 1.1,0.935 3.1625,0.935 1.21,0 2.2,-0.22 1.0175,-0.22 1.595,-0.4675 l 0.44,2.7225 q -0.275,0.1375 -0.77,0.3025 -0.4675,0.1375 -1.1,0.2475 -0.605,0.1375 -1.32,0.22 -0.715,0.082 -1.4575,0.082 -1.8975,0 -3.3,-0.55 -1.4025,-0.5775 -2.31,-1.5675 -0.9075,-1.0175 -1.3475,-2.365 -0.44,-1.375 -0.44,-2.9975 z m 9.6525,-1.485 q 0,-0.6875 -0.1925,-1.2925 -0.1925,-0.6325 -0.5775,-1.0725 -0.3575,-0.4675 -0.9075,-0.715 -0.5225,-0.275 -1.265,-0.275 -0.77,0 -1.3475,0.3025 -0.5775,0.275 -0.99,0.7425 -0.385,0.4675 -0.605,1.0725 -0.22,0.605 -0.3025,1.2375 z" />
<path
inkscape:connector-curvature="0"
id="path8867"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6057.8599,2274.2735 q 0,2.2 1.045,3.465 1.045,1.2375 2.8875,1.2375 0.7975,0 1.3475,-0.055 0.5775,-0.082 0.935,-0.165 v -8.25 q -0.44,-0.3025 -1.1825,-0.55 -0.715,-0.275 -1.54,-0.275 -1.815,0 -2.6675,1.2375 -0.825,1.2375 -0.825,3.355 z m 9.5425,6.7925 q -0.99,0.3025 -2.5025,0.55 -1.485,0.2475 -3.135,0.2475 -1.705,0 -3.0525,-0.5225 -1.3475,-0.5225 -2.31,-1.485 -0.935,-0.99 -1.4575,-2.365 -0.495,-1.4025 -0.495,-3.135 0,-1.705 0.4125,-3.08 0.44,-1.4025 1.265,-2.3925 0.825,-0.99 2.0075,-1.5125 1.1825,-0.55 2.7225,-0.55 1.045,0 1.8425,0.2475 0.7975,0.2475 1.375,0.55 v -6.9025 l 3.3275,-0.55 z" />
<path
inkscape:connector-curvature="0"
id="path8869"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6070.8317,2274.3835 q 0,-1.8975 0.55,-3.3275 0.5775,-1.43 1.5125,-2.365 0.935,-0.9625 2.145,-1.43 1.21,-0.495 2.475,-0.495 2.97,0 4.62,1.8425 1.6775,1.8425 1.6775,5.5 0,0.275 -0.028,0.6325 0,0.33 -0.028,0.605 h -9.4875 q 0.1375,1.7325 1.21,2.695 1.1,0.935 3.1625,0.935 1.21,0 2.2,-0.22 1.0175,-0.22 1.595,-0.4675 l 0.44,2.7225 q -0.275,0.1375 -0.77,0.3025 -0.4675,0.1375 -1.1,0.2475 -0.605,0.1375 -1.32,0.22 -0.715,0.082 -1.4575,0.082 -1.8975,0 -3.3,-0.55 -1.4025,-0.5775 -2.31,-1.5675 -0.9075,-1.0175 -1.3475,-2.365 -0.44,-1.375 -0.44,-2.9975 z m 9.6525,-1.485 q 0,-0.6875 -0.1925,-1.2925 -0.1925,-0.6325 -0.5775,-1.0725 -0.3575,-0.4675 -0.9075,-0.715 -0.5225,-0.275 -1.265,-0.275 -0.77,0 -1.3475,0.3025 -0.5775,0.275 -0.99,0.7425 -0.385,0.4675 -0.605,1.0725 -0.22,0.605 -0.3025,1.2375 z" />
<path
inkscape:connector-curvature="0"
id="path8871"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5921.6147,2316.2935 q -2.145,0 -3.85,-0.66 -1.705,-0.66 -2.8875,-1.925 -1.1825,-1.2925 -1.815,-3.135 -0.6325,-1.8425 -0.6325,-4.235 0,-2.3925 0.715,-4.235 0.7425,-1.8425 2.0075,-3.1075 1.265,-1.2925 2.97,-1.9525 1.705,-0.66 3.6575,-0.66 1.1825,0 2.145,0.1925 0.9625,0.165 1.6775,0.385 0.715,0.22 1.1825,0.4675 0.4675,0.2475 0.66,0.3575 l -1.0175,2.8325 q -0.66,-0.4125 -1.8975,-0.77 -1.21,-0.385 -2.64,-0.385 -1.2375,0 -2.31,0.44 -1.0725,0.4125 -1.87,1.265 -0.77,0.8525 -1.21,2.145 -0.44,1.2925 -0.44,2.9975 0,1.5125 0.33,2.7775 0.3575,1.265 1.0725,2.2 0.715,0.9075 1.815,1.43 1.1,0.495 2.64,0.495 1.8425,0 2.9975,-0.3575 1.155,-0.385 1.7875,-0.715 l 0.935,2.8325 q -0.33,0.22 -0.9075,0.44 -0.55,0.22 -1.32,0.44 -0.77,0.1925 -1.7325,0.3025 -0.9625,0.1375 -2.0625,0.1375 z" />
<path
inkscape:connector-curvature="0"
id="path8873"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5943.1747,2308.676 q 0,1.705 -0.495,3.1075 -0.495,1.4025 -1.4025,2.3925 -0.9075,0.99 -2.2,1.54 -1.265,0.55 -2.805,0.55 -1.54,0 -2.805,-0.55 -1.265,-0.55 -2.1725,-1.54 -0.9075,-0.99 -1.43,-2.3925 -0.495,-1.4025 -0.495,-3.1075 0,-1.705 0.495,-3.08 0.5225,-1.4025 1.43,-2.3925 0.935,-0.99 2.2,-1.5125 1.265,-0.55 2.7775,-0.55 1.5125,0 2.7775,0.55 1.2925,0.5225 2.2,1.5125 0.9075,0.99 1.4025,2.3925 0.5225,1.375 0.5225,3.08 z m -3.41,0 q 0,-2.145 -0.935,-3.3825 -0.9075,-1.265 -2.5575,-1.265 -1.65,0 -2.585,1.265 -0.9075,1.2375 -0.9075,3.3825 0,2.1725 0.9075,3.4375 0.935,1.265 2.585,1.265 1.65,0 2.5575,-1.265 0.935,-1.265 0.935,-3.4375 z" />
<path
inkscape:connector-curvature="0"
id="path8875"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5954.7977,2308.3185 q 0,-2.255 -0.5775,-3.245 -0.55,-1.0175 -2.09,-1.0175 -0.55,0 -1.21,0.082 -0.66,0.082 -0.99,0.1375 v 11.605 h -3.3275 v -13.915 q 0.9625,-0.275 2.5025,-0.5225 1.5675,-0.2475 3.3,-0.2475 1.485,0 2.42,0.385 0.9625,0.385 1.595,1.0175 0.3025,-0.22 0.77,-0.4675 0.4675,-0.2475 1.045,-0.44 0.5775,-0.22 1.21,-0.3575 0.66,-0.1375 1.32,-0.1375 1.6775,0 2.75,0.495 1.1,0.4675 1.705,1.3475 0.6325,0.8525 0.8525,2.09 0.2475,1.21 0.2475,2.6675 v 8.085 h -3.3275 v -7.5625 q 0,-2.255 -0.55,-3.245 -0.55,-1.0175 -2.1175,-1.0175 -0.7975,0 -1.5125,0.275 -0.715,0.2475 -1.0725,0.495 0.22,0.6875 0.3025,1.4575 0.083,0.77 0.083,1.65 v 7.9475 h -3.3275 v -7.5625 z" />
<path
inkscape:connector-curvature="0"
id="path8877"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5979.9392,2308.7585 q 0,-2.2275 -1.0175,-3.465 -0.99,-1.2375 -3.2175,-1.2375 -0.4675,0 -0.99,0.055 -0.495,0.028 -0.99,0.165 v 8.2225 q 0.44,0.3025 1.155,0.5775 0.7425,0.2475 1.5675,0.2475 1.815,0 2.64,-1.2375 0.8525,-1.2375 0.8525,-3.3275 z m 3.41,-0.055 q 0,1.65 -0.44,3.025 -0.4125,1.375 -1.21,2.365 -0.7975,0.99 -2.0075,1.54 -1.1825,0.55 -2.695,0.55 -1.0175,0 -1.87,-0.2475 -0.8525,-0.2475 -1.4025,-0.55 v 5.5825 h -3.3275 v -19.0025 q 1.0175,-0.275 2.5025,-0.5225 1.485,-0.2475 3.135,-0.2475 1.705,0 3.0525,0.5225 1.3475,0.5225 2.2825,1.5125 0.9625,0.9625 1.4575,2.365 0.5225,1.375 0.5225,3.1075 z" />
<path
inkscape:connector-curvature="0"
id="path8879"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5985.981,2308.7585 q 0,-1.8975 0.55,-3.3275 0.5775,-1.43 1.5125,-2.365 0.935,-0.9625 2.145,-1.43 1.21,-0.495 2.475,-0.495 2.97,0 4.62,1.8425 1.6775,1.8425 1.6775,5.5 0,0.275 -0.028,0.6325 0,0.33 -0.028,0.605 h -9.4875 q 0.1375,1.7325 1.21,2.695 1.1,0.935 3.1625,0.935 1.21,0 2.2,-0.22 1.0175,-0.22 1.595,-0.4675 l 0.44,2.7225 q -0.275,0.1375 -0.77,0.3025 -0.4675,0.1375 -1.1,0.2475 -0.605,0.1375 -1.32,0.22 -0.715,0.082 -1.4575,0.082 -1.8975,0 -3.3,-0.55 -1.4025,-0.5775 -2.31,-1.5675 -0.9075,-1.0175 -1.3475,-2.365 -0.44,-1.375 -0.44,-2.9975 z m 9.6525,-1.485 q 0,-0.6875 -0.1925,-1.2925 -0.1925,-0.6325 -0.5775,-1.0725 -0.3575,-0.4675 -0.9075,-0.715 -0.5225,-0.275 -1.265,-0.275 -0.77,0 -1.3475,0.3025 -0.5775,0.275 -0.99,0.7425 -0.385,0.4675 -0.605,1.0725 -0.22,0.605 -0.3025,1.2375 z m 0.5775,-11.66 -4.4825,4.345 -1.65,-1.485 4.0425,-4.8125 z" />
<path
inkscape:connector-curvature="0"
id="path8881"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6002.2971,2297.7035 3.3275,-0.55 v 4.345 h 5.115 v 2.7775 h -5.115 v 5.8575 q 0,1.7325 0.55,2.475 0.55,0.7425 1.87,0.7425 0.9075,0 1.595,-0.1925 0.715,-0.1925 1.1275,-0.3575 l 0.55,2.64 q -0.5775,0.2475 -1.5125,0.495 -0.935,0.275 -2.2,0.275 -1.54,0 -2.585,-0.4125 -1.0175,-0.4125 -1.6225,-1.1825 -0.605,-0.7975 -0.8525,-1.8975 -0.2475,-1.1275 -0.2475,-2.5575 z" />
<path
inkscape:connector-curvature="0"
id="path8883"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6012.8902,2308.7585 q 0,-1.8975 0.55,-3.3275 0.5775,-1.43 1.5125,-2.365 0.935,-0.9625 2.145,-1.43 1.21,-0.495 2.475,-0.495 2.97,0 4.62,1.8425 1.6775,1.8425 1.6775,5.5 0,0.275 -0.028,0.6325 0,0.33 -0.028,0.605 h -9.4875 q 0.1375,1.7325 1.21,2.695 1.1,0.935 3.1625,0.935 1.21,0 2.2,-0.22 1.0175,-0.22 1.595,-0.4675 l 0.44,2.7225 q -0.275,0.1375 -0.77,0.3025 -0.4675,0.1375 -1.1,0.2475 -0.605,0.1375 -1.32,0.22 -0.715,0.082 -1.4575,0.082 -1.8975,0 -3.3,-0.55 -1.4025,-0.5775 -2.31,-1.5675 -0.9075,-1.0175 -1.3475,-2.365 -0.44,-1.375 -0.44,-2.9975 z m 9.6525,-1.485 q 0,-0.6875 -0.1925,-1.2925 -0.1925,-0.6325 -0.5775,-1.0725 -0.3575,-0.4675 -0.9075,-0.715 -0.5225,-0.275 -1.265,-0.275 -0.77,0 -1.3475,0.3025 -0.5775,0.275 -0.99,0.7425 -0.385,0.4675 -0.605,1.0725 -0.22,0.605 -0.3025,1.2375 z" />
<path
inkscape:connector-curvature="0"
id="path8885"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6029.3713,2301.966 q 0.9625,-0.275 2.5025,-0.5225 1.54,-0.2475 3.41,-0.2475 1.76,0 2.9425,0.495 1.1825,0.4675 1.87,1.3475 0.715,0.8525 0.99,2.09 0.3025,1.21 0.3025,2.6675 v 8.085 h -3.3275 v -7.5625 q 0,-1.155 -0.165,-1.9525 -0.1375,-0.825 -0.495,-1.32 -0.33,-0.5225 -0.935,-0.7425 -0.5775,-0.2475 -1.43,-0.2475 -0.6325,0 -1.32,0.082 -0.6875,0.082 -1.0175,0.1375 v 11.605 h -3.3275 v -13.915 z" />
<path
inkscape:connector-curvature="0"
id="path8887"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6044.6871,2308.7035 q 0,-1.595 0.495,-2.97 0.495,-1.4025 1.4025,-2.42 0.935,-1.0175 2.255,-1.595 1.32,-0.5775 2.97,-0.5775 2.035,0 3.85,0.7425 l -0.715,2.7225 q -0.5775,-0.2475 -1.32,-0.4125 -0.715,-0.165 -1.54,-0.165 -1.9525,0 -2.97,1.2375 -1.0175,1.21 -1.0175,3.4375 0,2.145 0.9625,3.41 0.9625,1.2375 3.245,1.2375 0.8525,0 1.6775,-0.165 0.825,-0.165 1.43,-0.4125 l 0.4675,2.75 q -0.55,0.275 -1.6775,0.495 -1.1,0.22 -2.2825,0.22 -1.8425,0 -3.2175,-0.55 -1.3475,-0.5775 -2.255,-1.5675 -0.88,-1.0175 -1.32,-2.3925 -0.44,-1.4025 -0.44,-3.025 z" />
<path
inkscape:connector-curvature="0"
id="path8889"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6057.6851,2308.7585 q 0,-1.8975 0.55,-3.3275 0.5775,-1.43 1.5125,-2.365 0.935,-0.9625 2.145,-1.43 1.21,-0.495 2.475,-0.495 2.97,0 4.62,1.8425 1.6775,1.8425 1.6775,5.5 0,0.275 -0.028,0.6325 0,0.33 -0.028,0.605 h -9.4875 q 0.1375,1.7325 1.21,2.695 1.1,0.935 3.1625,0.935 1.21,0 2.2,-0.22 1.0175,-0.22 1.595,-0.4675 l 0.44,2.7225 q -0.275,0.1375 -0.77,0.3025 -0.4675,0.1375 -1.1,0.2475 -0.605,0.1375 -1.32,0.22 -0.715,0.082 -1.4575,0.082 -1.8975,0 -3.3,-0.55 -1.4025,-0.5775 -2.31,-1.5675 -0.9075,-1.0175 -1.3475,-2.365 -0.44,-1.375 -0.44,-2.9975 z m 9.6525,-1.485 q 0,-0.6875 -0.1925,-1.2925 -0.1925,-0.6325 -0.5775,-1.0725 -0.3575,-0.4675 -0.9075,-0.715 -0.5225,-0.275 -1.265,-0.275 -0.77,0 -1.3475,0.3025 -0.5775,0.275 -0.99,0.7425 -0.385,0.4675 -0.605,1.0725 -0.22,0.605 -0.3025,1.2375 z" />
<path
inkscape:connector-curvature="0"
id="path8891"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5903.8876,2347.2585 v 2.9975 h -12.045 v -19.0575 h 3.465 v 16.06 z" />
<path
inkscape:connector-curvature="0"
id="path8893"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5919.0796,2343.051 q 0,1.705 -0.495,3.1075 -0.495,1.4025 -1.4025,2.3925 -0.9075,0.99 -2.2,1.54 -1.265,0.55 -2.805,0.55 -1.54,0 -2.805,-0.55 -1.265,-0.55 -2.1725,-1.54 -0.9075,-0.99 -1.43,-2.3925 -0.495,-1.4025 -0.495,-3.1075 0,-1.705 0.495,-3.08 0.5225,-1.4025 1.43,-2.3925 0.935,-0.99 2.2,-1.5125 1.265,-0.55 2.7775,-0.55 1.5125,0 2.7775,0.55 1.2925,0.5225 2.2,1.5125 0.9075,0.99 1.4025,2.3925 0.5225,1.375 0.5225,3.08 z m -3.41,0 q 0,-2.145 -0.935,-3.3825 -0.9075,-1.265 -2.5575,-1.265 -1.65,0 -2.585,1.265 -0.9075,1.2375 -0.9075,3.3825 0,2.1725 0.9075,3.4375 0.935,1.265 2.585,1.265 1.65,0 2.5575,-1.265 0.935,-1.265 0.935,-3.4375 z" />
<path
inkscape:connector-curvature="0"
id="path8895"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5925.1201,2342.6935 q 0,2.1175 0.9075,3.1075 0.935,0.9625 2.3925,0.9625 0.7975,0 1.485,-0.22 0.715,-0.22 1.155,-0.5225 v -7.4525 q -0.3575,-0.082 -0.88,-0.1375 -0.5225,-0.082 -1.32,-0.082 -1.815,0 -2.7775,1.21 -0.9625,1.1825 -0.9625,3.135 z m 9.2675,6.105 q 0,3.4375 -1.76,5.0325 -1.7325,1.595 -5.335,1.595 -1.32,0 -2.585,-0.22 -1.2375,-0.22 -2.255,-0.5775 l 0.605,-2.8325 q 0.8525,0.3575 1.925,0.5775 1.1,0.22 2.365,0.22 2.0075,0 2.86,-0.825 0.8525,-0.825 0.8525,-2.4475 v -0.55 q -0.495,0.2475 -1.32,0.495 -0.7975,0.2475 -1.8425,0.2475 -1.375,0 -2.53,-0.44 -1.1275,-0.44 -1.9525,-1.2925 -0.7975,-0.8525 -1.265,-2.1175 -0.44,-1.2925 -0.44,-2.97 0,-1.5675 0.4675,-2.8875 0.495,-1.32 1.4025,-2.255 0.935,-0.935 2.255,-1.4575 1.32,-0.5225 2.9975,-0.5225 1.6225,0 3.08,0.2475 1.4575,0.2475 2.475,0.5225 z" />
<path
inkscape:connector-curvature="0"
id="path8897"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5941.9759,2350.256 h -3.3275 v -14.3825 h 3.3275 z m 0.3575,-18.59 q 0,0.935 -0.605,1.485 -0.605,0.55 -1.43,0.55 -0.8525,0 -1.4575,-0.55 -0.605,-0.55 -0.605,-1.485 0,-0.9625 0.605,-1.5125 0.605,-0.55 1.4575,-0.55 0.825,0 1.43,0.55 0.605,0.55 0.605,1.5125 z" />
<path
inkscape:connector-curvature="0"
id="path8899"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5945.3967,2343.0785 q 0,-1.595 0.495,-2.97 0.495,-1.4025 1.4025,-2.42 0.935,-1.0175 2.255,-1.595 1.32,-0.5775 2.97,-0.5775 2.035,0 3.85,0.7425 l -0.715,2.7225 q -0.5775,-0.2475 -1.32,-0.4125 -0.715,-0.165 -1.54,-0.165 -1.9525,0 -2.97,1.2375 -1.0175,1.21 -1.0175,3.4375 0,2.145 0.9625,3.41 0.9625,1.2375 3.245,1.2375 0.8525,0 1.6775,-0.165 0.825,-0.165 1.43,-0.4125 l 0.4675,2.75 q -0.55,0.275 -1.6775,0.495 -1.1,0.22 -2.2825,0.22 -1.8425,0 -3.2175,-0.55 -1.3475,-0.5775 -2.255,-1.5675 -0.88,-1.0175 -1.32,-2.3925 -0.44,-1.4025 -0.44,-3.025 z" />
<path
inkscape:connector-curvature="0"
id="path8901"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5962.5472,2350.256 h -3.3275 v -14.3825 h 3.3275 z m 0.3575,-18.59 q 0,0.935 -0.605,1.485 -0.605,0.55 -1.43,0.55 -0.8525,0 -1.4575,-0.55 -0.605,-0.55 -0.605,-1.485 0,-0.9625 0.605,-1.5125 0.605,-0.55 1.4575,-0.55 0.825,0 1.43,0.55 0.605,0.55 0.605,1.5125 z" />
<path
inkscape:connector-curvature="0"
id="path8903"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5965.9679,2343.1335 q 0,-1.8975 0.55,-3.3275 0.5775,-1.43 1.5125,-2.365 0.935,-0.9625 2.145,-1.43 1.21,-0.495 2.475,-0.495 2.97,0 4.62,1.8425 1.6775,1.8425 1.6775,5.5 0,0.275 -0.028,0.6325 0,0.33 -0.028,0.605 h -9.4875 q 0.1375,1.7325 1.21,2.695 1.1,0.935 3.1625,0.935 1.21,0 2.2,-0.22 1.0175,-0.22 1.595,-0.4675 l 0.44,2.7225 q -0.275,0.1375 -0.77,0.3025 -0.4675,0.1375 -1.1,0.2475 -0.605,0.1375 -1.32,0.22 -0.715,0.082 -1.4575,0.082 -1.8975,0 -3.3,-0.55 -1.4025,-0.5775 -2.31,-1.5675 -0.9075,-1.0175 -1.3475,-2.365 -0.44,-1.375 -0.44,-2.9975 z m 9.6525,-1.485 q 0,-0.6875 -0.1925,-1.2925 -0.1925,-0.6325 -0.5775,-1.0725 -0.3575,-0.4675 -0.9075,-0.715 -0.5225,-0.275 -1.265,-0.275 -0.77,0 -1.3475,0.3025 -0.5775,0.275 -0.99,0.7425 -0.385,0.4675 -0.605,1.0725 -0.22,0.605 -0.3025,1.2375 z" />
<path
inkscape:connector-curvature="0"
id="path8905"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5987.454,2350.531 q -1.485,-0.028 -2.475,-0.33 -0.9625,-0.3025 -1.54,-0.8525 -0.5775,-0.5775 -0.825,-1.4025 -0.22,-0.8525 -0.22,-1.925 v -16.555 l 3.3275,-0.55 v 16.4725 q 0,0.605 0.082,1.0175 0.11,0.4125 0.3575,0.715 0.2475,0.275 0.66,0.44 0.44,0.1375 1.1,0.22 l -0.4675,2.75 z" />
<path
inkscape:connector-curvature="0"
id="path8907"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6021.6857,2347.2585 v 2.9975 h -12.045 v -19.0575 h 3.465 v 16.06 z" />
<path
inkscape:connector-curvature="0"
id="path8909"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6027.4938,2350.256 h -3.3275 v -14.3825 h 3.3275 z m 0.3575,-18.59 q 0,0.935 -0.605,1.485 -0.605,0.55 -1.43,0.55 -0.8525,0 -1.4575,-0.55 -0.605,-0.55 -0.605,-1.485 0,-0.9625 0.605,-1.5125 0.605,-0.55 1.4575,-0.55 0.825,0 1.43,0.55 0.605,0.55 0.605,1.5125 z" />
<path
inkscape:connector-curvature="0"
id="path8911"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6041.2545,2343.0235 q 0,-2.1175 -0.8525,-3.355 -0.825,-1.2375 -2.64,-1.2375 -0.825,0 -1.5675,0.2475 -0.715,0.2475 -1.155,0.55 v 8.2775 q 0.3575,0.082 0.9075,0.165 0.5775,0.055 1.375,0.055 1.8425,0 2.8875,-1.2375 1.045,-1.265 1.045,-3.465 z m 3.41,0.055 q 0,1.7325 -0.5225,3.135 -0.495,1.375 -1.4575,2.365 -0.935,0.99 -2.2825,1.5125 -1.3475,0.5225 -3.0525,0.5225 -1.65,0 -3.1625,-0.2475 -1.485,-0.2475 -2.475,-0.55 v -20.35 l 3.3275,-0.55 v 7.4525 q 0.5775,-0.3025 1.4025,-0.55 0.8525,-0.2475 1.87,-0.2475 1.5125,0 2.695,0.55 1.21,0.5225 2.0075,1.5125 0.7975,0.99 1.21,2.3925 0.44,1.375 0.44,3.0525 z" />
<path
inkscape:connector-curvature="0"
id="path8913"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6056.2889,2338.871 q -0.4125,-0.1375 -1.155,-0.275 -0.715,-0.165 -1.6775,-0.165 -0.55,0 -1.1825,0.11 -0.605,0.11 -0.8525,0.1925 v 11.5225 h -3.3275 v -13.695 q 0.9625,-0.3575 2.3925,-0.66 1.4575,-0.33 3.2175,-0.33 0.33,0 0.77,0.055 0.44,0.027 0.88,0.11 0.44,0.055 0.8525,0.165 0.4125,0.082 0.66,0.165 z" />
<path
inkscape:connector-curvature="0"
id="path8915"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6058.3608,2343.1335 q 0,-1.8975 0.55,-3.3275 0.5775,-1.43 1.5125,-2.365 0.935,-0.9625 2.145,-1.43 1.21,-0.495 2.475,-0.495 2.97,0 4.62,1.8425 1.6775,1.8425 1.6775,5.5 0,0.275 -0.028,0.6325 0,0.33 -0.028,0.605 h -9.4875 q 0.1375,1.7325 1.21,2.695 1.1,0.935 3.1625,0.935 1.21,0 2.2,-0.22 1.0175,-0.22 1.595,-0.4675 l 0.44,2.7225 q -0.275,0.1375 -0.77,0.3025 -0.4675,0.1375 -1.1,0.2475 -0.605,0.1375 -1.32,0.22 -0.715,0.082 -1.4575,0.082 -1.8975,0 -3.3,-0.55 -1.4025,-0.5775 -2.31,-1.5675 -0.9075,-1.0175 -1.3475,-2.365 -0.44,-1.375 -0.44,-2.9975 z m 9.6525,-1.485 q 0,-0.6875 -0.1925,-1.2925 -0.1925,-0.6325 -0.5775,-1.0725 -0.3575,-0.4675 -0.9075,-0.715 -0.5225,-0.275 -1.265,-0.275 -0.77,0 -1.3475,0.3025 -0.5775,0.275 -0.99,0.7425 -0.385,0.4675 -0.605,1.0725 -0.22,0.605 -0.3025,1.2375 z" />
<g
transform="matrix(0.68174389,0,0,0.68174389,2141.0659,772.88352)"
id="text6302"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.99968249;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
<path
style="stroke:#000000;stroke-width:0.99968249;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0"
id="path6307"
d="m 5774.5893,2260.6745 q 2.28,0 3.36,-0.6 1.12,-0.6 1.12,-1.92 0,-1.36 -1.08,-2.16 -1.08,-0.8 -3.56,-1.8 -1.2,-0.48 -2.32,-0.96 -1.08,-0.52 -1.88,-1.2 -0.8,-0.68 -1.28,-1.64 -0.48,-0.96 -0.48,-2.36 0,-2.76 2.04,-4.36 2.04,-1.64 5.56,-1.64 0.88,0 1.76,0.12 0.88,0.08 1.64,0.24 0.76,0.12 1.32,0.28 0.6,0.16 0.92,0.28 l -0.68,3.2 q -0.6,-0.32 -1.88,-0.64 -1.28,-0.36 -3.08,-0.36 -1.56,0 -2.72,0.64 -1.16,0.6 -1.16,1.92 0,0.68 0.24,1.2 0.28,0.52 0.8,0.96 0.56,0.4 1.36,0.76 0.8,0.36 1.92,0.76 1.48,0.56 2.64,1.12 1.16,0.52 1.96,1.24 0.84,0.72 1.28,1.76 0.44,1 0.44,2.48 0,2.88 -2.16,4.36 -2.12,1.48 -6.08,1.48 -2.76,0 -4.32,-0.48 -1.56,-0.44 -2.12,-0.68 l 0.68,-3.2 q 0.64,0.24 2.04,0.72 1.4,0.48 3.72,0.48 z" />
</g>
<g
transform="matrix(0.68174389,0,0,0.68174389,2057.4567,807.42681)"
id="text6302-8"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;display:inline;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.99968249;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
<path
style="stroke:#000000;stroke-width:0.99968249;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0"
id="path6307-7"
d="m 5774.5893,2260.6745 q 2.28,0 3.36,-0.6 1.12,-0.6 1.12,-1.92 0,-1.36 -1.08,-2.16 -1.08,-0.8 -3.56,-1.8 -1.2,-0.48 -2.32,-0.96 -1.08,-0.52 -1.88,-1.2 -0.8,-0.68 -1.28,-1.64 -0.48,-0.96 -0.48,-2.36 0,-2.76 2.04,-4.36 2.04,-1.64 5.56,-1.64 0.88,0 1.76,0.12 0.88,0.08 1.64,0.24 0.76,0.12 1.32,0.28 0.6,0.16 0.92,0.28 l -0.68,3.2 q -0.6,-0.32 -1.88,-0.64 -1.28,-0.36 -3.08,-0.36 -1.56,0 -2.72,0.64 -1.16,0.6 -1.16,1.92 0,0.68 0.24,1.2 0.28,0.52 0.8,0.96 0.56,0.4 1.36,0.76 0.8,0.36 1.92,0.76 1.48,0.56 2.64,1.12 1.16,0.52 1.96,1.24 0.84,0.72 1.28,1.76 0.44,1 0.44,2.48 0,2.88 -2.16,4.36 -2.12,1.48 -6.08,1.48 -2.76,0 -4.32,-0.48 -1.56,-0.44 -2.12,-0.68 l 0.68,-3.2 q 0.64,0.24 2.04,0.72 1.4,0.48 3.72,0.48 z" />
</g>
<g
transform="matrix(0.67616411,0,0,0.67616411,2173.1135,820.26245)"
id="text6302-8-5"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;display:inline;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.99968249;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
<path
style="stroke:#000000;stroke-width:0.99968249;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0"
id="path6307-7-4"
d="m 5774.5893,2260.6745 q 2.28,0 3.36,-0.6 1.12,-0.6 1.12,-1.92 0,-1.36 -1.08,-2.16 -1.08,-0.8 -3.56,-1.8 -1.2,-0.48 -2.32,-0.96 -1.08,-0.52 -1.88,-1.2 -0.8,-0.68 -1.28,-1.64 -0.48,-0.96 -0.48,-2.36 0,-2.76 2.04,-4.36 2.04,-1.64 5.56,-1.64 0.88,0 1.76,0.12 0.88,0.08 1.64,0.24 0.76,0.12 1.32,0.28 0.6,0.16 0.92,0.28 l -0.68,3.2 q -0.6,-0.32 -1.88,-0.64 -1.28,-0.36 -3.08,-0.36 -1.56,0 -2.72,0.64 -1.16,0.6 -1.16,1.92 0,0.68 0.24,1.2 0.28,0.52 0.8,0.96 0.56,0.4 1.36,0.76 0.8,0.36 1.92,0.76 1.48,0.56 2.64,1.12 1.16,0.52 1.96,1.24 0.84,0.72 1.28,1.76 0.44,1 0.44,2.48 0,2.88 -2.16,4.36 -2.12,1.48 -6.08,1.48 -2.76,0 -4.32,-0.48 -1.56,-0.44 -2.12,-0.68 l 0.68,-3.2 q 0.64,0.24 2.04,0.72 1.4,0.48 3.72,0.48 z" />
</g>
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 46 KiB

View File

@ -1,318 +0,0 @@
%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 262 316 372 461
%................................
%%Creator: GNU Ghostscript 510 (epswrite)
%%CreationDate: 1999/12/10 21:20:34
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%EndComments
%%BeginProlog
% This copyright applies to everything between here and the %%EndProlog:
% Copyright (C) 1997 Aladdin Enterprises, Menlo Park, CA. All rights reserved.
%%BeginResource: procset GS_pswrite_ProcSet
/GS_pswrite_ProcSet 40 dict dup begin
/!{bind def}bind def/X{load def}!
/rg/setrgbcolor X/g/setgray X/w/setlinewidth X/J/setlinecap X
/j/setlinejoin X/M/setmiterlimit X/d/setdash X/i/setflat X
/m/moveto X/l/lineto X/c/curveto X/h/closepath X
/lx{0 rlineto}!/ly{0 exch rlineto}!/v{currentpoint 6 2 roll c}!/y{2 copy c}!
/re{4 -2 roll m exch dup lx exch ly neg lx h}!
/q/gsave X/Q/grestore X/f/fill X/f*/eofill X/S/stroke X/rf{re f}!
/Y{initclip clip newpath}!/Y*{initclip eoclip newpath}!/rY{re Y}!
/@/currentfile X/|{string readstring pop}!
/Ix{[1 0 0 1 9 -1 roll neg 9 -1 roll neg]exch}!
/It{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}!
/Ic{Ix false 1 colorimage}!
/@85{@/ASCII85Decode filter}!
end def
%%EndResource
%%EndProlog
%%Page: 1 1
%%BeginPageSetup
save GS_pswrite_ProcSet begin 0.1 0.1 scale
%%EndPageSetup
0.843137 0.027451 0.317647 rg
0 0 m
6120 0 l
6120 7920 l
0 7920 l
Y
3233.33 4125.86 m
3218.39 4125.66 3236.15 4118.18 3255.66 4115.17 c
3261.06 4119.39 3265.94 4123.63 3270.29 4127.77 c
3258.15 4124.8 3245.79 4124.73 3233.33 4125.86 c
f
3313.52 4145.85 m
3322.43 4158.14 3328.92 4171.58 3331.2 4185.48 c
3329.19 4175.58 3323.84 4167.03 3318.76 4157.99 c
3290.83 4140.4 3316.12 4168.43 3318.74 4179.1 c
3288.72 4141.27 3314.61 4156.42 3313.52 4145.85 c
f
3343.14 4222.89 m
3344.95 4249.8 3337.84 4241.28 3335.46 4231.03 c
3338.23 4229.57 3340.44 4212.05 3343.14 4222.89 c
f
3176.66 4590.68 m
3184.64 4589.26 3193.91 4588.16 3192.58 4586.25 c
3201.32 4588.18 3203.3 4589.92 3176.66 4590.68 c
f
3192.58 4586.25 m
3186.96 4585.08 l
3192.21 4585.56 l
3192.58 4586.25 l
f
3441.26 4212.69 m
3442.16 4188.53 3434.21 4176.79 3427.02 4156.03 c
3414.1 4149.6 l
3403.54 4129.06 3415.15 4136.56 3407.57 4120.23 c
3391.05 4105.56 3357.51 4074.34 3346.77 4071.48 c
3338.92 4071.65 3352.08 4080.74 3353.8 4084.29 c
3331.71 4069.13 3336.06 4061.53 3302.29 4052.3 c
3301.3 4054.51 l
3218 4015.31 3102.28 4092.98 3103.8 4198.94 c
3102.92 4192.22 3101.27 4193.9 3099.43 4191.2 c
3095.13 4245.71 3124.61 4300.46 3174.33 4322.85 c
3222.96 4346.91 3279.97 4337.05 3314.79 4304.56 c
3295.66 4329.62 3257.58 4356.19 3212.45 4353.73 c
3168.24 4353.01 3126.88 4324.92 3113.07 4294.41 c
3090.43 4280.16 3087.79 4239.45 3077.93 4231.99 c
3064.64 4134.39 3102.9 4092.24 3167.63 4042.63 c
3177.79 4035.77 3170.49 4034.72 3171.85 4029.5 c
3150.35 4039.56 3130.67 4054.76 3114.47 4073.37 c
3123.07 4060.8 3132.34 4048.58 3144.33 4038.98 c
3124.04 4045.83 3096.95 4088.11 3089.06 4089.83 c
3124.01 4027.25 3230.84 3980.08 3286.81 4003.49 c
3260.92 4002.53 3228.03 4002.96 3198.94 4013.71 c
3186.7 4020 3170.1 4033.01 3173.07 4035.44 c
3249.42 4006.93 3328.29 4013.86 3394.36 4066.81 c
3411.16 4079.91 3429.52 4102.18 3434.83 4102.48 c
3426.85 4090.46 3436.2 4096.7 3430.07 4086.09 c
3446.8 4113.1 3422.78 4097.09 3447.37 4132.73 c
3456.46 4120.23 l
3453.07 4142.67 3484.31 4169.89 3481.12 4205.35 c
3488.29 4216.19 3489.11 4193.67 3481.51 4168.73 c
3492.06 4196.4 3484.31 4200.85 3487 4223.69 c
3489.92 4216.01 3493.78 4207.86 3495.75 4199.75 c
3488.88 4226.5 3502.78 4244.78 3506.24 4260.33 c
3502.82 4261.83 3495.64 4248.51 3493.98 4280.09 c
3494.23 4293.81 3497.8 4287.28 3499.17 4290.66 c
3496.49 4292.21 3489.42 4302.73 3485.13 4322.9 c
3488.22 4327.65 3493.45 4310.61 3497.69 4309.92 c
3494.96 4325.95 3490.26 4338.18 3490.07 4350.49 c
3477.67 4376.39 3485.67 4347.03 3475.64 4361.61 c
3462.44 4402.75 3486.57 4371.16 3488.21 4389.84 c
3508.19 4360.89 3519.59 4315.99 3524.83 4297.4 c
3520.83 4320.07 3514.39 4342.04 3506.49 4363.29 c
3512.59 4360.72 3496.72 4409.92 3514.4 4377.34 c
3495.52 4446.79 3433.62 4511.69 3376.67 4542.13 c
3383.62 4535.76 3392.42 4527.76 3389.27 4526.5 c
3360.94 4543.35 3365.92 4544.68 3361.85 4551.8 c
3338.8 4561.19 3337.27 4551.03 3322 4551.78 c
3278.52 4574.86 3270.13 4572.4 3230.1 4586.85 c
3231.91 4578.33 l
3203.1 4587.93 3198.34 4574.71 3167.21 4578.31 c
3165.32 4579.78 3177.19 4583.67 3186.96 4585.08 c
3159.11 4581.4 3160.41 4590.58 3133.15 4584.07 c
3139.86 4588.78 3146.98 4591.91 3154.14 4595.91 c
3131.43 4594.53 3099.9 4582.69 3109.63 4593.47 c
3072.58 4576.93 3006.77 4553.72 2969.84 4519.09 c
2968.68 4526.85 l
2951.76 4506.54 2894.89 4466.19 2890.36 4439.86 c
2885.83 4438.81 l
2877.04 4423.9 2871.33 4407.01 2864.35 4391.68 c
2852.84 4372.05 2847.47 4384.12 2849.11 4381.04 c
2826.46 4335.12 2815.19 4296.54 2805.48 4264.88 c
2812.4 4254.53 2805.65 4202.56 2808.26 4160.97 c
2796.9 3955.53 2952.44 3756.07 3122.46 3710.04 c
3147.38 3701.11 3184.43 3701.44 3215.96 3700.55 c
3178.77 3711.19 3173.97 3706.17 3137.73 3718.81 c
3111.6 3731.13 3105.88 3745.18 3087.36 3761.25 c
3094.69 3748.3 l
3058.39 3761.15 3073.58 3764.2 3044.04 3773.55 c
3051.87 3783.77 l
3040.1 3784.67 3020.7 3803.59 3015.4 3814.1 c
3002.52 3813.59 l
2987.06 3832.66 2978.81 3846.43 2979.42 3857.09 c
2975.26 3849.67 l
2970.55 3857.75 2918.35 3921.25 2945.43 3906.47 c
2940.4 3911.05 2933.71 3913.94 2926.46 3927.13 c
2931.97 3933.42 l
2918.96 3950.19 2907.99 3971.68 2908.83 3978.84 c
2915.78 3969.46 2920.6 3967.7 2925.38 3966.09 c
2892.47 4047.73 2890.62 3970.58 2865.71 4049.19 c
2870.97 4049.61 l
2866.94 4055.72 2864.47 4062.31 2861.23 4068.8 c
2863.53 4091.65 l
2839.85 4119.01 2856.91 4208.1 2860.34 4256.95 c
2862.69 4276.81 2880.11 4297.96 2893.34 4331.13 c
2885.28 4332.51 l
2900.7 4359.39 2973.3 4440.5 3006.94 4436.34 c
3023.23 4456.8 3003.7 4436.42 3000.51 4441.56 c
3036.3 4478.59 3047.55 4467.72 3071.7 4474.39 c
3097.73 4489.84 3049.35 4468.35 3061.69 4480.28 c
3106.72 4491.77 3093.59 4506.42 3152.32 4512.25 c
3158.52 4508.73 3137.95 4506.81 3132.79 4502.24 c
3170.29 4520.6 3251.48 4516.41 3304.23 4492.06 c
3365.41 4463.45 3434.17 4378.92 3436.89 4299.39 c
3439.97 4298.56 l
3438.41 4266.94 3444.81 4230.37 3433.71 4196.79 c
3441.26 4212.69 l
f
3070.23 4105.36 m
3068.12 4094.89 l
3077.95 4081.54 3085.75 4067.08 3098.28 4056.68 c
3089.26 4074.27 3082.57 4081.54 3070.23 4105.36 c
f
3093.44 4106.26 m
3088.24 4112.02 3085.18 4118.94 3081.72 4125.82 c
3085.02 4113.71 3091.78 4103.3 3098.05 4092.7 c
3093.44 4106.26 l
f
3504.27 4195.56 m
3502.08 4190.04 l
3498.06 4161.46 3489.36 4133.18 3476.03 4106.95 c
3490.75 4134.62 3500.25 4164.89 3504.27 4195.56 c
f
3179.63 4597.85 m
3189.73 4601.54 3204.45 4599.88 3215.19 4602.31 c
3201.21 4601.14 3187.3 4600.44 3173.57 4598.69 c
3179.63 4597.85 l
f
2824.92 4409.23 m
2827.25 4387.69 2808.72 4379.32 2829.02 4393.54 c
2839.92 4418.08 2824.78 4400.31 2824.92 4409.23 c
f
2801.04 4309.49 m
2805.73 4323.86 2806.57 4332.48 2808.36 4340.81 c
2795.43 4324.27 2802.4 4320.74 2801.04 4309.49 c
f
0 g
2758.02 3347.25 m
2757.57 3346.78 2757.57 3272.19 2756.64 3252.72 c
2755.72 3236.97 2754.32 3203.15 2720.96 3203.15 c
2686.67 3203.15 2678.33 3242.54 2675.55 3259.67 c
2672.31 3278.67 2672.31 3294.43 2672.31 3301.37 c
2672.31 3323.61 2673.7 3385.72 2726.06 3385.72 c
2741.82 3385.72 2750.62 3381.07 2757.57 3377.38 c
2758.02 3347.25 l
h
2623.65 3292.56 m
2623.65 3161.9 2693.16 3161.9 2703.35 3161.9 c
2732.08 3161.9 2750.62 3177.66 2758.49 3204.98 c
2759.42 3163.75 l
2768.23 3164.22 2777.03 3165.14 2791.39 3165.14 c
2796.49 3165.14 2800.65 3165.14 2804.37 3164.67 c
2808.08 3164.67 2811.78 3164.22 2815.95 3163.75 c
2808.54 3178.57 2802.98 3211.93 2802.98 3284.24 c
2802.98 3354.67 2802.98 3473.75 2809 3509.9 c
2792.33 3502.01 2777.95 3496.91 2746.44 3494.14 c
2758.95 3480.7 2758.95 3473.75 2758.95 3412.6 c
2750.16 3415.37 2739.03 3418.61 2720.03 3418.61 c
2637.09 3418.61 2623.65 3346.33 2623.65 3292.56 c
f
2874.95 3316.21 m
2875.42 3354.67 2883.3 3388.97 2916.19 3388.97 c
2952.34 3388.97 2955.1 3349.12 2954.18 3316.21 c
2874.95 3316.21 l
h
3000.05 3311.56 m
3000.05 3365.78 2989.4 3419.08 2920.82 3419.08 c
2826.3 3419.08 2826.3 3314.35 2826.3 3292.11 c
2826.3 3198.05 2868.46 3160.98 2939.36 3160.98 c
2970.85 3160.98 2986.16 3165.6 2994.5 3167.93 c
2994.04 3184.61 2996.35 3195.27 2999.15 3209.63 c
2989.4 3203.59 2976.89 3195.72 2949.09 3195.72 c
2876.8 3195.72 2875.87 3261.54 2875.87 3284.24 c
2999.15 3284.24 l
3000.05 3311.56 l
f
3150.8 3291.64 m
3150.8 3248.55 3142.93 3190.62 3089.18 3190.62 c
3081.76 3190.62 3072.5 3192.03 3066.48 3193.42 c
3065.55 3210.1 3065.55 3238.83 3065.55 3272.19 c
3065.55 3312.05 3069.71 3332.87 3072.97 3343.09 c
3082.69 3375.98 3104.47 3376.44 3108.63 3376.44 c
3143.85 3376.44 3150.8 3327.77 3150.8 3291.64 c
h
3017.82 3241.13 m
3017.82 3206.84 3017.82 3187.38 3012.26 3172.56 c
3031.26 3165.14 3054.88 3160.98 3083.16 3160.98 c
3101.23 3160.98 3153.59 3160.98 3181.85 3218.89 c
3195.29 3245.76 3199.92 3281.91 3199.92 3309.26 c
3199.92 3325.94 3198.07 3362.54 3184.63 3385.72 c
3171.66 3407.48 3150.8 3418.61 3128.57 3418.61 c
3084.08 3418.61 3071.11 3381.54 3064.17 3362.54 c
3064.17 3386.17 3064.62 3468.65 3068.32 3510.82 c
3038.21 3496.91 3019.66 3494.61 2999.75 3492.75 c
3017.82 3485.35 3017.82 3454.75 3017.82 3355.12 c
3017.82 3241.13 l
f
3288.99 3163.75 m
3279.73 3165.14 3273.22 3166.07 3259.78 3166.07 c
3244.98 3166.07 3234.77 3165.14 3224.12 3163.75 c
3228.75 3172.56 3230.6 3176.74 3231.99 3206.84 c
3233.85 3248.09 3234.32 3358.38 3231.07 3381.54 c
3228.75 3399.16 3224.59 3401.93 3218.1 3406.56 c
3256.09 3410.27 3266.76 3413.05 3284.35 3421.39 c
3280.65 3401.02 3280.18 3390.8 3280.18 3359.77 c
3279.26 3199.88 3278.79 3182.75 3288.99 3163.75 c
f
3437.37 3294.9 m
3436.46 3265.7 3435.99 3245.31 3428.1 3229.1 c
3418.37 3208.24 3402.16 3202.23 3390.11 3202.23 c
3362.29 3202.23 3356.28 3225.39 3356.28 3248.09 c
3356.28 3291.64 3395.21 3294.9 3412.8 3294.9 c
3437.37 3294.9 l
h
3309.93 3237.89 m
3309.93 3208.69 3318.74 3179.51 3344.7 3166.99 c
3356.28 3161.9 3367.86 3161.9 3371.57 3161.9 c
3414.21 3161.9 3428.56 3193.42 3437.37 3212.87 c
3436.9 3192.48 3437.37 3179.98 3438.76 3163.75 c
3447.1 3164.22 3455.44 3165.14 3469.35 3165.14 c
3477.22 3165.14 3484.64 3164.22 3492.51 3163.75 c
3487.41 3171.62 3484.64 3176.27 3483.23 3194.34 c
3482.31 3211.93 3482.31 3229.55 3482.31 3254.1 c
3482.78 3348.63 l
3482.78 3383.87 3473.51 3418.61 3403.99 3418.61 c
3358.14 3418.61 3331.26 3404.71 3317.82 3397.75 c
3323.39 3387.56 3328.02 3378.77 3332.18 3358.83 c
3350.26 3374.59 3373.9 3382.93 3397.98 3382.93 c
3436.46 3382.93 3436.46 3357.44 3436.46 3321.31 c
3427.65 3321.76 3420.22 3322.68 3407.71 3322.68 c
3348.86 3322.68 3309.93 3300 3309.93 3237.89 c
f
3704.27 3209.63 m
3704.74 3193.87 3704.74 3177.19 3711.22 3163.75 c
3701.02 3164.67 3694.99 3166.07 3676.01 3166.07 c
3664.87 3166.07 3658.86 3165.14 3650.05 3163.75 c
3651.89 3169.77 3652.84 3172.09 3653.76 3179.98 c
3655.15 3190.62 3656.08 3226.31 3656.08 3238.83 c
3656.08 3288.87 l
3656.08 3310.65 3656.08 3342.17 3654.68 3353.28 c
3653.76 3361.15 3651.46 3382.46 3624.56 3382.46 c
3598.15 3382.46 3589.36 3363.01 3586.1 3347.25 c
3582.41 3331.03 3582.41 3313.42 3582.41 3244.84 c
3582.86 3185.53 3582.86 3179.98 3587.49 3163.75 c
3579.62 3164.67 3569.89 3165.6 3555.99 3165.6 c
3544.85 3165.6 3537.45 3165.14 3528.19 3163.75 c
3531.44 3171.17 3533.29 3174.88 3534.21 3200.82 c
3535.15 3226.31 3537 3351.43 3532.8 3381.07 c
3530.5 3399.16 3525.85 3403.32 3520.77 3407.95 c
3558.31 3409.8 3570.34 3415.84 3581.94 3421.85 c
3581.94 3372.73 l
3587.49 3387.11 3599.07 3419.08 3645.42 3419.08 c
3703.35 3419.08 3703.8 3376.91 3704.27 3349.12 c
3704.27 3209.63 l
f
0.843137 0.027451 0.317647 rg
3292.9 3486.97 m
3254.53 3448.61 l
3216.17 3486.97 l
3254.53 3525.33 l
3292.9 3486.97 l
f
end showpage restore
%%PageTrailer
%%Trailer
%%Pages: 1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View File

@ -1,216 +0,0 @@
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = _build
# User-friendly check for sphinx-build
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
endif
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " applehelp to make an Apple Help Book"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " xml to make Docutils-native XML files"
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
@echo " coverage to run coverage check of the documentation (if enabled)"
.PHONY: clean
clean:
rm -rf $(BUILDDIR)/*
.PHONY: html
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
.PHONY: dirhtml
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
.PHONY: singlehtml
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
.PHONY: pickle
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
.PHONY: json
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
.PHONY: htmlhelp
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
.PHONY: qthelp
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Algorithmique.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Algorithmique.qhc"
.PHONY: applehelp
applehelp:
$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
@echo
@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
@echo "N.B. You won't be able to view it unless you put it in" \
"~/Library/Documentation/Help or install it in your application" \
"bundle."
.PHONY: devhelp
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/Algorithmique"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Algorithmique"
@echo "# devhelp"
.PHONY: epub
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
.PHONY: latex
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
.PHONY: latexpdf
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
.PHONY: latexpdfja
latexpdfja:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through platex and dvipdfmx..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
.PHONY: text
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
.PHONY: man
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
.PHONY: texinfo
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
.PHONY: info
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
.PHONY: gettext
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
.PHONY: changes
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
.PHONY: linkcheck
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
.PHONY: doctest
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
.PHONY: coverage
coverage:
$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
@echo "Testing of coverage in the sources finished, look at the " \
"results in $(BUILDDIR)/coverage/python.txt."
.PHONY: xml
xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
.PHONY: pseudoxml
pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

View File

@ -1,291 +0,0 @@
Algorithmique
=============
Al-Kharezmi, auteur du traité "Kitab al jabr w'al-muqabala", est l'inventeur
des manipulations algébriques (algèbre = **al jabr**).
C'est Léonard de Pise, dit Fibonacci, qui emprunta le nom du célèbre
mathématicien arabe du 9ème siècle, mais l'algèbre existe
depuis bien plus longtemps (Depuis Babylone, puis ensuite l'Egypte ancienne).
.. glossary::
algorithme
terme désignant une suite d'opérations constituant un schéma de calcul
ou de résolution d'un problème. C'est un processus systématique de
résolution d'un problème permettant de décrire précisément des étapes.
C'est une suite finie d'instructions permettant de donner la réponse à un
problème.
L'algorithmique est l'étude et la production de règles et de techniques
qui sont impliquées dans la définition d'algorithmes.
Implémentation d'un algorithme
------------------------------
.. glossary::
implémentation
Adaptation de la méthodologie de calculabilité au calcul effectif
sur une machine abstraite ou via un langage formel.
Il ny a pas de parcours à sens unique de lalgorithme vers limplantation.
La quête dune implantation efficace nous amène souvent à effectuer
un retour vers les algorithmes eux-mêmes, et à en modifier des points
essentiels. Laspect théorique de réflexion sur les algorithmes,
et laspect pratique de l'implémentation sont donc en symbiose.
Un existant émerge de la décomposition structurale d'un
domaine de base. Le fait essentiel, c'est la genèse des genres de l'existant les
uns à partir des autres.
L'essence d'une forme (un algorithme) se réalise au sein d'une matière qu'elle créée
(un langage). L'origine d'une matière fait naître les formes (concepts)
que sa structure dessine.
- Notion structurale de non-contradiction
- Notion extensive de "réalisation dans un champ donné"
Deux aspects réciproques : l'essence d'une forme se réalise au sein d'une
matière qu'elle crée, l'essence d'une matière faisant naître les formes que sa
structure dessine.
Abandonner l'idée trop simpliste de domaines concrets et d'opérations abstraites
qui posséderaient en eux-mêmes comme une nature de matière et une nature de
forme ; cette conception tendrait, en effet, à stabiliser les existants
mathématiques dans certains rôles immuables et ignorerait le fait que les
existants abstraits qui naissent de la structure d'un domaine plus concret
peuvent à leur tour servir de domaine de base pour la genèse d'autres existants.
L'algorithme comme généralisation de la calculabilité
------------------------------------------------------
L'importance croissante de l'informatique comme outil scientifique
impose d'élaborer un nouveau mode de description des méthodes de calcul (appelées algorithmes)
susceptible de satisfaire à la fois le critère de sécurité (maîtrise du résultat) et la possibilité
d'implémenter les calculs sur un ordinateur.
Exemple d'algorithme
---------------------
.. raw:: latex
\begin{algorithm}
\caption{L'alorithme de Bellman-Kalaba}
\begin{algorithmic}[1]
\Procedure {BellmanKalaba}{$G$, $u$, $l$, $p$}
\ForAll {$v \in V(G)$}
\State $l(v) \leftarrow \infty$
\EndFor
\State $l(u) \leftarrow 0$
\Repeat
\For {$i \leftarrow 1, n$}
\State $min \leftarrow l(v_i)$
\For {$j \leftarrow 1, n$}
\If {$min > e(v_i, v_j) + l(v_j)$}
\State $min \leftarrow e(v_i, v_j) + l(v_j)$
\State $p(i) \leftarrow v_j$
\EndIf
\EndFor
\State $l(i) \leftarrow min$
\EndFor
\State $changed \leftarrow l \not= l$
\State $l \leftarrow l$
\Until{$\neg changed$}
\EndProcedure
\Statex
\Procedure {FindPathBK}{$v$, $u$, $p$}
\If {$v = u$}
\State \textbf{Write} $v$
\Else
\State $w \leftarrow v$
\While {$w \not= u$}
\State \textbf{Write} $w$
\State $w \leftarrow p(w)$
\EndWhile
\EndIf
\EndProcedure
\end{algorithmic}
\end{algorithm}
Exemple d'algorithme avec son implémentation
---------------------------------------------
Soit l'algorithme de factorielle suivant,
.. raw:: latex
\begin{algorithm}
\caption{Algorithme de la factorielle d'un nombre}\label{factorielle}
\begin{algorithmic}[1]
\Function{factorielle}{$n$}\Comment{La fonction récursive factorielle}
\BState \emph{parametre} : $n$ entier
\If{$n = 1$}
\BState \emph{Sortie} : 1
\Else
\BState \emph{Sortie} : $n * \Call{factorielle}{n-1}$ \Comment{On appelle la fonction dans l'algorithme lui-même}
\EndIf
\EndFunction
\end{algorithmic}
\end{algorithm}
et son implémentation en python :
.. literalinclude:: code/factorielle.py
:language: python
En voici une autre implémentation (en OCaml) :
.. literalinclude:: code/factorielle.ml
:language: ocaml
On remarque que le **pseudocode** est très proche de
la syntaxe du python :
.. function:: factorielle(n:int)
::
if n=1
return 1
else
return n * factorielle(n-1)
end if
Qualité d'un algorithme
-----------------------
- correction d'un algorithme
- complétude d'un algorithme
Sémantique
Étude du sens, de la signification d'un langage
Définir la sémantique dun langage formel consiste à lui donner une
signification mathématique.
Sémantique opérationnelle
on définit la sémantique par sa mise en œuvre sur
une machine abstraite.
Sémantique dénotationnelle
on associe à chaque construction syntaxique un
objet mathématique
Sémantique axiomatique
chaque construction est décrite par la manière dont
elle transforme des propriétés ou des prédicats.
Proposition
une proposition est un énoncé qui est soit vrai, soit faux
**exemple** : ``2 + 3 = 5``. Proposition vraie.
Prédicats
Une proposition dont la valeur de vérité dépend de la valeur dune ou plusieurs variables
**Exemple** : ``n est pair`` : vrai pour n = 4 mais faux pour n = 9
Axiome
une proposition qui est supposée vraie
Un ensemble daxiomes est consistant sil nexiste pas de proposition
dont on peut démontrer quelle est à la fois vraie et fausse.
Un ensemble daxiomes est complet si, pour toute proposition, il est
possible de démontrer quelle est vraie ou fausse.
Théorème dincomplétude de Gödel (1931) : tout ensemble
consistant daxiomes pour larithmétique sur les entiers est
nécessairement incomplet.
**Les concepts de base en algorithmique sont les axiomes**
inférence
règles dinférence, règles permettant de combiner des axiomes et des
propositions vraies pour établir de nouvelles propositions vraies.
Démonstration
vérification dune proposition par une séquence de déductions logiques
à partir dun ensemble daxiomes.
Lorsque le champ donné (le domaine) ne contient qu'un nombre fini d'individus,
on peut définir un choix de valeur des variables permettant de vérifier la
proposition obtenue par la *conjonction* de tous les axiomes du système proposé.
On dit alors que ce choix *réalise* un système d'axiomes.
Il ne s'agit plus de savoir si la définition entraîne l'existence, mais de
chercher si la structure d'un système d'axiomes (*règles*) peut donner naissance
à un champ d'individus qui soutiennent entre eux les relations définies pas les
axiomes.
Concret et abstrait
--------------------
Il est possible qu'un même genre d'existant joue dans un schéma de genèse le
rôle d'abstrait par rapport à un concret de base, et soit au contraire dans une
autre genèse le concret de base d'un nouvel abstrait.
Une pareille présentation des choses implique un tel renversement par rapport
aux habitudes de pensée classiques, qu'il faut encore insister sur le sens
nouveau que reçoivent ici les expressions de "concret" et "d'abstrait".
Les systèmes d'axiomes sont souvent conçus comme des structures purement
formelles, abstraites. Ces structures sont si profondément engagées dans la
genèse de leurs réalisations, qu'il valait mieux désigner par ces termes les
structures de base.
Un système d'axiome *peut* devenir le concret de base.
Ceci permet d'exprimer non seulement l'engagement du concret dans la genèse de
l'abstrait, mais encore les relations d'imitation qui peuvent exister entre la
structure de cet abstrait et celle du concret de base.
Dans certains cas, la genèse de l'abstrait à partir d'un concret de base
s'affirme jusqu'à réaliser une imitation de structure entre ces genres
d'existants qui naissent l'un de l'autre.
**C'est pourquoi on représente souvent un algorithme en pseudo-code**,
c'est-à-dire en fait dans le mode de représentation (issu du langage préféré de la
personne qui l'exprime) dominant chez la personne qui exprime un algorithme.
Comment rendre un algorithme lisible
------------------------------------
- Le bon algorithme utilise des identifiants explicites.
- Le bon algorithme est structuré.
- Le bon algorithme est indenté.
Complexité d'un algorithme
--------------------------
On peut approximer la complexité des algorithmes.
C'est utile pour pouvoir comparer des algorithmes.
complexité
estimer la complexité d'un algorithme, c'est estimer le nombre de calculs qu'il utilise.
Si f est la fonction caractérisant exactement le coût dun algorithme et n
la taille des données, on sintéresse à la façon dont augment f(n) lorsque n augmente
on va montrer que f(n) n'augmente pas plus vite quune autre fonction
g(n). Du point de vue mathématique, on dit que la fonction f est dominée
asymptotiquement par la fonction g ce qui se note f = O(g)
- Complexité temporelle : cest le nombre dop«erations effectuées par
une machine qui exécute lalgorithme.
- Complexité spatiale : cest le nombre de positions mémoire utilisées par
une machine qui exécute lalgorithme.

View File

@ -1,83 +0,0 @@
La planification agile
========================
Le mode itératif
-----------------
- livrer des versions successives et utilisables qui convergent vers
la version finale
- ne pas perdre d'énergie à maintenir des specs détaillées non nécessaires
- de nouvelles orientations fonctionnelles sont possibles, même tard
- les specs détaillées sont écrites "juste à temps"
La planification agile
-----------------------
- chaque livraison est un projet qui est planifié en tant que tel
- utiliser l'expérience acquise pour affiner les estimations
- préservation de l'écologie du projet au quotidien (code, tests...)
La confiance, feedback
-----------------------
- livraisons régulières
- progrès visibles par tous (pas d'effet tunnel)
- pilotage du projet par choix du contenu des livraisons
- investissement du Product Owner
- chercher la collaboration plutôt que la confrontation
L'agilité
----------
- le projet n'est pas joué d'avance
- cultiver la souplesse
- révolution douce
- sortir de la confrontation, jouer le "nous collectif"
mettre tout le monde sur le mme pont et amener tout le monde à bon port
Les outils agiles
------------------
- planification par itérations de 4 semaines
- entrepot de source partagé
- intégration continue
- tests automatisés
- pair programming sur points cruciaux
- sprints
- extranet :
- hitoires utilisateurs
- test cases
- gestion du backolog et des tickets
- suivi de l'avancement
- documentation
Le product owner
-----------------
idéalement,
- connaissance du métier à informatiser
- fibre projet
- dispo à 100%
Les tests
---------
- automatiser
- viser l'exhaustivité
- tester une cible mouvante
- migrer les tests d'une release à l'autre
Questions importantes en environnement agile
----------------------------------------------
- quelle durée d'itération ?
- comment découper en itérations ?
- que faire lorsque le product owner se retrouve sur le chemin critique ?
- la planification est faite en mode "juste à temps" et "juste assez"
- on ne s'échine plus à blâmer, au contraire on cherche à gagner ensemble

View File

@ -1,19 +0,0 @@
Exercices complémentaires
--------------------------
+ **Manipulation de chaînes de caractères**:
(création, accès à un caractère, concaténation), listes (création, ajout
dun élément, suppression dun élément, accès à un élément, extraction dune partie de liste), tableaux à une ou plusieurs dimensions.
+ traitement des chaines de caractères
+ s.replace()
+ s1 + s2
+ un exemple de regexp simple
+ **Fichiers** :
notion de chemin daccès, lecture et écriture de données numériques ou de type chaîne de caractères depuis ou vers un fichier.
On encourage lutilisation de fichiers en tant que supports de données ou de résultats avant divers traitements, par exemple graphiques.
+ **Piles**
Algorithmes de manipulation : fonctions 'push' et 'pop'. On utilise des listes
(ou tableaux à 1 dimension) pour leur implantation.

View File

@ -1,10 +0,0 @@
Annexes
=========
.. toctree::
:maxdepth: 2
exercices
surete
agile
scrum

View File

@ -1,176 +0,0 @@
scrum
=====
.. glossary::
scrum
Scrum est une méthode agile pour la gestion de projets
Le terme Scrum est emprunté au rugby et signifie mêlée.
Ce processus s'articule en effet autour d'une équipe soudée,
qui cherche à atteindre un but, comme c'est le cas en rugby
pour avancer avec le ballon pendant une mêlée.
Scrum définit trois rôles principaux :
- le responsable de produit -- Product Manager,
- le faciliteur -- ScrumMaster
- le développeur
et bien sûr, l'équipe (auto-gérée).
Des intervenants peuvent s'intégrer également au projet
de façon plus ponctuelle.
responsable de produit
Le responsable de produit (Product Manager) est le représentant des
clients et utilisateurs.
C'est lui qui définit l'ordre dans lequel les fonctionnalités
seront développées et qui prend les décisions importantes
concernant l'orientation du projet.
Le terme responsable n'est d'ailleurs pas à prendre au sens hiérarchique
du terme, mais dans le sens de l'orientation.
équipe, développement
outes les décisions sont prises ensemble et personne ne donne d'ordre
à l'équipe sur sa façon de procéder
facilitateur
est chargé de protéger l'équipe de tous les éléments perturbateurs
planification
--------------
Scrum utilise une planification à trois niveaux :
- release/projet
- sprint
- quotidien -- ScrumMeeting
quotidien
Au quotidien, une réunion, le ScrumMeeting (pas plus de 15 min)
permet à l'équipe et au ScrumMaster de faire un point d'avancement sur
les tâches et sur les difficultés rencontrées.
répondre à trois questions :
* Qu'est-ce que j'ai fait hier ?
* Qu'est-ce que je compte faire aujourd'hui ?
* Quelles difficultés est-ce que je rencontre ?
sprint
Scrum est un processus itératif : les itérations sont appelées des sprints
et durent en théorie 30 jours calendaires.
En pratique, les itérations durent généralement entre 2 et 4 semaines.
Chaque sprint possède un but et on lui associe une liste d'items
de fonctionnalités à réaliser.
Ces items sont décomposés par l'équipe en tâches élémentaires
de quelques heures, les items de fonctionnalités de sprint.
Pendant un sprint, les items de fonctionnalités de sprint à réaliser
ne peuvent pas être changés.
Les changements éventuels seront éventuellement réalisés
dans les sprints suivants.
releases
pour améliorer la lisibilité du projet,
on regroupe généralement des itérations en releases.
En effet, comme chaque sprint doit aboutir à la livraison
d'un produit partiel, une release permet de marquer la livraison
d'une version aboutie, susceptible d'être mise en exploitation
gestion des besoins
-------------------
tâches (backlog de sprint)
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lorsqu'on démarre un sprint, on choisit quels items des fonctionnalités
seront réalisés dans ce sprint.
L'équipe décompose ensuite chaque item en liste de tâches élémentaires
(techniques ou non), chaque tâche étant estimée en heures
et ne devant pas durer plus de 2 jours.
On constitue ainsi le backlog de sprint.
Les items de backlog de produit sont les fonctionnalités qui deviendront
les items du baclog d'un sprint.
Ces fonctionnalités sont estimées en points relatifs, sans unité.
planning poker
façon ludique et efficace de produire des estimations
sur la complexité des fonctionnalités à développer
pour évaluer les scénarios utilisateurs (user stories)
du carnet de produit (product backlog).
à la fin d'un sprint :
- revue de sprint
- rétrospective de sprint
comprendre ce qui n'a pas bien marché dans le sprint,
les erreurs commises et de prendre des décisions pour s'améliorer
mise en oeuvre
--------------
Scrum peut être mis en pratique avec trois fois rien : deux listes suffisent.
La liste des items du backlog de produit et la liste des items du backlog
de sprint. La saisie et la mise à jour des données est simplement
un peu moins agréable.
glossaire
---------
Directeur de produit (Product Owner) (responsable produit)
personne responsable de produire et maintenir à jour le backlog de produit.
C'est lui qui en détermine les priorités et qui prend les décisions
concernant l'orientation du projet.
ScrumMaster (facilitateur)
membre de l'équipe dont l'objectif principal est de la protéger
des perturbation extérieures.
Il est complètement transparent pour la communication entre l'équipe
et les clients et n'a aucun pouvoir hiérarchique sur l'équipe.
C'est en revanche un facilitateur pour les problèmes non techniques
de l'équipe.
Backlog de produit (Product Backlog) (fonctionnalités)
liste des fonctionnalités qui devront être réalisées par le logiciel.
Backlog de sprint (Sprint Backlog) (tâches)
liste des tâches à accomplir pendant un sprint.
Elles correspondent à la réalisation des items de backlog
du produit affectés au sprint.
Mêlée quotidienne (Daily Scrum) (quotidien)
réunion quotidienne de 15 minutes qui a pour but de faire le point
sur ce qui a été fait depuis la dernière mêlée,
ce qui est prévu de faire jusqu'à la prochaine
et quelles sont les embûches rencontrées durant le travail.
Sprint (sprint)
nom d'une itération dans Scrum.
Cette itération dure 30 jours calendaires en théorie,
mais en pratique on utilise plutôt entre 2 et 4 semaines.
Pendant une itération, l'équipe doit développer une liste d'items
du backlog de produit qui a été définie au début de ce sprint.
Graphique d'avancement (Burndown Chart) (avancement)
graphique qui montre la tendance du reste à faire total de jour en jour
(pour les sprints) ou de sprint en sprint (pour les releases).

View File

@ -1,93 +0,0 @@
Outils de sureté d'un programme
--------------------------------------
La preuve de programme
~~~~~~~~~~~~~~~~~~~~~~
Le niveau maximum de sûreté d'exécution d'un programme est la preuve. Qu'est-ce que la preuve
formelle d'un programme ? Selon la définition de Wikipédia, ce sont "des techniques permettant de
raisonner rigoureusement, à l'aide de logique mathématique, sur des programmes informatiques ou
du matériel électroniques, afin de démontrer leur validité par rapport à une certaine
spécification." Bref c'est un raisonnement logique sur un programmme qui permet d'être sûr que le
programme est valide et ne va pas planter.
La preuve de programme est très peu utilisée dans l'industrie, car très coûteuse et très
difficile à mettre en place. Elle quand même utilisée, mais dans des secteurs où le risque doit
absolument être évacué et où il n'y a aucun droit à l'erreur. Par exemple, le secteur médical
(informatique en bloc opératoire), militaire (peu d'informations nous parviennent dans ce
domaine), l'aviation civile (le logiciel Astrée pour Airbus), la fusée Ariane (depuis le bug qui
avait fait crasher Ariane 5 ces questions sont prises très au sérieux), et le milieu bancaire
(surtout le domaine des décisions boursières : un programme chargé de lancer des décisions
d'achat ou de vente à la bourse qui comporte un bug peut en quelque centièmes de secondes faire
perdre des millions, voire des milliards d'euros à une banque. Le programme ne doit tout simplement pas
bugger).
Le model checking
~~~~~~~~~~~~~~~~~~
Le model checking, l'analyse statique et l'interprétation abstraite procèdent d'une méthodologie
moins lourde de validation des programmes. Ces méthodes analysent exhaustivement l'évolution du
système lors de ses exécutions possibles et permetent de dire si globalement, dans un contexte
donné, le programme va fonctionner correctement. Encore très lourdes, ces techniques ne sont
utilisées que dans un contexte industriel de haute sécurité.
Les tests d'acceptation
~~~~~~~~~~~~~~~~~~~~~~~
Il y a plusieurs types de tests
- unitaires
- fonctionnels
- acceptation
Très utilisés dans l'industrie, les tests unitaires et fonctionnels ne testent que certaines
parties du programme et permettent de dire que le programme va marcher grosso-modo à peu près.
Beaucoup moins coûteux à installer, ce sont des éléments cléfs des méthodes agiles.
Les Outils de linting (validation)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- vérifications syntaxiques
- vérification sémantiques
- vérification sur les imports inutiles ou mal formés (imports croisés
Exemple en python : pylint
La dette technique
~~~~~~~~~~~~~~~~~~
Au bout d'un moment le code devient du code spaghetti et les techniques sont obsolètes.
Les tests permettent de solder la dette technique plus facilement.
**avoir le courage de payer une dette technique, et affronter une dette technique
sinon il peut y avoir un coût à payer qui sera pohibitoire.**
On solde la dette technique parce que à un moment ça va devenir beaucoup trop
cher à payer.
Les méthodologies agiles
~~~~~~~~~~~~~~~~~~~~~~~~
La manière dont le code est produit importe énormément. Par exemple, une
méthodologie ou le **refactoring** (réécriture de code) est permis et même conseillé
a plus de chance de produire du code organisé.
Les méthodologies agiles produisent en général du code mieux organisé. Ce sont les
méthodes de travail les plus en vogue aujourd'hui, elles mettent l'accent sur :
- Du logiciel fonctionnel plutôt que de la documentation exhaustive
- La réponse au changement plutôt que le suivi d'un plan
- Le logiciel fonctionnel est la principale mesure d'avancement
- Une attention continue à l'excellence technique et à une bonne
conception améliore l'agilité
- La simplicité est essentielle (il est facile de faire, il est
difficile de faire simple)
Le principe de base de la méthodologie Scrum par exemple est de focaliser l'équipe de façon
itérative sur un ensemble de fonctionnalités à réaliser, dans des itérations de durée fixe de une
à quatre semaines, appelées **sprints**. Chaque sprint possède un but à atteindre, défini par le
responsable de produit, à partir duquel sont choisies les fonctionnalités à implémenter dans ce
sprint. Un sprint aboutit toujours sur la livraison d'un produit partiel fonctionnel. Pendant ce
temps, le facilitateur a la charge de réduire au maximum les perturbations extérieures et de
résoudre les problèmes non techniques de l'équipe.

View File

@ -1,79 +0,0 @@
Aperçu des algorithmes fondamentaux
===================================
Les algorithmes sont partout. Absolument partout aujourd'hui.
Il n'est pas un domaine de nos activités qui ne soit liés à tel ou tel algorithme.
En mathématiques
-----------------
- l'algèbre (étude des structures de données)
- l'arithmétique modulaire (théorie des nombres)
- la géométrie (affine, algébrique, invariants topologiques...)
- les diagrammes (diagrammes de Venn...)
- les colorisation d'une carte
- comportements stochastiques
En informatique
----------------
- les algorithmes sur la manipulation des structures de données
Exemple : les algorithmes de tri, de recherche dans un arbre...
- les parcours de graphes (chemins le plus court, voyageur de commerce...)
- la cryptologie (code gray)
- les stratégies de jeux
Tirés du monde réel
--------------------
- les jeux (casse-tête, dominos, échiquiers...)
- énigmes, logique et paradoxes
- problèmes de raisonnements. Il n'existe pas beaucoup de méthodes
ou de moyens simples pour traiter et résoudre les énoncés de logique de raisonnement.
- La "marche de l'ivrogne" : processus de progression discrète (pas à pas)
dont l'étape suivante est lié à l'état présent et pas du tout à la mémoire du passé proche.
Il revêt seulement un caractère de type probabilité (stochastique) dit markovien.
- algorithmes de colonies de fourmis (chemins optimal pour arriver à la nourriture)
Le voyageur de commerce
~~~~~~~~~~~~~~~~~~~~~~~~
Le problème du voyageur de commerce, consiste en la recherche dun trajet minimal permettant à un
voyageur de visiter n villes. En règle générale on cherche à minimiser le temps de parcours total ou la
distance totale parcourue.
Il suffit de construire tous les chemins possibles et de calculer leurs longueurs.
Avec ``n`` villes il y a ``(n-1)!/2`` chemins possibles.
Avec 36 villes on trouve : 5166573983193072464833325668761600000000,
si le nombre de villes augmente, ça devient vite rédibitoire.
Résolution par
- algorithme de parcours de graphes
- algorithme glouton
- algorithmes génétiques
Les algorithmes génétiques sappuient sur un principe de sélection des individus dune population qui présen-
tent des caractéristiques se rapprochant au mieux de ce que lon recherche; cette population évoluant par
ailleurs selon des critères dévolution génétique à choisir. Dans le contexte du problème du voyageur de
commerce, un individu est une tournée, un chemin et une population un ensemble de tournées. Il sagit
maintenant de dé...nir un critère de sélection ainsi que des règles dévolution de la population.
- approches métaheuristiques (exemples: colonies de fourmis)
Exemple de résolution
.. raw:: latex
\begin{algorithm}
\caption{Algorithme du voyageur de commerce}\label{commerce}
\begin{algorithmic}[1]
\BState \emph{Données} : $L$ \Comment{Liste des villes à parcourir avec les distances entre les villes}
\BState \emph{Données} : $L'$ \Comment{Liste du parcours des villes à effectuer}
\State \emph{début}
\BState ...
\State \emph{fin}
\end{algorithmic}
\end{algorithm}

View File

@ -1,61 +0,0 @@
# coding: utf-8
minuscules = 'abcdefghijklmnopqrstuvwxyz'
majuscules = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def rotation(chaine, x):
"""
Effectue une rotation de x caractères vers la droite:
>>> rotation('abcde', 2)
'cdeab'
"""
return chaine[x:] + chaine[:x]
def index(c, chaine):
"""
Trouve l'index de c dans la chaine:
>>> index('n', 'bonjour')
2
"""
for i in range(len(chaine)):
if (c == chaine[i]):
return i
return -1
def chiffre_minuscules(chaine, x):
"""
Chiffre une chaîne composée de minuscules
>>> chiffre_minuscules('bonjour', 3)
'erqmrxu'
"""
r = rotation(minuscules, x)
resultat = ''
for lettre in chaine:
resultat = resultat + r[index(lettre, minuscules)]
return resultat
def chiffre(chaine, x):
"""
Chiffre une chaîne quelconque
>>> chiffre('Bonjour les amis!', 3)
'Erqmrxu ohv dplv!'
"""
r_min = rotation(minuscules, x)
r_maj = rotation(majuscules, x)
resultat = ''
for lettre in chaine:
if lettre in minuscules:
resultat = resultat + r_min[index(lettre, minuscules)]
elif lettre in majuscules:
resultat = resultat + r_maj[index(lettre, majuscules)]
else:
resultat = resultat + lettre
return resultat
#############################################################################
# Programme principal
#############################################################################
print(chiffre_minuscules('bonjour', 3))
print(chiffre('Bonjour les amis!', 3))
print(chiffre('Erqmrxu ohv dplv!', 23))
print(chiffre('Eudyr, yrxv dyhc ilql fhw hahuflfh!', 23))

View File

@ -1,17 +0,0 @@
let rec fact = function
|1 -> 1
| n -> n * fact (n-1) ;;
let print_fact n =
Printf.printf "factorielle %i = %i\n" n (fact n)
let main () =
begin
print_fact 5 ;
print_newline () ;
exit 0 ;
end
let _ = main ()

View File

@ -1,12 +0,0 @@
def factorielle(n):
if (n > 1):
r = n*factorielle(n-1)
else:
r = 1
return r
def print_fact(n):
print "factorielle {} = {}\n".format(5, factorielle(5))
if __name__ == '__main__':
print_fact(5)

View File

@ -1,370 +0,0 @@
# -*- coding: utf-8 -*-
#
# Algorithmique documentation build configuration file, created by
# sphinx-quickstart on Thu Mar 16 16:07:00 2017.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys
import os
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.'))
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'sphinx.ext.pngmath', 'sphinx.ext.ifconfig',
]
# ajout des cours avec solution des exercices ou non
def setup(app):
app.add_config_value('correction', False, 'env')
app.add_config_value('exercice', False, 'env')
exercice = False
correction = False
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
# source_suffix = ['.rst', '.md']
source_suffix = '.txt'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'Algorithmique'
copyright = u'2017, Gwen'
author = u'Gwen'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = u'1'
# The full version, including alpha/beta/rc tags.
release = u'1'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = 'fr'
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
today_fmt = '%d/%m/%Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all
# documents.
default_role = 'literal'
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
#keep_warnings = False
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'alabaster'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (relative to this directory) to use as a favicon of
# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#html_extra_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_domain_indices = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
html_show_sphinx = False
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
html_show_copyright = False
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Language to be used for generating the HTML full-text search index.
# Sphinx supports the following languages:
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
#html_search_language = 'en'
# A dictionary with options for the search language support, empty by default.
# Now only 'ja' uses this config value
#html_search_options = {'type': 'default'}
# The name of a javascript file (relative to the configuration directory) that
# implements a search results scorer. If empty, the default will be used.
#html_search_scorer = 'scorer.js'
# Output file base name for HTML help builder.
htmlhelp_basename = 'Algorithmiquedoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
'papersize': 'a4paper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
'preamble': """\usepackage{amsmath}
\usepackage{algorithm}
\usepackage[noend]{algpseudocode}
\makeatletter
\def\BState{\State\hskip-\ALG@thistlm}
\makeatother
"""
# Latex figure (float) alignment
#'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'Algorithmique.tex', u'Cours d\'algorithmique',
u'promotion GMSI B3', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
latex_logo = '_static/cesi.jpg'
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = False
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'algorithmique', u'Algorithmique Documentation',
[author], 1)
]
# If true, show URL addresses after external links.
#man_show_urls = False
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'Algorithmique', u'Algorithmique Documentation',
author, 'Algorithmique', 'One line description of project.',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
#texinfo_appendices = []
# If false, no module index is generated.
#texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the "Top" node's menu.
#texinfo_no_detailmenu = False
# -- Options for Epub output ----------------------------------------------
# Bibliographic Dublin Core info.
epub_title = project
epub_author = author
epub_publisher = author
epub_copyright = copyright
# The basename for the epub file. It defaults to the project name.
#epub_basename = project
# The HTML theme for the epub output. Since the default themes are not
# optimized for small screen space, using the same theme for HTML and epub
# output is usually not wise. This defaults to 'epub', a theme designed to save
# visual space.
#epub_theme = 'epub'
# The language of the text. It defaults to the language option
# or 'en' if the language is not set.
#epub_language = ''
# The scheme of the identifier. Typical schemes are ISBN or URL.
#epub_scheme = ''
# The unique identifier of the text. This can be a ISBN number
# or the project homepage.
#epub_identifier = ''
# A unique identification for the text.
#epub_uid = ''
# A tuple containing the cover image and cover page html template filenames.
#epub_cover = ()
# A sequence of (type, uri, title) tuples for the guide element of content.opf.
#epub_guide = ()
# HTML files that should be inserted before the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_pre_files = []
# HTML files that should be inserted after the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_post_files = []
# A list of files that should not be packed into the epub file.
epub_exclude_files = ['search.html']
# The depth of the table of contents in toc.ncx.
#epub_tocdepth = 3
# Allow duplicate toc entries.
#epub_tocdup = True
# Choose between 'default' and 'includehidden'.
#epub_tocscope = 'default'
# Fix unsupported image types using the Pillow.
#epub_fix_images = False
# Scale large images.
#epub_max_image_width = 0
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#epub_show_urls = 'inline'
# If false, no index is generated.
#epub_use_index = True

View File

@ -1,294 +0,0 @@
Les structures de contrôle
==========================
L'instruction de saut
----------------------
.. raw:: latex
\begin{algorithm}
\caption{Exemple de saut conditionnel}\label{saut}
\begin{algorithmic}[1]
\Procedure{Euclide}{} \Comment{c'est l'algorithme d'Euclide}
\State $\textit{stringlen} \gets \text{length of }\textit{string}$
\State $i \gets \textit{patlen}$
\BState \emph{top}:
\If {$i > \textit{stringlen}$} \Return false
\EndIf
\State $j \gets \textit{patlen}$
\BState \emph{loop}: \Comment{C'est le label (l'étiquette)} \label{etiquette}
\If {$\textit{string}(i) = \textit{path}(j)$}
\State $j \gets j-1$.
\State $i \gets i-1$.
\State \textbf{goto} \emph{loop}. \label{goto}
\State \textbf{close};
\EndIf
\State $i \gets
i+\max(\textit{delta}_1(\textit{string}(i)),\textit{delta}_2(j))$.
\State \textbf{goto} \emph{top}. \Comment{C'est l'instruction de saut}
\EndProcedure
\end{algorithmic}
\end{algorithm}
.. raw:: latex
Ligne \ref{etiquette}, le bloc `loop` est aussi un label (une étiquette),
c'est-à-dire une marque posée qu'il est possible de retrouver dans le programme. \\
.. raw:: latex
Ligne \ref{goto}, l'instruction \texttt{goto} (aller à ) est le saut vers le label. \\
Description générique d'une instruction de saut::
Instruction 1
Saut Label1
Instruction 2
...
Label1:
Instruction n
.. important:: les sauts conditionnels sont à éviter, même s'ils sont implémentés
dans le langage cible, car c'est le meilleur moyen d'aboutir à
du **code spaghetti**.
L'instruction de branchement conditionnel
------------------------------------------
On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non.
.. raw:: latex
\begin{algorithm}
\caption{Exemple d'instruction de test}
\begin{algorithmic}[1]
\BState \emph{entrée}: $quality\gets 0$ \Comment{C'est cette valeur qui sera testée}
\BState \emph{locale}: $a\gets ""$
\BState \emph{sortie}: $a$ \Comment{La sortie est la valeur de $a$}
\BState \emph{corps}:
\If{$quality\ge 9$}
\State $a\gets perfect$
\ElsIf{$quality\ge 7$}
\State $a\gets good$
\ElsIf{$quality\ge 5$}
\State $a\gets medium$
\ElsIf{$quality\ge 3$}
\State $a\gets bad$
\Else
\State $a\gets unusable$
\EndIf
\end{algorithmic}
\end{algorithm}
.. ifconfig:: exercice
**Exercice** : Compacter l'algorithme suivant en une seule condition de test::
Si il fait trop chaud Alors
Si il ne pleut pas Alors
Ouvrir la fenêtre
Sinon
Fermer la fenêtre
Finsi
Sinon
Fermer la fenêtre
Finsi
.. ifconfig:: correction
**Correction** :
::
Si il fait trop chaud ET il ne pleut pas Alors
Ouvrir la fenêtre
Sinon
Fermer la fenêtre
Finsi
L'instruction switch
--------------------
L'instruction switch permet de faire plusieurs tests de valeurs sur le contenu d'une même variable.
Ce branchement conditionnel simplifie beaucoup le test de plusieurs valeurs d'une variable.
Les instructions d'itérations (boucles)
---------------------------------------
.. important:: Toutes les boucles concernent le paradigme de programmation impératif
et ne sont pas valides dans le paradigme de programmation fonctionnel
(puisque l'ordre d'évaluation importe)
- arrêt conditionnel (break)
- passage d'un pas (continue)
Répéter ... jusqu'à
~~~~~~~~~~~~~~~~~~~
.. raw:: latex
\begin{algorithm}
\caption{Exemple de répéter ... jusqu'à}
\begin{algorithmic}[1]
\BState \emph{locales}: $i \gets 1$ \Comment{déclaration et initialisation de i}
\Repeat \Comment{c'est le label de début du répéter}
\State $i \gets \textit{i+1}$
\Until{i == 100} \Comment{condition de fin de la boucle}
\end{algorithmic}
\end{algorithm}
La boucle **pour** (for)
~~~~~~~~~~~~~~~~~~~~~~~~
.. raw:: latex
\begin{algorithm}
\caption{Exemple de boucle for}
\begin{algorithmic}[1]
\BState \emph{locales}: $sum\gets 0$
\For{$i\gets 1, n$}
\State $sum\gets sum+i$
\EndFor
\end{algorithmic}
\end{algorithm}
.. ifconfig:: exercice
**Exercice** : Ecrire un algorithme qui demande successivement 20 nombres à lutilisateur,
et qui lui dise ensuite quel était le plus grand parmi ces 20 nombres
.. ifconfig:: correction
**Correction** :
::
Variables N, i, PG en Entier
Debut
PG <- 0
Pour i <- 1 à 20
Ecrire "Entrez un nombre : "
Lire N
Si i = 1 ou N > PG Alors
PG <- N
FinSi
Ecrire "Le nombre le plus grand était : ", PG
Fin
.. attention:: ne jamais manipuler le compteur dans une boucle
::
Variable Truc en Entier
Début
Pour Truc <- 1 à 15
Truc <- Truc * 2
Ecrire "Passage numéro : ", Truc
Truc Suivant
Fin
La boucle tant que (while)
~~~~~~~~~~~~~~~~~~~~~~~~~~
.. raw:: latex
\begin{algorithm}
\caption{Exemple de boucle while}
\begin{algorithmic}[1]
\BState \emph{locales}: $sum\gets 0$
\State $i\gets 1$
\While{$i\le n$}
\State $sum\gets sum+i$
\State $i\gets i+1$
\EndWhile
\end{algorithmic}
\end{algorithm}
.. ifconfig:: exercice
**Exercice** : Ecrire un algorithme de validation d'une entrée utilisateur
::
"Voulez vous un café ? (O/N)"
.. ifconfig:: correction
**Correction** : deux solutions possibles, une
::
Variable Rep en Caractère
Début
Rep <- ""
Ecrire "Voulez vous un café ? (O/N)"
TantQue Rep <> "O" et Rep <> "N"
Lire Rep
Si Rep <> "O" et Rep <> "N" Alors
Ecrire "Saisie Erronée, Recommencez"
FinSi
FinTantQue
Fin
::
Variable Rep en Caractère
Début
Ecrire "Voulez vous un café ? (O/N)"
Lire Rep
TantQue Rep <> "O" et Rep <> "N"
Ecrire "Vous devez répondre par O ou N. Recommencez"
Lire Rep
FinTantQue
Ecrire "Saisie acceptée"
Fin
.. ifconfig:: exercice
**Exercice** : "C'est plus, C'est moins", c'est-à-dire Ecrire un algorithme qui demande à lutilisateur
un nombre compris entre a et b jusquà ce que la réponse convienne.
.. ifconfig:: correction
**Correction** :
::
Variable N en Entier
Debut
N <- 0
Ecrire "Entrez un nombre entre 10 et 20"
TantQue N < 10 ou N > 20
Lire N
Si N < 10 Alors
Ecrire "Plus grand !"
SinonSi N > 20 Alors
Ecrire "Plus petit !"
FinSi
FinTantQue
Fin
Et les autres boucles : répéter... jusqu'à, etc...
.. raw:: latex
\begin{algorithm}
\caption{Exemple de boucle répéter}
\begin{algorithmic}[1]
\State $sum\gets 0$
\State $i\gets 1$
\Repeat
\State $sum\gets sum+i$
\State $i\gets i+1$
\Until{$i>n$}
\end{algorithmic}
\end{algorithm}

View File

@ -1,577 +0,0 @@
Les structures de données
===========================
.. glossary::
ATD
Abstract Data Type, structure de données abstraites.
La représentation des données est forcément un choix.
Il est impossible de rendre compte globalement d'un élément du réel,
il faut en faire une interprétation abstraite.
**Exemple**:
- Un être humain peut être représenté par les données présentes dans sa
carte d'identité. Mais un être humain n'est pas sa carte d'identité.
- Un être humain peut être représenté par les données présentes dans ses préférences
de surf sur internet. Mais un être humain **n'est pas** l'ensemble de ses logs de surf sur le net.
Les séquences
-------------
Les types séquences (listes)
.. code-block:: ocaml
# 4::1::5::8::1::[];;
- : int list = [4 ;1 ;5 ;8 ;1]
Un ensemble de valeurs portant le même nom de variable et repérées par un nombre, sappelle un tableau, ou encore une liste, ou une variable indicée.
Le nombre qui, au sein dun tableau, sert à repérer chaque valeur sappelle lindice.
Chaque fois que lon doit désigner un élément du tableau, on fait figurer le nom du tableau, suivi de lindice de lélément.
**manipulation** :
- `insert()`
- `append()`
- `remove()`
- `find()`
- `print()`
- ...
.. code-block:: python
zoo = ['bear', 'lion', 'panda', 'zebra']
print(zoo)
# But these list elements are not
biggerZoo = ['bear', 'lion', 'panda', 'zebra', ['chimpanzees', 'gorillas', 'orangutans', 'gibbons']]
print(biggerZoo)
- Lists Versus Tuples : types mutables, immutables
- Lists Versus Sets : non ordonné, collection simple
- Recherche dans une liste, recherche du maximum dans une liste
- Recherche dun mot dans une chaîne de caractères.
Algorithme de la longueur d'une liste
--------------------------------------
.. code-block:: ocaml
# let rec longueur l =
match l with
[] -> 0
| ::s -> 1 + (longueur s);;
Cette fonction est prédéfinie en Ocaml : `List.length`
.. ifconfig:: exercice
**Exercice** : écrire un algorithme qui déclare et
remplisse un tableau de 7 valeurs numériques en les mettant toutes à zéro.
.. ifconfig:: correction
**Correction** :
::
Tableau Truc(6) en Numérique
Variable i en Numérique
Debut
Pour i <- 0 à 6
Truc(i) <- 0
i Suivant
Fin
exemple d'implémentation en python
.. code-block: python
>>> liste = []
>>> for i in range(6):
... liste.append(i)
...
>>> liste
[0, 1, 2, 3, 4, 5]
>>>
.. ifconfig:: exercice
**Exercice** : Calcul du premier élément maximal dans une liste,
proposer une implémentation en python qui renvoie le maximum et
la position du max dans la liste.
.. ifconfig:: correction
**Correction** :
.. code-block: python
def max_list(L) :
k = len(L)
max, x = L[0], 0
i = 1
while i < k :
if max < L[i]:
max = L[i]
x = i
i = i + 1
return max, x
couple = max_list([4,5,6,9,12,5,10,3,18,5,6,7])
print Max de L est , couple[0]
print et se trouve à la position , couple[1]
Exemple de généricité : ce code fonctionne avec une chaîne de caractères.
.. code-block: python
couple = max_list(totovaaumarche)
print Max de L est , couple[0]
print et se trouve à la position , couple[1]
.. glossary::
Matrice
Tableaux de dimension multiple, c'est un tableau de tableau
.. ifconfig:: exercice
**Exercice** : Écrivez un algorithme remplissant un tableau de 6 sur 13, avec des zéros.
.. ifconfig:: correction
**Correction** :
implémentation en python
.. code-block:: python
>>> matrice = []
>>> for i in range(12):
... matrice.append([0 for i in range(5)])
...
>>> from pprint import pprint
>>> pprint(matrice)
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]
>>>
Algorithmes de tri
------------------
On désigne par "tri" l'opération consistant à ordonner un ensemble d'éléments en fonction de clés sur lesquelles est définie une relation d'ordre.
Les algorithmes de tri ont une grande importance pratique.
Ils sont fondamentaux dans certains domaines (exemples : map-reduce en database non relationnelle).
L'étude du tri est également intéressante en elle-même, c'est un des domaines de l'algorithmique très étudié et connu.
Tri par insertion
~~~~~~~~~~~~~~~~~~
Cet algorithme de tri suit de manière naturelle la structure récursive des
listes. Soit l une liste à trier :
- si l est vide alors elle est déjà triée
- sinon, l est de la forme x::s et on trie récursivement la suite s et on obtient une liste triée s
on insert x au bon endroit dans s et on obtient une liste triée
Description de l'algorithme
- la fonction inserer permet dinsérer un élément x dans une liste l
- si la liste l est triée alors x est inséré au bon endroit
.. code-block:: ocaml
# let rec inserer x l =
match l with
[] -> [x]
| y::s -> if x<=y then x::l else y::(inserer x s);;
val inserer : a -> a list -> a list
# inserer 5 [3 ;7 ;10];;
- : int list = [3 ; 5 ; 7 ; 10]
Tri rapide
~~~~~~~~~~~~
soit une liste l à trier :
- si l est vide alors elle est triée
- sinon, choisir un élément p de la liste (le premier par exemple)
nommé le **pivot**
- partager l en deux listes g et d contenant les autres éléments de l
qui sont plus petits (resp. plus grands) que la valeur du pivot p
- trier récursivement g et d, on obtient deux listes g et d triées
.. code-block:: ocaml
:caption: fonction de partage d'une liste
#let rec partage p l =
match l with
[] -> ([] , [])
|x::s -> let g,d = partage p s in
if x<=p then (x::g , d) else (g , x::d) ;;
val partage : a -> a list -> a list * a list = <fun>
# partage 5 [1 ;9 ;7 ;3 ;2 ;4];;
- : int list * int list = ([1 ; 3 ; 2 ; 4], [9 ; 7])
.. code-block:: ocaml
:caption: algorithme de tri rapide
# let rec tri rapide l =
match l with
[] -> []
| p::s -> let g , d = partage p s in
(tri rapide g)@[p]@(tri rapide d) ;;
val tri rapide : a list -> a list = <fun>
# tri rapide [5 ; 1 ; 9 ; 7 ; 3 ; 2 ; 4];;
- : int list = [1 ; 2 ; 3 ; 4 ; 5 ; 7 ; 9]
Définition d'un itérateur
~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: python
>>> l = range(10)
>>> for i in l:
... print l[i]
...
0
...
8
9
>>> l.__iter__()
<listiterator object at 0x7f78bb450410>
Les listes chaînées
~~~~~~~~~~~~~~~~~~~~
.. code-block:: ocaml
typedef struct list{
int elt ;
struct list* suivant ;
} ;
**Outils de manipulation** :
- `next()`
- `pointer()`
- `insert(l, a)`
- `remove(a, n)`
Les piles
----------
**manipulation**
- `insert()` : insérer un élément à la fin de la pile
- `dequeue()` : (remove and return) : retirer un élément du haut de la pile
- FIFO : "first in first out"
Traduction d'une structure de données dans une autre
-----------------------------------------------------
.. code-block:: python
>>> listOfStrings = ['One', 'Two', 'Three']
>>> strOfStrings = ' '.join(listOfStrings)
>>> print(strOfStrings)
One Two Three
>>>
>>> # List Of Integers to a String
... listOfNumbers = [1, 2, 3]
>>> strOfNumbers = ''.join(str(n) for n in listOfNumbers)
>>> print(strOfNumbers)
123
>>>
.. code-block:: python
>>> l = [('host1', '10.1.2.3', '6E:FF:56:A2:AF:18'), ('host3', '10.1.2.5', '6E:FF:56:A2:AF:19')]
>>> result = []
>>> for hostname, ip, macaddress in l:
... result.append(dict(hostname=hostname, ip=ip, macaddress=macaddress))
...
>>> result
[{'hostname': 'host1', 'ip': '10.1.2.3', 'macaddress': '6E:FF:56:A2:AF:18'},
{'hostname': 'host3', 'ip': '10.1.2.5', 'macaddress': '6E:FF:56:A2:AF:19'}]
>>>
.. ifconfig:: exercice
**Exercice** : Proposer un algorithme de traduction de cette structure de donnée
.. code-block:: python
[
{
'address': '192.168.0.0',
'mask': '255.255.255.0',
'dynamicRanges': [
{ 'low': '192.168.0.5', 'high': '192.168.0.12', 'only_unknown': True },
{ 'low': '192.168.0.50', 'high': '192.168.0.55', 'only_unknown': False },
],
},
{
'address': '192.168.0.0',
'mask': '255.255.255.0',
'dynamicRanges': [
{ 'low': '192.168.0.12', 'high': '192.168.0.45', 'only_unknown': True },
{ 'low': '192.168.0.8', 'high': '192.168.0.35', 'only_unknown': False },
],
},
{
'address': '192.168.0.1',
'mask': '255.255.255.0',
'dynamicRanges': [
{ 'low': '192.168.0.5', 'high': '192.168.0.12', 'only_unknown': True },
{ 'low': '192.168.0.50', 'high': '192.168.0.55', 'only_unknown': False },
],
},
]
En cette structure de données :
.. code-block:: python
[
{
address: '192.168.0.0',
mask: '255.255.255.0',
dynamicRanges: [
{ low: '192.168.0.5', high: '192.168.0.12', only_unknown: true },
{ low: '192.168.0.50', high: '192.168.0.55', only_unknown: false },j
], [
{ low: '192.168.0.12', high: '192.168.0.45', only_unknown: true },
{ low: '192.168.0.8', high: '192.168.0.35', only_unknown: false },
],
},
{
'address': '192.168.0.1',
'mask': '255.255.255.0',
'dynamicRanges': [
{ 'low': '192.168.0.5', 'high': '192.168.0.12', 'only_unknown': True },
{ 'low': '192.168.0.50', 'high': '192.168.0.55', 'only_unknown': False },
],
},
]
.. ifconfig:: correction
**Correction** :
.. code-block:: python
>>> from pprint import pprint
pprint(l)
[{'address': '192.168.0.0',
'dynamicRanges': [{'high': '192.168.0.12',
'low': '192.168.0.5',
'only_unknown': True},
{'high': '192.168.0.55',
'low': '192.168.0.50',
'only_unknown': False}],
'mask': '255.255.255.0'},
{'address': '192.168.0.0',
'dynamicRanges': [{'high': '192.168.0.45',
'low': '192.168.0.12',
'only_unknown': True},
{'high': '192.168.0.35',
'low': '192.168.0.8',
'only_unknown': False}],
'mask': '255.255.255.0'}]
>>> newdata = []
>>> for i in l:
... if i['address'] not in [j['address'] for j in newdata]:
... newdata.append(i)
... else:
... for k in newdata:
... if k['address'] == i['address']:
... k['dynamicRanges'].extend(i['dynamicRanges'])
...
>>> pprint(newdata)
[{'address': '192.168.0.0',
'dynamicRanges': [{'high': '192.168.0.12',
'low': '192.168.0.5',
'only_unknown': True},
{'high': '192.168.0.55',
'low': '192.168.0.50',
'only_unknown': False},
{'high': '192.168.0.45',
'low': '192.168.0.12',
'only_unknown': True},
{'high': '192.168.0.35',
'low': '192.168.0.8',
'only_unknown': False}],
'mask': '255.255.255.0'},
{'address': '192.168.10.0',
'dynamicRanges': [{'high': '192.168.0.12',
'low': '192.168.0.5',
'only_unknown': True},
{'high': '192.168.0.55',
'low': '192.168.0.50',
'only_unknown': False}],
'mask': '255.255.255.0'}]
>>>
.. ifconfig:: exercice
**Exercice** : Proposer un algorithme qui permette de récupérer la liste
des adresses IP disponibles
.. code-block:: python
{
"local": {
"leases": [
{
"mac": "02:00:c0:a8:00:66",
"name": "pcxubuntu",
"address": "192.168.0.200"
},
{
"mac": "02:00:c0:a8:00:67",
"name": "pcxubuntu",
"address": "192.168.0.201"
},
{
"mac": "02:00:c0:a8:00:68",
"name": "pcxubuntu",
"address": "192.168.0.202"
}
]
}
}
.. ifconfig:: correction
**Correction** :
.. code-block:: python
>>> l = {
... "local": {
... "leases": [
... {
... "mac": "02:00:c0:a8:00:66",
... "name": "pcxubuntu",
... "address": "192.168.0.200"
... },
... {
... "mac": "02:00:c0:a8:00:67",
... "name": "pcxubuntu",
... "address": "192.168.0.201"
... },
... {
... "mac": "02:00:c0:a8:00:68",
... "name": "pcxubuntu",
... "address": "192.168.0.202"
... }
... ]
... }
... }
>>> leases = l["local"]["leases"]
>>> from pprint import pprint
>>> pprint(leases)
[{'address': '192.168.0.200', 'mac': '02:00:c0:a8:00:66', 'name': 'pcxubuntu'},
{'address': '192.168.0.201', 'mac': '02:00:c0:a8:00:67', 'name': 'pcxubuntu'},
{'address': '192.168.0.202', 'mac': '02:00:c0:a8:00:68', 'name': 'pcxubuntu'}]
>>> addresses = [lease['address'] for lease in leases]
>>> addresses
['192.168.0.200', '192.168.0.201', '192.168.0.202']
>>>
Structures de données complexes
-------------------------------
Les types produits nommés
~~~~~~~~~~~~~~~~~~~~~~~~~~
On les appelle enregistrements, dictionnaires ou tables de hachage.
::
algorithme monAlgorithme
// déclaration d'un enregistrement
enregistrement Personne
chaine nom;
chaine prenom;
entier age;
réel taille;
finenregistrement
...
Personne[50] t;
début
// Initialisation
t[0].nom <- "Duchmol";
t[0].prenom <- "Robert";
t[0].age <- 24;
t[0].taille <- 1.80;
...
fin
.. code-block:: ocaml
# type adresse = { rue : string ; ville : string ; cp : int};;
# type fiche = {
nom : string ;
prenom : string ;
adresse : adresse ;
date naissance : int * int * int ;
tel fixe : string ;
portable : string
};;
# let v1 = { a = 1 ; b = false ; c = 'r'};;
- les sommes (constructeurs)
.. code-block:: ocaml
# type couleur = Pique | Coeur | Carreau | Trefle;;
# let v = (Pique , Coeur);;
val v : couleur * couleur = (Pique , Coeur)
.. code-block:: ocaml
type nombre =
Ent of int | Reel of float | Cplx of float × float
Ent, Reel, Cplx sont les constructeurs du type.
Autres structures de données complexes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- arbres
- graphes
- dates
- le parcours de graphes
- les calculs de dates

View File

@ -1,588 +0,0 @@
Les fonctions et les procédures
================================
Préliminaire : rappel de théorie de cybernétique
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Théorie de l'information (Claude Shannon, 1949), (ou théorie de la communication)
Canal de transmission::
entrée -> récepteur -> émetteur -> sortie
.. glossary::
cybernétique
étude des fonctions de réflexes conditionnés du cerveau humain
utilisation au mieux en PNL ("programmation neuro-linguistique")
ou en analyse transactionnelle, ou au pire en ingérinerie sociale.
La matérialité physique est considérée comme le hardware, le génétique (le
réseau neuronal) étant assimilé au network hardware.
Les objets mentaux (fonctionnements psychologiques et épigénétiques du
cerveaux) est assimilé au logiciel, au software.
IFTTT ("if this then that") : la causalité mondaine est ramenée à un ordre de
comportement affecté à un assimilé-machine.
L'humain est ramené à une machine.
C'est articulation entre "déclencheur contextuel" et "action en réponse de"
n'est pas une "black box" mais un "feedback" qui, pour l'humain,
loin d'être ramené à une entrée/sortie, constitue un **feedback**
utile pour la connaissance de soi.
A la place, la communication est ramenée à une **boucle de rétroaction**
(comme dans un prompt) entre un système comportemental et son environnement.
La représentation sujet/objet (la perspective traditionnelle) est remplacée
par le clivage intérieur/extérieur. Behaviorisme, procédural.
L'humain est donc ramené à
- un ordonnanceur
- un comportement intrinsèque (boîte noire)
- un stimuli pavlovien (déclencheur, trigger) est considéré comme un paramètre
d'entrée
- une instruction comportementale est considérée comme une action de
traitement
- le résultat est observé.
Cette articulation entre "déclencheur contextuel" et "action en réponse"
est très exactement une forclusion de la profondeur monadique (Leibniz) de
l'humain à la black box informationnelle (et cybernétique).
Pour quoi faire ? Pour pirater. Pour manipuler.
Le piratage consiste à
- isoler les constantes (les procédures répétitives, les algorithmes)
- les observer (collecter les données)
afin de
- les réécrire (influence toxique, pishing - hammeçonnage)
- les détruire (attaque en règle)
Description d'une procédure
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
En programmation impérative, un programme est une suite dinstructions qui font
évoluer létat mémoire, le résultat est dans létat final de la mémoire.
- une procédure peut prendre des paramètres
- elle modifie l'état courant du système
- Déclaration des paramètes
- Déclaration du corps
- Appel de la procédure
.. raw:: latex
\begin{algorithm}
\caption{Procédure de permutation de deux entiers}\label{permutation}
\begin{algorithmic}[1]
\Procedure{permuter}{$a,b$}{}
\BState \emph{parametres}:
\State $a: \textit{int}$
\State $b: \textit{int}$
\BState \emph{locales}:
\State $z: \textit{int}$ \Comment{Une variable intermédiaire est nécessaire}
\BState \emph{corps}:
\State $z \gets a$
\State $a \gets b$
\State $b \gets z$
\EndProcedure
\State \Call{permuter}{10, 12} \Comment{appel de la procédure}
\end{algorithmic}
\end{algorithm}
effet de bord
toute modification de la mémoire ou modification d'un support externe
instruction
commande ou phrase en mesure de modifier l'état du programme ou de la machine hôte
(allocation mémoire, support externe, disque, écran...)
Une procédure ne renvoie pas de valeur, mais provoque un 'effet de bord' (écriture dans une globale, dans un flux sortant etc.).
Une procédure permet de créer une instruction nouvelle qui deviendra une primitive pour le programmeur.
Cela permet de structurer le texte source du programme et améliorer sa
lisibilité. Cela permet aussi d'appeler plusieurs fois, et à plusieurs endroit
dans le code, cette primitive.
Appel d'une procédure
~~~~~~~~~~~~~~~~~~~~~
(ex: pseudo-pascal)
**déclaration de procédure**
.. raw:: latex
\begin{algorithm}
\caption{Procédure de permutation de deux entiers}\label{appelpermutation}
\begin{algorithmic}[1]
\Procedure{permuter}{$a,b$}{}
\BState \emph{parametres}:
\State $a: \textit{int}$ \Comment{paramètres formels de la procédure}
\State $b: \textit{int}$
\BState \emph{locales}:
\State $z: \textit{int}$ \Comment{les variables locales de la procédure}
\BState \emph{corps}:
\State ... \Comment{Le corps de la procedure}
\EndProcedure
\State \Call{permuter}{10, 12} \Comment{l'appel de la procédure}
\end{algorithmic}
\end{algorithm}
- les variables x1,...,xn sont appelées *paramètres formels* de p
- les variables v1,...,vm sont appelées *les variables locales* de p
les valeurs effectivement passées en paramètres, ici `10, 12`
sont appelées **paramètres effectifs** de p
signature
C'est l'ensemble paramètre formel + resultat de l'appel
fermeture
L'ensemble procédure + variables locales + signature + parametres effectifs
est appelé une **fermeture**. C'est la procédure + son contexte qui permet
de l'instancier dans un programme.
Environnement
Contexte dévaluation d'une expression ou d'une fonction
Portée
La portée d'un identifiant (une variable) est sa condition d'utilisation dans un contexte donné
(utilisation locale uniquement, ou bien globale, ou bien locale et globale)
La portée dune liaison est la portion du code dans laquelle cette
liaison est valide (i.e. où un identifiant est lié à une expression).
.. ifconfig:: exercice
**Exercice** : Que donne ce code ?
.. code-block:: ocaml
# let x = 42 in
let y = x - 1 in x - y ;;
.. ifconfig:: correction
**Correction** :
.. code-block:: ocaml
- : int = 1
.. code-block:: ocaml
let a = 3 (* première liaison pour l'identifiant a *)
let b = 5 and c = 6
let somme = a + b + c
val somme : int = 14
let a = 45 (* deuxième liaison pour l'identifiant a *)
somme
val a : int = 45
.. ifconfig:: exercice
**Exercice** : Que donne ce code ?
.. code-block:: ocaml
let a = 3 and b = 4 and c = 8 ;;
let somme = a + b + c ;;
val somme : int = ???
let a = 44
let b = 5
let c = 1
somme
- : int = ???
.. ifconfig:: correction
.. code-block:: ocaml
let a = 3 and b = 4 and c = 8 ;;
- : int = 15
let somme = a + b + c ;;
val somme : int = 15
let a = 44
let b = 5
let c = 1
somme
- : int = 15
Même code en python
.. code-block:: python
>>> a = 1
>>> b = 2
>>> c = 3
>>> somme = a + b + c
>>> somme
6
>>> a = 56
>>> b = 5678
>>> c = 56789
>>> somme
6
>>>
Portée locale dans une expression
.. code-block:: ocaml
# let a = 2 and b = 3 and c = 4 in
let somme = a+b+c in
somme
- : int = 9
# somme ;;
Error: Unbound value somme
# a ;;
Error: Unbound value a
.. important::
Lordre dévaluation dans un let ... in ... est bien déterminé,
sans grande importance dans un cadre purement fonctionnel, mais important
en cas deffets de bord
Exemple de variable globale modifiée localement (**attention, mauvaise pratique** !) :
.. code-block:: python
>>> a = 5
>>> def print_a():
... print("La variable a = {0}.".format(a))
...
>>> print_a()
La variable a = 5.
>>> a = 8
>>> print_a()
La variable a = 8.
>>>
niveau
Le niveau dune déclaration (de variable ou de procédure) est le nombre
de procédures sous lesquelles elle est déclarée. Le programme principal
a le niveau 0.
.. code-block:: python
:linenos:
def _get_config(name):
# return config value
if not isfile(CONFIG_FILE):
raise Exception("Fichier de configuration non existant")
from ConfigParser import ConfigParser
cfg = ConfigParser(allow_no_value=True)
cfg.read(CONFIG_FILE)
if name == "SUBNETS":
return eval(cfg.get('eole', 'subnets'))
elif name == "LEASES_FILE":
DHCP_PATH = cfg.get('eole', 'container_path_dhcp')
return join('/', DHCP_PATH, 'var/lib/dhcp/dhcpd.leases')
def get_routes(*args, **kwargs):
"""
Send list of reserved IP
return list of tuple (id, machine name, IP, MAC Adress)
"""
cfg = creole_loader(load_extra=True, rw=False, owner=MODNAME,
mandatory_permissive=False)
return zip(cfg.dhcp.dhcp.id_dhcp.id_dhcp, cfg.dhcp.dhcp.id_dhcp.hostname,
cfg.dhcp.dhcp.id_dhcp.ip, cfg.dhcp.dhcp.id_dhcp.macaddress)
On voit que l'objet `cfg` ligne 6 et 7 a le même nom que l'objet `cfg` ligne 19.
C'est autorisé et les espaces de nommages sont différents.
Description d'une fonction
~~~~~~~~~~~~~~~~~~~~~~~~~~
Une fonction renvoie une valeur et ne modifie pas l'état courant du programme
en cours d'exécution ni ne réalise d'effets de bord. Elle renvoie
**toujours** quelque chose (même la valeur ``None`` qui n'est pas rien)
- une procédure peut prendre des paramètres
- elle modifie l'état courant du système
- Déclaration des paramètes
- Déclaration du corps
- Appel de la fonction
En programmation fonctionnelle, programme est un ensemble de définitions de fonctions,
un résultat est l'application dune fonction à une structure de données effective.
- composant de base : la fonction
- opération de base : lapplication
.. raw:: latex
\begin{algorithm}
\caption{Exemple de fonction}\label{fonction}
\begin{algorithmic}[1]
\Function{permuter}{$a,b$}{} \Comment{définition de la fonction}
\BState \emph{parametres}: \Comment{déclaration (noms, types) des paramètres formels}
\State $a: \textit{int}$
\State $b: \textit{int}$
\BState \emph{locales}: \Comment{déclaration (noms, types) des valeurs locales}
\State $z: \textit{int}$
\BState \emph{corps}:
\State $z \gets a$
\State $a \gets b$
\State $b \gets z$
\BState \emph{return}: \Comment{La valeur, le résulat renvoyé par la fonction}
\EndFunction
\State \Call{permuter}{10, 12} \Comment{appel de la fonction}
\BState \emph{result}:
\State (12, 10) \Comment{Le résultat effectif de la fonction après appel}
\end{algorithmic}
\end{algorithm}
.. ifconfig:: exercice
**Exercice** : factoriser le code suivant
::
Ecrire "Etes-vous marié ?"
Rep1 <- ""
TantQue Rep1 <> "Oui" et Rep1 <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Rep1
FinTantQue
...
Ecrire "Avez-vous des enfants ?"
Rep2 <- ""
TantQue Rep2 <> "Oui" et Rep2 <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Rep2
FinTantQue
.. ifconfig:: correction
**Correction** :
::
Fonction RepOuiNon() en caractère
Truc <- ""
TantQue Truc <> "Oui" et Truc <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Truc
FinTantQue
Renvoyer Truc
Fin
Ecrire "Etes-vous marié ?"
Rep1 <- RepOuiNon()
...
Ecrire "Avez-vous des enfants ?"
Rep2 <- RepOuiNon()
Définition mathématique
~~~~~~~~~~~~~~~~~~~~~~~~~
fonction
Une fonction f dun ensemble E vers un ensemble F est une
correspondance qui associe à chaque élément de E au plus
un élément de F.
- E est appelé le domaine de définition
- F est appelé codomaine
- la **signature** de la fonction : `E → F (int -> int = <fun>)`
Exemple de signature d'une fonction
::
Fonction RepOuiNon(Msg en Caractère) en Caractère
Ecrire Msg
Truc <- ""
TantQue Truc <> "Oui" et Truc <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Truc
FinTantQue
Renvoyer Truc
Fin Fonction
...
Rep1 <- RepOuiNon("Etes-vous marié ?")
...
Rep2 <- RepOuiNon("Avez-vous des enfants ?")
...
curryfication
évaluation de l'application d'une fonction
- évaluter `(f x y)`
- peut donner une **valeur fonctionnelle**
- évaluation de la valeur fonctionnelle sur une valeur des types de base
::
let g = function n -> (function p -> p + 1) n;;
Typage d'une fonction
~~~~~~~~~~~~~~~~~~~~~
.. code-block:: ocaml
# let f x y z = if x > 0 then y + x else z - x;;
val f : int -> int -> int -> int = <fun>
cest en fait une fonction à un argument qui retourne une fonction::
.. code-block:: ocaml
val f : int -> (int -> (int -> int)) = <fun>
application de f à trois valeurs
.. code-block:: ocaml
# f 1 2 3;;
- : int = 3
en programmation fonctionnelle,
les fonctions sont des valeurs comme les autres
.. code-block:: ocaml
# fun x -> x * x;;
- : int -> int = <fun>
Récursivité
~~~~~~~~~~~~
.. code-block:: ocaml
let rec fact n =
if n=0 then 1 else n * fact (n-1)
équivalent impératif utilisant une boucle
.. code-block:: c
int fact(int n){
int f = 1 ;
int i = n ;
while (i>0){
f = f * i;
i-- ;
} ;
return f ;
}
Définitions par cas
~~~~~~~~~~~~~~~~~~~
.. code-block:: ocaml
let rec fact n =
match n with
0 -> 1
| -> n * fact (n-1)
**exemple** : la fonction puissance
.. code-block:: ocaml
let rec puissance x n = match n with
0 -> 1
| -> x * puissance x (n-1)
.. ifconfig:: exercice
**Portée locale dans une fonction**
Quelles sera la valeur de la variable `a` ?
.. code-block:: python
>>> a = 1
>>> def myfunc():
... a = 2
... return a + 1
...
>>> a = myfunc() + a
.. ifconfig:: correction
Correction:
.. code-block:: python
>>> a = 1
>>> def myfunc():
... a = 2
... return a + 1
...
>>> a = myfunc() + a
>>> a
4
>>>
.. ifconfig:: exercice
**Exercice** : Portée locale dans une fonction avec variable globale
Quelles sera la valeur de la variable `a` ?
.. code-block:: python
>>> a = 1
>>> def myfunc():
... global a
... a = 2
... return a + 1
...
>>> a = myfunc() + 3
>>>
.. ifconfig:: correction
**Correction** :
.. code-block:: python
>>> a = 1
>>> def myfunc():
... global a
... a = 2
... return a + 1
...
>>> myfunc()
3
>>> a
2
>>> a = myfunc() + 3
>>> a
6
>>>

View File

@ -1,198 +0,0 @@
Présentation de l'art de programmer
====================================
Qu'est-ce que la programmation ?
--------------------------------
programmation
Description dun calcul (traitement) dans
un langage compréhensible par la machine
(langage de programmation)
Le processus d'abstraction
--------------------------
Débuter en programmation n'est pas une chose aisée. Aujourd'hui, la tendance est au
"bas niveau". Souvent, on se jette dans le grand bain :
- soit en s'approchant au maximum de la machine (admin système et réseau, noyau
linux, langage C)
- soit en faisant du dev web côté backend, ce qui ramène à une administration réseau
de bas niveau (microservices, monde nodeJS/javascript, etc...)
Soit on suit un cursus scolaire traditionnel qui commence souvent par une
explication du fonctionnement d'une machine abstraite de bas niveau, puis en
allant de plus en plus haut, mais étant sous-entendu qu'il faut rester connecté au
bas niveau (comprendre comment ça se passe derrière la scène).
Dans ces deux cas, il est sous-entendu qu'on apprend plus de choses et plus rapidement en mettant
les mains dans le cambouis, ce qui est vrai bien sûr. Mais cela sous-entend qu'un développeur doit
rester le nez dans le guidon. Qu'il doit être un expert de son domaine en accumulant des technologies
sans aucun recul. Bien sûr il se doit d'être un expert du système dans lequel il évolue
(connaissance du système d'exploitation, binding avec le C, du ramasse miette (garbage
collector), interaction avec les différentes librairies, gestion et optimisation de la mémoire,
architecture par microservices, threads...) mais il doit aussi être capable de prendre du recul.
L'approche algorithmique (algorithmique de pseudo code, algorithmique algébrique et modulaire)
est un véritable moyen pour le programmeur de prendre du recul : elle commence par se placer du
côté de l'esprit humain et de ses capacités de compréhension et d'abstraction, elle autorise une
pensée rationnelle sur l'art de programmer et permet au programmeur d'effectuer les bons choix,
en connaissance de sa discipline.
Le lien est fait ensuite avec le plus bas niveau grâce une implémentation effective
des langages à partir des paradigmes de rationalisation de la penseée (modules,
objects, généricité, polymorphisme paramétrique...) et d'un outil de communication
avec la machine qu'on appelle compilateur (dont la description est en dehors de
l'objectif de ce cours).
La tendance générale de l'évolution des langages est de se libérer de ces
contraintes de bas niveau, un peu comme en sciences physiques où les lois physiques
dépendent de l'échelle d'en dessous (du niveau microscopique/quantique) mais qu'à
l'échelle du dessus, on n'a pas affaire à des effets de bas niveau (pas d'effets
quantiques à un niveau macroscopique en général). Ce processus d'évolution est vrai
aussi dans le monde de la technique informatique lui-même (modèle OSI, comment est
construite une trame IP, indépendances de chaque couche (transport, payload) entre
elles). Même la tendance système est à la virtualisation qui accentue encore la
tendance à s'affranchir du bas niveau (le niveau système), le séparer nettement du
haut niveau (le niveau applicatif).
Il apparaît régulièrement de nouveaux langages. Comment s'orienter ? Quel(s)
langage(s) choisir pour un projet de développement ? Au delà de leurs disparités, la
conception et la genèse de chacun d'eux procèdent d'une motivation partagée : la
volonté d'abstraire.
- **s'abstraire de la machine** : un langage de programmation permet de
négliger l'aspect *mécanique* de l'ordinateur. On oublie le modèle du
microprocesseur, jusqu'au système d'exploitation sur lequel sera exécuté
le programme.
- **abstraire les erreurs** : Il s'agit ici de garantir la sûreté d'exécution; un
programme ne doit pas se terminer brutalement ou devenir incohérent en cas d'erreur.
Un des moyens pour y parvenir est le typage des programmes et la mise
en oeuvre d'un mécanisme d'exceptions.
- **abstraire le mode opératoire** : Il s'agit de choisir une représentation, un
paradigme d'implémentation qui est indépendant du domaine considéré (paradigme
objet, modulaire, générique, composants...)
- **abstraire les composants** : Les langages de programmation donnent la
possibilité de découper une application en différents composants logiciels, plus ou
moins indépendants et autonomes. La modularité permet une structuration de plus haut
niveau de l'ensemble d'une application complexe. Les langages à objets constituent
une autre approche de la réutilisabilité permettant la réalisation très rapide de
prototypes.
Description des niveaux d'abstraction par rapport à la machine
---------------------------------------------------------------
Les langages de haut niveau simplifient le travail du
programmeur là où les langages de bas niveau permettent de produire un code
plus efficace.
- **niveau 0** : le langage machine. Illisible, c'est une suite d'optcode.
impossible de coder dans ce langage.
- **niveau 1** : langage d'assemblage. Il reste très dépendant de la machine
et aujourd'hui il est rare d'en faire, sauf si on code un bootloader par exemple,
la gestion de l'accès à la mémoire est en réel (le mode protégé n'apparaît que après).
Il faut gérer les ressources,le langage est très optimisé mais presque impossible
à maintenir et rendre générique. Aujourd'hui plus personne ne code en assembleur.
- **niveau 2** : langages dits de **bas niveau** : (exemple : le C, le C++)
indépendance par rapport à la machine, grande structuration mais très verbeux
- **niveau 3** : langages dits de **haut niveau** : le raisonnement dans ces
langages ne dépent plus de la machine, et ils implémentent des paradigmes de
programmation indépendant de l'état de la mémoire de l'ordinateur,
ils sont indépendant même du système d'exploitation.
Qu'est-ce qu'une machine ?
---------------------------
Une machine, ce truc apparemment si complexe, est en fait
un assemblage de bric et de brac.
L'assemblage des connecteurs permet de simuler un additionneur,
en prenant en compte les propriétés de **reste euclidien**
de l'addition.
La structure électronique est composée de :
- un ordonnanceur.
- le stockage d'un **état**.
- une pile d'instruction
.. glossary::
adressage
Dès lors qu'on dispose de ces bases électronique au dessus du processeur,
un langage d'assemblage est possible, c'est le langage de calcul sur les registres.
registre
machines ont un espace mémoire et un espace de calcul (registres)
Un ordinateur, c'est très très stupide, mais ça permet de disposer de :
- une mémoire très grande et ordonnée,
- une capacité à effectuer inlassablement des tâches répétitives
- une grande rapidité de calcul
Apprendre à programmer, c'est-à-dire être capable de
contrôler la machine.
.. important:: Apprendre à programmer, c'est-à-dire apprendre à penser de manière structurée,
pour pouvoir accessoirement ensuite communiquer avec une machine.
Compilateur
-----------
Schématiquement, un compilateur est un programme qui traduit un
programme dun langage source vers un langage cible, en signalant
déventuelles erreurs.
Quand on parle de compilation, on pense typiquement à la traduction dun
langage de haut niveau (C, Java, Caml, ...) vers le langage machine dun
processeur (Intel Pentium, PowerPC, ...)
- xml (libre office, word) -> postscript (imprimante)
- postcript -> image
- syntaxe wiki -> html (Wikipédia...)
compilation graphique
passer une description, ça donne un dessin genre ocaml Quilt < mon_dessin.txt
passer par une api qui permet de causer avec une interface
**transpiler** : transformation d'un langage de haut niveau vers un autre
langage de haut niveau.
- cofee script, typescript -> javascript
- (babel) javascript -> javascript ES 6
- python -> javascript
Un compilateur traduit un programme P en un programme Q tel que
pour toute entrée x , la sortie de `Q(x)` soit la même que celle de `P(x)`
Un interprète est un programme qui, étant donné un programme `P` et une
entrée x , calcule la sortie s de `P(x)`
Le compilateur fait un travail complexe une seule fois, pour produire un
code fonctionnant pour nimporte quelle entrée
Linterprète effectue un travail plus simple, mais le refait sur chaque entrée
Autre différence : le code compilé est généralement bien plus efficace que
le code interprété
Typiquement, le travail dun compilateur se compose dune phase danalyse
- reconnaît le programme à traduire et sa signification
- signale les erreurs et peut donc échouer (erreurs de syntaxe, de portée, de typage, etc.)
Puis dune phase de synthèse
- production du langage cible
- utilise de nombreux langages intermédiaires
- néchoue pas

View File

@ -1,19 +0,0 @@
Introduction à l'algorithmique
================================
.. toctree::
:maxdepth: 2
presentation
fondement
langage
algo
programme
fonctions
control
donnees
apercu
modularite
modules
tp
annexes/index

View File

@ -1,336 +0,0 @@
Les langages de programmation
=============================
langage
Un langage de
programmation
doit permettre d'écrire des
programmes de bonne qualité
Un programme doit être :
- correct
- robuste
- lisible, bien documenté
- facile à modifier, extensible
Un langage de programmation doit permettre :
- la programmation structurée
- la structuration avec les types
- proposer un mécanisme dexceptions
- présenter des caractères de généricité, de polymorphisme et de surcharge
.. important:: La structuration et l'organisation modulaire sert à maintenir de grands programmes,
Elles sont une nécessité
Approche historique et chronologique
-------------------------------------
- Lambda calcul (1930)
- machines de Turing (1936)
- début des langages vers les années 1950 (A0, Fortran(impératif),
Lisp(impératif et fonctionnel), Cobol)
- années 60 : Simula (classes), CPL (compilation séparée)
- années 70 : C (référence du langage impératif de bas niveau), Pascal
(procédures), Smalltalk (programmation orientée objects), Prolog
(programmation logique), Scheme (programmation fonctionnelle pure), Modula,
C++, Ada, Turbo Pascal, Common Lisp, Eiffel (programmation par contrats)
- années 80 : ML, CAML (langages fonctionnels)
- années 90 : Perl, Python, Ruby (languages de scripting multi-paradigmes)
Haskell (fonctionnel pur), Lua, Delphi, Java (orienté objet, machine
virtuelle), PHP (impératif, dédié au web), Erlang (fonctionnel+
programmation concurrente), javascript (orienté web, objets par
prototypage), OCaml (multi-paradigme, fortement typé, orienté sécurité,
programmation générique, fonctionnelle et objets, modulaire et fonctorielle)
- 2009 : go (google, compilé, typage statique, objets par prototypage,
prgrammation concurrente), Rust (fondation mozilla, multiparadigme, programmation concurrente)
Les langages actuellement les plus utilisés dans le monde de l'entreprise sont :
- javascript/NodeJS (70% du code dans le dépôt github) mais victime de son
succès (chaos complet des librairies)
- le go est de plus en plus utilisé, c'est **le** langage qui monte
actuellement
- Python, Ruby, lua, autres langages de scripting (de plus en plus utilisés)
- PHP, Java (stagnants)
- C, C++ (de moins en moins utilisés)
Approche par typologie des langages
-----------------------------------
- **A0 (1954)** : possibilité de découpage de programmes en
sous-programmes ;
- **ALGOL (1958)** : concept de bloc de code (pas forcément nommé) et d'imbrication
de blocs de code ;
- **C (1971)** : syntaxe claire et simple, programme fortement structuré ;
- **C (1980)** : le **code objet**, qui consiste à essayer de faire fonctionner
un seul jeu d'instructions sur des machines différentes. Avant, le code
d'assemblage dépendait du processeur, donc il n'y avait pas un seul et unique
jeu d'instructions ;
- **1980** : déploiement et succès des langages à objets ;
- **1983** : turbo pascal (Borland) qui fut le tournant du C,
propose un IDE (Environnement de Développement Intégré).
aujourd'hui le turbo pascal a pratiquement disparu mais pas totalement,
il est soutenu par une communauté open source autour de **Lazarus** ;
- **depuis les années 90** : deux grands groupes de langages. Les langages à
objets, et les langages fonctionnels. Les deux mondes s'interpénètrent (les
avancées actuelles du web, les microservices (Erlang, Haskell),
viennent du monde fonctionnel, le NoSQL, etc).
Les grandes avancées architecturales (système d'exploitation, linux, etc...)
viennent du monde de l'impératif.
Approches par modèles de programmation
--------------------------------------
- **le mécanisme d'exceptions** : il est possible de rompre l'exécution normale d'un
programme à un endroit et de la reprendre à un autre endroit du programme prévu à
cet effet. Ce mécanisme permet de gérer les situations exceptionnelles.
- **le paradigme impératif** : les entrées-sorties, les modifications physiques de
valeurs et les structures de contrôle itératives sont possibles.
- **le paradigme fonctionnel** : manipule les fonctions comme étant des valeurs du
langage. Celles-ci peuvent être utilisées en tant que paramètres d'autres fonctions
ou être retournées comme résultat d'un appel de fonction.
- **le paradigme objet** : La représentation du programme colle à la réalité en
reproduisant des entités relativement proches des objets réel. Attention, le piège
est de croire qu'il s'agit *du* paradigme universel puisqu'il reproduit en miroir le
réel. **C'est en fait un processus d'abstraction comme un autre**.
Sûreté du langage, typage
~~~~~~~~~~~~~~~~~~~~~~~~~
Tri par ordre de sûreté croissant :
0. typage très faible (presque inexistant aujourd'hui) : 42 == "42" == 42.0...
1. typage dynamique faible : (javascript) (possibilité de changer le prototype
d'un objet pendant l'éxécution du programme, c'est la fête on peut faire
n'importe quoi)
2. typage dynamique fort inféré par le comportement (behavior, duck typing)
(python, ruby, PHP) Le contenu de la variable détermine le choix du typage
`var = 0 -> type int`
3. typage statique déclaré fort (Java)
`int var = 0 ;` (pas mal mais super lourd, pas **agile** du tout)
4. langages à types statiques muni d'un moteur d'inférence de types (Ocaml)
sûreté d'exécution, agilité, sécurité.
La syntaxe, la lisibilité
~~~~~~~~~~~~~~~~~~~~~~~~~
Importance de la lisibilité (notamment par rapport aux méthodes agiles).
- courte (python)
- verbeuse (C)
- l'importance des mots clef du langage
- délimiteur de phrase, de blocs (parenthèses, accolades, tabulations, blocs...)
Langages compilés ou interprétés ?
-----------------------------------
.. glossary::
langage compilé
une première passe est faite, des validations son effectuées **avant**
la génération du code objet, cette phase est faite par le compilateur.
compilateur
programme qui transforme un langage de haut niveau en un langage de base
niveau
- phase danalyse syntaxique (source -> syntaxe abstraite)
- phase de synthèse (syntaxe abstraite -> code objet)
scripting (langage de scripting)
langage interprèté
générique (langage)
Langage à usage générique, qui peut être utilisé dans n'importe quel
domaine (par opposition au DSL)
domain specific
Domain Specific Language, langage destiné à être utilisé dans un
domaine prédéfini.
paradigmes
représentation d'une vision particulière à partir d'un modèle théorique
impératif
l'algorithme ressemble à une recette de cuisine,
c'est-à-dire à une succession d'instructions à exécuter
les unes à la suite des autres
fonctionnel
l'algorithme ne dépend plus de l'ordre d'exécution d'instructions
pas de mélange entre les données et les traitements
objets (programmation)
le monde est découpé en catégories
qui permettent de créer des objets
**développement par composants**
les objets sont organisés entre eux par composants suivant des designs patterns,
(patrons de conception)
garbage collector (ramasse miettes)
la gestion automatique de la mémoire apparaît en 1989
machine virtuelle
portabilité du code (mais diminution en optimisation et performances)
JIT (just in time compiler)
code objet, programmes fonctionnant autour de machines virtuelles
- **le typage statique** : la vérification de la compatibilité entre les types des
paramètres formels et des paramètres d'appel est effectuée au moment de la
compilation du programme. Dès lors, il n'est pas nécessaire de faire ces
vérifications durant l'exécution du programme ce qui accroît son efficacité. En
outre, la vérification de type permet d'éliminer la plupart des erreurs introduites
par maladresse ou étourderie et contribue à la sûreté de l'exécution.
- **le typage dynamique** : la vérification de la compatibilité entre les types des
paramètres formels et des paramètres d'appel est effectuée au moment de l'exécution
ou de l'appel à certaines parties de codes du programme.
- **le polymorphisme paramétrique** : une fonction ou un objet qui n'explore pas la
totalité de la structure d'un de ses arguments accepte que celui-ci ait un type non
entièrement déterminé. Ce paramètre est alors dit polymorphe. Cette particularité
permet de développer un code générique utilisable pour des structures de données
différentes tant que la représentation exacte de cette structure n'a pas besoin
d'être connue par le code en question. L'algorithme de typage est à même de faire
cette distinction.
- **l'inférence de types** : le programmeur n'a besoin de donner aucune information
de type à l'intérieur de son programme. Le langage se charge seul de déduire du code
le type le plus général des expressions et des déclarations qui y figurent. Cette
inférence est effectuée conjointement à la vérification, lors de la compilation du
programme.
Les grands paradigmes de programmation
---------------------------------------
Le paradigme des objets
~~~~~~~~~~~~~~~~~~~~~~~
- 1962 (SIMULA) : premières notions de classes ;
Pui, une dizaine d'années plus tard :
- C++ : intégration des classes pour le C ;
- turbo pascal : intégration des classes pour le pascal ;
Tous les langages actuels ont intégré des traits objets mais de manière très
différentes :
- perl (1987)
- python (1991)
- Ruby (1993)
- L'implémentation des objets en python est très proche des notions initiales de
classes issues du Smaltalk et présente une tentative très intéressante
d'unification des objets et des types depuis python 2.2 ;
- Java (1995) : très grosse réussite industrielle en surfant sur la vague de la
programmation objet, et des machines virtuelles, mais en fait et avec le recul,
doté d'un support objet lourd et alambiqué.
Le monde Java est lourd, avec des outils consommant beaucoup de mémoire et
qui ne satisfont pas à la règle du KISS (Keep It Simple, Stupid) ;
Il n'y a pas **une** POO (Programmation Objet), il y a des POO.
Les implémentations objets dans les langages sont riches et variées :
- objets obligatoirement construits pas des classes (Java, C++, ...)
- objets sans définition de classes (javascript, Ocaml, go, rust)
- langages à attributs (python)
- langages ou le type des objets est défini par leur classe (python, ruby)
- langages ou le type des objets est différent du type de leur classe (Ocaml)
- objets sans classes mais construits par des prototypes (javascript)
- construction d'objets possibles objets sans classe du tout (Ocaml)
- encapsulation des attributs des objets (Java, Ocaml, C++, PHP)
- pas d'encapsulation des attributs (python, ruby, javascript...)
Le paradigme impératif
~~~~~~~~~~~~~~~~~~~~~~
Un programme est une suite d'états de la mémoire de l'ordinateur,
c'est la suite logique des machines de Turing.
La plupart des programmeur aujourd'hui raisonnent suivant ce paradigme,
et ont une très faible visibilité par rapport aux autres paradigmes existants.
Seuls les programmeurs cultivés sont aujourd'hui capable de raisonner
suivant différents paradigmes, ce sont des programmeurs chevronnés et
cultivés.
Le paradigme fonctionnel
~~~~~~~~~~~~~~~~~~~~~~~~
La notion de fonction que possède sous une forme ou une autre la plupart des
langages est empruntée aux mathématiques et non à l'électronique. D'une manière
générale, les langages substituent des modèles formels aux conceptions purement
calculatoires. Ils y gagnent en expressivité. Certains langages fondent leur
paradigme de programmation sur l'abstraction entrée-traitement-sortie, donc sur le
**mathème fonctionnel** et pas sur la boite noire électronique. La fonction
mathématique apporte un niveau opératoire dans le traitement de l'information.
Approche par fonctionnalités
----------------------------
Plusieurs domaines de l'informatique on proposé/imposé des méthodologies,
des manières de faire. Ces modèles de programmation on fortement influencé
en retour les langages. On reconnaît aujourd'hui :
- Le modèle client-serveur
- Le modèle de programmation concurrente (exécution de processus légers, threads) :
- Le modèle de développement d'une application de bureau (MVC, ergonomie d'interface)
- Le modèle de développement web (communiquer sur le réseau Internet, API
REST, microservices...)
- Le modèle de programmation système et réseau
- le modèle **Dev Ops** et les méthodes de développement virtualisés
- les langages présentant des **fonctionnalités agiles**
Conclusion
-----------
Les langages de haut niveau sont caractérisés par
des concepts tels que :
- déclaration de valeurs, types, expressions, portée
- expressions, variables, instructions, structures de contrôle
- fonctions, procédures, fermetures
- encapsulation, modules, objets
=========== ============
Paradigmes Concepts
=========== ============
impératif variables, procédures, modules
objets classes, méthodes, héritage, surcharge
fonctionnel fonctions, fermetures, modules
logique prédicats, modules
concurrent tâche/processus, communication
=========== ============

View File

@ -1,200 +0,0 @@
La programmation structurée
=============================
Un langage de programmation doit permettre la programmation structurée.
.. important:: La structuration et l'organisation modulaire sert à maintenir de grands programmes,
Elles sont une nécessité
Structuration d'un programme
-----------------------------
La réalisation d'applications importantes oblige le programmeur ou l'équipe de
développement à se poser des questions d'organisation et de structuration.
Aujourd'hui, on dispose de deux grands modèles d'organisation dont les avantages et les
particularités sont distincts.
L'écriture des vrais programmes consiste à les structurer pour les présenter
comme un assemblage de briques qui s'emboîtent naturellement.
Ce problème se révèle fondamental dès que la taille des programmes devient conséquente.
Si on ne prend pas garde au bon découpage des programmes en modules indépendants,
on se retrouve rapidement débordé par un grand nombre de variables,
et il devient quasiment impossible de réaliser un programme correct.
La programmation raisonnée
---------------------------
Un **programme** est le codage d'un algorithme dans un langage de programmation.
La programmation consiste à modéliser un problème du monde réel sous une forme
symbolique (pour faire résoudre ce problème par un ordinateur).
Certains problèmes sont **indécidables** ou **ouverts**.
On utilise un langage de programmation pour décrire la **solution** du programme.
La sémantique du programme est le sens de chacune des constructions du langage.
**Comment passer de l'énoncé d'un problème à un programme de bonne qualité ?**
spécifier
décrire de manière complète et rigoureuse le problème à résoudre
modéliser
proposer une représentation du réel qui soit accessible au calcul
algorithmique
transcrire
La transcription du modèle algorithmique se fait dans un langage
de programmation cible adapté au problème
valider
La validation du programme est une étape qui permet de s'assurer plus ou
moins fortement que le programme produit les résultats attendus.
La validation va de la série de tests unitaires (validation faible)
à la preuve de programme (validation mathématique forte).
Conception descendante
-----------------------
Une vision **centripète** : du général au particulier.
Il s'agit d'une méthode de résolution d'un problème. On le découpe en tâches
de plus en plus fines, de plus en plus détaillées, qui aboutiront au programme final.
On met des *trous* dans les algorithmes de plus haut niveau,
c'est-à-dire des phrases en langage naturel.
.. ifconfig: exercice
**Exercice** : **Calculer la date du lendemain**
.. ifconfig: correction
- l'algorithme de plus bas niveau
::
lendemain jour =
si jour [est le dernier jour du mois] alors
resultat = [calculer le 1er janvier de l'année suivante]
sinon
resultat = lendemain_dansl'année jour
- les algorithmes de plus bas niveau
::
lendemain_dans_l'année jour =
si jour [est le dernier jour du mois] alors
resultat = [calculer le premier jour du mois suivant]
sinon
resultat = jour suivant jour
::
jour_suivant jour =
jour + 1
et ainsi de suite jusqu'à ce que toutes les phrases soient calculables.
Algorithme vague
--------------------
L'algorithme vague, c'est quand on pense l'algorithme en se plaçant du côté de
l'implémentation en premier. On a le nez dans le guidon, la vue d'ensemble est
difficile.
Voici, tiré du monde réel, un exemple d'algorithme vague
("ce que doit faire une fonction"), placé dans un bout de code
(souvent la **docstring** d'une fonction).
.. code-block:: python
def upsert_route(*args, **kwargs):
"""
Create or modify an existant DHCP route
param tuple (id or null, machine name, IP, MAC Adress)
return True or False with error message
"""
# si id présent alors modification sinon ajout
# récupère la liste des réservations en cours
# y cherche la variable sur la base de l'ID
# modifie les valeurs
# applique la nouvelle conf DHCP
return True
Voici un autre bout de code avec l'algorithme en commentaire,
et l'implémentation effective de l'algorithme
.. code-block:: python
def del_route(*args, **kwargs):
"""
Delete an existant DHCP route
param tuple (id, machine name, IP, MAC Adress)
return True or False with error message
"""
# récupère la liste des réservations en cours
# y cherche la variable sur l'id donné en paramètre
# supprime l'entrée avec vérification que les données fournies
# sont bien dans l'enregistrement à supprimer
# applique la nouvelle conf DHCP
route_to_del = (1, "host2","10.1.2.4","6E:FF:56:A2:AF:17")
routes = get_routes()
if route_to_del in routes:
c = creole_loader(load_extra=True, rw=True)
c_id = c.dhcp.dhcp.id_dhcp.id_dhcp.index(route_to_del[0])
if c.dhcp.dhcp.id_dhcp.macaddress[c_id]==route_to_del[2]
and c.dhcp.dhcp.id_dhcp.ip[c_id]==route_to_del[1]:
c.dhcp.dhcp.id_dhcp.id_dhcp.pop(c_id)
config_save_values(c, MODNAME)
return True
return False
Les deux grands paradigmes
---------------------------
La modularité
~~~~~~~~~~~~~~
Les données et les traitements sont regroupés au sein d'une même entité à deux
facettes : d'un côté le code proprement dit, de l'autre son interface. La
communication entre modules s'effectue via leur interface. La description d'un
type peut être masquée en n'apparaissant pas dans l'interface du module. Ces
types de données abstraits facilitent les modifications d'implantation à
l'intérieur d'un module sans affecter les autres modules qui s'en servent. De
plus, les modules peuvent être paramétrés par d'autres modules augmentant
ainsi leur réutilisabilité.
Le paradigme objet
~~~~~~~~~~~~~~~~~~
Les descriptions des traitements et des données sont regroupées dans des
entités appelées **classes**; un objet est une instance (valeur) d'une classe.
La communication entre objets est réalisée par envoi de message, l'objet
receveur détermine à l'exécution (liaison retardée) le traitement
correspondant au message. En cela, la programmation objet est dirigée par
les données. La structuration d'un programme provient des relations entre
classes, en particulier l'héritage permet de définir une classe par extension
d'une autre.
En programmation objet, un **programme** est une collection dobjets qui communiquent
entre eux par **message**, le **résultat** est un message envoyé à un objet particulier
Comparaison entre les deux paradigmes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Il y a dualité entre ces deux modèles.
- On ne peut pas augmenter les composants d'un type dans un module (pas
d'extensibilité des données), mais on peut ajouter de nouveaux traitements
(extensibilité des traitements) sur ces données.
- En objet, on peut ajouter des sous-classes à une classe (extensibilité des
données) pour traiter des nouveaux cas, mais on ne peut pas ajouter de nouveaux
traitements visibles de la classe ancêtre (pas d'extensibilité des traitements).
**La combinaison des deux paradigmes offre de nouvelles extensibilités pour les
traitements et les données.**

View File

@ -1,313 +0,0 @@
La programmation modulaire
===========================
Il s'agit de décomposer un grand programme en
morceaux (**modules**) connectés entre eux par des **interfaces** bien
définies.
Ces modules doivent être aussi indépendants que possible.
module
ensemble de ressources liées sémantiquement
interface
mode demploi du module, avec en plus un principe de masquage
des informations (partie publique, partie secrète)
Signatures, type abstrait et langage de modules : la programmation modulaire
permet d'aller très loin dans la programmation structurée.
Définir des fonctions dans un fichier séparé
--------------------------------------------
Les fonctions peuvent être définies dans un fichier et le programme dans un
autre fichier séparé. Dans ce cas, pour pouvoir être exécuté directement avec
la commande python `nomfichierprogramme.py`, le fichier du programme doit
importer dabord les fonctions du fichier dans lequel les fonctions sont
définies.
1. Fichier de fonctions
~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: python
# Fichier foncmaxliste.py
# Recherche le premier élément maximal dans une liste ou
#dans une chaine de caractères
def max_list(L) :
k = len(L)
max, x = L[0], 0
i = 1
while i < k :
if max < L[i]:
max = L[i]
x = i
i = i + 1
return max, x
2. Fichier de programme
~~~~~~~~~~~~~~~~~~~~~~~~
Pour utilser les fonctions définies dans dautres fichiers, le fichier de
programme doit commencer par les instructions qui importent ces fichiers de
fonctions ou directement les fonctions de ces fichiers. Dans la syntaxe
ci-dessous, on importe une ou toutes les fonctions du fichier `foncmaxlist.py`.
.. code-block:: python
# Fichier progmaxlist.py
from foncmaxliste import max_list
# ou plus simple:
# from foncmaxliste import *
print max_list([4,5,6,9,12,5,10,3,18,5,6,7])
couple = max_list([4,5,6,9,12,5,10,3,18,5,6,7])
print Max de L est , couple[0]
print et se trouve à la position , couple[1]
print max_list(totovaaumarche)
couple = max_list(totovaaumarche)
print Max de L est , couple[0]
print et se trouve à la position , couple[1]
Au lieu dimporter les fonctions, on peut importer le fichier qui définit les
fonctions avec la syntaxe qui suit. Dans ce cas, le fichier de programme sera
changé comme suit :
.. code-block:: python
# Fichier prog2maxlist
import foncmaxliste
print foncmaxliste.max_list([4,5,6,9,12,5,10,3,18,5,6,7])
# la syntaxe indiquant le chemin dacces a la fonction max_list utiliser .
couple = foncmaxliste.max_list([4,5,6,9,12,5,10,3,18,5,6,7])
print Max de L est , couple[0]
print et se trouve à la position , couple[1]
print foncmaxliste.max_list(totovaaumarche)
couple = foncmaxliste.max_list(totovaaumarche)
print Max de L est , couple[0]
print et se trouve à la position , couple[1]
Lexécution directe du premier fichier de programme::
python prog max list.py
Lexécution directe du seconde fichier de programme::
python prog2 max list.py
Définition de l'implémentation d'un module
-------------------------------------------
Tout fichier qui contient au moins une définition dune fonction ou dune
variable est appelé un module (une bibliothèque). Le nom du module est le nom
du fichier enlevé le suffixe `.py`. Ainsi, un fichier de programme qui contient
au moins une définition dune fonction ou un fichier qui ne contient que des
définition de fonctions sont des modules. On peut importer un module ou des
fonctions ou variables dun module dans un programme, comme nous avons vu dans
les exemples ci-dessus.
.. important:: on peut importer un module, ou bien lancer un module en tant que
programme executable
.. code-block:: python
if __name__ == '__main__':
main()
Pour faciliter la programmation, Python définit un certain nombre de **modules internes**,
appelés les builtins (la librairie standard).
Par exemple :
Lors de louverture dune session interactive, on est dans un module interne nommé
main . Toutes les variables définies par affectation au niveau de ce module sont valides
globalement dans la session.
Dautres modules internes sont string, math, random
Dans une session de travail sous linterpréteur Python, la première importation dun mo-
dule qui, à part des fonctions quelle définit, contient des instruction de programme fait
exécuter ces instructions. Dans la même session, les importations suivantes ne font pas
exécuter ces instructions. Pour les exécuter, on utilise la fonction reload(nomdumodule)
(sans sufffixe .py).
Exemples d'interface
--------------------
::
type: son type
arguments
arg1 : description de l'argument 1
arg2 : description de l'argument 2
préconditions:
arg1 > 10
postconditions:
result < 19
raises: TypeError, AssertionError, SystemError...
test: tests nominaux pour chaque cas spécifié
- L'interface racine carrée
::
racine:
type: float -> float
arguments x: float, flottant dont on veut calculer la racine
pré: x >= 0
test: racine 25.0 -> 5.0 ; racine (-25) -> raises TypeError
- L'interface `lendemain`
Il faut définir auparavant un type spécifique appelé `date`
::
lendemain: le lendemain est la date qui désigne
le jour suivant de la date passée en argument
type: date -> date
arguments :
d: date
description: la date dont on veut calculer le lendemain
Le langages des modules
-------------------------
.. code-block:: ocaml
module type PILE = (* signature (interface) du module *)
sig
type a t
val create : unit -> a t
val push : a -> a t -> unit
val pop : a t -> a
end
(* implémentation du module *)
module Pile : PILE = (* le module est restreint
par la signature PILE *)
struct
type a t = a list ref
let create () = ref []
let push x p = p := x::!p
let pop p = match !p with [...]
let rec print p = match p with [...]
end
- `struct .. end` introduit une collection de définitions, valeurs, types ou modules.
C'est une **structure**.
- `module Nom = struct .. end` permet de donner un nom à cette structure et
c'est ça un module. C'est une structure nommée.
- `sig ... end` introduit une signature de module : une interface pour un module.
On restreint souvent une structure par une signature pour "cacher" certaines
définitions. Une signature de module fournit une **interface** entre l'extérieur
et l'intérieur d'un module.
En dehors du module, on accède à ses composants grâce à la notation pointée
.. code-block:: ocaml
let p = Pile.create()
Pile.push 45 p
Les foncteurs
--------------
Si un langage possède un langage de modules, on peut aller plus loin : on peut
considérer un module comme étant une expression de base du langage.
- La signature d'un module peut être considérée comme le type du module
- La structure du module peut être considéré comme sa valeur
Quel est l'intérêt ? On peut alors définir des **foncteurs**.
foncteur
"fonction" d'une structure vers une autre structure.
On peut ainsi paramétrer un module par un autre module.
.. code-block:: ocaml
module Nom (M1 :S1 ) (M2 :S2 ) (M3 :S3 ) ... =
struct
...
end
On applique un foncteur à des paramètres modules, pour
obtenir un nouveau module :
.. code-block:: ocaml
module M = F (Titi) (Toto)
Contrainte de type par signature
------------------------------------
::
module M =
struct
type t = int * int * int ;;
let make d m y = d, m, y ;;
end ;;
let d = M.make 8 5 8 ;;
module type S =
sig
type t ;;
val make : int -> int -> int -> t ;;
end ;;
module MS = (M:S) ;;
MS.make 5 1 2 ;;
Type et signature
------------------
::
# module type A = sig
val a: int -> int
end ;;
module type A = sig val a : int -> int end
# module B = struct
let a x = x + 1 ;;
end;;
module B : sig val a : int -> int end
# module C = (B:A) ;;
module C : A
# C.a 2 ;;
- : int = 3
#
Module auquel on impose une signature
-----------------------------------------
::
module type DATE = sig
type t
val make: int -> t
val get_year: t -> int
val get_month: t -> int
end ;;
module MR = struct
type t = int * int
let make x y = (x, y)
let get_month (x, y) = x
let get_year (x, y) = y
end ;;
module date = (MR:DATE) ;;

View File

@ -1,72 +0,0 @@
Avant propos
============
Introduction
~~~~~~~~~~~~
| "**Que nul n'entre ici s'il n'est géomètre**"
| Maxime apposée au porche d'entrée de l'École de Platon
- L'accent est mis sur l'approche **algorithmique scientifique**, dite algorithmique
algébrique. L'algorithmique est un sous-domaine de l'algèbre et des
approches modulaires (arithmétique modulaire...)
- Le point de vue mathématique étant assez exigeant, **aucun formalisme fort** de
l'algorithmique mathématique ne sera présenté. Aucun symbole mathématique donc, et
seulement du pseudo-code.
L'approche mathématique forte utilisant le formalisme mathématique de
l'algorithmique algébrique est en général enseignée en France uniquement aux cours
des grandes écoles.
- L'algorithmique présentée ici est donc délibérément pseudo-scientifique mais en revanche
ouverte au **multi-paradigme**. En général l'évocation d'un algorithme en pseudo code est toujours
réducteur car limité au style de programmation le plus à la mode actuellement, c'est-à-dire le
**style impératif**. Nous présenterons un éventail des plus grands paradigmes de programmation
existants. Nous nous limiterons à la **programmation impérative, fonctionnelle, modulaire,
générique et objet**. Nous envisagerons les structures de données et les structures de contrôle
spécifiques à chacun des styles évoqués.
- Et parce qu'un honnête programmeur doit avoir une vue d'ensemble de **l'état de son art**,
nous évoquerons un panorama des différents langages existants -- historiques et contemporains --
en les comparants les uns aux autres.
- Durant tout le cours, nous souhaitons proposer une pédagogie par l'exemple, et nous
limiterons l'exposé à deux langages d'implémentation des algorithmes : le **Python** pour la programmation
impérative modulaire et objet, et le **OCaml**, car nous évoquerons aussi certains points
de programmation fonctionnelle et modulaire, polymorphe et teintée de généricité.
Intérêt
-------
| "**Il ne suffit pas d'avoir les mains propres, il faut avoir l'esprit pur.**"
| Thalès de Milet ; Sentences - VIe s. av. J.-C.
L'algorithmique en tant que rapport à la vérité et à la pensée juste et vraie,
en tant qu'art de découper un problème complexe en tâches élémentaires,
en tant qu'énoncés de compréhension et de sémantique,
est la seule chose vraiment profonde dans l'informatique. Le reste n'est que 0 ou 1.
Cette notion d'algorithme est profondément enracinée dans le désir humain de
transmettre des méthodes pour comprendre des problématiques,
qu'il s'agisse de processus scientifiques ou mathématiques, de secrets,
de philosophie ou de divination au sens des anciens Grecs.
De règles linguistiques, aussi, chez les Romains.
Objectifs de ce cours
~~~~~~~~~~~~~~~~~~~~~
Il s'agit de :
- maîtriser et concevoir un algorithme de base,
- choisir une représentation appropriée des données,
- décomposer en sous-problèmes et affinements successifs,
- savoir organiser son code en fonctions et en modules.
Le développement raisonné dalgorithmes et leur implantation
permet d'acquérir les qualités suivantes :
+ Analyser et modéliser un problème, spécifier,
+ Exprimer une problématique, une solution ou un algorithme,
+ Traduire un algorithme dans un langage de programmation,
+ Concevoir une réponse à un problème précisément posé.

View File

@ -1,476 +0,0 @@
Définition d'un programme
==========================
Qu'est-ce qu'un programme ?
----------------------------
- Un **programme** est une suite de **phrases** ;
- Une **phrase** est une **déclaration** ou une **expression** (*statement* en anglais) ;
Production d'un programme :
1. on écrit le code source du programme ;
2. on demande au compilateur de le traduire en code machine : c'est la compilation du programme ;
3. on demande à la machine d'effectuer le code machine : c'est l'exécution du programme.
.. important::
L'introduction à la compilation et les différentes phases de la compilation
d'un programme sont des sujets qui ne seront pas traités dans ce cours.
Dans un programme de base, il y a deux fichiers :
1. un fichier contenant le code : c'est le source du programme.
2. un fichier contenant le code machine : c'est l'exécutable.
Que peut faire un programme lorsqu'il est exécuté ?
Le programme doit communiquer. S'il reste isolé, il ne pourra pas
produire quoi que ce soit. Voici les trois moyens de communication qu'a un
programme :
1. communiquer avec l'utilisateur,
2. communiquer avec des fichiers,
3. communiquer avec d'autres programmes.
Les expressions
----------------
expression
Une expression est une valeur caculée du langage, une opération arithmétique
qui retourne une valeur (entier, texte, valeur logique...).
C'est donc une suite sémantiquement correcte de **valeurs de base** et **d'opérateurs**
Par exemple, la ligne suivante est une expression effectuant une addition::
5 + 6
Expressions à partir de types de base
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Autres exemples d'expressions :
- 5 est une expression de type int
- 4.5 est une expression de type float
- 'c' est une expression de type char
- true est une expression de type bool
- print ('c') est une expression de type None
- raw_input est une expression de type string
Les expressions se complexifient avec la complexification des données et des traitements,
mais le principe de l'expressivité d'un langage reste le même.
.. ifconfig:: exercice
**Exercice** :
Le parenthésage et les opérateurs booléens::
Variables A, B, C, D, E en Booléen
Variable X en Entier
Début
Lire X
A <- X > 12
B <- X > 2
C <- X < 6
D <- (A ET B) OU C
E <- A ET (B OU C)
Ecrire D, E
Fin
**Que valent D et E si X = 3 ?**
.. ifconfig:: correction
**Correction** : D sera VRAI alors que E sera FAUX
Les déclarations
-----------------
Un autre exemple d'expression :
.. raw:: latex
\begin{algorithm}
\caption{Exemple d'expression}
\begin{algorithmic}[1]
\BState \emph{sortie}: $l$ \Comment{C'est l'expression calculée renvoyée}
\ForAll {$v \in V(G)$}
\State $l(v) \leftarrow \infty$
\EndFor
\State $l(u) \leftarrow 0$
\Repeat
\For {$i \leftarrow 1, n$}
\State $min \leftarrow l(v_i)$
\For {$j \leftarrow 1, n$}
\If {$min > e(v_i, v_j) + l(v_j)$}
\State $min \leftarrow e(v_i, v_j) + l(v_j)$
\State $p(i) \leftarrow v_j$
\EndIf
\EndFor
\State $l(i) \leftarrow min$
\EndFor
\State $changed \leftarrow l \not= l$
\State $l \leftarrow l$
\Until{$\neg changed$}
\end{algorithmic}
\end{algorithm}
Exemple de déclarations :
- `a = 1`
- `b = 'c'`
.. important:: Le signe égal est utilisé de deux manières
- lors d'une déclaration d'une expression
- lorsque deux expressions sont équivalentes
Suivant les langages, il y a deux symboles différents, ou alors
ils sont identiques.
Il s'agit de **renseigner** une valeur dans une expression nommée
- en javascript :
.. code-block:: javascript
var b = "blabla" ;
- en python :
.. code-block:: python
b = "blabla"
- en java :
.. code-block:: java
String b = "A";
- en OCaml :
.. code-block:: ocaml
let a = 1
Grâce au mécanisme d'inférence de type dans OCaml, le mot-clef **let**
signifie ici véritablement l'instanciation d'une valeur au sens
mathématique du terme : soit `a` l'entier tel que a soit égal à 1...
En OCaml comme dans tous les langages fonctionnels, tout ce que nous avons l'habitude
d'appeler des "variables" à propos des affectations, sont en fait des **constantes**
au sens du paradigme impératif de la programmation.
.. important::
Par voie de conséquence, le symbole ``=`` est utilisé à la fois pour la définition des objets et pour le test d'égalité.
Pour les autres langages, on utilise `==` ou bien `===` (javascript) car
le `=` est sémantiquement déjà utilisé...
Toutes ces notation, apparemment anodines, correspondent donc à des paradigmes de programmation
Lorsqu'on ne déclare pas les types des symboles déclarés, c'est que soit
- le typage est faible
- le typage est dynamique (calcul du type en fonction du contenu de la
variable)
- le typage est statique et fort mais ça ne se voit pas
(var le système les calcule automatiquement par inférence de type)
Assigner, allouer, affecter une chose à quelqu'un ou à une autre chose.
Exemples dans la langue française :
- Le traitement que le budget **alloue** à ces fonctionnaires.
- Un système d'exploitation multitâche alloue le travail du processeur aux processus en attente, pour un bref laps de temps, à leur tour.
.. glossary::
affectation
Une affectation, aussi appelée assignation par anglicisme, est une structure qui permet d'attribuer une valeur à une variable.
Il s'agit d'une structure particulièrement courante en programmation impérative, et dispose souvent pour cette raison d'une notation courte et infixée,
comme ``x = expr`` ou ``x := expr`` ou encore `x <- expr`.
Dans certains langages, le symbole est considéré comme un opérateur d'affectation,
et la structure entière peut alors être utilisée comme une expression.
D'autres langages considèrent une affectation comme une instruction et ne permettent pas cet usage.
Voir aussi :
- Les déclarations de types primitifs et conversions de type
- Les types de base::
Octets (8 bits) byte
Entiers courts (16 bits) short
Entiers (32 bits) int
Entiers longs (64 bits) long
Réels (32 bits) float
Réels longs (64 bits) double
Caractères (16 bits) char
Booléens boolean
- Déclarations par lots::
x1 = e1, x2 = e2, ... xn = en;
Exercices : algorithmes sur les affectations
.. ifconfig:: exercice
**Exercice** : Calculs d'affectation::
Variables A, B, C en Entier
Début
A <- 3
B <- 10
C <- A + B
B <- A + B
A <- C
Fin
.. ifconfig:: correction
**Correction**::
Après La valeur des variables est :
A <- 5 A = 5 B = ?
B <- 2 A = 5 B = 2
A <- B A = 2 B = 2
B <- A A = 2 B = 2
.. ifconfig:: exercice
**Exercice** : Calculs d'affectation
Quelles seront les valeurs des variables A et B après exécution des instructions suivantes ?
::
Variables A, B en Entier
Début
A <- 5
B <- 2
A <- B
B <- A
Fin
.. ifconfig:: correction
**Correction**::
Après La valeur des variables est :
A <- 5 A = 5 B = ?
B <- 2 A = 5 B = 2
A <- B A = 2 B = 2
B <- A A = 2 B = 2
.. ifconfig:: exercice
**Exercice** : écrire un algorithme permettant déchanger les valeurs
de deux variables A et B, et ce quel que soit leur contenu préalable.
.. ifconfig:: correction
**Correction**::
Début
A <- n
B <- p
C <- A
A <- B
B <- C
Fin
Il faut passer par une variable dite temporaire (la variable C)
.. ifconfig:: exercice
**Exercice** :
Que produit lalgorithme suivant ?
::
Variables A, B, C de type entier
Début
A <- 423
B <- 12
C <- A + B
Fin
.. ifconfig:: correction
**Correction** : dans un prompt python
.. code-block:: python
>>> a = 423
>>> b = 12
>>> c = a + b
>>> c
435
.. ifconfig:: exercice
**Exercice** :
Que produit lalgorithme suivant ?
::
Variables A, B, C de type texte
Début
A <- "423"
B <- "12"
C <- A + B
Fin
.. ifconfig:: correction
**Correction** : dans un prompt python
.. code-block:: python
>>> a = '423'
>>> b = '12'
>>> c = a + b
>>> c
'42312'
Interaction avec l'utilisateur
------------------------------
Il est possible de communiquer de la manière suivante avec un programme :
- lire et écrire sur l'entrée/sortie standard
- lire et écrire dans un fichier
- afficher (du texte, un nombre...)
- lire (du texte, un nombre...)
- interagir avec les prompts
.. code-block:: ocaml
let x = read_int () in
let signe =
if x >= 0
then " positif "
else " négatif " in
print_string signe
.. ifconfig:: exercice
**Exercice** : écrire un algorithme qui demande le prénom d'une personne
et renvoie "bonjour, je m'appelle <Prénom>"
.. ifconfig:: correction
**Correction** : (implémentation en python)
.. code-block:: python
# coding: utf-8
prenom = raw_input("quel est ton prénom ? \n")
print("bonjour, je m'appelle " + prenom.capitalize())
La REPL (boucle d'interaction)
-------------------------------
.. glossary::
REPL
Read Eval Print Loop : outil principal de communication avec un programme
ou avec un système. Exemples : la console python, le prompt OCaml.
interface
outil de communication avec un programme.
- interface texte
- interface graphique
**Exemples de REPL**
Le prompt python::
Python 2.7.12 (default, Nov 19 2016, 06:48:10)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> dir()
['__builtins__', '__doc__', '__name__', readline', 'rlcompleter']
>>>
Le prompt ipython::
Python 2.7.12 (default, Nov 19 2016, 06:48:10)
Type "copyright", "credits" or "license" for more information.
IPython 2.4.1 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]:
Le prompt OCaml (utop)::
Type #utop_help for help about using utop.
─( 09:21:24 )─< command 0 >──
utop #
# let x = 1 in x + 2;;
- : int = 3
# let y = 1 + 2;;
val y : int = 3
# y * y;;
- : int = 9
Construire une boucle d'interaction avec l'utilisateur en python::
#!/usr/bin/env python3
error = True
while error:
try:
entier = int(input('donnez un entier : '))
error = False
except:
print('une valeur entiere est attendue')
print(entier)
Lire et écrire dans un fichier
------------------------------
Les descripteurs de fichiers (file handle)
Exemple en python
.. code-block:: python
>>> fh = file("test.txt", "w")
>>> fh.write("un contenu exemple")
>>> fh.close()
>>>
.. code-block:: python
>>> fh.read()
'un contenu exemple'
>>> fh.close()
>>>
Linéarisation (serialisation) de données par exemple en json
.. code-block:: python
import json
data = dict(a='essai', b='essai2', c=range(3))
with open('data.txt', 'w') as outfile:
json.dump(data, outfile)

View File

@ -1,101 +0,0 @@
Travaux Pratiques
=================
.. ifconfig:: exercice
**travaux pratiques :**
Ecrire un algorithme qui renvoie le résultat dune mini-calculatrice. Cette
méthode aura
comme paramètre deux nombres et une chaîne de caractère qui vaudra « + », « -
», « * »,
« / ».
.. ifconfig:: exercice
**travaux pratiques :**
Ecrire un algorithme qui renvoie si deux mots (chaîne de caractères) passés en
paramètre
sont des anagrammes lun de lautre. (Lettres identiques mais dans un ordre
différent)
.. ifconfig:: exercice
**travaux pratiques :**
ascii art (ligne d'étoiles)
Concevoir un algorithme qui, pour un caractère imprimable et un nombre n
donnés, imprime une barre
horizontale de n de ces caractères.
``****************``
2. Modifier lalgorithme pour limpression dune barre double.
::
****************
****************
3. Modifier lalgorithme pour limpression dune barre dépaisseur quelconque
donnée.
4. (optionnel) Transformer les algorithmes ci-dessus en fonctions.
5. Écrire un programme Java implémentant la dernière version de lalgorithme
(épaisseur quelconque).
3.3
Triangle de nombres
Concevoir un algorithme qui imprime pour n donné::
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
...........
.............
...............
1 2 3 4 5 6 ... n
.. ifconfig:: exercice
**travaux pratiques :**
code de césar : faire un programme pour chiffrer et déchiffrer par décalage
exemples : Effectue une rotation de x caractères vers la droite::
>>> print(chiffre('bonjour', 3))
erqmrxu
>>> print(chiffre('Bonjour les amis!', 3))
Erqmrxu ohv dplv!
>>> print(chiffre('Erqmrxu ohv dplv!', 23))
Bonjour les amis!
.. ifconfig:: exercice
**travaux pratiques :**
::
écrire “Entrer un numéro de mois”
mois <- lire
selon que mois est
cas 1 : écrire “janvier (31 jours)”
cas 2 : écrire “février (28 ou 29 jours)”
cas 3 : écrire “mars (31 jours)”
cas 4 : écrire “avril (30 jours)”
cas 5 : écrire “mai (31 jours)”
cas 6 : écrire “juin (30 jours)”
cas 7 : écrire “juillet (31 jours)”
cas 8 : écrire “août (31 jours)”
cas 9 : écrire “septembre (30 jours)”
cas 10 : écrire “octobre (31 jours)”
cas 11 : écrire “novembre (30 jours)”
cas 12 : écrire “décembre (31 jours)”
défaut : écrire “numéro invalide”
fselon

View File

@ -1,47 +0,0 @@
RST = python tools/rst.py
TEXDOCUMENTS = $(basename $(wildcard *.tex))
RSTDOCUMENTS = $(basename $(wildcard *.txt))
SOURCES = $(addsuffix .tex,$(TEXDOCUMENTS))
DVI = $(addsuffix .dvi,$(TEXDOCUMENTS))
POSTSCRIPT = $(addsuffix .ps,$(TEXDOCUMENTS))
POSTSCRIPT_GZ = $(addsuffix .ps.gz,$(TEXDOCUMENTS))
PDF = $(addsuffix .pdf,$(TEXDOCUMENTS))
RSTSOURCES = $(addsuffix .txt,$(RSTDOCUMENTS))
HTML = $(TEXDOCUMENTS) $(addsuffix .html,$(RSTDOCUMENTS))
all: dvi ps ps.gz html
dvi: $(DVI)
ps: $(POSTSCRIPT)
ps.gz: $(POSTSCRIPT_GZ)
pdf: $(PDF)
html: $(HTML)
${DVI}: %.dvi: %.tex
latex $<
latex $<
${POSTSCRIPT}: %.ps: %.dvi
dvips -o $@ $<
${POSTSCRIPT_GZ}: %.ps.gz: %.ps
gzip -c $< > $@
${PDF}: %.pdf: %.tex
rm -f $*.out $*.log $*.aux
xelatex $<
rm -f $*.out $*.log $*.aux
%: %.tex %.dvi
latex2html -local_icons $<
touch $@
%.html: %.txt
$(RST) $< > $@
clean:
rm -f -- *~ *.log *.aux *.out *.nav *.snm *.toc ${DVI} ${POSTSCRIPT} ${POSTSCRIPT_GZ} ${PDF}
rm -fr ${HTML}

View File

@ -1,268 +0,0 @@
\documentclass[ignorenonframetext]{beamer}
\usepackage{graphicx}
% Internal links only wors with second screen on the right
% \setbeameroption{show notes on second screen}
\usetheme{Madrid}
\usecolortheme{dolphin}
% gets rid of bottom navigation bars
\setbeamertemplate{footline}[frame number]{}
% gets rid of navigation symbols
\setbeamertemplate{navigation symbols}{}
%\usetheme{Warsaw}
%\usepackage[french]{babel}
%\usepackage[utf8,utf8x]{inputenc}
%\usepackage[T1]{fontenc}
% Replace babel
\usepackage{polyglossia}
\setdefaultlanguage{french}
%% Require XeTeX
\usepackage{xltxtra}
\usepackage{fontspec}
\usepackage{xunicode}
\logo{
\hspace{120pt}
\includegraphics[width=2cm]{img/cesi.jpg}~
\hspace{113pt}
\includegraphics[width=1cm]{img/logo-cadoles.png}~
}
%%\setbeamertemplate{background}{\includegraphics[width=128mm]{beamer-skel/img/banner01.png}}
\title[]{Algorithmique}
\subtitle{CESI alternance}
\subtitle{promotion GMSI B3}
\author[Gwenaël Rémond]{}
%\institute[E.O.L.E]{\includegraphics[width=2cm]{beamer-skel/img/logo-eole.png}}
\institute[Cadoles]{\includegraphics[width=2cm]{img/cesi.jpg}}
%\date{{\small 8 avril 2013}}
\subject{Talks}
\AtBeginSection[] % Add a TOC with current section highlighted
{
\begin{frame}<beamer>
\frametitle{Plan}
\tableofcontents[currentsection]
\end{frame}
}
\usepackage{hyperref}
\usepackage{hyperxmp}
\hypersetup{%
colorlinks=true,linkcolor=blue,urlcolor=blue,pdfpagemode=UseNone,
pdftitle={EAD3},
pdfsubject={Présentation technique d'EWT},
pdfauthor={EOLE},
pdfkeywords={EOLE, J-EOLE, distribution, GNU, Linux, Éducation,
nationale, Ubuntu},
pdflang={fr-FR},
pdfcopyright={Copyright © 2017 Équipe EOLE <eole@ac-dijon.fr>}, % Require XeTeX
pdflicenseurl={http://creativecommons.org/licenses/by-nc-sa/2.0/fr/},
}
\parskip=0.8em
\begin{document}
\frame{\titlepage}
\section{Introduction}
\begin{frame}
\frametitle{Objectifs}
\texttt{
"Il ne suffit pas d'avoir les mains propres, \\
il faut aussi avoir l'esprit pur."\\
}
\emph{Thalès ; VIe s. av. J.-C.}
\begin{itemize}
\item<1-> maîtriser et concevoir un algorithme,
\item<2-> choisir une représentation appropriée des données,
\item<3-> décomposer en sous-problèmes et affinements successifs,
\item<4-> savoir organiser son code et faire des petits programmes en python.
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{L'art de programmer}
\texttt{GEEK SUBLIME (Vikram CHANDRA)
Une vision esthétique, littéraire, mathématique du codage}
\begin{itemize}
\item<1-> Programmer, c'est abstraire, prendre du recul.
\item<2-> Abstraire, par rapport à quoi ? Par rapport à la machine
\item<3-> Les niveaux d'abstraction par rapport à la machine
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Les langages de programmation}
\begin{itemize}
\item Qu'est-ce qu'un langage de programmation ?
\item Les grands paradigmes de programmation (procédural, objet, fonctionnel, modulaire, générique \dots)
\item L'historique des langages.
\end{itemize}
\end{frame}
\section{Algorithmique}
\begin{frame}
\frametitle{Les algorithmes}
\begin{itemize}
\item définition d'un algorithme
\item implémentation d'un algorithme
\item représentation d'un algorithme dans un langage cible
\end{itemize}
\end{frame}
\section{Algorithmique pour la programmation}
\begin{frame}
\frametitle{Qu'est-ce qu'un programme ?}
\begin{itemize}
\item <1-> Les expressions
\item <2-> Les déclarations
\item <3-> La REPL (Read Eval Print Loop)
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Approche générale des fonctions}
\begin{itemize}
\item Les procédures
\item La portée d'une variable
\item Les fonctions
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Les structures de contrôle}
\begin{itemize}
\item Le branchement conditionnel
\item L'itération
\item \dots
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{Les structures de données}
\begin{itemize}
\item Les listes
\item Les dictionnaires
\item Les arbres, les graphes \dots
\end{itemize}
\end{frame}
\begin{frame}
\frametitle{L'état de l'art de l'agorithmique}
\begin{itemize}
\item en mathématiques
\begin{itemize}
\item algorithmique algébrique,
\item arithmétique modulaire,
\item \dots
\end{itemize}
\item en informatique
\begin{itemize}
\item en informatique fondamentale
\item en langages de programmation
\item dans touts les domaines où l'informatique intervient\dots
\end{itemize}
\item en sciences physique, en biologie
\item en sciences sociales (réseaux sociaux, auto-organisation\dots)
\end{itemize}
\end{frame}
\section{Programmation modulaire}
\begin{frame}
\frametitle{La programmation modulaire}
\begin{itemize}
\item La programmation raisonnée
\item Le paradigme modulaire vs le paradigme objet
\item exemple de programmation modulaire en python
\end{itemize}
\end{frame}
% Not present in TOC
\appendix
\begin{frame}[label=thanks]{Remerciements}
Je remercie la communauté du logiciel libre pour tous ces
merveilleux logiciels sans lesquels si peu de choses existeraient.
Cette présentation a été réalisée grâce aux logiciels libres
suivants~:
\begin{itemize}
\item Le système de composition \LaTeX{}
\href{https://fr.wikipedia.org/wiki/TeX_Live}{TeX Live}
\item L'éditeur de texte
\href{http://www.vim.org/}{Vim}
\item L'environnement graphique
\href{http://gnome.org/}{Gnome}
\item Le système d'exploitation
\href{https://debian.org/}{Debian}
\end{itemize}
\begin{center}
% Do not mess with graphics
\hypersetup{hidelinks}
\begin{tabular}{cccccc}
\href{http://www.gnu.org}{\includegraphics[height=1.3cm]{graphics/gnu-head.pdf}} &
\href{http://www.kernel.org}{\includegraphics[height=1.2cm]{graphics/tux.pdf}} &
\href{http://www.debian.org/}{\includegraphics[height=1cm]{graphics/debian.eps}} &
\href{https://fr.wikipedia.org/wiki/TeX_Live}{\includegraphics[height=1cm]{graphics/texlive.pdf}}
\end{tabular}
\end{center}
\end{frame}
\begin{frame}[label=license]{Licence}
Cette présentation est mise à disposition sous licence\\
\href{http://creativecommons.org/licenses/by-sa/4.0}%
{Creative Commons \textsc{by-sa 4.0}}
\begin{columns}[t]
\begin{column}{5.5cm}
\begin{itemize}
\item Attribution
\end{itemize}
\end{column}
\begin{column}{6.5cm}
\begin{itemize}
\item Partage dans les mêmes conditions
\end{itemize}
\end{column}
\end{columns}
Vous pouvez obtenir une copie de la licence
\begin{block}{par Internet}
\href{http://creativecommons.org/licenses/by-nc-sa/4.0}%
{\url{http://creativecommons.org/licenses/by-nc-sa/4.0}}
\end{block}
\begin{block}{par courrier postal}
\begin{quote}
Creative Commons\\
444 Castro Street, Suite 900 Mountain View,\\
California, 94041, USA.
\end{quote}
\end{block}
\end{frame}
\end{document}

View File

@ -1,133 +0,0 @@
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: cairo 1.14.8 (http://cairographics.org)
%%CreationDate: Tue May 16 12:20:58 2017
%%Pages: 1
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%BoundingBox: 0 -1 232 85
%%EndComments
%%BeginProlog
save
50 dict begin
/q { gsave } bind def
/Q { grestore } bind def
/cm { 6 array astore concat } bind def
/w { setlinewidth } bind def
/J { setlinecap } bind def
/j { setlinejoin } bind def
/M { setmiterlimit } bind def
/d { setdash } bind def
/m { moveto } bind def
/l { lineto } bind def
/c { curveto } bind def
/h { closepath } bind def
/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
0 exch rlineto 0 rlineto closepath } bind def
/S { stroke } bind def
/f { fill } bind def
/f* { eofill } bind def
/n { newpath } bind def
/W { clip } bind def
/W* { eoclip } bind def
/BT { } bind def
/ET { } bind def
/pdfmark where { pop globaldict /?pdfmark /exec load put }
{ globaldict begin /?pdfmark /pop load def /pdfmark
/cleartomark load def end } ifelse
/BDC { mark 3 1 roll /BDC pdfmark } bind def
/EMC { mark /EMC pdfmark } bind def
/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
/Tj { show currentpoint cairo_store_point } bind def
/TJ {
{
dup
type /stringtype eq
{ show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
} forall
currentpoint cairo_store_point
} bind def
/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
/Tf { pop /cairo_font exch def /cairo_font_matrix where
{ pop cairo_selectfont } if } bind def
/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
/cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
/cairo_font where { pop cairo_selectfont } if } bind def
/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
/g { setgray } bind def
/rg { setrgbcolor } bind def
/d1 { setcachedevice } bind def
%%EndProlog
%%BeginSetup
%%EndSetup
%%Page: 1 1
%%BeginPageSetup
%%PageBoundingBox: 0 -1 232 85
%%EndPageSetup
q 0 -1 232 86 rectclip q
0.290196 0.247059 0.454902 rg
133.668 16.757 m 133.668 16.757 133.25 1.257 148.941 1.257 c 176.328 1.257
l 170.723 3.749 168.633 5.874 164.891 10.585 c 150.969 10.585 l 147.234
10.585 145.441 13.222 145.441 17.538 c 145.441 17.538 145.492 75.363 145.414
75.445 c 142.301 82.999 133.668 84.519 133.668 84.519 c 133.668 83.995
133.676 39.347 133.668 16.757 c h
133.668 16.757 m f
41.039 38.73 m 41.207 38.808 41.25 38.921 41.457 39.109 c 41.5 40.347 41.375
41.511 41.164 42.823 c 40.625 46.238 40.664 49.726 41.207 53.07 c 41.125
53.214 l 41.043 53.366 40.914 53.405 40.914 53.405 c 40.664 53.48 40.414
53.554 40.121 53.515 c 35.613 53.366 31.141 52.577 26.758 51.265 c 24.457
50.702 22.16 50.14 19.863 49.577 c 17.984 49.015 16.688 48.152 15.812 46.913
c 16.062 46.839 16.145 46.691 16.23 46.538 c 16.48 46.464 l 16.395 46.238
l 15.98 45.863 15.812 45.409 15.895 44.886 c 15.977 44.738 16.105 44.698
16.188 44.55 c 16.523 44.327 16.859 44.101 17.062 43.909 c 17.234 43.988
17.234 43.988 17.355 43.952 c 17.523 44.027 17.816 44.062 18.023 44.249
c 18.316 44.288 18.445 44.249 18.57 44.21 c 24.836 43.464 30.973 41.999
37.027 39.933 c 37.152 39.894 37.281 39.855 37.242 39.749 c 37.324 39.597
37.449 39.558 37.406 39.445 c 37.91 39.296 l 38.91 38.995 39.785 38.734
40.75 38.698 c 40.914 38.769 40.914 38.769 41.039 38.73 c 39.117 40.687
m 38.117 40.988 l 39.078 40.948 l 39.16 40.796 39.117 40.687 39.117 40.687
c f
49.855 72.859 m 49.855 72.859 54.316 79.749 63.262 84.269 c 13.684 84.269
l 0.484 84.269 0.527 73.152 0.527 73.152 c 0.527 17.499 l 0.527 17.499
0.117 1.984 15.809 1.984 c 64.07 1.984 l 58.465 4.472 54.559 8.597 50.816
13.308 c 50.816 13.308 15.844 13.296 15.891 13.308 c 11.449 13.308 12.086
17.542 12.086 17.542 c 12.156 69.034 l 12.156 73.109 15.902 72.859 15.902
72.859 c f
69.723 45.148 m 69.723 45.148 66.891 28.866 79.219 23.05 c 84.949 20.351
89.504 19.945 95.855 22.363 c 99.852 23.882 103.457 27.659 104.977 31.769
c 106.496 35.878 105.191 40.874 101.199 44.757 c 99.793 38.538 98.297 33.53
92.91 30.741 c 89.711 29.116 86.457 29.386 83.211 30.995 c 79.961 32.605
77.473 36.48 76.484 40.363 c 76.484 40.363 74.473 47.585 82.195 59.417
c 75.809 56.718 70.875 52.245 69.723 45.148 c h
69.723 45.148 m f
0.945098 0.792157 0.0745098 rg
110.621 8.773 m 117.836 13.503 123.312 20.792 125.211 30.261 c 125.238
30.429 l 126.707 37.968 125.305 45.933 121.43 52.601 c 117.527 59.308 110.711
64.777 102.098 65.82 c 102.074 65.831 l 96.797 66.464 90.988 64.273 86.93
60.507 c 82.406 55.163 80.273 51.816 80.387 44.03 c 84.254 49.132 94.043
54.202 100.949 53.523 c 105.414 52.984 108.629 50.445 110.898 46.542 c
113.168 42.636 114.066 37.445 113.184 33.058 c 110.383 19.085 94.641 12.073
81.125 15.976 c 62.398 21.382 55.426 40.464 63.086 58.038 c 72.824 73.859
90.422 80.905 113.074 77.519 c 105.887 85.03 93.703 83.984 93.703 83.984
c 82.363 84.874 61.398 78.519 53.613 63.808 c 42.234 42.316 52.059 11.566
78.055 4.062 c 89.188 0.847 101.344 2.695 110.621 8.777 c h
110.621 8.773 m f
0.290196 0.247059 0.454902 rg
194.387 67.495 m 185.594 67.495 178.215 64.179 172.285 57.597 c 166.355
51.011 164.41 42.503 164.41 32.046 c 164.41 20.98 166.184 15.999 171.609
9.894 c 180.992 -1.075 203.68 1.32 210.367 1.402 c 217.055 1.484 219.438
1.644 231.012 0.57 c 228.027 5.839 220.824 9.495 218.348 10.011 c 206.766
12.195 193.328 8.179 181.414 15.484 c 176.691 19.57 175.734 22.14 175.559
29.62 c 223.012 29.62 l 223.012 35.269 l 223.012 45.374 219.598 53.257
214.785 58.945 c 208.164 64.816 201.25 67.409 194.387 67.495 c h
194.184 58.421 m 199.434 58.421 203.531 56.702 206.484 53.245 c 209.438
49.788 211.941 44.956 211.984 38.745 c 175.684 38.745 l 175.715 44.808
177.715 49.339 181.262 52.972 c 184.805 56.601 189.109 58.421 194.184 58.421
c h
194.184 58.421 m f
Q Q
showpage
%%Trailer
end restore
%%EOF

View File

@ -1,1277 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg3118"
version="1.1"
inkscape:version="0.92.1 r15371"
width="308.26666"
height="113.06667"
xml:space="preserve"
sodipodi:docname="Logo EOLE.svg"><metadata
id="metadata3124"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs3122"><marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"><path
id="path4626"
d="M -10.666667,0 -14.933333,4.2666667 0,0 -14.933333,-4.2666667 Z"
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.85333335pt"
inkscape:connector-curvature="0" /></marker><linearGradient
id="linearGradient4664"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4666" /></linearGradient><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3132"><path
d="M 0,600 H 800 V 0 H 0 Z"
id="path3134"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3248"><path
d="M 205.131,405.857 H 559.926 V 579.858 H 205.131 Z"
id="path3250"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3260"><path
d="M 0,600 H 800 V 0 H 0 Z"
id="path3262"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3288"><path
d="M 205.131,405.857 H 559.926 V 579.858 H 205.131 Z"
id="path3290"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3304"><path
d="M 0,600 H 800 V 0 H 0 Z"
id="path3306"
inkscape:connector-curvature="0" /></clipPath><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664"
id="linearGradient4668"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientUnits="userSpaceOnUse" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664"
id="linearGradient4676"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9"
id="linearGradient4668-8"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientUnits="userSpaceOnUse" /><linearGradient
id="linearGradient4664-9"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4666-6" /></linearGradient><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9"
id="linearGradient4676-2"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
id="linearGradient4706"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4708" /></linearGradient><linearGradient
id="linearGradient4711"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4713" /></linearGradient><linearGradient
id="linearGradient4716"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4718" /></linearGradient><linearGradient
id="linearGradient4721"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4723" /></linearGradient><linearGradient
id="linearGradient4726"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4728" /></linearGradient><linearGradient
id="linearGradient4731"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4733" /></linearGradient><linearGradient
id="linearGradient4736"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4738" /></linearGradient><linearGradient
id="linearGradient4741"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4743" /></linearGradient><linearGradient
id="linearGradient4746"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4748" /></linearGradient><linearGradient
id="linearGradient4751"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4753" /></linearGradient><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9"
id="linearGradient4880"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9"
id="linearGradient4896"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient4896-1"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
id="linearGradient4664-9-8"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4666-6-7" /></linearGradient><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient4880-2"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
id="linearGradient5022"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5024" /></linearGradient><linearGradient
id="linearGradient5027"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5029" /></linearGradient><linearGradient
id="linearGradient5032"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5034" /></linearGradient><linearGradient
id="linearGradient5037"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5039" /></linearGradient><linearGradient
id="linearGradient5042"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5044" /></linearGradient><linearGradient
id="linearGradient5047"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5049" /></linearGradient><linearGradient
id="linearGradient5052"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5054" /></linearGradient><linearGradient
id="linearGradient5057"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5059" /></linearGradient><linearGradient
id="linearGradient5062"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5064" /></linearGradient><linearGradient
id="linearGradient5067"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5069" /></linearGradient><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient5090"
xlink:href="#linearGradient4664-9-8"
inkscape:collect="always" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3289"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3291"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3293"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3309"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3315"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3318"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3321"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3324"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3327"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3330"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3337"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3341"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3345"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3349"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3353"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3357"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3361"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3375"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3377"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3379"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3381"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3383"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3385"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3387"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3389"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3391"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3393"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3396"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3399"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3402"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3405"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3408"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3411"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3414"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3432"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3434"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3436"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3440"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.43531,-541.69844)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3445"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.43531,-541.69844)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-5"
id="linearGradient4896-6"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
id="linearGradient4664-9-5"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4666-6-3" /></linearGradient><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-5"
id="linearGradient4880-3"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
id="linearGradient3288"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3290" /></linearGradient><linearGradient
id="linearGradient3293-8"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3295" /></linearGradient><linearGradient
id="linearGradient3298"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3300" /></linearGradient><linearGradient
id="linearGradient3303"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3305" /></linearGradient><linearGradient
id="linearGradient3308"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3310" /></linearGradient><linearGradient
id="linearGradient3313"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3315" /></linearGradient><linearGradient
id="linearGradient3318-7"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3320" /></linearGradient><linearGradient
id="linearGradient3323"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3325" /></linearGradient><linearGradient
id="linearGradient3328"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3330" /></linearGradient><linearGradient
id="linearGradient3333"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3335" /></linearGradient><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient3363"
xlink:href="#linearGradient4664-9-5"
inkscape:collect="always" /><marker
style="overflow:visible"
id="Arrow1Lend-7"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"><path
inkscape:connector-curvature="0"
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.85333335pt"
d="M -10.666667,0 -14.933333,4.2666667 0,0 -14.933333,-4.2666667 Z"
id="path4626-5" /></marker><clipPath
id="clipPath3132-0"
clipPathUnits="userSpaceOnUse"><path
inkscape:connector-curvature="0"
id="path3134-4"
d="M 0,600 H 800 V 0 H 0 Z" /></clipPath><clipPath
id="clipPath3248-3"
clipPathUnits="userSpaceOnUse"><path
inkscape:connector-curvature="0"
id="path3250-5"
d="M 205.131,405.857 H 559.926 V 579.858 H 205.131 Z" /></clipPath><clipPath
id="clipPath3260-7"
clipPathUnits="userSpaceOnUse"><path
inkscape:connector-curvature="0"
id="path3262-3"
d="M 0,600 H 800 V 0 H 0 Z" /></clipPath><clipPath
id="clipPath3288-4"
clipPathUnits="userSpaceOnUse"><path
inkscape:connector-curvature="0"
id="path3290-0"
d="M 205.131,405.857 H 559.926 V 579.858 H 205.131 Z" /></clipPath><clipPath
id="clipPath3304-6"
clipPathUnits="userSpaceOnUse"><path
inkscape:connector-curvature="0"
id="path3306-1"
d="M 0,600 H 800 V 0 H 0 Z" /></clipPath><linearGradient
gradientUnits="userSpaceOnUse"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
id="linearGradient4759"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4761"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4763"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4765"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4767"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4769"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664"
id="linearGradient4771"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4773"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4775"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4777"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4779"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4781"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4783"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4785"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4787"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4789"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4791"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4793"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4795"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4797"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4799"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4801"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4803"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4805"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4807"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4809"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4811"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4813"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4815"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4817"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4819"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4821"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4823"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4825"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4827"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4829"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4831"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4833"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4835"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4837"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
gradientUnits="userSpaceOnUse"
id="linearGradient4839"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4841"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4843"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4845"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.43531,-541.69844)"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4847"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.43531,-541.69844)"
gradientUnits="userSpaceOnUse"
id="linearGradient4849"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient4851"
xlink:href="#linearGradient4664"
inkscape:collect="always" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664"
id="linearGradient4853"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /></defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1678"
inkscape:window-height="1028"
id="namedview3120"
showgrid="false"
inkscape:zoom="2"
inkscape:cx="234.31834"
inkscape:cy="117.22431"
inkscape:window-x="0"
inkscape:window-y="20"
inkscape:window-maximized="1"
inkscape:current-layer="g3126"
inkscape:snap-bbox="false"
inkscape:object-paths="true"
inkscape:snap-global="false" /><g
id="g3126"
inkscape:groupmode="layer"
inkscape:label="logoeole1"
transform="matrix(1.25,0,0,-1.25,0,113.06667)"><g
id="layer1-0"
inkscape:label="bateau"
transform="matrix(0.8,0,0,-0.8,3263.1972,1017.0386)" /><flowRoot
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.23999977px;line-height:0.01%;font-family:COUTURE;-inkscape-font-specification:'COUTURE Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.85333335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="flowRoot4297-1"
xml:space="preserve"><flowRegion
id="flowRegion4299-9"
style="stroke-width:0.85333335px"><rect
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:122.87999725px;font-family:COUTURE;-inkscape-font-specification:'COUTURE Bold';stroke-width:0.72817779px"
y="645.2547"
x="5058.6104"
height="354.98666"
width="928.4267"
id="rect4301-6"
transform="scale(1,-1)" /></flowRegion><flowPara
id="flowPara4303-0"
style="font-size:122.87999725px;line-height:1.25;stroke-width:0.85333335px"> </flowPara></flowRoot><flowRoot
style="font-style:normal;font-weight:normal;font-size:10.23999977px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.85333335"
id="flowRoot3677-9"
xml:space="preserve"><flowRegion
id="flowRegion3679-9"
style="font-family:sans-serif;stroke-width:0.85333335"><rect
y="-627.65375"
x="5665.9272"
height="85.68248"
width="658.91034"
id="rect3681-4"
style="font-family:sans-serif;stroke-width:0.72817779"
transform="scale(1,-1)" /></flowRegion><flowPara
id="flowPara3683-3"
style="font-size:34.13333511px;line-height:1.25;font-family:sans-serif;stroke-width:0.85333335"> </flowPara></flowRoot><flowRoot
style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="flowRoot4653-0"
xml:space="preserve"><flowRegion
id="flowRegion4655-9"
style="font-family:sans-serif;stroke-width:1.06666672px"><rect
y="331.22806"
x="4741.1704"
height="300.37335"
width="348.16"
id="rect4657-1"
transform="scale(1,-1)"
style="font-family:sans-serif;stroke-width:1.13777781px" /></flowRegion><flowPara
id="flowPara4659-0"
style="font-size:34.13333511px;line-height:1.25;font-family:sans-serif;stroke-width:1.06666672px"> </flowPara></flowRoot><g
id="g5567"
transform="translate(-81.066665,-29.439999)"><path
sodipodi:nodetypes="csccccccc"
inkscape:connector-curvature="0"
id="path3238-6-5-8-3-3-8-2-2-0-1-4-0-3-3-0-0-1-3-0-9-0-0-8-1-9"
d="m 223.64477,47.315777 c 0,0 -0.44523,-16.533333 16.29322,-16.533333 h 29.21227 c -5.98037,2.657493 -8.20768,4.9232 -12.19893,9.946666 h -14.85334 c -3.98336,0 -5.89333,2.812907 -5.89333,7.417494 0,0 0.0533,61.678716 -0.0299,61.769596 -3.31946,8.0543 -12.53045,9.67808 -12.53024,9.67808 3.2e-4,-0.56032 0.0107,-48.185703 2.2e-4,-72.278503 z"
style="fill:#4a3f74;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.06666672" /><g
id="g3276-4-2-8-2-4-8-6-2-1"
transform="matrix(-0.24101235,-0.49825763,0.72298939,-0.16609682,125.97693,71.485057)"
style="fill:#4a3f74;fill-opacity:1"><path
d="M 1.7934243,-0.96970754 C 1.5691998,-0.79961828 1.3331053,-0.8164976 0.87787922,-0.65822353 -1.5218484,-1.3975491 -3.7083721,-2.3133919 -6.1451141,-3.4323038 -12.488224,-6.3457762 -19.225905,-8.5326385 -25.903247,-9.9575472 l -0.247882,-0.2029018 c -0.25648,-0.208217 -0.273442,-0.400249 -0.273442,-0.400249 -0.03366,-0.381227 -0.06736,-0.762456 0.138575,-1.126553 2.283231,-5.891302 5.781359,-11.321624 10.249609,-16.300951 2.100325,-2.689577 4.204242,-5.37796 6.306738,-8.069263 1.9162051,-2.131222 4.1509802,-3.29873 6.9218717,-3.669328 0.033842,0.38312 0.2866489,0.589194 0.542211,0.800166 l 0.033341,0.377443 0.4698516,0.0336 c 0.90753081,-0.310177 1.85073987,-0.242743 2.8272897,0.202131 0.2526397,0.204184 0.2699367,0.4 0.5180682,0.60574 0.2831425,0.588942 0.5687898,1.179944 0.8453212,1.575714 -0.2263115,0.172761 -0.2263115,0.172761 -0.2095992,0.361956 -0.2179629,0.175237 -0.4171267,0.536997 -0.8678447,0.693713 -0.2045063,0.36702 -0.1874599,0.559997 -0.1708311,0.748247 -1.33185938,8.799057 -1.22651547,17.893566 0.074677,27.2596895 0.016798,0.1901409 0.033847,0.3831197 0.2594176,0.3992467 0.2552276,0.2071871 0.2721071,0.3982738 0.5082015,0.4151532 l 0.067266,0.7615089 c 0.1344498,1.5220696 0.2521035,2.8540008 -0.1044352,4.15579 -0.2086962,0.1749594 -0.2086962,0.1749594 -0.1917332,0.3669921 m -2.9158252,-3.8077224 -0.1346165,-1.5239637 -0.3531155,1.301094 c 0.256313,0.2063246 0.4877324,0.2228697 0.4877324,0.2228697"
style="fill:#4a3f74;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.06666672"
id="path3278-9-83-5-1-8-0-7-4-9"
inkscape:connector-curvature="0" /></g><path
inkscape:connector-curvature="0"
id="path4310-6-3-5-4-1-7-1-6-2-5-3-5-0-5-9"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:144px;line-height:125%;font-family:COUTURE;-inkscape-font-specification:'COUTURE Bold';letter-spacing:0px;word-spacing:0px;fill:#4a3f74;fill-opacity:1;stroke:none;stroke-width:1.06666672"
d="m 134.24391,107.15482 c 0,0 4.75958,7.35189 14.30219,12.17301 H 95.663964 c -14.080107,0 -14.036267,-11.86123 -14.036267,-11.86123 V 48.10415 c 0,0 -0.435413,-16.550293 16.303147,-16.550293 h 51.477446 c -5.98027,2.6576 -10.14496,7.057813 -14.13611,12.081173 0,0 -37.304323,-0.01067 -37.25547,0 -4.73792,0 -4.057706,4.517867 -4.057706,4.517867 l 0.07467,54.922883 c 0,4.34826 3.99584,4.07904 3.99584,4.07904"
sodipodi:nodetypes="cccccccccccc" /><g
transform="matrix(0.81587728,0,0,-0.81587728,-701.65987,1291.3573)"
id="g3550-3-3-6-3-7-9-3-8-0-2-8-8-4-4"><g
transform="translate(-43.249218,364.84503)"
id="g3586-3-0-0-2-0-8-5-9-6-2-3-7-1-7"><g
transform="matrix(1.0404262,0,0,1.0404262,-71.883772,-41.905465)"
id="g3402-8-5-9-6-1"><path
sodipodi:nodetypes="csssccsccc"
inkscape:connector-curvature="0"
id="path3359-6-74-0-1-9-6-9-6-3-7-6-2-3-6-2-7"
d="m 1120.3633,1119.4763 c 0,0 -3.5568,20.4619 11.9327,27.768 7.2005,3.396 12.9255,3.904 20.905,0.8664 5.0224,-1.9118 9.552,-6.6569 11.4611,-11.8215 1.9093,-5.1645 0.2732,-11.4417 -4.7449,-16.3195 -1.7695,7.8156 -3.6493,14.1069 -10.416,17.611 -4.0225,2.0444 -8.111,1.7045 -12.1907,-0.318 -4.0796,-2.0228 -7.2085,-6.8927 -8.4528,-11.7715 0,0 -2.5254,-9.0737 7.1765,-23.942 -8.0225,3.3894 -14.2234,9.009 -15.6709,17.9271 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#4a3f74;fill-opacity:1;stroke:none;stroke-width:23.74341393;marker:none;enable-background:accumulate" /><path
sodipodi:nodetypes="cccscccccssscccsscc"
inkscape:connector-curvature="0"
id="path3359-8-8-4-6-7-8-1-6-3-1-1-8-8-2-0-1-1"
d="m 1171.7557,1165.1847 c 9.0667,-5.9443 15.9456,-15.1034 18.3323,-26.9986 l 0.036,-0.2122 c 1.845,-9.4715 0.083,-19.4824 -4.7861,-27.8592 -4.9017,-8.4311 -13.4688,-15.3007 -24.2922,-16.6144 l -0.031,-0.011 c -6.6322,-0.7981 -13.9274,1.959 -19.0297,6.6892 -5.6838,6.7137 -8.3619,10.9192 -8.2233,20.7045 4.8592,-6.4111 17.1623,-12.7819 25.8393,-11.9272 5.6097,0.6749 9.6503,3.8646 12.5032,8.7716 2.8528,4.907 3.9787,11.4322 2.8727,16.9447 -3.5229,17.5582 -23.303,26.3651 -40.2867,21.4627 -23.5286,-6.7915 -32.2906,-30.7698 -22.6684,-52.8538 12.2398,-19.8825 34.3524,-28.7354 62.8183,-24.4779 -9.0335,-9.4406 -24.345,-8.1228 -24.345,-8.1228 -14.2495,-1.1222 -40.5898,6.8652 -50.3766,25.3512 -14.2965,27.0046 -1.9507,65.6469 30.7149,75.076 13.991,4.0384 29.2641,1.7151 40.9212,-5.9275 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#f1ca13;fill-opacity:1;stroke:none;stroke-width:23.74341393;marker:none;enable-background:accumulate" /></g></g></g><g
transform="matrix(0.84351752,-0.54896555,0.51910062,0.8920468,307.56423,30.76431)"
id="g3240-2-1-4-4-7-8-0-7-9-2-5-6-9-2-7-6"><path
sodipodi:nodetypes="ccsczcccccsccscccss"
inkscape:connector-curvature="0"
id="path3242-2-6-6-9-6-6-7-4-5-2-2-3-5-0-0-6"
d="M -51.831427,47.326395 C -59.895364,42.363849 -64.893573,35.32236 -66.817364,26.26606 -68.739856,17.209458 -65.984036,8.7300195 -60.40346,-0.33818968 -54.49654,-9.9366965 -50.210652,-13.255154 -41.97748,-15.484843 -27.515019,-19.70367 -7.9836824,-4.8218392 -1.8943856,-0.97576512 4.1949112,2.8703089 6.2927392,4.3529194 17.480784,9.9551429 11.932455,12.839158 3.3756816,11.947763 0.82595055,10.996623 -10.961104,6.3524792 -21.140137,-4.7136447 -35.966514,-5.1033549 c -6.512982,0.8784234 -8.76316,2.5650242 -12.915824,8.9552297 l 43.5206803,26.7826232 -3.0155866,4.900207 c -5.3936837,8.764517 -12.7311517,13.673383 -20.1799837,15.890713 -9.204896,1.353089 -16.931596,-0.298964 -23.274199,-4.099023 z m 4.660181,-7.983573 c 4.814882,2.963078 9.488296,3.783934 14.043484,2.454391 4.551634,-1.331826 9.427718,-4.109627 12.783662,-9.471337 L -53.638108,11.836745 c -3.208293,5.274169 -3.790195,10.333683 -2.479019,15.483935 1.312201,5.148586 4.29059,9.157276 8.945881,12.022142 z"
style="fill:#4a3f74;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.83779979" /></g></g></g><g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="bateau"
transform="translate(0,-1486.9333)" /><g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Calque1"
transform="translate(0,-1486.9333)"><flowRoot
xml:space="preserve"
id="flowRoot4297"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0.01%;font-family:COUTURE;-inkscape-font-specification:'COUTURE Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"><flowRegion
id="flowRegion4299"
style="stroke-width:1.06666672px"><rect
id="rect4301"
width="1160.5333"
height="443.73334"
x="2244.2666"
y="2077.8667"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:153.6000061px;font-family:COUTURE;-inkscape-font-specification:'COUTURE Bold';stroke-width:1.13777781px" /></flowRegion><flowPara
id="flowPara4303"
style="font-size:153.6000061px;line-height:1.25;stroke-width:1.06666672px"> </flowPara></flowRoot><flowRoot
xml:space="preserve"
id="flowRoot3677"
style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion
id="flowRegion3679"
style="font-family:sans-serif;stroke-width:1.06666672"><rect
id="rect3681"
width="823.63794"
height="107.1031"
x="3003.4126"
y="486.73111"
style="font-family:sans-serif;stroke-width:1.13777781" /></flowRegion><flowPara
id="flowPara3683"
style="font-size:42.66666794px;line-height:1.25;font-family:sans-serif;stroke-width:1.06666672"> </flowPara></flowRoot><flowRoot
xml:space="preserve"
id="flowRoot4653"
style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"><flowRegion
id="flowRegion4655"
style="font-family:sans-serif;stroke-width:1.06666672px"><rect
id="rect4657"
width="435.20001"
height="375.46667"
x="1847.4667"
y="1685.3334"
style="font-family:sans-serif;stroke-width:1.13777781px" /></flowRegion><flowPara
id="flowPara4659"
style="font-size:42.66666794px;line-height:1.25;font-family:sans-serif;stroke-width:1.06666672px"> </flowPara></flowRoot><g
transform="matrix(3.7418697,0,0,3.7418697,-7508.261,-6259.3333)"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#4a3f74;fill-opacity:1;stroke:none"
id="flowRoot3442" /></g></svg>

Before

Width:  |  Height:  |  Size: 53 KiB

View File

@ -1,318 +0,0 @@
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: cairo 1.14.8 (http://cairographics.org)
%%CreationDate: Tue May 16 12:15:46 2017
%%Pages: 1
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%BoundingBox: 0 -1 1660 851
%%EndComments
%%BeginProlog
save
50 dict begin
/q { gsave } bind def
/Q { grestore } bind def
/cm { 6 array astore concat } bind def
/w { setlinewidth } bind def
/J { setlinecap } bind def
/j { setlinejoin } bind def
/M { setmiterlimit } bind def
/d { setdash } bind def
/m { moveto } bind def
/l { lineto } bind def
/c { curveto } bind def
/h { closepath } bind def
/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
0 exch rlineto 0 rlineto closepath } bind def
/S { stroke } bind def
/f { fill } bind def
/f* { eofill } bind def
/n { newpath } bind def
/W { clip } bind def
/W* { eoclip } bind def
/BT { } bind def
/ET { } bind def
/pdfmark where { pop globaldict /?pdfmark /exec load put }
{ globaldict begin /?pdfmark /pop load def /pdfmark
/cleartomark load def end } ifelse
/BDC { mark 3 1 roll /BDC pdfmark } bind def
/EMC { mark /EMC pdfmark } bind def
/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
/Tj { show currentpoint cairo_store_point } bind def
/TJ {
{
dup
type /stringtype eq
{ show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
} forall
currentpoint cairo_store_point
} bind def
/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
/Tf { pop /cairo_font exch def /cairo_font_matrix where
{ pop cairo_selectfont } if } bind def
/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
/cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
/cairo_font where { pop cairo_selectfont } if } bind def
/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
/g { setgray } bind def
/rg { setrgbcolor } bind def
/d1 { setcachedevice } bind def
%%EndProlog
%%BeginSetup
%%BeginResource: font DejaVuSans-Bold
11 dict begin
/FontType 42 def
/FontName /DejaVuSans-Bold def
/PaintType 0 def
/FontMatrix [ 1 0 0 1 0 0 ] def
/FontBBox [ 0 0 0 0 ] def
/Encoding 256 array def
0 1 255 { Encoding exch /.notdef put } for
Encoding 32 /space put
/CharStrings 2 dict dup begin
/.notdef 0 def
/space 1 def
end readonly def
/sfnts [
<000100000009008000030010637674203eb93108000000e8000002546670676d5b026bf00000
033c000000ac676c7966e2f9cb840000009c0000004c686561640e24be09000003e800000036
686865610eaf07730000042000000024686d74780796006600000444000000086c6f63610000
00980000044c0000000c6d6178700647062d0000045800000020707265707c61a2e700000478
000007a700020066fe96046605a400030007001fbc00040126000000060126b6010805890204
002fc4d4ec310010d4ecd4ec301311211125211121660400fc73031bfce5fe96070ef8f27206
2900000001660133016600bc00e90000013d00a200fa031f00020002006601660002000200ac
015400ec00bc006201660181048501540166016d04a400020166007f04cd0000000201330062
00710000002504a401bc00ba00e500660181018d0548055a0166016d000000000002000200f6
05c301f0053902390058046d043d04b2048104b2016601750466048100b00466043902d1049c
047b04cf047b005801330166014c0166014c000200ac009a014a0123009a029a014401190144
02cd00c100000166013f019a013b05cb05cb00d500d5015000ac00ac0077020a01c701f2012f
015801b2012300f600f6011f012f0135023501ee01e70133009800d10358050a009a008f0112
009800bc00cd00e500e500f2007304000166008f05d5022b05d500c300e100d700e50000006a
01020000001d032d05d505d505f000a8006a00ec00e1010205d506140721046602f800ec0183
02a602f80123010201020112011f031f005e03cd046004c7048900ec01bc00ba01020333031f
03420333035c0112011f05d5019a009a00e106660179046004600460047b000000ec02c302b8
02cd00be00dd00d50000006a025c027b029a00dd01ae01ba01120000008501ae04600762041b
009a069a045800ee009a029a00d102cd019a015005cb05cb008b008b063100f6040600f0034c
016004a800c10000002505c101000121074a06120096014a078300a800000337007b00140000
00c9010005c105c105c105c101000108061d00960427039e00ec0102027d0133009800d10358
017900cd02390362009c009c009c009301b8009300b80073000014000326b707060504030201
002c2010b002254964b040515820c859212d2cb002254964b040515820c859212d2c20100720
b00050b00d7920b8ffff5058041b0559b0051cb0032508b0042523e120b00050b00d7920b8ff
ff5058041b0559b0051cb0032508e12d2c4b505820b80128454459212d2cb002254560442d2c
4b5358b00225b0022545445921212d2c45442d2cb00225b0022549b00525b005254960b02063
68208a108a233a8a10653a2d0001000000025eb8b54203fc5f0f3cf5001f080000000000d3d9
0a2000000000d3d90a20f772fcae0fcd096500010008000000010000000000010000076dfe1d
00001021f772f9320fcd00010000000000000000000000000000000204cd006602c900000000
00000000004c0000004c000100000002034e002b0078000c0002001000400008000005ed0221
0008000441840280012600fe000301250011000301240121003a0005012400fa000301230016
000301220121003a0005012200fe00030121003a0003012000fa0003011f00bb0003011e0064
0003011d00fe0003011c00190003011b001e0003011a00fe0003011900fe0003011800fe0003
011700fe0003011600fe000301150114000e0005011500fe00030114000e0003011300fe0003
011200fe0003010f010e007d0005010f00fe0003010e007d0003010d010c008c0005010d00fe
0003010d00c00004010c010b00590005010c008c0003010c00800004010b010a00260005010b
00590003010b00400004010a00260003010900fe0003010800fe00030107000c000301070080
00040106b2972e054113010600fa0003010500fa0003010400fe0003010300190003010200fa
0003010100fa0003010040ff7d03ff3e03fefe03fcfb2c05fcfe03fb2c03fafe03f9f84705f9
7d03f84703f7fa03f6fe03f5fe03f4fe03f3bb03f2fe03f1fe03f0fe03ef1e03eefe03edec0a
05edfe03ec0a03ec4004ebea0a05eb3203ea0a03e9fa03e8911605e8fe03e7fa03e6fa03e591
1605e5fe03e4fe03e3fe03e2fe03e1fe03e0fe03dffe03defa03dddc1805dd6403dc1803dba0
1e05db6403dad92505dafa03d92503d8d12505d8fa03d7d61405d71603d6d51005d61403d510
03d4d30b05d42003d30b03d2d12505d2fa03d1911605d12503d0940c05d02303cfce1405cf26
03cecd1205ce1403cd1203cc911605cc1d03cb1403cac9bb05cafe03c9c85d05c9bb03c98004
c840ffc72505c85d03c84004c72503c6fe03c56403c4901005c4fe03c31c03c2fe03c1fe03c0
bf3a05c0fa03bfad1b05bf3a03bebd1a05be3203bdbc1105bd1a03bcbb0f05bc1103bbba0c05
bb0f03ba0c03b9911605b9fe03b8fe03b71503b61203b5fe03b4fe03b3fe03b21703b11903b0
1603afad1b05affa03aead1b05aefa03ad911605ad1b03ac911605ac7d03abfe03aa2603a9fe
03a8fe03a7fe03a6fe03a50a03a4fe03a3a20e05a3fe03a20e03a24004a1a01e05a1fa03a091
1605a01e039f9116059ffa039e940c059e1c039dfe039c9bbb059cfe039b9a5d059bbb039b80
049a8f25059a5d039a400499fe0398972e0598fe03972e0396911605961e40ff0395940c0595
2003940c0393911605934b039291160592fe03919010059116039010038f25038efe038dfe03
8cfe038bfe038afe0389fe038887250588fe0387250386fe0385fe0384320383960382fe0381
fe038019037f0a037efe037dfe037cfe037bfa037afa0379fe037776a60577fe0376a6037574
1b0575fa03741b0373fa03727d0371fe03706f2c056f2c036efa036dfa036cfa036bfe036afe
0369fe0368630c0568320367fe0366320365640a0565fe03640a0364400463620a05630c0362
0a0361601505619603600111056015035f0a035efe035dfe035c0111055cfe035b5a1b055bfe
035a0111055a1b0359fe0358fa0357fe035601110540ff56fe0355fe03541e03531403525119
0552fa0351011105511903504f190550fa034f4e11054f19034e11034d1e034c4b14054c1503
4b4a11054b14034a490e054a1103490e0348fa034746140547150346140345fa0344430e0544
0f03430e034241250542fa0341011105412503403f0f0540fe033f3e0e053f0f033e0e033d3c
0d053d16033c0d033b64033afe0339140338fe0337130336351a0536250335341405351a0335
c004340a0d0534140334800433320c05331403334004320c033130a60531fe033001110530a6
032f0c032e13032d2c3a052dfa032c1525052c3a032b64032a640329fe032815032717110527
1e03262003251e0324231105402b241e0323110322000d0522fa03210f032140042014031f0a
031e1e031d1c19051d25031c0f13051c19031cb801004091041b0d031a194b051a7d03190111
05194b0318fe031711031615250516fa031501110515250314640313110312fe031101110511
fe031064030f0e10050f13030fc0040e10030e80040d0111050dfa030c32030b0a0d050b1603
0b80040a0d030a400409fe0308fe0307fe0306050a0506fe03050a0305400404fa0303640302
01110502fe0301000d05011103000d0301b80164858d012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b002b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b1d0000>
] def
/f-0-0 currentdict end definefont pop
%%EndResource
%%BeginResource: font DejaVuSans
11 dict begin
/FontType 42 def
/FontName /DejaVuSans def
/PaintType 0 def
/FontMatrix [ 1 0 0 1 0 0 ] def
/FontBBox [ 0 0 0 0 ] def
/Encoding 256 array def
0 1 255 { Encoding exch /.notdef put } for
Encoding 32 /space put
/CharStrings 2 dict dup begin
/.notdef 0 def
/space 1 def
end readonly def
/sfnts [
<0001000000090080000300106376742000691d39000000e0000001fe6670676d7134766a0000
02e0000000ab676c7966f9f1ddd70000009c00000044686561640d13be360000038c00000036
686865610d9f076f000003c400000024686d747807580066000003e8000000086c6f63610000
0088000003f00000000c6d617870046f0671000003fc00000020707265703b07f1000000041c
0000056800020066fe96046605a400030007001a400c04fb0006fb0108057f0204002fc4d4ec
310010d4ecd4ec301311211125211121660400fc73031bfce5fe96070ef8f2720629013500b8
00cb00cb00c100aa009c01a600b800660000007100cb00a002b20085007500b800c301cb0189
022d00cb00a600f000d300aa008700cb03aa0400014a003300cb000000d9050200f4015400b4
009c01390114013907060400044e04b4045204b804e704cd0037047304cd04600473013303a2
055605a60556053903c5021200c9001f00b801df007300ba03e9033303bc0444040e00df03cd
03aa00e503aa0404000000cb008f00a4007b00b80014016f007f027b0252008f00c705cd009a
009a006f00cb00cd019e01d300f000ba018300d5009803040248009e01d500c100cb00f60083
0354027f00000333026600d300c700a400cd008f009a0073040005d5010a00fe022b00a400b4
009c00000062009c0000001d032d05d505d505d505f0007f007b005400a406b80614072301d3
00b800cb00a601c301ec069300a000d3035c037103db0185042304a80448008f013901140139
0360008f05d5019a0614072306660179046004600460047b009c00000277046001aa00e90460
0762007b00c5007f027b000000b4025205cd006600bc00660077061000cd013b01850389008f
007b0000001d00cd074a042f009c009c0000077d006f0000006f0335006a006f007b00ae00b2
002d0396008f027b00f600830354063705f6008f009c04e10266008f018d02f600cd03440029
006604ee00730000140000960000b707060504030201002c2010b002254964b040515820c859
212d2cb002254964b040515820c859212d2c20100720b00050b00d7920b8ffff5058041b0559
b0051cb0032508b0042523e120b00050b00d7920b8ffff5058041b0559b0051cb0032508e12d
2c4b505820b0fd454459212d2cb002254560442d2c4b5358b00225b0022545445921212d2c45
442d2cb00225b0022549b00525b005254960b0206368208a108a233a8a10653a2d0000010000
00025eb862af5a3e5f0f3cf5001f080000000000d3d90a2c00000000d3d90a2cf7d6fc4c0e59
09dc00000008000000010000000000010000076dfe1d00000efef7d6fa510e59000100000000
00000000000000000000000204cd0066028b0000000000000000004400000044000100000002
0354002b0068000c000200100099000800000415021600080004b8028040fffbfe03fa1403f9
2503f83203f79603f60e03f5fe03f4fe03f32503f20e03f19603f02503ef8a4105effe03ee96
03ed9603ecfa03ebfa03eafe03e93a03e84203e7fe03e63203e5e45305e59603e48a4105e453
03e3e22f05e3fa03e22f03e1fe03e0fe03df3203de1403dd9603dcfe03db1203da7d03d9bb03
d8fe03d68a4105d67d03d5d44705d57d03d44703d3d21b05d3fe03d21b03d1fe03d0fe03cffe
03cefe03cd9603cccb1e05ccfe03cb1e03ca3203c9fe03c6851105c61c03c51603c4fe03c3fe
03c2fe03c1fe03c0fe03bffe03befe03bdfe03bcfe03bbfe03ba1103b9862505b9fe03b8b7bb
05b8fe03b7b65d05b7bb03b78004b6b52505b65d40ff03b64004b52503b4fe03b39603b2fe03
b1fe03b0fe03affe03ae6403ad0e03acab2505ac6403abaa1205ab2503aa1203a98a4105a9fa
03a8fe03a7fe03a6fe03a51203a4fe03a3a20e05a33203a20e03a16403a08a4105a096039ffe
039e9d0c059efe039d0c039c9b19059c64039b9a10059b19039a1003990a0398fe0397960d05
97fe03960d03958a410595960394930e05942803930e0392fa039190bb0591fe03908f5d0590
bb039080048f8e25058f5d038f40048e25038dfe038c8b2e058cfe038b2e038a8625058a4103
89880b05891403880b03878625058764038685110586250385110384fe038382110583fe0382
110381fe0380fe037ffe0340ff7e7d7d057efe037d7d037c64037b5415057b25037afe0379fe
03780e03770c03760a0375fe0374fa0373fa0372fa0371fa0370fe036ffe036efe036c21036b
fe036a1142056a530369fe03687d036711420566fe0365fe0364fe0363fe0362fe03613a0360
fa035e0c035dfe035bfe035afe0359580a0559fa03580a035716190557320356fe0355541505
55420354150353011005531803521403514a130551fe03500b034ffe034e4d10054efe034d10
034cfe034b4a13054bfe034a4910054a1303491d0d05491003480d0347fe0346960345960344
fe0343022d0543fa0342bb03414b0340fe033ffe033e3d12053e14033d3c0f053d12033c3b0d
053c40ff0f033b0d033afe0339fe033837140538fa033736100537140336350b05361003350b
03341e03330d0332310b0532fe03310b03302f0b05300d032f0b032e2d09052e10032d09032c
32032b2a25052b64032a2912052a25032912032827250528410327250326250b05260f03250b
0324fe0323fe03220f03210110052112032064031ffa031e1d0d051e64031d0d031c1142051c
fe031bfa031a42031911420519fe031864031716190517fe031601100516190315fe0314fe03
13fe031211420512fe0311022d05114203107d030f64030efe030d0c16050dfe030c0110050c
16030bfe030a100309fe0308022d0508fe030714030664030401100504fe03401503022d0503
fe0302011005022d0301100300fe0301b80164858d012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b002b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b
2b2b2b1d00>
] def
/f-1-0 currentdict end definefont pop
%%EndResource
%%EndSetup
%%Page: 1 1
%%BeginPageSetup
%%PageBoundingBox: 0 -1 1660 851
%%EndPageSetup
q 0 -1 1660 852 rectclip q
0 g
BT
115.200005 0 0 115.200005 1659.494566 0.0000456218 Tm
/f-0-0 1 Tf
( )Tj
ET
0.945098 0.792157 0.0745098 rg
158.102 787.356 m 160.379 829.535 l 190.289 799.809 l h
158.102 787.356 m f
21.06434 w
0 J
0 j
[] 0.0 d
4 M q 0.380357 -1 -0.775998 -0.295156 0 1266.965088 cm
471.528 27.38 m 435.436 6.755 l 471.344 -14.188 l h
471.528 27.38 m S Q
58.695 757.856 m 80.516 721.688 l 39.07 729.465 l h
58.695 757.856 m f
18.464385 w
q -1 0.699805 0.543047 0.775998 0 1266.965088 cm
-278.556 -404.865 m -310.193 -422.942 l -278.719 -441.304 l h
-278.556 -404.865 m S Q
10.25 623.512 m 41.414 613.496 l 14.113 596.141 l h
10.25 623.512 m f
17.112694 w
q -1 -0.121862 -0.110002 0.811158 0 1266.965088 cm
75.757 -781.871 m 46.436 -798.623 l 75.608 -815.637 l h
75.757 -781.871 m S Q
101.438 509.071 m 70.375 498.742 l 82.148 528.875 l h
101.438 509.071 m f
12.576204 w
q 1 0.937579 0.772771 -0.802194 0 1266.965088 cm
-330.318 558.711 m -351.867 546.4 l -330.429 533.894 l h
-330.318 558.711 m S Q
0.290196 0.247059 0.454902 rg
161.094 604.578 m 161.094 604.578 152.773 561.961 192.316 543.309 c 210.699
534.641 225.316 533.344 245.688 541.098 c 258.508 545.977 270.074 558.094
274.949 571.278 c 279.824 584.461 275.645 600.489 262.836 612.942 c 258.316
592.989 253.516 576.926 236.242 567.981 c 225.973 562.762 215.535 563.629
205.117 568.793 c 194.703 573.957 186.715 586.391 183.539 598.844 c 183.539
598.844 177.09 622.012 201.859 659.969 c 182.059 644.739 164.789 627.348
161.094 604.578 c h
161.094 604.578 m f
0.945098 0.792157 0.0745098 rg
293.059 497.508 m 316.207 512.684 333.766 536.067 339.859 566.434 c 339.953
566.977 l 344.664 591.156 340.164 616.715 327.734 638.102 c 315.219 659.625
293.348 677.164 265.715 680.52 c 265.637 680.531 l 248.703 682.571 230.078
675.531 217.055 663.453 c 202.543 646.313 195.703 635.578 196.059 610.594
c 208.465 626.961 239.875 643.227 262.027 641.047 c 276.348 639.321 286.664
631.18 293.949 618.653 c 301.23 606.125 304.105 589.465 301.281 575.391
c 292.289 530.563 241.789 508.082 198.43 520.598 c 138.359 537.934 116.312
599.153 133.5 657.778 c 160.254 711.746 268.816 729.453 286.945 734.754
c 280.277 744.656 213.539 742.957 213.539 742.957 c 180.559 734.364 130.008
728.141 104.754 682.086 c 53.828 589.199 105.188 506.442 188.582 482.371
c 224.301 472.059 263.293 477.992 293.055 497.504 c h
293.059 497.508 m f
0 g
BT
32.000001 0 0 32.000001 1361.895445 368.012451 Tm
/f-1-0 1 Tf
( )Tj
ET
Q Q
showpage
%%Trailer
end restore
%%EOF

View File

@ -1,779 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg3118"
version="1.1"
inkscape:version="0.92.1 r15371"
width="533.33331"
height="533.33331"
xml:space="preserve"
sodipodi:docname="Logo EOLEienne.svg"><metadata
id="metadata3124"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs3122"><marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend"
style="overflow:visible"><path
id="path4626"
d="M -10.666667,0 -14.933333,4.2666667 0,0 -14.933333,-4.2666667 Z"
style="fill-rule:evenodd;stroke:#000000;stroke-width:0.85333335pt"
inkscape:connector-curvature="0" /></marker><linearGradient
id="linearGradient4664"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4666" /></linearGradient><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3132"><path
d="M 0,600 H 800 V 0 H 0 Z"
id="path3134"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3248"><path
d="M 205.131,405.857 H 559.926 V 579.858 H 205.131 Z"
id="path3250"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3260"><path
d="M 0,600 H 800 V 0 H 0 Z"
id="path3262"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3288"><path
d="M 205.131,405.857 H 559.926 V 579.858 H 205.131 Z"
id="path3290"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3304"><path
d="M 0,600 H 800 V 0 H 0 Z"
id="path3306"
inkscape:connector-curvature="0" /></clipPath><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9"
id="linearGradient4668-8"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientUnits="userSpaceOnUse" /><linearGradient
id="linearGradient4664-9"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4666-6" /></linearGradient><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9"
id="linearGradient4676-2"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
id="linearGradient4706"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4708" /></linearGradient><linearGradient
id="linearGradient4711"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4713" /></linearGradient><linearGradient
id="linearGradient4716"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4718" /></linearGradient><linearGradient
id="linearGradient4721"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4723" /></linearGradient><linearGradient
id="linearGradient4726"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4728" /></linearGradient><linearGradient
id="linearGradient4731"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4733" /></linearGradient><linearGradient
id="linearGradient4736"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4738" /></linearGradient><linearGradient
id="linearGradient4741"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4743" /></linearGradient><linearGradient
id="linearGradient4746"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4748" /></linearGradient><linearGradient
id="linearGradient4751"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4753" /></linearGradient><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient4896-1"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
id="linearGradient4664-9-8"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4666-6-7" /></linearGradient><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient4880-2"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
id="linearGradient5022"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5024" /></linearGradient><linearGradient
id="linearGradient5027"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5029" /></linearGradient><linearGradient
id="linearGradient5032"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5034" /></linearGradient><linearGradient
id="linearGradient5037"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5039" /></linearGradient><linearGradient
id="linearGradient5042"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5044" /></linearGradient><linearGradient
id="linearGradient5047"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5049" /></linearGradient><linearGradient
id="linearGradient5052"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5054" /></linearGradient><linearGradient
id="linearGradient5057"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5059" /></linearGradient><linearGradient
id="linearGradient5062"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5064" /></linearGradient><linearGradient
id="linearGradient5067"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5069" /></linearGradient><linearGradient
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient5090"
xlink:href="#linearGradient4664-9-8"
inkscape:collect="always" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3289"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3291"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3293"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3309"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3315"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3318"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3321"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3324"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3327"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3330"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3337"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3341"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3345"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3349"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3353"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3357"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3361"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3375"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3377"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3379"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3381"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3383"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3385"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3387"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3389"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3391"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3393"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3396"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3399"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3402"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3405"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3408"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3411"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3414"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3432"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3434"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3436"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3440"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.43531,-541.69844)" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-8"
id="linearGradient3445"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.43531,-541.69844)"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4664-9-5"
id="linearGradient4896-6"
gradientUnits="userSpaceOnUse"
x1="1114.8962"
y1="926.69495"
x2="1341.036"
y2="926.69495" /><linearGradient
id="linearGradient4664-9-5"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4666-6-3" /></linearGradient><linearGradient
id="linearGradient3288"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3290" /></linearGradient><linearGradient
id="linearGradient3293-8"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3295" /></linearGradient><linearGradient
id="linearGradient3298"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3300" /></linearGradient><linearGradient
id="linearGradient3303"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3305" /></linearGradient><linearGradient
id="linearGradient3308"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3310" /></linearGradient><linearGradient
id="linearGradient3313"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3315" /></linearGradient><linearGradient
id="linearGradient3318-7"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3320" /></linearGradient><linearGradient
id="linearGradient3323"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3325" /></linearGradient><linearGradient
id="linearGradient3328"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3330" /></linearGradient><linearGradient
id="linearGradient3333"
osb:paint="solid"><stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop3335" /></linearGradient></defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1678"
inkscape:window-height="1028"
id="namedview3120"
showgrid="false"
inkscape:zoom="0.1767767"
inkscape:cx="2217.3454"
inkscape:cy="1337.1815"
inkscape:window-x="0"
inkscape:window-y="20"
inkscape:window-maximized="1"
inkscape:current-layer="g3750-1"
inkscape:snap-bbox="false"
inkscape:object-paths="true"
inkscape:snap-global="false" /><g
id="g3126"
inkscape:groupmode="layer"
inkscape:label="logoeole1"
transform="matrix(1.25,0,0,-1.25,0,533.33333)" /><g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="bateau"
sodipodi:insensitive="true"
transform="translate(0,-1066.6667)" /><g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Calque1"
transform="translate(0,-1066.6667)"><flowRoot
xml:space="preserve"
id="flowRoot4297"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:12.80000019px;line-height:0.01%;font-family:COUTURE;-inkscape-font-specification:'COUTURE Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"><flowRegion
id="flowRegion4299"
style="stroke-width:1.06666672px"><rect
id="rect4301"
width="1160.5333"
height="443.73334"
x="2244.2666"
y="2077.8667"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:153.6000061px;font-family:COUTURE;-inkscape-font-specification:'COUTURE Bold';stroke-width:1.13777781px" /></flowRegion><flowPara
id="flowPara4303"
style="font-size:153.6000061px;line-height:1.25;stroke-width:1.06666672px"> </flowPara></flowRoot><flowRoot
xml:space="preserve"
id="flowRoot3677"
style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672"><flowRegion
id="flowRegion3679"
style="font-family:sans-serif;stroke-width:1.06666672"><rect
id="rect3681"
width="823.63794"
height="107.1031"
x="3003.4126"
y="486.73111"
style="font-family:sans-serif;stroke-width:1.13777781" /></flowRegion><flowPara
id="flowPara3683"
style="font-size:42.66666794px;line-height:1.25;font-family:sans-serif;stroke-width:1.06666672"> </flowPara></flowRoot><g
id="g4708"
transform="translate(-234.66667,-661.33333)"><g
transform="translate(258.11647,292.41513)"
id="g3750-1"><g
transform="matrix(3.4040263,0,0,3.4040263,-5864.8164,-2849.7877)"
id="g4763-8-1-4-8-8-28"><g
id="g4707-6-9-0-7-9-1"><path
sodipodi:type="star"
style="fill:#f1ca13;fill-opacity:1;stroke:#f1ca13;stroke-width:13.69999981;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path3438-4-3-1-5-7-4"
sodipodi:sides="3"
sodipodi:cx="1546.047"
sodipodi:cy="712.37"
sodipodi:r1="15.609281"
sodipodi:r2="7.8046408"
sodipodi:arg1="1.0427219"
sodipodi:arg2="2.0899194"
inkscape:flatsided="true"
inkscape:rounded="-1.800643e-15"
inkscape:randomized="0"
d="m 1553.9121,725.85296 -23.4742,-13.4131 23.3532,-13.62269 z"
transform="matrix(0.22906783,0.6022449,-0.46734074,0.17775615,1770.4985,222.63478)"
inkscape:transform-center-x="-1.8039821"
inkscape:transform-center-y="-1.1274589" /><path
sodipodi:type="star"
style="fill:#f1ca13;fill-opacity:1;stroke:#f1ca13;stroke-width:13.69999981;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path3438-6-6-2-8-8-7-96"
sodipodi:sides="3"
sodipodi:cx="1546.047"
sodipodi:cy="712.37"
sodipodi:r1="15.609281"
sodipodi:r2="7.8046408"
sodipodi:arg1="1.0427219"
sodipodi:arg2="2.0899194"
inkscape:flatsided="true"
inkscape:rounded="-1.800643e-15"
inkscape:randomized="0"
d="m 1553.9121,725.85296 -23.4742,-13.4131 23.3532,-13.62269 z"
transform="matrix(-0.52791029,-0.36943435,0.28668023,-0.40965724,2360.5301,2170.4693)"
inkscape:transform-center-y="-4.59347"
inkscape:transform-center-x="-0.15719734" /><path
sodipodi:type="star"
style="fill:#f1ca13;fill-opacity:1;stroke:#f1ca13;stroke-width:13.69999981;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path3438-6-4-8-6-1-0-7-83"
sodipodi:sides="3"
sodipodi:cx="1546.047"
sodipodi:cy="712.37"
sodipodi:r1="15.609281"
sodipodi:r2="7.8046408"
sodipodi:arg1="1.0427219"
sodipodi:arg2="2.0899194"
inkscape:flatsided="true"
inkscape:rounded="-1.800643e-15"
inkscape:randomized="0"
d="m 1553.9121,725.85296 -23.4742,-13.4131 23.3532,-13.62269 z"
transform="matrix(-0.48926443,0.05962255,-0.05381995,-0.39687094,2528.6554,1547.0921)"
inkscape:transform-center-y="3.4869151"
inkscape:transform-center-x="-4.1484718" /><path
sodipodi:type="star"
style="fill:#f1ca13;fill-opacity:1;stroke:#f1ca13;stroke-width:13.69999981;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path3438-6-4-9-9-7-6-6-9-8"
sodipodi:sides="3"
sodipodi:cx="1546.047"
sodipodi:cy="712.37"
sodipodi:r1="15.609281"
sodipodi:r2="7.8046408"
sodipodi:arg1="1.0427219"
sodipodi:arg2="2.0899194"
inkscape:flatsided="true"
inkscape:rounded="-1.800643e-15"
inkscape:randomized="0"
d="m 1553.9121,725.85296 -23.4742,-13.4131 23.3532,-13.62269 z"
transform="matrix(0.35956287,-0.33711877,0.27785959,0.2884392,1004.6201,1710.9855)"
inkscape:transform-center-x="-4.1631714"
inkscape:transform-center-y="-0.057200996" /></g><g
transform="translate(-19.751502,372.32158)"
id="g3586-1-2-5-3-2-7"><path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#4a3f74;fill-opacity:1;stroke:none;stroke-width:23.74341393;marker:none;enable-background:accumulate"
d="m 1808.1526,986.76492 c 0,0 -3.2597,16.69338 12.2298,23.99948 7.2005,3.3959 12.9255,3.9039 20.905,0.8664 5.0224,-1.9118 9.552,-6.657 11.4611,-11.82157 1.9093,-5.16452 0.2732,-11.4417 -4.7449,-16.31949 -1.7695,7.81561 -3.6493,14.10691 -10.416,17.61096 -4.0225,2.0445 -8.111,1.7046 -12.1907,-0.318 -4.0796,-2.02274 -7.2085,-6.89258 -8.4528,-11.77144 0,0 -2.5254,-9.07376 7.1765,-23.94196 -7.7559,5.9661 -14.5205,12.77754 -15.968,21.69562 z"
id="path3359-6-74-6-4-2-1-8-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="csssccsccc" /><path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:#f1ca13;fill-opacity:1;stroke:none;stroke-width:23.74341393;marker:none;enable-background:accumulate"
d="m 1859.8421,1028.7048 c 9.0667,-5.9443 15.9456,-15.1035 18.3323,-26.9987 l 0.036,-0.2122 c 1.845,-9.47143 0.083,-19.48234 -4.7861,-27.85914 -4.9017,-8.43109 -13.4688,-15.30069 -24.2922,-16.6144 l -0.031,-0.005 c -6.6322,-0.79814 -13.9274,1.95899 -19.0297,6.68912 -5.6838,6.71374 -8.3619,10.91924 -8.2233,20.70452 4.8592,-6.41106 17.1623,-12.78189 25.8393,-11.92722 5.6097,0.67502 9.6503,3.8646 12.5032,8.77162 2.8528,4.90695 3.9787,11.43223 2.8727,16.94471 -3.5229,17.55819 -23.303,26.36509 -40.2867,21.46279 -23.5286,-6.7916 -32.1648,-30.7698 -25.4329,-53.73354 10.4805,-21.139 53.0027,-28.07465 60.1046,-30.15118 -2.6116,-3.87866 -28.7525,-3.21222 -28.7525,-3.21222 -12.9196,3.3663 -32.7194,5.8024 -42.6107,23.84314 -19.9471,36.38183 0.1691,68.7974 32.8347,78.2264 13.991,4.0385 29.2641,1.7152 40.9212,-5.9276 z"
id="path3359-8-8-4-2-1-4-6-6-02"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccscccccssscccsscc" /></g></g></g></g><flowRoot
xml:space="preserve"
id="flowRoot4653"
style="font-style:normal;font-weight:normal;font-size:12.80000019px;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.06666672px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"><flowRegion
id="flowRegion4655"
style="font-family:sans-serif;stroke-width:1.06666672px"><rect
id="rect4657"
width="435.20001"
height="375.46667"
x="1847.4667"
y="1685.3334"
style="font-family:sans-serif;stroke-width:1.13777781px" /></flowRegion><flowPara
id="flowPara4659"
style="font-size:42.66666794px;line-height:1.25;font-family:sans-serif;stroke-width:1.06666672px"> </flowPara></flowRoot></g></svg>

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

View File

@ -1,927 +0,0 @@
%!PS-Adobe-3.0 EPSF-3.0
%%Creator: cairo 1.14.8 (http://cairographics.org)
%%CreationDate: Tue May 16 12:27:36 2017
%%Pages: 1
%%DocumentData: Clean7Bit
%%LanguageLevel: 3
%%BoundingBox: 0 -1 300 165
%%EndComments
%%BeginProlog
save
50 dict begin
/q { gsave } bind def
/Q { grestore } bind def
/cm { 6 array astore concat } bind def
/w { setlinewidth } bind def
/J { setlinecap } bind def
/j { setlinejoin } bind def
/M { setmiterlimit } bind def
/d { setdash } bind def
/m { moveto } bind def
/l { lineto } bind def
/c { curveto } bind def
/h { closepath } bind def
/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto
0 exch rlineto 0 rlineto closepath } bind def
/S { stroke } bind def
/f { fill } bind def
/f* { eofill } bind def
/n { newpath } bind def
/W { clip } bind def
/W* { eoclip } bind def
/BT { } bind def
/ET { } bind def
/pdfmark where { pop globaldict /?pdfmark /exec load put }
{ globaldict begin /?pdfmark /pop load def /pdfmark
/cleartomark load def end } ifelse
/BDC { mark 3 1 roll /BDC pdfmark } bind def
/EMC { mark /EMC pdfmark } bind def
/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def
/Tj { show currentpoint cairo_store_point } bind def
/TJ {
{
dup
type /stringtype eq
{ show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse
} forall
currentpoint cairo_store_point
} bind def
/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore
cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def
/Tf { pop /cairo_font exch def /cairo_font_matrix where
{ pop cairo_selectfont } if } bind def
/Td { matrix translate cairo_font_matrix matrix concatmatrix dup
/cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point
/cairo_font where { pop cairo_selectfont } if } bind def
/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def
cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def
/g { setgray } bind def
/rg { setrgbcolor } bind def
/d1 { setcachedevice } bind def
%%EndProlog
%%BeginSetup
%%EndSetup
%%Page: 1 1
%%BeginPageSetup
%%PageBoundingBox: 0 -1 300 165
%%EndPageSetup
q 0 -1 300 166 rectclip q
0.32549 0.286275 0.529412 rg
197.438 160.944 m 171.461 160.944 148.402 148.244 134.059 128.76 c 154.211
128.76 l 165.531 139.28 180.707 145.713 197.438 145.713 c 214.016 145.713
229.07 139.405 240.355 129.057 c 260.641 129.057 l 246.285 148.385 223.293
160.944 197.438 160.944 c h
132.855 37.463 m 147.086 17.01 170.703 3.549 197.438 3.549 c 223.234 3.549
246.145 16.073 260.508 35.323 c 240.219 35.323 l 228.949 25.041 213.953
18.772 197.438 18.772 c 179.809 18.772 163.918 25.92 152.438 37.463 c h
132.855 37.463 m f*
4.26191 w
2 J
0 j
[] 0.0 d
5 M q 1 0 0 -1 0 164.490509 cm
197.438 3.547 m 171.461 3.547 148.402 16.246 134.059 35.73 c 154.211 35.73
l 165.531 25.211 180.707 18.777 197.438 18.777 c 214.016 18.777 229.07
25.086 240.355 35.434 c 260.641 35.434 l 246.285 16.105 223.293 3.547 197.438
3.547 c h
132.855 127.027 m 147.086 147.48 170.703 160.941 197.438 160.941 c 223.234
160.941 246.145 148.418 260.508 129.168 c 240.219 129.168 l 228.949 139.449
213.953 145.719 197.438 145.719 c 179.809 145.719 163.918 138.57 152.438
127.027 c h
132.855 127.027 m S Q
q
0 164.491 300 -165 re W n
% Fallback Image: x=0 y=0 w=300 h=165 res=300ppi size=2580000
[ 0.24 0 0 0.24 0 -0.629491 ] concat
/DeviceRGB setcolorspace
8 dict dup begin
/ImageType 1 def
/Width 1250 def
/Height 688 def
/Interpolate false def
/BitsPerComponent 8 def
/Decode [ 0 1 0 1 0 1 ] def
/DataSource currentfile /ASCII85Decode filter /FlateDecode filter def
/ImageMatrix [ 1 0 0 -1 0 688 ] def
end
image
Gb"-V#C$t`_Z+TWTnl<<&Yt88b,Xs2W2ka,:g=(M65>*n8eDZ2(mhN?N"B_H["+5<Td>p+.A
<))6]`'+5R]f?:_V:#om[bNcc\tLR=!98HgXVBTBGt8j6i'dBC<tac]?jCo@I=Lzzzzzzz!
.]34EcP)sAiqcX3I.W;#64`(!,s5e=ZKP9VjpGjG[U!^D4?SS0)oG'_AsdcRspj>B!VHZ0u
LnW#DWd,0R#dci1=3U^ZdGoX-LFj.hBC\rto0E=uRLJqe*Nd:%%]!1bkYap\`u6@:BmK-Uc
5g>UMEJ*k$.Wb'gn1*Bef>o]]:Gf<3sE'j1,Z"98E%!&0DO@_$gHB)L'Jd6!Aj>dd-Z_$Ql
d+#\((^Rd`c/[fRU`nI`_piL1([`;HJIf)B3o]8[)<\0UO[:\OWQsK50rk*LSHE-6H(]XO9
!:U!!3I)DRYO1(c,'*K$Z_hXXmCRIJh`4t(:28U0V"0sgf<f6I8p&]OrBeM`L_(SS?0&_Pq
bJMD\fp@Ll=0kq!!!!&6;C;Dl'"]N[N1?0Zn$*)jNrGcH?>aIn(XcMmBtP)dsQq(cBtn\H2
-ejdIEsMkN,QH!<<*"5Y>p3hSflS@s5hHL[>Ke]mN)Ki3l?M/+8!@)GsdeGPc7$nF4f8>B`
KSSN1h\h?j5_!!(_jVI]&NHW"r`s,kM$opdIgQ1As^O41hr(fC25`[kI<^ACIfRIp,&e]/a
3!!!!592!Ng4*5X76qkD[jh8;)k1N:RG:Uc1kEcj;q^`)F]/=2%HqJFjlE^Qm!!!#c/gi%@
k`Kr0(@N15CNtoc;jI)4o!!?so'>tn[.0o?O'M\)ab5S"4;\%u!'n8<1F6O,FSrf0c%?8Fj
borfRLUph%NDc/FRI]^HVa4c?iU0,!&!GT;Y&uCZ%2q<ICf#1hY`[?*e+(&$^re]mImKgj;
Vg5cSY\&!!%8Jo^o3eHV]A!D&UbOQtBN@nnmQhJH:lpU>f'L1K:!!z$G*=?SD2;1:qmR5>?
\hkb/8-_Y@)?*Lf5KZ.nB9C#ljr*TE%PGHZe#)BHQ^=D85";1#r@Lhe^MUT1*Nrm_,-TXSQ
`:!!!"\5NV!0iXVLg$/3n@lZD57Lq$9qm6#N'i49#;:Zgg#WBQ4@!!!#/]GoJO2Qf2&k1B)
4/]T=/42duEWO;d$OisIW*PRrY2cp(\!!$-aE`2IcLmUL,6Tc=`.;q-jT;?\jOi%AU=M&>*
NU,@D(]XO9J<p5$ds`IqUmF%`SrNZdaX0cnX&i1uTDJTg!!&P1L%Ep6_fl%SIB`:r64.<m>
ohRAcLRgDP:kZfrGDT8!!&\9okUP$(C]Lr3H^d<Y'L/Lj4S+aT`-*M<po(]WrN,"5f&SRQ*
V\bDRe#eekLD+.<3eCo'dSZE5C]0Z'cK_Wo#N2!!!#c_IE>eULXE.,!3.KX1X&r@PAfc`s%
E.*j[@\0@-Bh4Tk`b!5KRecWln:gP13,3Dk(^+N3Dao:!="p6J>fY,d"9!<<*"YYf"Ep82s
;#PAU)hCiD<i4lBcm_lGohlqY>[R\;JBBQ:DLB.AT!&3^)l,t59S%`Vn??rFk`(ojnoFD@d
4IL.[ot(Y5!!'f%V5It.MqmLOH^=4,6&<E6W*dWc[0JKD\]GHa!!(qFcCML$II`g[\LeFCW
:=Wa5C:C>^9n:J!!&s/Yup]fs#FoB6I/-dCB>[%e&oSSDs625qbC>)+#!Zp!8puDkuhe'mH
`SN](0/mL_HZ;5GtW>Lri36;Z0>o!!!#i^Vk1pB22aU1J\>)NL-RCXQ^ZV?+cm->mgW4!9?
qrNh#\[]%F?OTCTrc+YK#1NCWi+>]qm]U?ZqV!!!"\J&E?g45=J2o$ooI/tG<,6=P,Wo9E;
U!!'fH\N+r)2oP^B@tsR94X'VJ"*t,hgN"PmO0T)m!!$+E1F%6X6qm>M;j8s"$-AP0[e&"i
jaUfPjf!X3!rr<$c7V7CCJ!`MYM+q:^5OEbhrgV=:0\jSS$!(u!!#,X7XEY6d%0f-66)LJm
/rY-h49t%Xniq9!!!!YMp..H'bN00WN:KX:.Tq1kI)&@_fjI.!<<*r^sPpaEN4E:ApigtXm
'PfWilj3!!%PEAS'sS>J."XgBl#hjb/_Bd\U6bb%5p?EcP/e-NF,H!(Y,RZYW`bTUXPDj\'
S[Ldl]4T"8LN+U\f_"TSNf^33oQahHZX<5/8WKG[DODSPRpMGnrbzb]bTjEQF44PV9QR+ZA
Cg5Kl<=n?hJ]#QOi)@#d%@0)H)`XF-F1#a('j,G.,I=nNL5!!!#'h2U`7;^XuAo'fSl\gE)
tP1GU_cBtmq,ro9(eHGpQ!3f49:>UkaR#[cuPV9$C+f<;\Q%+&2:2U+A!!!"#&[O"e].SZW
(XdsJ]B9!ne+^j-W4q*g!!!"&cCDI.CsYN1Me>A4_r<a'o^%trWinPc!!'gJDPgsgR'O/Cj
,qL9b_-N4Vfe2c1BZ7*V.QaA%KQP0!<6K4r3^fuD!/5?PV8:.+UZ\pI=SgAL^O7a!!&\=l'
"\kqLp>)*YUl1,X1)Vcg_$D!!!"tOI;4oHcF(V:&'Mt+YJil%bt*S-DT],DpHSN<dg57!!#
7b'!j+&H`&=8(Z'fVVp..@->d'2X86!'!!%QIn']/o_gN:L?N:a+>TtDA??A1V=nQnF!!!#
p;dQ&,q9n*dRuL:ZmNmOr:cbs#]6_G&m]$Bi!!%)24`f^lIHN"cmLhik1d_Jk4eHsnop#pc
!!)g\DJid*fZpp"7k7s.&jfhai\D--GAD(kT'E?p!!!"(f]eSkhS!PN?ec8\nkJuRS='q<6
1qVp!!!#%-RU9#FRE0N1d_O'4lX>a0I07qA5lq!!!!#W1/@amnV8/APV6SS+o++rH3Tp(Q)
+7k#64`(B4nLI[3?flm2)O^Y@%Y[q**e9'-=S<09?#1!WW5Y_3-G,)"Q]LjU5-V8:eq!^2k
oGqd0='!8M3W<1K;Q^[h%I+f#+86d'Ib=7&q7'a+L:J?qe\OZ)Kk--DRRKTH6VE?Ps],Loj
`!!!!I[O:pt0'rb*Y>,BI7&3JfJA$:B<*pFB!!&Z]G'<;t^ic6.e?;M:Ia7,V-U:ogihA8B
k/Q2H4Or%S!!!!Ye:khV"*t,$?]Gaca91JYB@b$0f2Z0,!<<,X+PSdrl-OI@nl7(]eu"/d#
nTV(UZ]/S;/rV>QN.!cYck.0S>d/GPqP<-+iId,,thLQ<*q]f!!$CCB2;n6U&,8[CJI2%Yp
t15s*!PSA^sjY!!!"dCua4Om@0)4^=ji#8bf6gX%-F/2Qr0AI2rIk!.[)8ZZE%'?_r.48I-
K&R6G>-:/7tWCFT;a!2Nl1SFTUNfuhp4KFhTb#4r8:FRb+N.k:T"!,QarhoX/\-R`>%&jhD
2&XTnXqbO3*^&e97^cE7S?f?od[drod^7HU'&CVjVDW,"c`J"d%!!"Vp,<]hdn8RL484!Te
CI\67-oEkLobA8C!!#(*S[n<>fBLFZO+\)(J;DD)q8@'KYIac7!-kI@J"6$!oN/bE,_Q_a`
N,:(J\<F2?[VqT!:Tt=,@^El.NtSfVKLp]X+&s$qAKbB!.b*7S!+XJ0iIg6OUshn7U-/:`D
H7#(]XO9J)*f?nF<*RI!nNk+j0Cpms-A(l)Lr0!!!!&gA/[&gae3m6LNphc;RN28lC(S"on
WOTX\&9+b\XC%P>_XbG4>Q1]RM@J[9gurmm'!.UNXJr0.[C`dZMcd(@W*@07=))'1ta6KIJ
N)]-cV^+pmEmAbS3Rh"nCMA(pJ"+*fj`*^$<e#/?]?FYG3-PJ,gq7hq39b`)%DbPcX_(?T9
M*[G_mgbo#20euoao3e\q^rmME5@'2_;2aN[qe$.q<jIEPh&PuDHLsFolV/Q!2-!h=T2JXH
].G`+E>AJeRj3DShl0!/..ma))cEf`jH%?KbS\#b2nlSX;nVqG%O5;V$kn9`?jr/NaKD=hn
kJR8`NkJ%M%mTrAQnr5\u?<Mo5c4!!!"BQ(*srEU4%oCHph>C#*=\pKa\T2EEX5h27#UQsK
5p:0l/hbZ9/kg+G6?j2@Q+GATFQD"4[mP?*V8g>f4_SrM77eATHR/stGh(B=HNIaZ\#LCIL
]I+:`W/a]$ena82Kd^U%N@6:6.*(rD<2)i!0/B]itZf7%:hmiBqlkpa2DscCqMXk7CS1m;8
/kAX[<.21V!!)(I=0JFllT%o>HB1$Q\p7!knaiLNZa]:WMA)Q1_M9'0^\"nWj$sd7YMMKZq
M&F2(4OeG]^g\DS0:,hQuV5.MX&Y(!!"-K3HOJk-mm)<H:1cEZjR`=',EWQl^m<)Y?t(*I6
P6*o82)-CcF7]b$+8jZW]<HL1:BGhfP6-qBSk8!<<*Ra-#"1gc`[LZqrmdmBlHRlhg(nl''
^eD*4&)l%\JE0V?G3auOe/h"%;Ra,Po5j1tmQ?EO-d*BC%o1^!dYE-Zs"rj.$Z1!3RA_u]C
EjQG?Gf">.Tp[1UD:ZH54G'EmglE9NpI[e!If/M0C++<.9Zu8-?h]<i8$31'6]BC9Ug3tbK
q7;U=2?3Sp@_h3h4/1_4P1*F'E<V\BXPsco#"3Y%3(`op60t$u9h'!SE^]R<#64b^OuBM)D
;CS_dH/]%fja<pJIB?4Fsb.7:jo(s?5G8"?b:(1R,R!E4i]!9<JWfdb/8/bb'g9c1]RLU(D
F&e(XI]WB+YC@a7"Wsc/3[q/ho#?]CNO`S=JBPZ"HC8DYgM/T^q]0QlGRE>T11PodL(F!8o
Wp"`IGUKHk**Q&"7Y!HV=1`*?&0<deSrG%XQU?8R0/J6p(7cR<73B$],NF.<41!45l[QKaT
6.poh!q6Xikb'.ggg/\#f>Ye:H>/<n!0&B\O^3dqO\ZJ!lPb2PU5(O@l.B3@J!"Y9[B:1`&
L%7)?O\,F^@n-8Hh6Q!9C2/Lg'+4GuHm<M,lM\Ks4,dC6\U(-3?Y,q1!WW5U7o[ugdE@fYe
qe0Wjl%T@b-ill1,H7:T1X(0e=.=k<poofh`8j*_ZCQo+*ftgljCHY%KHKJ2_(ink52=16g
&>]\o^=48He_)Bb2>oo@qPhQ(OA\L5[&`Odhi<qBQ+B!,r:>U.uR(]CH[TYps(Ordb*4EJM
i>5(2@2//F.'0uW>(TuC-q-RuAN@tod%k"o"X!'igt<^^D&UjR#K%&S1-Oi)UaG!s;\BBQ9
YGMqgC1U8sCO8\l]$ToAJT-]iG.,Uj8<<*"qOGUBlB]#Z/=(T<@\p'SU*k(\:[8b[h%:%5U
M`3t7DYgBXGibhX0bV6pMfWq6CFB/_:_8J@3c`jcjm+Xq)^"PE]=&gAc74p?Q'J[ac%5lO"
Xu[4M/Gf]Z@q\F!W[b&7T>t!IM'_(@RMGXRuRsq^&6B:9<(c'j>RD8(BO[_`<iF>,UXKJo4
p<S'`\4J*#?_);oZ"=^'5em997@s_o$Yp,c@\,;imVW^RcoMZYj*5Q(RR,@@9)u"j^$L!!!
1R=Ro.X]LM_^MqfE#7O*Wt>d/S<ERpt*R,"4ED-N%ue7Z5\o:J-!djM9[H2mpFo"@%>2_&0
YOaH*@aD]ji#X7#OKb!N4q=@DRQ+n-VrL#NkKBfcF!!'fp_WG]6^>^>\Vfe2c'?@7H4F:*$
W<)q;Z+.^a5;2SDV#IJ^m`ta`>?%45!!!"BZ#!"=o!K7DPI=hWRPo0YV$kmTT,5;V:7\mOc
7boW#>\KFU+BWT?1iID!!$E4[4D"Aq[k2Iqds>iVld^[,t7Ju!GFKcG\sbdau2s`.=]O&gK
Ck'YNh;Q!!'ek4/1^s)t@\Up$'hDgt^g^2m0'X4sL'&/ghskS@Z/r(N`[MC$"<_F5'RBB*8
27J-fZqS772O4RJSt%LLjRH8@q]klB?[l-bQA1!BC90'*Z]o0WaXX$.O(!!&gb5+1Knl*#J
G<KJF@p1&i4oDMVK")#qb&LXpUpJ_/hLR-s5i\.5o(B=F8Ca>Is5JN_eHqdV&1YaAEoVj+d
-N[\Q_m*kReT[&E2ci:?QhCFrcLViZ!!'h-,i;/iY"PGYePq*ZGFr#n&+[P!jBL"nNqMg$?
25GA^o$;H;m0P(<IGV_!!$+E,<a5^pFK7o67l.i``t.RFU?h8'kaeM4p_3NbKI5n?bO3ia%
=G2F9OK!^C*Y0b>`m*!!!!9P+.[0bM\)s=&9&SS_Hnq>lKM'rDfHkJE(0OjXck8X^0E'b27
^Q0]H!&S'(s?!!'NZ^kn2rf1lK$SrNXL7P@P/:02l5!B%#b:(_CFjmU+hQmq&sWBU(W!!#'
GK^M[NC+<m7cn"ndd6uMT*`2=`r_pMBrMKKE=jRedBUA!/%fcV!:cl-,jai/HN)qP0'bN0G
H$fi3poiJC4Ro<4csj*I[qEO6B;6&C2]YqIj8f5\*[(IGH+k3Z^h'4sPjtgLLbJ6_Q]mTQr
5t4'*>`_c(]Oh=IFnQ#!<*M6-LB/E5l"$OJ7LpKi+$bS`#$d?@.25+H!63&d\U6bV2I93+*
.D^JH&5;bP\'S%-;9#Je0S2s2a;On.B$CTU_P-Y^,!W1`<.fc!(b-]A%8'W>V^s3<0&pIi_
bV4![f$lDPh9\51c-.k.J/38f*XT1g0M.p2UO\0,>7TS<;$)?9b6DJ%ffjm/Xg+"pFiNGB'
)51G)jbK\:9'"Xk*(]71]m[5q\KBf3@!!!A5bo:,WYDDatHj>F5:.eQ8W.Fm)6K5Br"6M(_
;s4$o=E?b#T`tJs"]Rhd"`EU@f6$X)[s$:c$_O!mb[[n[`7q;?o.eDFi;#?L\`GIE!)VYN[
FD?"-RiC1jl?+G$,(AIDkR5UOa-<ZTRJ',hra_ohfP52r\^DG3!0/2![K-@G>Nc)GkOa"cZ
+>=%^7mM`NhURG?[6B@^cd44"!*O=7pP;!!!2A[#(hX=MoNhIM([pnaW3sY>>7T3LOic2pY
I2>Gd?dV>:H"!.Y,Z?0"32/"_3W<ZZ^Jk&99'%Y01CAnHrVV>L[^?PC!J&(O/e!!))$7us0
Ue"jcDb/"S&"n()adZN0<WXgaZE,CYnoCDNTIsK.[&c^"05K97Y!!%P_ge>iRju$<;ROA,H
`6X?>P1*DQ?D*t'S<V5Vmd1VV0+RNU&(QFO!!)(I(<^'66Ph7[mGtU\DDEthmT']+RfT$HD
Jl%j9=FE\;gr`-B,U-DM!H#\!&.]sU0Ypn3Vb3h]*'J!?Vl/Y!Sf4!^o;65n>%Y"ZTNWEl2
qCo!:lCbEJ^feN)[O4a\VFK\L]lq;tY\Fn6d]el+[X5W;JuETCSU-W#k%.WW3%7*2tkQ\p'
U;I"dc&,*ltZ=7&q7;uu4(bHlj)D=VM=rh>Nndc7AWia4+6%kI\\E-W5B?R(=X;80K\2sJa
S+R\`%eOL@);*1N3g,C+Kr6g^G,6!;5(K:D8J>AGB1!3QTq'Ot3B3i'<UABrQYg2Ks8Njh[
Wr)p]Do*;i!<@Y/K_Ppl^F8SI7l;ap,F;tRAue+k!,RdhQH;kHbt@:K,EEj*VtuJV!!&@MO
e1+hT@9%.BC\>lH2*)Km8SKr!D'ItrXs-[^8>X;\p7$4+jg8i^]n;(LFZ`RjF_Phm=/O48_
"%ZJ2qd@`I6EKXRZ`l5)A+C`I'rd!!$,4c-!`Bf.d"C5BNN;iV[iK#8;WU:7k5Fd@%2;RZQ
W(q1:'r!&3\K_PO\87k7r^\9^US>EY,?V>=R$0]2P=W<7GM/&008HJ11nFo5pIl@TBC!*m<
h^5i%!?UpC+oZ:n>o(Y$\ODftKV=3>=jd-le:\RUH5nsA"kR/6@>kttMV;p6B7-NF.WXg<S
]?AC("AXnTIa)m*%/3oC(K:D8J;+MK%Ob\h\9(o"poTJ0Vtr(KE1HF%S]\,uXrb<M$31&Ik
00gJm@0)4^0G[6Lf\LjoUi,o,616g\Fs=r-6nd_Jm:7oeN:ne;um!7I53UbqfMj4q-(a[o2
V:Mg]dm0YkCKbftKIrb@c15GFEP.KeKA+!.b)ZZN!PYWta/[O0>E+T"V0#(]mOucf5hQZjT
]Z3HEpapBfjfWW3%WNi7qmPcmkf2uS%,?+YD]oe?TBhM(RQ^ZuN2r1`8`q0ctal=1)"!1^o
[`+pAsN`3YOERFQ+cVI3Y<.,/U3/a7T)2%d@.).ULB_[0/!!!S9ZZ>p8$rXepERB^a&WrWT
X83Y7E%[QHfo,!2$OPNTCrklVHW;.Q!!&[Z=:Yi('hiF7aNR?o^-`&(zzzzzzzzzzzzzzzz
zzzzz!",`i-SDNWL`s2Qma,+e#7q'dPq+:f2]X6R-13I*>6"X'Vm^Ni$3-.2Li(hVl%nU,L
k=j:itmrPr2uMhbP%kuJ,fQLcpCBj#qZlacr+FA9*G:qE,r<bRF"j*">*V#Zr@#*!%190Pm
K#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P=4F<@5
(P!!)H.cH]HR"oJT1iZ>I+RF"j*">*V#Zr@$UEr5Rtqr!);cC[>ii9b,fAK<gR-nHpna2b)
XX&^mgr,SoC[2_:6#`4Cpldi0W5CS"3Y$Du'BMbj:\]Di_eWY#+ZrEI?;P=4F<@5(P!.\6-
0elHfq.-0cKkf2?H1'HJ]5Hrg[;0jGbk^M$T>(*[MsAin(G8t&d/PDLWa.!&gGX!,4DNBEc
CI&3rV#!,5Q5o$qp8705tdIL/JUn);Ir0f"TTqb'bs`K<2ht8Uft0@#mgq3gYBf.)t,FJZr
G(mrUndM%g4KW*jen7cr-P?/QF.);uhFuU,,",fOO[*PH%W`*^>,/ITrVE3WiQc[:lNpTqt
'^>,k80W;loE<ifD#U-shC2O*dob9&ikclO.&V)eodWjQN>181O2$!O?&BW1t3`sW=c/R#N
[7S,%5[VU&-[-?>AV)eodWjQN>181O2$!O?&BW1uncX^X"?G#=IV+ZZ%M7<LF4[!*D]`-O<
\T?T_h6fn5:o6pS*BSG3]4kHKPG"aUMj>h+=t5c0V94IW$32\(0/)ehn`(2n&X+S<p@7\;d
A'4\VG5rts8CZZCHq^_ZXq=GeQDO3/6T8neZ*Q%q.B6\c272"2g+E8SND$V^:a^T#2XiBh1
p:Jd7;fl?Z4rTBrOjZQ>/!TW_@**:kFu_'3Zjc\:fD8#JU01gS/C#lurZE]=X!X.L+e9AP6
oYY.aR=il$[kDJiM";!dc<eZ6r`!%l_mcr-u799ff8'hZhNAO9#n!132a^\uEWEbC#^'e9b
20]:Tg@s6Q05<hBe-<@3MYpE&/QnenMWfs*P>)S[r'3ZlMTV]eaQ3mUE_#Z.\[_d_+[r1"_
2E'.Aq0RI8CM`Y-Vk5"cA4Z7M`?4dYMA@eT@)2p?C!]bK">//-ZrEI?;P=4F<@5(P!,r5SC
T4eR]=[h%djHFf7=OA7Ma\&NZ)u`fCS*_7;Z+WW4*FT%:uPi4X@SHt1M>!tS.%""8^LA;78
&mP/JUn);Ir0f"TXnIi0J[nN>a\Jn)#cYo<)B2C2BV5M\`:kWH\@2fs>>We>`&D5O@Op2LY
FDRE<fRSHLOp>-q7scr-P?/QF.);ugkD8m5u'>;n3=\T4Ojbbn1)p:ueZjn/9?cHFDCkKdd
OA9`BF4n(s6PUNeZlW0Fqcr-D;/_+%3<12*2T`crI-F?_PE!`OJC8"kfE6Xh/16_J&n[X.n
OH:$5*uR:lr&kRl&c["$U.$idpktI'1h`l>U8?"cQ3npOWA:0D!e<p?fM[FOV+W0],fn3E=
0GqS7]TXripPX7FamrPW`<N?GCE0V<ga9L7S@k:ZrChg;Ir0fKbCalRF"h4^a0h9WUB3BAc
KMXT7-FtVk:]8le1X,\)+^re%*JTTCqjK']Y!qEotR`K0OMFfWgl&CPn`&0OTFUS%]gneOe
+cX[PmJ#qZlacr+FA9*G<^T\EB1f<6j]T>k/^Y?nm\*?@:]hRjq[r:.JphU?`9bJOGd"j-*
t7Ri-9YHR^sX+!Z7gX"3l@^4!jq@6]/PG"aUMj>h+=t5c0V94IW$32\E\#"QQq<(cf.,*[^
=gQt0isk$#[;tBO3B9*Cg-NcPV)eodWjQN>181O2$!O?&BW2!i&km5CG:Zn&Ug1HN#)d4a7
"i,Jj^>Gp-UCD5(+iN5ZrAG>99ff8'`_KjrE?5jkF[6)WD^]+95W7]R>F#eGdLEt5teU$/Q
F.)<%(%*PmK#W!*k+]>H4oWs*c3M<%V+MPW_5&S"6*umFjE&I%8ig>3beHf@/0r*4@l*iX@
F3k09C;aiX85MHOVl181O2$!O?&BW2!i'("FPKn''e?b.ghLlRL]gsD<:<u*GqgoFM[:HnT
MC=T?Pmd>9'03Y_r[;+511hb7JGOP%jE)Bme[ri48/bSc#dm68c?[_Ut>Aq2tcWum0GiB%W
g01n!20S?=?+Y:%ge1e,KS5#H1M?FKgUC%T7Wn"GH1AiiT7?k9>.&+Ys8MmiRPYm=B[H>3b
:d5:I.r[]^86^.l1S9S_$;'H044_HD3ZYT;B5GNN>qcipoIW)`nDAZ3<h'8-F?`#5tdIL/J
S7jJcf1k;GrZ+M:u/G6m&[Nr1':I7>hq,G^'oO;FG^Z[u'p.n\l<=Y3+m/9((MPNc1n2Bkc
%n9mc?BpY=QZ%.89"b*Dkumk7kH\MGtr\T?q_q;mq]2/3u].<3^!rqPLk1M5GAoqfQ0Wi5h
-&J="R.TWX<_:QGDl-`mE?:H"#lU\B^RF"j*">*V#Zr@$E#nCXJ_FG\rUq;BUp@bq<f^.tk
ace):pY9foCVp%M=0Ff1l;TKuj:45VV5C/g%i[FnWMc>nD3m[Yn'\%*;GrZ\o.cA@d,06BN
KM!)\=_u8!sT/F#?:S]agY6-`A2f6lk`uQ_5<S!58l@l&/uR(at"g"Q7<PO.[6U&b(Q&f!%
u)B/QL:*h5,IR%NVVh1Fam>Puh:s\LH<.N3d*=(7?1b=A)r-C/qZVe`:rMM'nl#%1P1+8u<
0MDq_R4O$33(r2satCoKpb*3!/OY5C+E'E@gAs)$>jnn$0GAO9%D'!tW+cr'n[,rhcu:7aR
NGMV,gH#nV5M+6Ogk?#04@JR3JLRXd&\$rikXhb#i2('bAP^VSamkphhs8M#sPan,RPa%D%
N>e4p?Q*HYlKm31++<cY'.;85@70/N=e_b8KU)rkBW3b\V#l0?E(in>bBr%[qe)OLAn7k4o
Q1TS&!L26]p^cl@bWJPm+kPq1G`7DCh\r9ma@qig:Jh?^3mJ7mFq9d[0O"JV>C#`fjd3glI
<@jor>PUWE!W2181O2$!O?&BW2!i&ff@uVb`qf]3H-];0SP[e5RZ"EL$(YVk8hjD!__d[A@
JHAVjRCDjPtMkpMt`-7L5ejioaA[,8%BcaK-Sn35C2q=s!2*Up;/LS:QeKU)rkBW3b\V#l0
?E(inF5('m.>.n4RG1qRN/=+kh>FX+N[!6nC>5L<^qmFqd]Y([igY-e"h;$d$04&JLoONao
\ODDlG29S'g!EVE9UK5V=nV1:f,h-"&[YN*cr-P?/QF.);ugkDNbPJ`3d&kVW;#N'6[K@d+
!6\-J\KO,7pEBRp1pWP7Z;<%r]^/=PP71ae,^Q9rpFE999"gd1B)qORh[P\Gh]ZDG']^ed8
FOB98+"c<12*2!Pg!@VPP3A/a_2q@l6`3M2?4rG;m8&J)Z;4hLGS([VacVo%U$9RsObmM>t
QiNu'HUr5]I#et7,#WFE%?5*eXeS52BJ<0Z^qd*Sn![r0j&@EtB'rVH2f<2l%s?1-:GRgh0
\g"E]EXh>C1fU"XAl?IPu1i:sRDV_nM5QAA*pQDh^V-^cWX\+j.#"O.0[F]eRHpU.d`5s.5
mD=PbI=6NZeZ*3Ma(s;0XlKl,ZrEI?;P=4F<@5(P!,r5SBW9apD)8Ii?bUp`_a__lbr'`u*
Dp$E[VWK``JXO7JLUj9h5t\W`^[r[hL"]Sj83MNQ7=r=)fNAtA?)Ar*^4uH@=sBm<1uV^h*
FFL5(3:7[?It#]6<QM*JQn7C=K1:@D[\=kK_mJaMj&RkK]XQW`?*/`JPNQc)R)`ZY*&YA(I
_aF7nhK%i]'Feub[^)Au&ekH8Nu181O2$!O?&BW2!i&ff7r5Pse'h=Z'P_M+2:OrcMJE,`%
D7=N45'fU!`UcY2[bEeDF>LplG^]4;F_0r[\9:[eIL@,I=[@B6uVX@8^Y?j(aGl.-tA*kOY
',MHtj?Z-#md@g'^A%Y]_u7NqoBWTpQ75a%G>.$K2)[ADaKP&Zp$.g-Q)-WCDJlV>&&#aNe
lr@AAg1EY9PCD%JsIl"=t0N^"FIW-8WtLc0$Xj\H61,E7M$m-fk6r-*MGfR$@i'NVnlO'fs
Bl3`uinR;`$Rg".J(EF)l;CpKDYej#pQ[eX'Tg8UJ6njiSI?K^ukVqJ4n'?PN#!n8PF_]mT
X]mYb\iV7(-h8p?GN#7i^PROG1*DADiKhhg(u/QF.)<%(%*PmK#W!*k+]>O(:kP7?Ao`n/i
:@=s5fL?eb_WD]Q&*&q?Vgt&T3BB2!_#4H89H:senJ%k@+rr);8>;^#7FL:HgY?\WdW\J@0
oB&alhamG7pU=T#f3a#5HWYnPou)\#\u0Fu"q@ZF(\G+Nf6"bS4D<(a)tmG>/QF.)<%(%*P
mK#W!*k,H>,iupiWlk]^8"f8@M^Y%Gh>j]^]2%9#iisd[pbGJqtAP\\RW[?7YW\3V:M\K:O
BmD?@'_Jhg9P2dRAN8n%\nZg+f]E&e^r9ZJ0aW+gY@P\$rj?39$_sFm>4!dgHKidN2HL6Nq
X"99ff8'hZhNAO9#n!1.)&9?kT#M2mT;3HF12YIpSmjukbLmej:D',)%%n)Gl)TP^<"9h@q
(rS?%7O$/f#Sut/>\Lgg'G29?=cBp?(L0`ZJGH^_E[;+6t@9BQIq'<'O:Goi1XHm&'H?JUp
^AdtE)l>".-1-%R(F`8Cg9k]SN,1:RW_@**:kFu_'3Zjc\-1WRqX1uam^^Z@9q0_9>8J%j(
).JDj5\Uf;lBKbl\e*-4k'RjT+Y/r@FL]$AW#m]F6:]OH1sgi*j%N<OmdafgJTCpSub(YWD
]QJ1,<\#jl`4^:1Ifn2`FUjD&_.6MoAT.I!P+mHh#&kD'%T!QF_SGIdKFSh7Imc2T$"F3bX
SeB$D7K7^`aX<@5(P-p^Lk#qZkl>_6id[C:u+-Yc=NpP(Jb55OKfRl>3@r<jDok^HP'gMaj
W*QQs$g87R`mEo+FC1ZuhGO3sZHgp7_BU]7Y'c.[a]ldcA^k"D)Db<Y3#RJcuUgh<#<dc4c
DH!H.eK0+n\8es:C`?QX9PCD%JsIl"=t0N^"LTi3e'h6BH<%"HeK1E$gU<9K5f8<c[5VOT:
;>r"eE<HR?@0'De#1s5^S=8XdN1M!.*1PeFbPO'Bl@:5M2AK_HrF4KDNXD;WKYR_e9u^`QS
)Q[*o$t,<12*2T`crI-F?_PE!ZkUlML%bYPi7`Unf9l5pf9m+Sc?Q)`CB:'CP;V\mJ/hZ)(
dAIU2]K\2$3bk007IK+At`eE4Siq=s_uDnT8X@PU`s0r:_\qWb-8K@k@VY1nsX4fU[?B:jT
aoADO"V94IW$70Ab181NGJ4i_h;B%Q4S<fJ<4h$tDGNt2%'br%j$ER@76?aqMNp*Q59l-du
^(fhnjjhm^%2q(M*kY"(*g/1UL/+:#Bl@;Jp._Ek<8DIp2f.-nk1<u7H`=Dgf9U[cX@5dI#
qZlacr+FA9*G<^i:rUAUe$WA6\cS*cA7T1V-^oc?1J^iGOD!h<`Z>+V*0Wk/ToaPAO^$!qe
4ZgV;t:L621!$X]r9#).1+S?Fb*q][tRI'e31EGm19<99ff8'hZhNAO9#n!12X%QMT!!+!!
=[^u4"fNutPg>-VPUjBmK)ltkKllTY$]`0NH$g,(<d:ci@?W0-_1qG=B/p6t^+-%D+/hbjt
*3b7)_BoCE99?XsLetT"`KU)rkBW3b\V#l0?E(ioIF)u-DTRi4q]%h/tnDW*=55!E(VS!0\
9:")aORBSb9l-g.rr1K^\7YX!P>@u]d>*&<`>>qkro9&(b)A"2;KqTdD;K&BM\7=.aLhT*U
8?"cQ3npOWA:0D!e<qJCJ,E(oX3:W'4pdraceX,D9.e^g>c8<?JUh^iL+>MdGE6+&L4YQ0X
7J>G&r"Ws8D\g?dXY/<iqhaepmMW(RagT>O%M+>>0AmD,R0#&Xc_9>-q7scr-P?/QF.);ug
kDVRP&QV+T:==0H8_T(D-k^Nf:CbhR;EC5j,h9R.4"<N;k.TjN<J<I4i^>O'S/6`k^Sc1^t
rT1cqn%ooGu(%&.'r:A5ij3+p]p$:5!pKH;1n])`<Gm19<99ff8'hZhNAO9#n!10A5;P/@-
aThcHUIL5Hh9rQ<8'sd2%j!iNgphY$k&'"i4Y\\=@^2:X2pi)BkP"Ps:ReX5h0Za0qtk/i?
t)e%oCLEPb22K2pS8]bC1qPaLECu,).1+SDV_nS][tRIcTLfXbU['Q>,k80WDJ24.MGu8!4
W0fQ>5%/XD-/^L8HEWi60BieU9Vq?soZ$+==Nrh0VWES!TJ.oS`QB[;+7?hKnA1SRog-DlG
HG1$608[P7#glitj8AO9%D'!tW+cr'n[,rfs=SMtJYmZLoNTrYbfP*0pr&fr*s4c"qH2'aG
8H`4f8$ig"^O5>&dAB>J+QW1kX++C0%GER.eQ>``M:7TZP60Qt+U]"O!ET>'\]E6ZYV94IW
$70Ab181NGJ4jkDQ>5KeQdO4.P$9[34iG$\pM(4J@S>5l8iV>"]]<D"ioT9u]k`e'ig+M^R
@0JS^KY'PBT^LaSI-rK-F?`#5tdIL/JS7jJhsmcF6Ch_cV9cjICeK?`f(e1]9TEuYA+SW@S
?[kcTcR8ZY@l8ah:_dnDM-oH["c).@\AEDlH'W$5KoQnb)R_H%sV!Q7<PO.[6U&b(Q&f!%u
*U>H1N6I!P,DFm[m_EYGQZ\(9D([;+66#;NK[k2k^hhT\VKCUp!:-8[PYHe3q]F6D7>^*tZ
,dn`3Y*i+)Qju1Q4g!EW.6;*"FZrEI?;?=QZ3-e/6e>SN'oZEFLQ]mVCoD#;aWOeA!<NB03
j-\IsKt;EmC6/)_^]3-P>uiI!+[LJ,KE_l(fK?ks/TnjZ!SW0j-rD0K3SEOd3Ybhu9PCD%J
sIl"=t0N^"=J,eUIL6k/N'S1YI8`Sfs>>WN^%7+,i*H^>H1\aG1CG$DJj@^naSO+[6bXe7J
HD\@df=!5Ao6NVR4j/L^<B6"EESV2FD+E99ff8'hZhNAO9#n!12X)/N#.5::Dm$G^.k!G[=
_5Rr?$?49!?c-Zt3mD5gQ!"EWta[CW\Ze#&+AH`^P>/mWSnm]3P*Z>FPZ>&$Z%9$sA%[E!R
lq<'Oi1MrVW;k^&1KU)rkBW3b\V#l0?E:T;E]_q?D\ts#`RPd!^4CcA>h2t.l0f%8PmG#%h
.8ls4<`YO&M.L4.PV-6FHU'MK[k1gmfW`uMrVl]_\hC\J4553QDG!P:55F7Qh+<VD0uAY_3
ZD8&9PCD%JsIl"=t0N^"Qs^&'.6Q)m0dAV;GpDo)E'<)Z!=h[\g("A3n;;bZ*CRF6g`U8bP
:_@FmGndTU>c,UIVH?CM/`mP>e;M(#?R(>.*Xl9:)_#goQf&B?hLQ)&=Z!AEhO=f"V41KpF
2%=t5c0V94IW$32]pq-0ktT=Vd>'L)Nkj,Ap*K4A6&I_Bplg:CdOm2@OjVb`r9*UW0r^G`g
XHhQgR*Di\@]m<pgSFL$YKV+m/OhH,/[F[$9\7!k.B!p-q['V3PGX?V/,tjP/[;(t$YCX$Q
V94IW$70Ab181NGJ4jk\Q7D\+qALe?s7jW!Y$JZ:450N%kML^^>pBF]*BM^.$r^)'h;$em7
k7iSn:hAkN:41BrJb`BjH2sPN#?-sNK,Z!^-$Q'<!V<=8Tb!1T75M8hGpOQ`Msa!XHr^LiN
l9!pM[eAk/NB"2SB`QV5L4E?G(O=\okI[\3*rp9PCD%JsIl"=t0N^"IEf$U'!UNbVM^<6`!
D?B$Qnqrqll=&WL2@PUTBkootT4b*=Jie^I!f=0JbgAr.-Hr;HR'hK:1m-:S\R,?):hj$SP
0q=DosNJsBnQF:MV-6F>%qXs0d]=WtCT/1,?nNAbKjN3Spm[C)*c'gLo^OCTSG..+3\[f8^
^EPVn;FQl%I9c4]O$32=f</DSUSIGOnoRA;40j)!hJqSq2/1M"n])^f5MiMH2hSFl*A(8<Z
rAG>99ff8'`_Kj9=.YA4?VD,?RU$^F-s(6\+]Fb'BO#kb*B;GcQ58tGe8.db*FVpI$"0qk?
Bg]k09A7**IBU[VacV]"2Lu)H!"^`pD6VQgkC>);N-IUOW=C@eTs,!uELj0Q#ONZ"(fa*BL
QOn(nKm2QTr]gASe[rR\g`-$Oa<-5tu-n%</\Y*CVF\n0'NhVR,KV40PjmVfl=2K@_EZ'th
#%d_W?b?Jnu-'#V*+N@WcY]/PfX(Ec9f(m,e+,H9;f@P5pUe)^Q+Z!cVS1nBgYJ:(jY@#$[
/R$Z*=nDV3#hQ7ehgR5d2Hm+SBW4g[Q7<PO.KHs]=)"X#LCP?+XUI*$D91GqN>st,L(.jH6
ocP>jb4LW0R`EXf;r+2M'HN*A&jTmqWO[afXnauePZQj-9,C6jiWjpdu1;cQ7<PO.[6U&b(
Q&f!%u*A>&&A0qHImOjabKMZXuoN^1MWTe>XW\MHI9[8sLmj%N?3#BB82PP$WJ!-(BpOX<g
N*)#mRA.BIBc2fIQ#p!m+a0X8ff0AG_[ej`;t#qZlacr+FA9*G<^i'K"q3-44U[;+7Y=r&S
gXD%4-KK=;CB[sOTqs6*`_ld=ZqN48hZ.&^/k3hYTnCt7GoCr"2^%%>DXDOq'6:/PqcTZ.5
M+'j%g#M2E78&mP/JUn);Ir0f"TXnI=tTEN>JIIkrqYaEe.eo^W?QDmg[jUS)gQhQ*W>j-1
H=r[%3'3BB#f@0@q0B4ECmKKc+<qURW`.-9E"2-=_I2a?3^Z=Rf:/B5tdIL/JUn);Ir0f"T
XnIE\6sf>7XO*jHEA5Y6f@;ekJh3Pan3k6,j:6:f*8DOcLMEB&ji52@Bm#PMC@")`MZ9>e.
0=p?iFF>,m[SSF#M)BtoMtl-m].Qdd-]W_@**:kFu_'3Zjc\-,lLWBs?TcJZNkc2%U6)!@f
hI`fgU11b>R=0=CT:"&7hBWFTt92"mMp+BCIQmmB1&*"1U[?E+BY&rsYakiZh[CN+@(5q:`
hgRBV,U7(Br:mbcBW3b\V*YJlW_@**!8nJp[&)Up)]L<Yp6+g9@DdhsJ(XG<R56Eu[*UF1i
r?];o;2tLa2Q$*C"()U4#L`!m^_Kr/mN)XMdW%1]6Ac$l)47=Waa3+[;56g^L)#9=0Grtf<
=(AO$.+7grbj11M"Q<;dM_)d8FOB98+"c<12*2!Pg"kFA';aa,V13St<oZ(UpC\PUKD'D;2
MMr\i4T#7hmRm^qr1Pq2UE$&E%=1O+:p]]_sCpQBQ@GCT5/2o#Clq_`0?jQ5Kk[F_8e03sV
[4j'*EDtDiA-G!aD\okth=L;a=;Gr[71DF,;jN*I+lI<(aDPB#'o[6B>IJ).G\T>/#Rql*4
<12*2T`crI-F?_PE!aY.ak&B&pA7%o'2o>M%dquSUIK5:^#8_LT,51KcC?mQ4DVqpU&aW=^
HXD+Y\2:R*ZcBk^AG(s-DJ(0D;*L(nc/CENsQIHZu=k$Dh%YRp8rk;HKqI?5Q"?b^WDZe7n
#kCV59S8!W1!`bn]jBp%<1W\8dc`<OAB$;lj(UEH"/=kTb(pJ,]9,d*U-La,W0QI@iK=+t+
k<CY,_m^]&PI11`:S-n=gmDnX]3F6?Dq7R]d9?Fb*qhK(K)Q7<PO.[6U&b(Q&f!)Ot)4oO<
TKBq*j>I%d2=BO5(V+\cl+$+Kl,9oSKeElV_`JXs2*8%T1O4`Reldq&ELl[Tm8kN"STG\DS
AS!/5,`"SreQ(t,peUG+7un]+s5UM&f::pR_)H8e&8.H!fVVB4`$D+QUZ:@ncC[=nR[U7&C
(Ed,PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P
=4F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.);ucmu-V$gp#qZlacr+FA9*G
:qE,r<bRF"j*">*V#Zr@#*!%190PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff
8'hZhNAO9#n!!$tYZrEI?;P=4F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.)
;ucmu-V$gp#qZlacr+FA9*G:qE,r<bRF"j*">*V#Zr@#*!%190PmK#W9$gII6;%I^!,utc<
12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P=4F<@5(P!!!!H7n]*R/JUn);I
r0f"TSOAEjSf6cr-P?/QF.);ucmu-V$gp#qZlacr+FA9*G:qE,r<bRF"j*">*V#Zr@#*!%1
90PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8'hZhNAO9#n!!$tYZrEI?;P=4
F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.);ucmu-V$gp#qZlacr+FA9*G:q
E,r<bRF"j*">*V#Zr@#*!%190PmK#W9$gII6;%I^!,utc<12*2T`crI-F?_P!!"B:99ff8'
hZhNAO9#n!!$tYZrEI?;P=4F<@5(P!!!!H7n]*R/JUn);Ir0f"TSOAEjSf6cr-P?/QF.);u
cmu-V$gp#qZlacr+FA9*G;3Fm7>NjQ'k%ZN/nhZrEI?;P=4F<@5(P!,t@E)&_nWqsGDA]TJ
GCUj=Wnm#IA]'3ZlMTV]eaQ3mUEa'u;qkg6$M/N%=p4EKYDl59W,03YALBW4g[Q7<PO.KHu
K@Ddg7]$%G+5'uYK1"DHh?q7S'RF"j*">*V#Zr@$E/W1Du/mPo*U&V0@q==FVm8H/*!;8`P
PmK#W9$gII6;%I^(\5TgIm!SkUP0bb9URZj[V\r+5lc'o99ff8'hZhNAO9#n!*=1>r;"L#.
mL84hH$pmaiMOoe^FY/5$Fs[BW4g[Q7<PO.KHu3['[2!hKVD_U>GV8cTeJ%.0/te;Ir0fKb
CalRF"h4_"h+aQ8WU6:f2cFMj>h+=t5c0V94IWMYo%h4oNa$6[SOn=gr9SA7VM2cY_FFM>q
nmjN6cTCt5ioN#FZpTPd3kp%;<J9`XlR99ff8'hZhNAO9$Y5'-8R`MH4op?U>6If9,h4S+N
OP2>$N]mBA:%3%4lhnT2C"Ug>45H]>#^k7>qL:Xq+Bq3E,ruF=Q]]s24YTm>O9PCD%JsIl"
=t9)uoB4FqQnY4?]mBE;Tu4AI'e4=hcsb4i3B(j2:q]63Ir4)W]m0),g(ebYUe.Sa$,F8gW
A:0D64$hq9PCDEFaNiKC#?XQd@s'H/uSFo;5-J%Q7\l+U/^S$$G'06:6dJ>?K59B;PZj&E3
KGAZ$Q*.0k84Fl-^k=3niG[")pJ.W_@**:kFu_'3Zkj='T"ckF[6A@QD-ZHgeYg""9j88kM
_Cg9n==C.LmOl.\p+9O,&Eh>$O#]6<Qkh?&a&rqP:g?+G!Pl!":`Mj>h+=t5c0V94IW$<NI
`T&-YX5BD=(WaYJZaf>(P"\rB1hA9OHTlF6O.opK.OsQuD[r1$5g2@4".\Hnr<@5(P-p^Lk
#qZlE-S@#Hq\Mr'gV%sClCCCqo>;)'BUk:*M\hG1Lp4pChgG#imC*0L'i9LJ.MGu8Pb=kqK
U)ts&f)6`Z=HO*4/e1+?@#39:8>U]N/Z7G-cK:tmFnskg,(ArE)*c>RF"j*">*V#ZrFPs=g
M_N]=XQd61k[+2GEdmUVP!rc0aB$qZBX87j!/$_hJWogGCJsE)*c>RF"j*">*V#ZrFOBIt)
t87n23bfO@06K'HW3!TiM-GL$Ru\od0W4*K8!UU4"93RL`96;*"FZrEI?;W/6T6:0``Wk5l
iM%V,9qN8@3l`/fa'PP>!_08(-:o6pS?+Y:5H],71^cBe?AO9%D'!tW+cr/j#eui:o_sMh?
+nb?o(ccWtqXs/MT0Ag8RsSe`o^qdN7urQ-IDUXD?[r#sN>aYq2@+O$KlYA&/UQQ@8'7)I[
t"F,#AfEd$90D:W_@**:kFu_'3ZlUgk?+PSppNMX8;)\r6PDeS2p2\N>omHEoP#oET>(;rU
56Nq_tsX)IL4+fm^O;(pnGOf#*7R4(_^(<5:NA;Ir0fKbCalRF"jjbUaN&_hJV[pXAEXX8i
1rmkS)]Fk,*qpNA3-d\M_&3s)o!=t8I#BW3b\V*YJlW_@**E+Un<bV3@#^\dH2N/S0D[[W_
S3bHSQ<oYTYBW6N'U8?"cQ3npOWA:0D_J(;D-^QJnhFKkRGB]ZBHa`58!r2jK'lZpT<12*2
T`crI-F?`3XT8M.(oaH&MA04#BT_T%)O6ncIc/"mLkpk[TV0Dj-Vp0fBuZ)L9:%9e]6A0c8
rD?5=Y,kSf<1Z.I6&Mp6-L]'->))FFW35TfX#5:OX!BEdaDY1ccO:cO,k)EX^Ah,.On'g_p
P5L1G^i3R_0*tm&ZSuY$JZXc>MCF:&M>bVqR!`,;1_=jN3U$euY8sCY"_!;Z["%VG3Nq()F
>ga,UND/ss@5-Z>te=]pLj+'uBlfl+Y(2IXIUWDf^PGEDU'qtBDM:/4hIX5!*6ZY.UAdn.3
g`EBQ^djB'(mG>N\r:@I?kJTYc27IpCA7WWu`emi6p?^Jl6lJ:=r9_sIq=<Y,IlH]R-lUC$
3?p-X@dE%+M'FFW^0nd/X]r8l=39<g^5$r;Knb>.H[C8@p"(d"[f#3M:[6H/oBE0F[Vjp4H
hZr\"q;4.f]LGJ*C$faTr#nbQ3npOWA:0D_Dto8HM,ZU+#VJE7u\F`HEoTM$<A^#qXj%Dg2
!l,/mMLg?XA3WjdnV^Y$/6umQ2'9K4n\Cr:*9rE:Df%K>"q155aoflIDpO.oo@@V(Q,h]SD
8tGeqAacH'%(gpeNYT3]'PIH?_q*dF#`2`J4gPq+e1g2tQ+0uo=s\)71V3,p-)4T*f<Ihe/
]fW\f/RPhLF8L,W`Z!p/l-[gAi7+]N*cF2Wc*_*N.l-lOhCY%j/-_A\PWgK]^Vl)M=f<8O?
A\5N*<P4:VX<c]#j5]0Lq;mqR557D'^kng5hEg-47n,u%muWD#N[UJb5s]_0GD[1iY5P)O2
qJEj][4B@qga1sEAlNbD@[su%8fd;[7._A[3+WZrnj_UX#=nQ>dW+rHhWt/Y#A4rk005<g7
S)ZA"J/GkqBdG6F>@?Ua/mIq`qc:mHW,r9=]*)Zk(jG*e4+XO$EVgi4smo=0?X1Oae3OW_@
**:kFu_'3ZlUP?<qc=ZlWB+9,/#;_=`@N>OD0\`]P?^)X^Y<"H5<^3&V&=YgYjbl\1\L_[3
t-]=8TSO[YQ7P&+>KA3nUirccUQ'Jb%nRAcWe6TZC1M4=HogG,\V-\V#04):>k0U#%+44lH
PURi`Z\%Ct?[_UtmbPM:-YA%a:trEqXa9XCn`Rk:j_k=(gJVlBGOA_j-Bjpg]4fTdpYL8Cg
+A2r1N_j-.p&lE^)DLWHLL4X^OO+R$16HS'.m>W]i4.GWW(1)mfWk#Mg('VoX(/PHa[kM^/
d+s]2bk1WF*DhU9<34J_8W-YJ:(JABC!8D-+BkU=/J_A*3VU>Zepi=K>ISgKob!8sLn!jd0
=lgU>AF\J[e.PmK#W9$gII6;*"Gb08'dnr6VRnhKo44ibaea:O8?Z(@(\%R'C(,JAHu[d&u
9%ho]l<46UGR@-02e##hQ',0hN-oj;5q!d7n4uqgJFm@HgL"b[[4am2!M_DeXedgQ3If9+?
;,NL36UQ6K]SD8tbRBCD.FPP8:RU+@3_rCS]mB?E0>/X;h(iQa9URY)jqiWuVb`ZZ>E4IN*
AA`a`9+UE]6a.M3"rCl]8d+G<ifD<C9"ZT3-XdqgU:t,Is%edr+sE6*A:a3.0"%<IoFjt=&
8gl\AQqM=+43$U8?"cQ3npOWA:0D_?heu[`lfRiQ!$i<'A\8'1JcfN>cC\LFQ9%Y[kigRJH
XQpm<q,q`Xc9PO$i([ob1j]e-*rb*ZX<r7c/)fs\4WNZ9cb%M'dbcL'>n1]7uDiWU;\DO`/
H6E"(qC.q<[D)60dQC<u"o&Z3FR^Mem%3!msi8[+U#+7?.LM>8:O]e=-^16-=Ka)HYB>b#s
Hsl=EJqJ[tHgEIc[U-+A\VGTL_]WrM1B"Bpeui:/1F:f&;Ir0fKbCalRF"jjKY4t1F;G609
9usNGF*,(HLtnHcNN)l1o%d5qrZu#fJY%f[a[XQ9''8q]k-W!@[BN!ZXIM6h,8/)'u7b!C0
FeEZY%J+SRI?f-,RR;D4$:QQ?qoM1"1Uk?EID=KS0II?4@.H<2!pKRV(BM7pI@Q]tM[]hQU
G+N)(QX41fRscK7ke>Z$-*Jo#d"Q7lVE^b<[M&6C7.s'ieM>,k80WDJ24.MGu8S5!$bQBAr
VmaS5"lC$MP@^5Rie&U8*d+t-IBk#i1BC4MQmA+^[_D^1EehJbad&kXFcC-W6L;S"l)`MZI
s8MohQsm7/`Ki)[B'juq[a]a&p6k\K^q3UK>4pCE;qAZ$NbPIZX]i-nMpKY;2a@)q"4QGAI
J\2?'1bnpDqqk-kn>IelY6tN*,P!M,#5%+*dP]rajdCpe(U4WJsIl"=t5c0V94IW$>6\^gG
U;BK[#uFX.JRhHM6]>qJtd@/R,ZjiCe>Hg/<X&SpJQ5cY>MBV&$YMEh5:4VR;3>DIQUaVi#
ei=JGic`ue>V8RY8OO,oY*;R<gc[;0"DrCVjQ<'g.<R9PH'MJC%GVKA(Q<Qa6t3-'(]Rl>8
'q?647>-t5.Qi4"eXI!:CfcDs>o('*Z-qU,/b(Q&f-"s85Tr#WZN#=E@GEG_)>WLtmrnqYR
a,d^MEp.rS#7e+aDQ__lL$md/>ICetCoN,+rC1qod\YM9OkW8MC!iZ/]k@,W$SR;gCj]9`>
3_qWQ`=&dB)8Cnnb(L@>BPlEfi!MA1M0`H]fX0Ce>cM!HVCD1P9pLsd&gM2HVE@8'e31mHM
+;Sq#gg'fP)7f-;Cf50M/"8b(Q&f-"s85Tr#WZ(g1XRqQ&t<fsu1%BIe70&`(@Lc-=tg_7F
_]/RH*"<F=F#E(_d)lRUCmUK3sAs'b<PC_SI)Zr3_m0>@4U_++ghn^C8u)5!1WQ7>Lm[5U$
njH2rIe>Q6PC/s*Qr8(/\IB:!pO+U[%dn`3!P*0:%H?U3RFI*HT=__IK$Pk:tC05JlXB;a%
316n^&\>fnB?89>1]E^^cTLem_hJW>aBcE$mG,7YVl+0["q=mep!niR@DM#0P=_LFb(Q&f-
"s85Tr#WZ<3KV6G>Vf?%:JQH,9rsqc'ej'6\PmaY#hg`kg?.A/R#MugU8+aFt?q1<3-1+Zt
N=26j\Ku<3BKZWlNTP[T"t3Z.f6AUQ<.bk*mM]LA:ZCc^H`WpYUI-Z=M(Q8X'#Ckp,dmY$/
5Jp$:3_+<Y(N_M-1"0+SBs)E)D6rVH2Hp\LRNLDo&Q,:up^Cn!>"]Y2"tT$E]X,:kB^c'gM
!R6>idA2-"r0<Z0uGepD.XAc#lG':;oVi@(A_':QJo-6bc4F[5'h&cm8FQnsUmH^sjDI`lI
DiK5m;b9Uk$k+sPPaJ$Zm@HD;*BnjQS@8]@0jVD7D;u_>eSV:ph`Dp/pn?n2iX^sV[^\ATG
PA+;X$T->`!P"o;^\V0`]R\H"G:d-j1p3J<o"lhFMj\5HVU+m2*=!Kldi1bp?^JFH*_a6MD
onVmbR3[Xa>7RMiE_HSNpXnU;<>_55F9'ic6<)fA.O'\T[A/\1AKp\?_TngV/+5FJgDX89Z
KP#5n2LD`(!W:J]l]HabsYT7?k9SaX%FT5q`"DBF\#.MGu8Pb=kqKU)tCP+.qVA@Z:==7,@
sf@SWqi_$:a]63F_k006KN?]4qU(81/DPHkCT:p-qmEq\amN<)R&QV&.7MJ!M5JOO;cTZ/1
nUDGSp"@MA^MJ:1F^(kJ-Q=$q*"M")dh)2jp`tQJ%3+Sm.GbH,9&I:,o3m9-V>g,OdiX);E
S[>&qsHOu'@Uft2Vc_QgXW?+`Bho-L%=?Kc^m:(UL5Dr-hloV96VB7pYUHZ3&fZZqYg0GlO
G*Ke%0\f%,M6DWjDZ->JGplqqqEkAE6(d*cSc5k>'hf;c6N3qn6:IG0`>GS<69ZjK@k/![t
3-g7Qu&Y[Bc-EohCuC>HJ/mZ_f(>`BXZNZL?`43el+D)d"Bph-4Ip76Ea1&b,6U8?"cQ3np
OWA:0D_Ps%hIG2bW-R0j'oh>DOb*=KR9:+5#F30Rk=05Y;AAF0D2]DJtg`qkBP*hVME0@**
<8k]J$^E2Ad[cjUZh*>(1\g:9T76W.G<j">LORK_WOI^6rJuI+_oN7YGiFQqf<,u2<h'T0"
,_.H1,@;!B\U"7f.F"31kQkrFaQh>EbFa*?@#1J*/oh7HLtn,d2FiT?uU"\[+*iNEcO3am&
3!)_5\$-04)<DaI$P^QF5\+cUL)A&/,`;k2rPSoqFm5cC[>Ya;/8q@s*]EOWm4Nrqbq=h-1
=-C$YL,#P$076T4k8.;5\9Tqt'^>,k80WGj=k[VX>sDE[U81TIAK^BP2iX?0jq68M_&DVMC
(6h00TFbfAA^V@Scc"a5-h)[g4/(3$UHd2?2k2k\Bq&NC9=I?o*c#'GhBDC;,hs&FjO>W)a
XC&`Vp/$GN(LFRgSaf9@6q$66cerkc*8FGq>e-U+2;=!'.pfl5dJ0*dIf$88bA6V94\T[kJ
).^%ll0lUTfo(,n*b165`<VPlDq,R%TpGmq7*poj7BX8Vl-H\":S>\gU:tRVYcL=;56Tp&#
0$.L_iHsVq%H:b(Q&f-"s85Tr#W*)#:jq-oJ$&q-RUUC#ms-e##jGG3#<h+PgHpgG8OcAJ8
:Jd%EZ,mEn<*Yj1a5U4MUtm(`T!DhFgQhGXBbeHLmo@\[u*b!quUZ$Z4_h4a]=m;))7Fam3
=W)4caj#FQFlJD6Tc-=M5^Z5u);cB<<rd!m>%Ghf?gm7f'Z0t>oD;3Y"BH&mJe/cfih*!e[
g8[^_Q]R<%gF0i7nk3bRmGG[np6ahjeK3]&B:m`LnJ>P[dFLH]M3]V)=t5c0V94IW$E#Xlc
5bY/=2Tb%<DW5$N7=nPhKd.rB-<'Rq;?l9F9eEsDk<*=b\a=KIVlQAq/YKtAnPcBhHm'RRl
1I@ZU[Y'/mc2(jL^UFG$Oc#I:^Tf[GaTYnaZ/'^ZL"3Z,_fNJCD=d<V-I^bo&(apR!p[U@t
fuI.;oQED1;MK'mK-??tWIK0tJZX$)\$Gjo*VB5$)H5Q@gup#<rK)ujfm*LAEdf"SUqiPL;
P>e-R`K(]Z#%)*OJ%4tR,ZrAG>99ff8'i&>oZt[+0Y%GqIWLi7%[;4AhGIG,-n$[*&f[s<^
cdoO<dDEt$k-id/2fJ!<iQBkY$0cnPYYL`M#)BK_9,3&2K=+2b3d'_`4\/mc?H%d:[0Nu%_
(g02pu@FC8)CL\L[H:FCoIXL*70+*Xa4s1*QcFF,tjQR(q+PNd^cp!]&VG<V>g>WYM*Kt]=
V]fB'PD?QBnD]O+hKMda5-UV#?qcq&eu1FRIr;[ZP\?G^+JC`fJ`P=&8_6D19^66F9^[cr-
P?/QF.)<&bU;:QRF4EB(SQcHb"SDj'X.ofsUJpn@EV@Z?hJSut/8\Lgg+qsCl##OKm8McBl
Uqtk.>=K5=LK1"=qV2?M#H^Eb?Sp3U!6bb?11"miX2W(*;`/##Z,>Xab8Tt_9[T)(s<k36^
)a9-ugIE?6UcnMCj2Z9IYt%IC[;2-&R"CHUXb`RF4-%,f2VZ6mc0fEF9*ShebaI00%iI,jj
2Z<Bii>tR9#_t!j<SE<181O2$!O?&BW5r#'.-E"?1p*nhH]_1s'sBH4h=Q42f>/0-B*=6Fj
$(&]&T17;S.,>W]ab=VG402E;fY+\pKm9S8;^aqmBD>gY5qVSpU5"eJKGP+@,hEX&lKBoCR
.>o@Ua'GMPP)fi":rBqi9mCX:5:%3.?(HZ14E9s[>_c-4B_>e%$3YhHi?]WGDIDVB`--rE>
.aY/fD6US7/:pt1C,N%""+Peu^p:gllgt/]DeZ*E9XKcVg9$gII6;*"FZrEI?;W1TP:S4f%
[.sFVO&]!I5E'tLq8A+'17Pdnj+cu:G3$`,]&T17;K_GQo>rAP=>f%,j2Z:Lbk(#D)]?f$/
bS&<K=^ZE11c?_#TYsJd/J#<0/&fm-dF[<_*@e[,MbX*fhut-O$%XS>aks/$k1W,I)LgQ\q
AY1V$^5&<7)b1p?^JDK=q3[le6tJDVWm!\Ja#&?U*oaI/`s)2@lCJR]8N\p4HqcD;1rdj*,
`mGhDKQ;Wa^Mb(Q&f-"s85Tr#W*(qG!VjMtrY@cSRinlsMT[u?Hq5F^M-FUusUDng/>J/K4
B\mN=6O,l4TP[.L.?='5kP=`Objr99l?@2&sm2n:d'U&>>-RW[??F+6<h*E%3;Nm9,Zo96M
5()#FnTAbfAu&hgWMSm/Qp2]95^NY(Q>q+mf,eJds'tL\^oBHhp2(OkXKa([B^@=U\&>5%`
$:-SHP^JIJA&s/5XhrN?j#b)n%JII_2_e5"@T9^ZMEY(qsij"XI7W4m'V*+labm<]]ZM3rF
RqMhKuAm\T9(H`_P9sD1r@Zr.]>$_@n=(hd?lt6`jP"KZd!r3UL*W>U7NsAkZU3EWSl;>_&
Zn#qQgY'J(c^<2icLGFAKM_SSXL:.9X'mFehDn5bu9D+\Y5ED&HDr4$]u2/:VPgJdB"0J%/
--*(j]"R=dcJ,]8A^rORD>57-X;PZhqC'T`1W@TRjW(N*l4fCfLA?"(f-5S48+Pai_Vba94
'YAsX=K5H+/n0%*JFHHA-Vp<JgL,R6"bmL-HM=S!Nf.;EEWSl;>_&Zn#qQgY'ULI[V@Fl/(
GF(Gbl8m"C4%qJG6"U="nT@p^6@H1=A->HiIZ$$A]pASgJdAu03>;]@;/5K9-$*;XDn'eW`
@7/ZOmc]_Oi[e8P)Lj*Aj4]Z@!sp.d#mUe07nue,]XU#WFhjnmp\pLk/GcW9W_7#(qL'c'$
fUqtga;aYF>&=)$6efo@(7<1P(5!jGWaJY`E#^f'7sQ3p:mlAKd60M\F=.b+,ZVG3O,Ik0#
?O)sF*7;YG49;PB]._u82PURj4k/E5p=kZa-;Q1$l$@IauX?lWf7R6b3Vdq#U.a+=;Wm[V1
$YkeR=mF(j,DDVX0O]QP$S:TfWHt1qNfFm[YLS3(i?9?fe@0W*q!Pc_aN]q=NHcZJ99g/m.
c:@Z<DHr$^ncdGNMX@]QqbREU^BG:FE>j(7Imq)1)?]=:Tq:)H?jcB2^lKF.oiSpgnop1.W
s./I/3>Ep0!]Z1t<p01fUu;7^H'[AZ&L]jm?cI/Ci>&<k);4V)gUs$+H!@7h3Y!pok;L*%Y
uOX+7[g2mpr(THI)bW+I;VY$Al"&,5\e;f?;(!_\dl==W51/6,GQWPI#Vr^KIuG'<"RAhoJ
\i?D@,?7gXW/5J]hKnTglU:@&V^OKV#5m\l?\T29?2GM+fWS\Y*c^m9U41KM'T($BPJE^19
SXl<k\ssWX/Tq!dn\WOK/_.\R6+DWcKaUO%N#c84?ZE\^"eIl(`_n:s6[%qT?08TdkKcqAU
llPF;$:"$SA8#'(LX4_!_W]o7_<j2Vuqd*!seBL1RU;UldDV&j_n_b[VaO-&KMlDg^#H2Ao
27U/n/U.AsV+_9u0`,_ec)NlJfd@NRR"5?s,/)A1^g,Du,?!$C31,pW`Bsf,$)H>ilfOrUn
e:n)(1T=+u4%apBU6Dul7S-a6QXC.t6`SN9^u;l0tG&fA$M0(h2>eh$W$Tg%'UnB5)eYZ.$
uV1nc9l8RUJPM'TZ5Ok4%DdI/`Zd'6!*BSG?(2:(?\o-=bC'Rb0r5TMCp_E\cD.mVHUe-b\
:AXV=GMbQ5r`l;5.L[k.:11&O$a<SjJY`EHK5p&"CY,`ZXcmL"2E!Ja\$B\p,2oX<-r>HJ#
V8tfD/#CsDk:qFV+R#qm'H0;]bCCHg6=!_K%`Mc=mGkVl]'BZbimfj0==?7[FD<_[o,:)'G
Mgd2F_.b@RTQu(!)t0HX^HYKZ].PY#qr\\eMOP'e32Pp%;=4QVrC2apBU6Dul7S-a6QXC64
RCR@+q8S1o?cE5$J'C=Pqd67XQ:q-3[\YJ5b"_QkpG/6-;!Bc0'[ZuGp8lIF)EZRh;mX]r:
&Q"gk)VKU="Q?r>q@GqY-*^4tMhVS&&nKYG4PI8n]kKZs!SsPe1K\G'-;P]+f!V>L#=7>Xl
If3GFnHOX)baC7m\oc&^1FI<@B&o:cISk6.WilIsPnR7LhuYH0:11':"DQGg)0M%&042FhT
0@6GP.KX]Pq#epDhYbQg9tikD$6.SZaR6JB[K/VI7m4+JWE_O'OS.VM4F.te#6+gi<kVe4f
ZSX=PhJ+gU!iGXJJ+-p5HTW2Jq.nWRIqFf8QU#_A%7hmbPg<'+5U/9\l?*fX5L]O\:D)apB
U6Dul7S-a6QXK$9iOT4O*<IJS&G74qiT:q4.X3HBNHr)q;lP*2!Bq;rXTXc+8^QJ)g"<G$)
^TrpX;DVR4&O&Nf:(c#WXSFY`.eaU8!pF<JBYcohH0?ZG$mSm_$Otg*4NJi_<SNF<",GRbi
QIKVL3d'^5>X82[m8Y`'5p@Ks*$$%M<id_)UU4"!:dNe[a-)"MapBU6Dul7S-a6QXJinP^S
7U7#I/3@/q"X>.o$jX;e-_6Y5;$R^2fIQKDSk5cS_=Q)<G$*I4F6Wj\8d+iS!uYN,=db.rc
ktojc'3b@9TUnCpTXPN)6?Ykg6"qD+bcoCT2uZIelXGOd\.C8uR`?=gM]H(Jq>D_3gT,<GP
DH@\$`3D#*%F+,'NV$Mdc=R,u.^jTLkV\,]0e'3H_<9j4uAaYHC@2`KnWU^mqFcB0?,E-_E
Yool]gl77sLVb`p_gOZ3DX=]]erqT'oEPd>5%g6'DR54"&p$7bkPRhnJalU^4/%)Ksh7<o2
le??mNK9-%C3("AAP4%#BTR0XKNkp'8LTX^K*Mob$Qsqo?3)NAb^/!MBe8_R$9pMD33Z@BJ
Y`E#^f'7sQ3p;!Q?>Mm=LN#`Y9KGoD(8dpJH?!!,9s$B*Z#V_?/;\NKaKA*_,=jqQ@cq\T[
!pKW`1G+Y>&?9GTkiD@IW3kdOJ3!Wr%_l0g_jV;&<EY`quH:;moYkBmrR4*%@RD7RBF.W&*
74=BMM'J?#,!E?]>X]Y_?tfs7G/97j"_#qQg1!L>2_YZ,#!&4[rP7NI+mqssUHSiqG1'M2R
WL+mi>>\T2PgY5XGB3ad-Q7B5L'Sn@J\"&FpEK_Jor)'s9E_:\)H:f\c5*I?i(+ue9oB&Y^
MoFA!pu."lk\-g$-l,ai<.BCIlC/B2o&T?7p6JMu,LgYsZ5NVG=9Vj5A;P9WW`QBAb^*ZrE
WSl;>_&Zn#qQgY/=SP7U5j_$0JbM+EH*^^L%!m3U]-L>042H&Dr6Fh3?TGpA^8C:2f>k,#"
t4a>On,a9e'/C,ht.`hnFNgVP[%T6>`W?j2Sa]N-a<BF'c\:3:#2":Ycu.l'0nl=A7CG$,?
H4)g1VWCtV_"f-21S*2j$?X]dS-,XeI1<$a(H9R)FER8^AI"dUVcYZ/CA=K7n,;LurQOH<;
@=uGRV.#%$@Z]>t[7_sY(E,b<@7>pTjV-G./QBp%S>.8B$C'kOs7-<Xoe7O40q.I\O@Au"t
,7nW%DO+,/E+,%7rTr2nQH?s(FQbtB!=>UFjSJQ8eCms*>,Ba285n$_AQ/54=AbHqV/G/&R
:Yh=?+O!%OXpV>#3O'nMcrBpVG3h[U/\-Y<J9g63HF17k/7P0<&oN+!\V8djTLkV9UQ8)0!
L;t;lNs.lMgbZj_U%f3QNUsjN*H49>K36g'[jC;(%[H\od2R\7S$);Guu?]ij'"?ORO4R[/
?snm/hK8Q9PeNfG[R+oB+uD;2Lq[RU&<J,\KolRSu7q1OES:^\dVZD:C5NeN1@'e*%6\j`=
qe##itNK$qKU[4AXV%WHrY/$OobEmI3(+iG+Vu$/V:G%+db:gWCI/-["!`VU5)X=t\o,=qP
=K7n,;?7SAWH&&5"X_NN&L1D45\[3!YMSQpWriG+fsd-+ODs7"%:XDCT'Bih(5/Uh93$K>n
]1P$mtI5<#RG,$^-,,)`5gP\BS3-nUg(<G/CU5?qXeLki5$rRR[KSK&&MIuY=sKagrbm4M9
7Q]S4[a>n?-'/\od0lET0BkT4M._Z:U6,TqS10VT;ndk007bkKaP6c.ojN)>?Vfg9hG33[A
-rb1Eh(4$#D\CY%jnOX$SaB]>>Hbk;*b$E[OA^3B%;W&d:468i]7FR@d>J\QL(ll#K8LD7J
ujr5Mf&fqjMLkn$0i'?bf]a"ub`;Z`QgU?qRq2*p.>0+a<]2ke&)*.)B"dUVcYZ/CA=K7n,
;LsZ<*ZeX_7Ld@G=B`"CcX*YQXeA+;g=b0HhS#BeQ-!.ombPKVY$<.MR>c8IDVVa0_#eCfl
fQH](G&ZBZZ`;9IQi#GJE<1X6N6oY7un]c$HQnphVR,<Vb^rN(GuA^pE*=bV.Kp//TM>_,E
hIb3b!eUc^l.5AdnPK))uT.W;]t'=g?RMLA+*%af(]!-^fC"6EZR-[r8mh\_5]jeu`.8Fd]
$irqJi[@>&(,L9X]XZ=HO9cl'TF+Vd1jrd;bH*W>m0s7Y2cZ[MXE5[\Z/o!2iMZL86s##hE
p4ad%/^V>81D3FpUW:ATLCBk7bOEUFmicLo<L$;fVA7T6Ho&\R!hJ^1-[VF>BEX@6gCTaJ/
,\$DdNusuSF(U=G/Q1HJS2G)JE"+@6Au1Y<:EJMbY-+pg*^.[4$O>*/:J]=(gUBtK33dJ``
i4m5e?3)HEOWm)`/ru8A"&mV]=YZgcXm#^.WKHJSN:m+m`Y(6s":`_3P\PS"I9D)!)&Rj==
Q"QaJas,-B!2SbhU)7@o*N.48%pkn'Iaqa,V/Z2/;d>GMe8R3"[--3tR_#6D6`".TNKJZ!t
\"q=9C@Ck2Wk`;XNCiPUGF7>jd:1OoE%5Q:Ff]mB?T[r+p!K:GKns".*B6tUrKrV,3-4Vh\
US.Sb!\T6fQC##R[Rt_@k<iJuNm)a@!5WhngMh_c_P-?IBI6#ct(<LaAeseO4<i8\5Z8]k`
aR&B7I[OU?Q:`::/n*?Doda%B<6^jhM2er[fs3nr#%Z<tL!9=Y?+Y7p/g*8=S=BZoC*;,3K
aJR[eud]t$`!uI%?d_HHbc5;a7p'7]#PQ,<C>8\c^m9N:T?oT7sfK*r;?04eG@;O_/t>E!g
Y;`YZ/CA=K7n,;Lp/SHhONDG>JDt^ns<f)]p1%l`\&AVk3J@bCBHb;:OHTV5heOFmI!>Q`t
Dc5#JLh98;QUgpA=Q,uG2.=K#$RPEShr/Uiu)N>mf0'q2@+K!i"oE]Y^5eZ)WE(-jKJ`^`X
3o'G$cQ6"uKkkN\hP:M[7G_ZbLL(>@iCXt$u4$*ZP#P,pr5EKA<@).<Tc's2_e\;IO/F,n/
99g/m.c:@Z<DHr$5V$*NF=H6g1rb+:"\+fC8n:7frQ^rq@WrhD<E6VPkp!RBWVlA65=VU@q
Xs/`$ZgB1;mqFU7un!q0eP)]7>hr(DDWU!*[5>3+g"j]9MA-4"q?gO:]H'8R2O3/eSEa;;5
o)Q*&qnfAV]pBdmrdtIer:V;9)3kYZ*W6V#i9b;WS%I$8f]ggUBVb^SV^(o?TOKr`n"Eo&n
>KqXeJ.q[Jjk*fV'qqY^/qfZp?\N/;,*)k!p+#G"Ir@Udf`9bja\S:oCOP!.L0F__.>qGjJ
XR&*5%QC@__VB^+>.^u&LLO]@&Q_fE_99uMU5Uq[-/Rk\InV7-#Eqo-4Z,]B^YZ*W6V#i9b
;WS%I$FE5u:f+cImF32+Un^81$B2a7]Qis5V-d2[(+jjk_?FX8%@4",N>jgB0O\Zb(+rk53
(p8.,Y[f&Gl%%]qrCURg:)"HZ;DgG*BSFDC85-)e5ndOZIIqg'0E7jq-1=GAZW`$ff<Wh-'
d]O^H],\:S0hMr@EB#?G.U(+IU#CjTLkV\,]0e'3Ha2*(`^nldi0_*i/'D,V=<4jE^Xr/Rs
&L+X)e[e$/Gm:Hus(C(Q]2#!I;)Ll.'&gWdr%HhOPn8[R,Y1rP>X\o^MO-6c<O/6S-UUBZ@
ehVMR%drBJOAD[LCZIIqg9E.\R1*q'tB;LtVFXh_I[r1#2=j0DT%3%4$(3'3HEL!u(K$5Sj
,Qg])'3HaB!\@>H@&ZDd":#0m))EUXhRokK7e5`g5A\uVf<8P>Wf7Fnh;-mcf&2W]Y$ANYR
$6X.0EGR\b!M+>qbKlOKS>*lj[ia"6U?2!nOL]$H$OZaAK:&Dod#$4IU;P_HVt\@E[5uLR^
:KX4?YimIJVRDdSa$FdF$A&[\Lk@\Nk]Ie0eJ_baG7$G#N,*Wg26$aHQal.OVH"^]di?SA8
$RV?mY>,\*NGV+N0u%O#`B[VacY)`P&R>EBa%rr0@7[`!55f.^aV&32tKV?0Cb$ZXAm#7`S
+ekGkb^'Y`$:S0gVc<3Hp`JYPML(.XbAQ5%]KiTMDSs5P^aN-r:-HVZd]6sGFe##k:o]_Rl
9qORqp5_H;:h3W=b*FXVcThGcP%BVVC@[]MMmmW^?F+6<q>6-kH?(O":kOgiO,],.3=4g!O
R<'TB_C/kF&YeLhnHcJ>>,:4-dS;CPAr#k21VOG#qQg1!L>2_YZ.7taEWXP?2j]d0554qV*
[B&X]r8/Rl1ET#:idnnRr.4#F;4\;Q3^!g4BJ97*Y6GN4Z]K)aRN->Uc\h=0Gp:2b74^0d?
c)$kR<?W%gq,<(fqCkQ_V>&-o1@]fPhBOPt3FeudQ-?QTjl+gtb+q"XBSMi5cNJ,Un5%>u#
UDIHs.J,]B;kKagX<2uaEJ:KY$k1$A/LTq7D1UHrNl]Y3Ec'pYUP*4mBRN0e%oB+T(=&818
X=;>Qo]ah;p$1*%mbK*H$F-)W]QpjQBt7j#)@8Q1[r.aUZd-kA&t7&Ng%1O_>oGkP["O:l.
TWWAY"Dbsf<DJ53AlJEL6>c&V5:#AVoO]0.:R145(!"iP:'.\LPI['OkdaoD>ZWuq2\F3j,
aqXHhZsh4I!/oj9&&?'3HaB!\@>H@&ZD(q"jjTfs>>6PUSbAoOu[Ka`lWjQZ8Of2fE"HUs5
Af-SdQ.r-0u+4EKYD^V@P;Kl,YWp$]ZqDV)$30dBRuTgFG?(+`RnABCiOWtHKtQ;*+P@\57
Wl!V!M<'Ga,FQ15q"Uc*uf[u9oH,kpc]63Gj^OL`;>?`I&VfV%H.JWnA=Q8B$n(bI[G4!ui
'./f\Empm[M6-[NKpjl7P5gl=3TRps1M.'C,uQ48=]5(jq=u$nG`ZV!Y[PG*%MP[RfW\eB(
+hRhkWjN7e>Q6)NfI2D>Z"=Z;^%`Qp?^HY99t\=P0K-Veui:?AT.MEo?X4ep?gW/mbN6<Ue
/M,DVr1QjlJdl`Q-#3f</DtprH&+gMahaB[EDmjiV,c<N9#Tr+GTXOM*Srlr\9PSN:nNgoh
DF+>GUubKF]"qXp%":[Zc6(V'Y"Y?sNUn<$p!\Qojl,q!cV.<PFYC&'WJ97+R2%HJFiVQ8C
VB5cA&R=g-EW8HL_"-tDaYZ/CA=K7n,;F)(LN,M'M6=dgg#tuEIQ3mW=2c3FLkK]X)\$riT
[VjWq<NTH48sLlkp']+Bq=Bq$;1eR`UIL7>p?fJ:n`%HA&,Z1unLj`hJ>LBp//<+)Q7=8d;
uhH?J>E;IF9sKu:11&O$a<SjJY`DJoE6][!2)tmWH&&5"^HSSapBU6!2(]IW;lp(!_\dl==
W51/6,GQW;lo]!D<RrkRq!tSA8#'(LX4_!_W[skQt?@!'lmd;WS%I$Fg(/PnR7L!'j>q;?6
d/"I:MbYZ/CA=K7n,;?6cD!gX/ncm>nq3J"".0#1BH"I9ApckEW_!.Z\QV90)q'lX2>.OVH
"!.^YkV#gX=#qT(O@&\YaYZ*W6V#gYh"=t8fTM&[lEWSl;>_&Zn#qQekTI4-H!!$:+99g/m
.c:@Z<DHr$!!#._9*G=Z&m20(^et1L@&\/J9*G=Z$!8YW5aT8ajTLkV\,]0e'3H^a5Yo0n!
<B\6Q7=8d<58Z>Wgpk&!<@G_f@RLD+@CkliE[Z.!/LiF.OVH"^]di?SA8#'z9H707SA8#'(
LX4_!_W[s!!!!QEF>bd!_W]%J>LBp//8-b!!'gQJYgKq//<+)Q7=8d;ucmu!!!Z;Q7=8d<5
8Z>Wgpk&!<<*"!)+A7Wgpk&!>f.CEWSl;z0QCL"EWSl;>_&Zn#qQek!!!#7`.=c-#qQg1!L
>2_YZ(T&!!!!4#F6heYZ/CA=K7n,;?6at!!#\4=K7n,;?7SAWH&&5"TSN&!&/D#WH&&5"^H
SSapBU6z^r1f#apBU6Dul7S-a6PMz'*jgQ-a6Rc"^%dp^et15!!!!m**B52^et1L@&\/J9*
G:q!!"]m@&\/J9*JRNV90)q'`\46!5QO(V90)q'lX2>.OVH"z!##U'.OVH"^]di?SA8#'z9
H707SA8#'(LX4_!_W[s!!!!QEF>bd!_W]%J>LBp//8-b!!'gQJYgKq//<+)Q7=8d;ucmu!!
!Z;Q7=8d<58Z>Wgpk&!<<*"!)+A7Wgpk&!>f.CEWSl;z0QCL"EWSl;>_&Zn#qQek!!!#7`.
=c-#qQg1!L>2_YZ(T&!!!!4#F6heYZ/CA=K7n,;?6at!!#\4=K7n,;?7SAWH&&5"TSN&!&/
D#WH&&5"^HSSapBU6!!$!8f@Tchl-kZQNl-S\Z`p[l>n0\nW2M+?:X?.I[n`JT[:@7;#7hm
:>nPF&YZ*W6V#i9b;WS%I$31'`&/#UrjiS;S(RMo:rjtmo2C2"^ba+!%^\sIBJNtsLio2"B
HK=&D0miW\mbPM,XBF#rbUi/?hR$u1mi$c6J>LBp//<+)Q7=8d;ufUXf\"h4B?o/agJ=4mA
a.X>QS2]@8kS)KP]Zj$r*3N5kKK>MCY#Qr)`G?UpPsGd9(M&bPAGid;G@:7&RE"lD:u4+;l
<ArZtRk/P:+J+-FT':r9$;]LDuNd'F0pR-a6Rc"^%dp^et1e9t"lk;RUDpF@4sNeZ5<+I@>
@oU'V8<*B\RccC?oDp*E4h*.@_XrUf=fn*6,<QDt84j\qpDNHBrQFQq4kDJl3&JY`G."&"m
m==W51/6,GQW;r;.'.-DoD"LB]cIpm=GC^t5nDQarb*=dK:5'#iI!g<df;J\R<7>L9\om*)
am9#\g=ihk"\T$=#F6heYZ/CA=K7n,;?8I/gt^\<#Jaq`B%O4nk?TDJ#(rUPZY%)1C!`N(V
OqBo!L@K[>e>/2h5d:gEHcV>C^l[;N"7I>:11&O$a<SjJY`EU;@or\?bX2B!17/3DU,jl-B
9-19'm!pn(taj/!UJne\l1NV@E2\XAGSl\H#c9K;AY0"&"mm==W51/6,GQWELZ555kbG%j+
")/ebI0n(p2CXilt[=%#FZmpbMi+$Q3k3s,]tjB\`i@&`Ar#mm<^R_lt[NDiMQ=BN/dU,0^
1bDW2_==Q!gYZ*X9[-mS#?.TY:bfaY1*N$\Oji#^2m+IS/LhZ#)'0kdXn*f^@*Hs)@]$q!e
,#Er`4*RuhV:gXQHth-2'h_o&2/C4D;RsS@drFm860`I)E8cCgMXg?2A2t/,*Zc@R%Dl"on
U[M\HB%*YQb4t)[=G(tHHl97&#eYU/6->E_(F\dqWcV3]SiW8\8c#E^=9,\LNfS8JYf6]Ub
)2]Pq,NE<OQ_HY-';b_GYsTJYaQ:%4i5[1`'8/(?Ei96]AqIB@!1>/s]8EG3rE.o)%mjo<)
%FYgdc^PbgQlqNU6=b*MG9OWuCd_GYsTJYaQ:%4i5[1`'8/(*kRf:ggPe</MJFY).FDkK]X
AU'<Dcbhud+>[XPq0I]Xh9M@!<X;J>dEp8\oOJP6F.PO&j<(*p@V':`X!_^e,=B\m+O6NH3
PB`G9`9Z$YF6Ch#gm=NkF*`1[o<)%FYgdc^Pbf!>:7OkWVdmc-N30ooJan;f,'j\L'gXYm=
DHFJq=EdfBESfYeZ)V:6UQ-cai_JS$\cpQ=gM`1Y#,4-WTc)o9-oouPq#de&($4N0,RoGV#
oZZ91AIk==So90!NhVbO+&nbEXUPeYDs3cTf0io7hI?iZK<=e]4&`B?rbenmo`T.SUmbC-#
&5;NnlnZ;3*FY?"Q0CtW%%DQu,(9*N<?QAXl`YZ(bQ>[XO6RF'=-H1U1KW)4f$+;1BK=0LK
'Pq-?R@X+4dKfaMHo^(8;8<G)Fh'l0n5hE/EY@#&i].V'QV5D-5/X6kd)nUFhl37\9Ujd/Y
[;+7FZY,2E3!#<PN"7HSd;*-h#bnlF;?7q%3gq%"1:lURLb])<#;]+OUFflQkqGh)9dMDEN
a,U^;,Pb*%SHuF#F:8226^$_d9L(Y!,)O<C-#&D;Ioo&"i^e5MWcq%<!:TR@&X->"^#M#@&
^eS"F:09MWcq%<!:TR@&X->"^#M#@&^eS"F:09MWcq%<!:TR@&X->"^#M#@&^eS"F:09MWc
q%<!:TR@&X->"^#M#@&^eS"F:09MWcq%<!:TRoPLS"5CYk:ie3knS[GluT7?jnZt[tn?hjT
ohlWu]VG3QBmdC)NokWDq-N!T5*'\o-aiS8no][SjN[30KmFuj[nDWEINLM\7b+_=_<ifE.
Dr3`S:X@tW@,AlF,!J3ilIDr9=0K';Z0BW/6gN=*;iXE?k0;YfC"'D$cUj<I\[]/>4*N;>4
IgW#'OkN\/mc1]cE8<XL7"I"Vf\_C_hOs3rVH2V3HO>c?+\1?<H*l9[o?^AhZF)nO>Ct:_M
+1$:F>8#Xf^u\3HJ6(>e+Fh(=IVOF&7%<U4B);qoIO$D`p3Fa;oog2orfZk99Z9jI08YB$K
ShVh9SQN80-.aN+Ss*ZR4_Lg8HQQ7\RfGAbQ+eA$M5^]+(f>U/;t3dg_l_hSbf?2Z6*/rn_
"aM1>7LCPVSr^MkcV-KVQg?d:d&%Tr&gU>?@meeC;//?QJ@&XF+\`hI>,9e>QpoS,NQ8s$K
UfL6h:n[q.4$A&jfU,)s7n<%(]=3"QhIXlrALTC"6A5csX]p"bJ-!i[00ascHq6eaKWQUK-
?c:Q7[OO+G/oU`mFntkT0GPM2pKRjaJb8H3pC-P;Nc"r`:8QY68W&K^5rBbSiqE]GOCt[Dd
J`i<39>hN5f5;GThRc`j+%Gf[u`VGENH%/mXpBKB.\27uF7c`f1poOr+T3q)'j8JsK$i9DD
J6rqncd;iI"\+!4;(s+(7WQ7>m,q!W:baAK^$rE6I=&XcXuq[!Q8[r:/IE,b$oZY,OQ<O-8
`c>j7(aM#/[SN>i?k3VI4o]]:g>:6m;ik/gNN;"27h"f&%nac8)[r:0dc'ug\B[3,.$Pk:4
EcN@jfZB=)("[O&^etcX#*t,hRZ#HB2)$_'p?^I$MA0J=)PuJ\?[a/N*4:RTY@#$c4*GFk!
X5A7R1\FE6\Z"hF`i-(jpbf0A7S>M<gs&c,;_6A%*XSE/LmZNA]g7*0O]Q`X0,^<;RclcE0
];sU@!jT04o=8F:d^)dA+agB@#WQTXL]nq>$!h2m-8f@M1_haq$`75RnQ,'fhO5@Y0n<`(.
>/Rl>7@2FY#QH[C*[EKr(XP5XU?5]jDDa,YB4hGpT-`3tJLR@BZrEa'c+9C<an$Aa\$F`_`
$mek9eB5)'O>Z.Q7Og7>$:7TtLH#ou=P@Hm2R5Sp99U[ePn(tb#5(+RT==U&s^etb4F4#uD
'($m<'Lg#4^]!l\UIUBp-o*2!B[itX6s/Ldq,MnBoiLkC7;YbrV%Tb4]6:=;D[b&kUIG]DD
&L/faT/VO\T0HPOXEqrfs><=,U>p]5s7ju(^qoqXAJDUP<]*F;d(KAaPrL8'4PU&qXfpA(i
XS=oTUe'W`5slCgg>E<Y\WSM%_6d=0=)qUH*DX*&hc*b[37A',03WgmU-<.]8H`[;1u<`.J
<eJ""mfQAXl`YZ(bQ>kDI(c^m;sl)107$k1RH.p&n8bEjaVU[%:']4Lu;8B#[%e]5^c'Vf'
f`f(c[YW5]82(C(jnDM+ip8)otefR,*PYd3/Q5U>Id@io4"Zo8B3HM'N9#Ld(Pu"AWV(Q)e
.'9ft5($2%Uji:=0bt<:(M@5f_u<mqQ%f_e9)^^>eu`/!lI8\2P.Gf%8h37UYZ+#oJYaQHk
+VrN4`]USTgFHt)B5K+W(h)EXS`E^&e5j=9T9D.@3V"0]V%ZL'$>BWpkZ^$e[*c@^qfg>lR
U_VCgVW0Q8%ch)O=!UEkQel'^su=_hZ33+otfG,37%?Hi*O(&j!(VV39#iAa<c5@4bZi:jh
TjbEm_OlBU"-6#+]1/!kj!$m.Z<quKXp==U&s^etb4F4%RqmbYW]fs*h(a?VI@3a,:4Ocbd
ng9jk__R,\^V&hjMS8h^UG0J1SK\o^,a\r*8r2NbtVJKU;WE$!bfQiDj[o@Ad./T3P.`RnR
(RD'8j:^4ZGH]ZEWar*\Y@"2F3]K*$NN\C@+JL@N"J.GaP2\@g>%S&+MWcq%<!:TR1i93>:
S(PS*R@]rG3pdTd9g>`D;2L!]>@OW>O&1dVfLtGXa%UL1he/H>r=/j/1aKJa2g'bWDb0AVj
?>.3dpjH2>T`Gq'($k6suu$OuI=9J,fIK<+jace=8O?;SO%oJ"Y6!/#eX(a\@q0-]iiTe0s
86_hXtHKi5]a&\SC7MBJ@GFtM8!gUhF`_J0Ji1,<Lf*,.h[k<\!)pfctKf<8a\&"=FmB$:h
C[,RBDjO#qo0=\O%YZI[&V7q9K8r^"g#Zau,U@u$+@&_:HUIL6AW$qAbWaVkXmpl(YgK3q4
An9c2H.5H(h7CS8hO,c!(+bi?R)j_!'Ej_ZkV]SD"OUI2C8hLG$&oi\')PISac[t9e>ZB\I
/,mMnqd.8R@+rifJ40P%hGo[Q75b0=gM]\4*DT!A4ZI_h7Igq7`;WB`JTU=)0</adNBE6MX
<'j8<G+HW`::9rUIoMM.D&-DpFt>0>)GH/Tpm[jm69O=gR7@!<]2mR:9fA2f[iqhS"9B^Qr
*2B[M?\!62%'[FC<`8$_lOe60P8rDp%(2/_3:\4jGRjmqNVQe<J8gY7Y?gQI,aI[.Qko+ii
W9\QNYe8L#g,/I.b'e2VS%WXUAFqYoXFK"[u[qsa7^:>^nWq>W/DpkFQjP$+dGr#3AhgbYh
j(HJO'OKqS?naEOdY,:NG0#BWIMA"MQAXl`YZ(bQ>Vp2pAB;U^cTN-[=^,+&3HHN"/hUuKD
r/-0]65e'P`3"beREn+/;9ai+SHlm.p&mdGk#6oj_m][NupT`5+fsE;AUrjaOjVsnJqi>#;
7a6F9dL2*Ze(2nP2hS`6_G[6maf[>ol=897?Ku(#u@&mFnu>o^pA[!nk8B%NQbeb0gP->K4
Mo[+*a\=I(tf.TNLU@`=4k0>I(=HW!bie#-!NDr5GBA!='n7MA-kC'rjGo*m^taUO6b-.;c
0qXNUdgUD)S>-s+aokJO0^O?!FYsK4!D;;Y+Xf^u^4aT_:kq;&8`'g>NLCYIRG7P&hMj.ja
KV'k&$k-ZoKVi>(QIi9FbLcmLkc%LY)Dl-Cd`?q>!sFK)s/`F]Oohn/nrH>jVG/!fCe,%+l
-cC3Q;T"qc$0L.#F:8226^$_d9O%lWFVZ"Y[Bb_JO/2-I>+$c+=$7_)`Ed4*_U:ocHbcFNZ
C3IV+i]l,eh:.JEFRoqh/26AZ<DX^&l'NV56Y@)J!O%?=_1aQMQrj>&)Zl?)\hf6fn:DpJ^
CM0OY$j.<71"mV2nWp&+XW_G0.5O^lLr-1$[5^3fTl`f(d(MA.3UN/39tr00l_WB^=MK9MK
4FW)lQUYEG,1S`k+p"*Q0's^pkfed2SjCIlQnfkPeJ\N'dHoQ8,`;[2]fcp@62qcd[q=CR[
jiWi]^tJVWksK<=>`r$`:;(`3:<&bcWUT#mQc.e'+4RK$5OEbX&n\FI$<SdPf>(8r7!$bMV
:sSS;!T:KSNE1C_7Op[ZM^k)[VT*dKk\WDL?3D:@WnYFT4[Q%a]^1SZ_RKrpS\!?.LcP5p"
$6Le;fbC<Jl3r)&?(T]65c!;[Q\XFikM7^ZH(lF`VVfn3Lc!ED*^J[MC_&q6O_[aA%W)a1h
B3S)E44Q3NV^<0mB[mlhF7;WR,nX,ILn49:VuU]eUjW=S\5(bgJg*cJ>?8Ne@mQ6[Q"s8G1
AV\BB%MWcq%<!:TR1hWe]TqO#%I?#@3>#_h=.*M1CkI,6^=BZpoHtlSJA(c?39YiP;Pmjft
-K,h)Gd-8.P,TjCWE*&#_G0.5Ob<M%Cg+n.rO:[5'5mE.?[cEt8jQ+HI^)/H`SO*kA8t8-Y
ZT#bLC[PUT2&-V/?KfC;FcZ_6/C=f4aTT)ftMl]i<Cf6Y5Hfhf:+^;KKi![C'f<LNfJ:*FV
Xd&"bEKoH4;D?5r9D&=mCkZ/#^EDB[B#]n6keG`RL2V1lqtcb8[G\r:?!%$;JuI(G&ZRD5q
3mRO\8nRY"G'lJpnlrNSiY(Egh,ln[tgHl4+-X72nKWU0uC`bqchHhS:n8pGnj'*4CKTgG%
a?&KIM=IM"BV32LTqH<n[X2R!_lg%4BP3qM_V\q^DmbBh]:PjBb`,pO+,'j\L'gXYmbunep
HM)qA+Tq]_2f;0"3A)qe7ZA>9Spkf/RC&JIH^<AVX]i+f:)l[@">//30N>,U;7N0e3HO&jH
WP#r7A5sB;Q'65Pq/3.L[kBAo2">24Zkj*N>U,BT07NJTpnLUQ7ATFkih5NjiRn=S0LN6QD
pdABrPufDSd>:GCF6:!;,R,9=X)+ldfYFeGfFDKg0_<^]E,Zjo?qId;*-h#bnkCb>Nb9I"[
!5,'<(t7<89)%:n_&XfX1_&U/GC29I_hV;Ah.O4oW%[C(\5MF&ab,s+r5SUUP68ZQgb[V`l
5Nu^<Jg5(?H8j,ff*#tdIe<n$LV%lS8?F$iLh-`oLmF\\=n:iJF/>T\$r:k9jQM^==POVR>
6A7WMC+3]B!LAW,26^$_d9O%iWT;rbC*hAt<s=D<M^r,H\8_<s>IG5`Ug_/q_CZHN;C(XE&
aYmXV9YJbLYC%U>IPl"<YUEn.QJn;F640S8+Q*n^:q=u/[MO?W1]tb+8[To\FB+Qc_Yd8BY
[NB'hN<-e0iuU%2qWOa(Uc2)PKoF-[BW`LPH9+NB24IAGjsMldpjVl-Q,V]MA&!QAXl`YZ(
bQ>dS(A6\Z!]/u*+-U5[RjAd3A]RJcmP$S7f?4?'Usl;NiCgS,!XlL2Lf0&4ND5Q)k0Z_C:
7;Qj?9,2<HDf[$0S9.hu2p<Ll1?G&8*"U-K#p[6kS9bGO4.<G=UA]am.!jGYGFgc2D>.AR<
/(\I#qWQ<OlA#67r$8aY]m=gPQ?267Sai<OqXnW=8W:"CR1ul)7'D0<,)GBU/P@Al-fHiAI
soQsme-5Ebj=AN+$ZWOI,i5+dV:Qq94dpMA)bF`dQ/lc74a`#;X.>5;IQJHmFoGE;jSA%cr
*)Wr(-cD/_cV9rVH9WDmDU-_GV]33G[1siPos$bXqcQcY/V:I4;RGl-aV+DqVFmE;LMS9dM
lV3h$f9LZI$^i%2o<!1&N+26^$_d9JM=W<S!+3\$4FEGdgbI!hl`(&3NRqMGsFdA'4[C,7_
?IJNF[[?4b,G"M#$-krr9dA'2>2c@D>I2<c#Y$>,>IB!]*BW9)^0D_M3I'uCt%YkQ::/">l
Dr1i9;C0r*B?qXaY4MA\(2h'(Q:c;bC=T?+\Mes:q.J[[^O"D.;kg,8TL"2T7ujOW%[XK:;
A$SHQAQfRMhWc?0JJSl`nnCUj_osd<r7IP$SqVGL(,*#77pmM`RHH(AN"&`PfS`TLo"9Y>#
Mu-.T`cX&["r59D.rLUqVVRNj<6>&mp_YbHVu$;C0pd%$\?hcCI$Egka?/Fl:&de.&D"TgO
Sj<jcGX%e^Zo8!AEKahM<UpP,]`;A$SHQAQfRMhWdJANEuf&YK-sldls0b(pWS1A`WqWR6+
hnjtIXe1>b&`f8J;"Q&*;&4J.XDV_nRm\n9b'.8G`<7XqR'.-D7:a^8;DV_lAg&A\m/6-_]
iSibF?+4tB<oHN,AuU:XnHX2(Wj7'Mp5Dut-72XjYt.CQgpt%@msaEC)3b#5'paa@26^$_d
9JM=WL#8FVNrBB]tAHoC=Pq$.plSL+GBt,('oCjcMLP;AuWt>/JE#q5_0!"4"CY,/=$'"Y1
aHM'!>&N99"mhCso,9jFV1!Y.\`/3mrh_N@G2b<H=Wu*cpD`+l*(N[;1I80q+r]3D1)qoB+
;)/aUcR4"TiEB;A"V)GX%&Eb8f[$!8[Of>(8r7!$b;V4K_jMHYb<YHRj5Fme$fGUqhc1AgG
9q=B;)>HV3kab?.OV9YPh:Ul*6A]dR3X=+dfe?WZ/;YQ$Jm,#E[\3e.dPn4iP>-D6q3Fs!Z
>^4u0Be2&,.h4+1:8uaBc^$4k0&2'+/=$(gW7n=W[k>#@W6`cq5cu+H)]P!0SICgAkV]SD"
OUI2A?!V0*M\o4'GMgB6c<Yk[j&&(r/r@!W5B7iKpeC+rq"H#_C\`i>Zl)[7A5O6(+WFE\k
c;EpqNZ&5RoXDRi*\EM\`_0[nfOcOALI<@&\0=V4R1"G':_S(sPsZ<NAUFOK)jb>A=Mp0.2
IqOX!Ao:7WZVWi%DP<(*p@V':`XU*3/mGO?HYN&P\3aPTh+G3ssld]H`_bW`XbokNcB7.RS
,e1?kG2Che-PdI$>71i0-?I.+,S3;4"\3cH32>PDug>pa8=KnIB0!o<>6BUFK(kJMUY*0iF
lD(B?Z4_&nBU27r`CXo/4?S9IFE_p^:nW?/9p!7IB[EDJT0CBS?#kIl,'j\L'gXYm%9_uhl
dr+IgqS>Gre?k#D_A\frr)_,p=W``G#=1qq!k,d_G&3Pa[$_\+`H5MdX!AY74bioq=<$`U+
/*>g^pVb4\JKm+<Y(QaH9pZr_5n>&g\S]T\i``!L>4G:6sRs2Jh"ggka?/[:-t-e.&D"Z"(
hQ7='<-P<6"m%?\76q3OkU*g7!`("$f)W<f6/BZO(SQ;4r3l&trReZ)VBGUk[12OT!elIDr
b,#=gp/Zg^*ZW&\NVD]WDfc<p<@]=M8e.HTZ]C3ILTI*-70/YQB^3r([g,(h)/:[]upTIo:
P$\M1=K:FCa\er'3pORgVDH82Z!t[O]f,?7\\hP7rr)_*5+e>q="\NoQbV"F!D>lR)H\J@B
J(4/e>T;oC)PMSs/?QXbF:Gon5^MK*&@E$YHKUeaMj&R9<6=e/G8)GPLN(7]Y(%_<YUEn.e
QC%6%]@ZTe?Haa&5ilMi6>p@u'.&L8n=Y:0LJoR*:)W9!7d4TgR=87o_@o=YEc_XoRKL\pW
MU#tmoaC"*(po&Rn[?*%'Q@&\rg"%u&obsb!c8gn#Y\8W=\7urtHM>R&9;`cN-NY8b@2Jq/
=X3K-Fp$q(_e4*tDnA9u*Q9&j70]>Ki1hgEP^'J+?921+F&VC<!-GsH\Ytg(iQT7Y=99ia0
Fm?;L%.>M[bu1H8T.[dA8sLmJhhpF7Gq>Y.iPL.sJ]=l2QAXl`YZ(bQ>dS(A^]4;FE#HFgn
r(^d\@T7L48\Bt1P$=cc-:r,SiqGoQS52j/PXJf8L%2[))Z/nKV"&i&PI7gF;/Vg:n^3FT#
3H,>V%`9EYFg#F!gQ!R'[PZ>#anNBjdp'l_NC7^An1ZC*Q3Se8<sK$#df,bUaq^6N2_h+>u
-$oB+<I(CDoQ@`/Q4<sqYioGUg]JnQdjZIC=%V?iNN1M>!`J,hU!kgZSqn0SJY/o33Y"Bnp
?GVO>b$,"q@J>l[$J\'?CR5/=d',)[6<YUEn.a].!4umoZUtU5/J>8s<&/>pKG'/WS-)`mT
Ksb^JW`foa<EbOGQC]U.0&aeR<eX;fBU8MYd3Iq2[Vt%UIm`Kerm`uNl;ZNHD6mm$:@1[]j
I\6eDa`+UQAXl`YZ(bQ>dS(ALCYK(<jI&EC<>iJ"U4#5SQiW&G4!ui2r`r\74g8bNZ8ig?5
-V8$!QVm;5:)WS2bLTCer$ELo!R/6r8[,K*Mof].X4^/[\EK6:N@J4?VE=`eL#$e3d"o9@Z
XBWR?Z/Y[@KS^F`ToK\DI6/2\RoTlAu-_AhdmZ(q4+)$0:="SEN)<2NE]C?4qnWJFj_919E
:79c&r'buue?U!F@lIDp_r*-'!e>6.NCY#S\[_oD^?c@m;hn=@aW]Us%eG]:=;qj%DkYVpb
-+%@56F`RKH1JUmnNuX2A-UR^F6:\\Zsle%4@rg$Z=qX[Wn%/CPu&X7Mj>kpNk4,\]tLC>)
9l%cSND$2hN4.nR;qA(;hUo9O-VA%QFchUeu``K_I0@!?3<hh&C!XJQ:`:B6S2onQ7W_Q%L
`as;P]+fbLs47J,Apk[AgQLf2@ONp17eKp8.:#5CQ:S/_Bc`)AX+.19Z_l5GouBW@Uh\>?P
+.g(sdG+B-J\o]_RelIin"41--h7-YKe99i>IXfX0tVq%_CK;C#,>,mL=$[#\7%]ROXN5N\
s+7%O^0AIeHhF<k_4"[[97'D0<,)GBU3D3q/kdO6R1?%3N@Tsm1BFqR_F)uDgVT?ikFQq6'
f!9^LoXB>MrW5=1`Q#n=3,kO3kKZ)/k+oFtHqPc-ldh'L<9;8f<OER</G8u=pFM4mONjcV(
BFR=!iWM4^3nUIob\*l++O2c\/prSFX.&^'jKO[.p#goeRj*^2qb^,)B'MdI?92f@)2n52J
4"9]m<+Qprq(1c^6#p;A$SHQAQfRMrlQJ0eoqB`JW/k>.8Ai',/:?m"uN.W,31"(L)*,G%P
GBQ'sRGNZC44_80R'Q7]8BY2hf@S2dcBM\[iGZW+G:lB*;]=DI0KT`[#e`q%'BPbf#H[V\\
)$Sg=?]6:1'(BIX($m%ELUbPLd4'&j4lC+2_J>J.'mJd(]`JPD*mP/b.#n@GWC!`659'G*C
2g'2pZY(Z[?DY)D"M/^>,2=D`e;RN@//?QJ@&XF+\S08d$1$3HVq.(!bNk7K^Y`n`\<5nI"
X9,re('Vd)0&-33Yd=+V37G$W`=tR]O--`jis8RN"q4:5tbdWkr7@`_=36m,NLD)6(InnN>
l=k7=Dm2=0>fJ*7bT:0L3.>HhZs-[rke&HXR-h*2$%lPesqMiu$N-ZDIQtn%XepjS%ieLJb
Fn$Fr<+]66oJZA"u)>\iC6(m^'C26^$_d9MpAe2ha;FAmb:T0Hti-QsY,>.&)r@hn!gkK]V
3kZU5:^qbL'=dgQ$h7Hb<IDago]3rI,N/]=h(J?(@fWg(6_Yj6$:S']%a2`t?jX3iq3&ilS
C=Ge!k::5FKN>3Y0m9I:l-aY8b^'6f4aZ5XhS!uSGOO.e+&N6.,q7=5o?TX"X"%,LeG8_!W
D,O(qGbu9#1Dd^rVEqG9aJODWPAE*S)X1=0k846<g!bmWgB&Rf</DY4">q.7>e=ag2(:m-*
VTh7#;OTVbRu71:<aHhtHHlXf\^`'e>S'?Tr$Oc\uSeV?qH7_KT.'J>FH9%4i5[1`)u><@'
C>0:b7QQ@7;olIDpKQ+1el!Z@;ZKn]@!qN?CR)3+:Vh4+79:b(Vijq=O$5(<DhbBo7A_95`
uStXGiRhg&2RP\_6ET4p=>ITc$FR.L0173I^lBS9FkG:h<gt^[sba:\NUVsT=5=1C'5QT#2
lGJAfW='?8KcFR]d=;,ffB1>Ic^[":p[6iR04'b.gqS@=qXs0P:S6LRE?j^aqtBE,pu)J"4
#mK0DjRH1C"()Ld?0saRD#BOZ=Q[<b(Bp0-<HD<2/RR)g*KukSih9t>qMD^;UqF\jiX!VA5
#WBgEJR24$1&!7ujC8G`Nn/+t"GBd9XJ6H2$a_j2[4a;Pf8LY,tp;Nd^pHhbr@EGse-*3\<
@4jJZ:lmdT2Qf<8OWG1#^3\">m7:3I5[`ejYVs+Xdb;l37Qe>ZBC8sRhQQMd.i1#rE1nF2P
8<=ebb)cEo1p;I)+7J%L#.Y;=d)RWNGOTM;C;5d;7acjNM]=YCCI&%%\/<rJTa6^r%JaV@+
$Z'*O9-k,u<j+/j&c5rZ&Pi^;agaYBOiOi(rR.N8NuL$<N8#5HP2$_lfUdCu2f78J<:@bg`
@Y)0rqu@`;;]>1hbjc]<in-oXrn;M(Tq<Jr;#F"$5Y<WAB9l(kKcfb.CCh>F6?:h8<CE`U]
=%VoGUg]JnQdj[FCS2QmPOr(nl]Nfs?$MGf[FH*'8?1gMaha6E(qV24=8g@;45m=]8_WMH_
PJE*?@GW7RS>2K%:uW\>M:+-q,LdmF$tisXQO*^'5_+-RAggt\D:l\ZE-[VacBq!d5u?T<N
4q!QtMaaU\'Yp&PWpr1FhH1OGs:+WVK"fYJ#;IEn*W;Y&];Mdp<lIF&`4+oZBZ)+:.g:o:F
[d:qh'@3428,[Qf/hW/h;s?LF<EcbCU"l5L!g\`-26^$_d9O%oWQALR,:['7]\54kZF%H[G
OPP+it&Ojj_Lj;CAu"CZq+S^@)X^_5e:=7G&<MUPKJOb'>t[;UIPhlS#B5]9#a>V*NR\b<6
WS1aD!<9GG9Va.RhIB,mDl;ap]ng8r/FbCtc7qgA>FMi5*9AUjXO4/`b-Z<iqgEKuK]NK-j
Bc4Cu["q=Ed5s(cCc9Dk5XSj.^R`Ysdr/R]!j<(*p@V':`XU1m7praLB,'cZ7"L)(-P7K1K
e]mD&`&*[[bg<-5X?bEFMW<S!k`l:JO#H9h1OQj<UL8?5H&_0@1)QD5W'Za*OCfSD#^A6n1
p.]Ysgc8jh_hJV!Y>ZkY))=Us4r4AR<=utFrqhH]+%k2c]IYr9Ml?XSqsUQQ(?+H,hnFN>l
IN:i=V<,2-qK?2-NG\4d;*-h#bnkCh,4RJhnO*^YbC'GcCI&+PEV1CpQ,?*GhgE)-i<Z,?_
g4)Q84=4.lMM5d*nmgPJQ+iIJ\]tf\G8PYmcmK2$Fd4(K%LL0sY<0Nm+r1P,/d8+sNsYK$'
cr`JP;.EclM9T07#1N#<L;@$rNI%c;^/S_1tQ,lgT':SUC=,lcrMd8H1C]_(aghg_]9B*oA
',k.,&LPLY2RnhqC=0C8m;A$SHQAQfRM[h9qq9*_gq!d8/j)un:rqN8BlfA^S]RB\NW`?)h
Num,kI=!0l5Q14QmFnstrUj5b91s&9CM.9m0/'N9Ze=^#\Pp"Snj2uO;g3h(9-miVHF7M<W
X9c+s'totl'ZB`4\JLXmFnt,h^XHDX"TI<5gC@hl(c@7PO>c>OccZhk`n)FhFj1fak>X3^f
'8ZcCaXea2c0<8`'Jp/N&6!gU<@q;*q*bjQl-$fle`;R\\A$;]u)[8@p\!"I=r/26^$_d9Q
<PW@;)bGd1l*RPM?C#1ukP:?=5nT]5%n,[>`3If1+Q;VP(UZ*CS*k05DUW0#4JP"MWISMJr
cg6S3*ASGFcC[569E[fP0'T*\[/p[;,@Y--=#A8E^RX@rb?DOD_JH@2pSs6dp):>piG3RFD
]e96^qsX:Jhj:nR9u0_k^H@qapYUHN50%p,_M&0M12,@HV6ZR`9A-U^7BQ3^+L"g5YCWMoL
utEZ925C@2=$8C4+@%j-OJNO5%SMFlf[FYoff'1F6Cg`mK38iZpq:L'M'Hik0/rJaV?fm`"
3*,pI;C:']-NM7ns]m^YKSU>-pYP%Qen&'UTMjKnP*^GB\7^R:M+SBDf#Nl-cC`ld(OD[;/
!QoLM`<7%nNl2&H`4+$Lt5G3@/A1Rk=5/4ATGo]X+tK.nW]W@<pYVl!4[>.SfiRCe:1D;)F
8lfR=Vn6KV:Kq+C(7ZA>!'K$boMWd"'<!:TR==f^GV"\gpo$_9DSt6TB9_eGHT;g"WPUotC
HhZsHD53l$V/=ChFR%@I\1amaY@_U.$lqKEaE\IR*Fug2rVH2$e#'NhfofoqbO!og'<uE3^
A['1Mm$I#9!.1MoB3u=\T-Ya;LM.91.FEVrqs]k'7]uRf6mDbZ&Cf'(GFXF<NAul7W$kdl1
*fSU/n+$iROu1/hSaY#7bRsTE.pJeEq^-"Wng.++&A3qXs0\<6bb(pLVO6`Q-"LgFluk-#p
IK$2dnQm+=&O;_^6k=B]A9r;;Qr4Z\)lHn-]tEg57l.Nqklp$1'4%2uTpkK\m>#cTo_/&]B
E:i@S9TBa:T3ub_?OBW1)g_`JC>VG/)*\h,WZa97U#7jq&%"@a+"lo4JU*0J>OYT+MrbR6.
Po6f*7'D0<,)GBu@]>eC,UDI!V+X2ck0BMZA]b]B"rK::gl*+,*$$&\*'*TVfeXi`U*N+k/
68j>n0$oL\T>F,Um$n%5a7.jlK[Y,Ne3gmh9;9Cao>YQAe"QS%N[`'#)^n6#>GH_AM7E),g
tu?k-f$TWmpI<?+W"+]hrhHIJilfaAn@b2VG%<[l6=b"oaJ5rIP1\lI;dXH!Hn%GOG1lgQT
?A7Re;uG9DU<W2Rat+.kN4K#lm4c'r!D>f_al1j7073TNC9kM!\#^SduB=BHF/9)1`TJi@W
)>eG=/h;*MPlIBF;baLD)n`%M_:/5$&DEW+*&G_q^I/"hdnUQ,idLL8*7<FgiWMQHQh7Ilr
h#e:?V':3p//:H-(Yr;qDBNF=iGhWdm+E]b9EVR[Y?nmdRPSd4Ya-kFIfKB@!X!B35?4jk\
T?rZe##jo]mFs:BIN?'!T8gL^]0`[CKe2b/`FZN,,`3Sp=lTIX%_\N'3H`Yf>(8r7!!pUC'
'%(5[D@CHM-R9b67Yb3&m;(X1,S4h(Lm?rqsZh&)lL+]^#X77#?n_]mBA:qXs/%:7TtKGOI
crr3J\A#'K4\q=+j#C=R(S\8durD7XoXC27Us@Ddhh2fG/C"U.OfoGUg]JnQd@<)#&rrd="
_o&IcOk?TD7!!!H191AIk==So90!J=JLlRMPZ=Sslkt7J9S>^Ko&WF%_,ldoF]`LhqoGUg]
JnQd@<;!bIodZ*Er;#sYmbN6ep?`LL4F6MT60HOa=l+(s=gOu+VL\dK!+;82;A$SHQAQfR$
S5:@*#osH\Ra6j<<j$UChICiGOODcp[8=l#H(f!JGd/MAl"pVZ#J[=k09C%ph:*$f<=Af9`
P.nq>ch=kV]SD"OUI^WTqm;B29;Zbagh>d@s'&Pq)IO2rCiTBj,9&XI503^q72Y!!'A8//?
QJ@&XF+\\M+nUI'YAd]?@]AnGWk04*_q<r`4#RKo.9kV]SD"OUI^W@AJs(ha%@--VrDRs/3
?!!)3`==U&s^etb4F+L0f`1]PRN1d*O#7aF"9&eZ.!!!"F!1&N+26^$_d9L(Y.PZ#,9XPW.
n%\lt2u+'d!!",Z==U&s^etb4F+L0fKXnY(H@B&)B[Nqd\+8r2!!!")!D>lR)H\J@BJ-Mg2
)#jU`JYO6_bY@:c>@E8*>fX7]8HXh!;$IH("$f)W<f6/^f"/V3&l0;[V\0Sp+0+;La%:OY$
ANZP:-8&q!d\h!!!"I!_YuS)H\J@BJ-Mg[7O%cI.6(1`f1pm%NS`^DV]mJ$aQ79Z!t\rc->
FrRs4Pj<QpU/!!#8a@&\rg"%u&oblsDJI"Hs%DVr1qiSibTij*t-njSHP:&2Yb))LXGm+/7
@ZZ"a8.p&m$r:lCuV#UJqZ4O6>7'D0<,)G@_9*G:q!'i:j("$r-W<f6/^et15!!&)h91AIl
==So90!J:T!!!!E_bq*F#*t,hRL:Y]zafn`4^O`4*Lunb3"TSN&5Val*d;NEl#bnlF;?6at
!0@U^7J%O$.Y;=dYZ(T&!!":^;A&j3QAQfR$S3"m!!!#@YZ+$*JYaQHjoS0Z!!!!a1+X0fD
d]OMU:J';!<<*"O:4cNoG^m^JnQd@;ucmu!$oH[&cDp"MBJ>q//8-b!!!/j-be?k/nV5q?J
Omp#17i?5Bt6GnktB)Y6*99*]KWL0&^_-Lctl5"TSN&zTIR3$na)*n:Z,M3zzzzzzzzzzzz
zzzz!!'gALl.-Si,Ji2Q(X2s]T4!3z!!)5KFXp70CUY-hccCZQ"8tT4+#a0"z!73*u1%Ab/
\o:_8D.UWcVZ;N&z!!!"t_lFUQ4Y6!2X.Qge7+M;>6ko\%z!*$dEqc3(@Vn(_%<<*"!z:^M
cjnB[nIgq?L)q<ou:INc@b*WQ0?zk`A(0d!jf:F8%lC`OaBqpHG3o+$BT(z!72nP:Z(=fI9
Ok!IVX<SWW3#!zTE5U]%WIau/S8CO(!jSlGTT'Kz!!(@b&`M-TqQ8m4I9K<oX6!+uqX?\!!
!(L-rk16p2d\hG"n,@i!!!!A"g<8kX=X->T,,nVj-!WuTCG*q!!#sVr94Ggk=]jX9\Yu"AD
hkE!<<*"?n,u95/VerU=&V?>]TMs'A`s*!5KJ)+aM\jbM;PWg<K-dCEgWjGooKU!!!"d&Fj
`Hj$mqI5"a49X=W^u*4X8j(]j]IOdM6;B),<lpEK"%7gJphO5BIlMuWhX!&-Fi]F+#UE=)B
EMK\$on[nm`WWA4SLlRLb2e*Zu>EG_'@*];=LCjLd!!"@gTtNCqO&\$-V$m";a!L4=MuWk<
&JG"edTBT=2]kb,i@GLe`<QAC!.`9I(^tJ_mbg9<d<+MEgDM"HbPOg3!/uKTgRo,\S@II"1
``k(5=`Z]5*>mG!!"]eJj2[4m'20>\4+lO*P!=I+H6&W"9>CD_u"?W=Q+-H.m5HNT0C9\Vu
Qet!2+DnW]0[GMq0\_V^%L*"[L+5^[ea5Vkr0e2-S=grKqd=zXK5TOK_st%lQIM*X-^%W%0
/HMJB&,#0eGW`oCh-c;ucmu!3d+O)*;T[>4,l;XbVjFp[#DE@2K!U+X&#VH.<5hpD+c[eDP
J3TCFrlz`:;o^:\XR+gda+\Lr5qhYqbd]O!aom/g8''ViT`PrKa11o]isI`Np)fO!ao-!!"
jtG1VZ-#;c4tpqJ]jqM4W*ScAcTGX(^=g35FKRu'=Lr:""K`tJFQ!!$1K0d19%hcL+[R1/B
Fq!e8ehM2dF+GEb7me*ql_YlBeO"=L[JG8R:!!!"L[L)R:*RGg"/LZf(*UJh.]YjW.!WYV"
+.p'onMp9TLMem$g,UVq.nTmD!!#8:[r4CLCmGE?\_Y)hkW%Eh'`^M^;c(D3>BfKo%Gdg]V
kpS(#4OgVzcj<o8?/RoZd8S$pF*[NR,O_B7!"e/SU\E>f<cPl[kUEEih;`o_!<<*"TH=d[P
@dSD`dNN8VtBBAE94rHh?Oern.c@djJ)tKoWY^cI\Y7gQJ3G@I:*'U!!&ZNJj4[lmZ!hR'[
?o\;t4i6]T4WEi;XB1(:@iL*ptrlSRq.aQY=%rz!#9a#ruG-:<BN/a2W3h,!)/%N?>kVl>J
pEJTX3R!;ucmu!3"&3*S7e3Gk@=d?'_$GI@p8="X$I%R#n[to*$WPHkE9(cCX[fI<Ybm!!&
[)$jOVd=WZA=4M$KHrLrF'/C4@s#Q-f>:9es%IM:(><\6JOqsXXe!!#:a6q51T*U:LijJ0o
r20ds+a7"9q@0!SKQd.bZf@>HLjfcjd)mqCY-D'rD"onW'5aK4SI;j\:jkRm@\r;o.h'V;@
#mlI$%l+.]-TX;+e^>\tYBmlo@#l'%+$t5pA,lT0!+[8@gjFYh\CA]tZ**QQ"n=dt!9fgu%
t-nX=i^JMf5#\SY^bU(QM3ZL!!!!aQ=KAYbbV%DH?WP=o\^aB_8,q-"/%S^A)]GL4,r^^<6
_[8GBk9CzA4;;=/RNmeqcHDHR5TMPYKnTQLDg0knDp:h(i*dPQaXW7g>OIKisYnf!._.D>[
5.AZ*)kP7/BZ^:.l+Bgdk&SO/`3$,!%2sPOf[iKW93mNSb?jO#QA*!!!#7P<f/p5s67!O,J
+PC#e"+j%!)LV"4!1f-:JZEPITXTAfb#KSDnc52#u:!!!#@O7'dKBt8ookXbI4eT&_!D--3
O"TY9QN/UoGr##1o2_1\JVkl&=qt!#0z!<:+8dgrr!OKqFV*kqXDK6Os=2uq[jp5S7QqQ8n
/fk,q?=kI#pns&kL#64`(!;IXZ\mOG\9ZeQaZ<4bOq6>bFB\pcL!7SpE04`IH&+3M7f#b`k
2gHKdzJFjZeaXc]gE??W@SIFqoo%^5A=K2RUFMu2;Dg/hGX!:q<0OC8NTAY.M!<<*"!5;2p
6K7>\41L?<Z;`01Fa`u5O8"bA^f7gbo>RXoCUmf>=XjekmS6GLidKkgz1*n,,HL+HEm\?X1
'e>3]X-Oe5$]X.on,_I(T5QF2-19Ap<f?@d%8i7m]FR1+zKb&VU=I[>*);&H<YsW^K'C^na
aDs[=`O`09f>H%.qdl/F19BB%:I,T*O$<UE!!!!4:EKAjV(aM>43Zg3bnn$R56+0i?nbhFo
3c6=bi6ehIChPQIMoru'EA+5!!!SHod`hM\$tB]NlmfY1Nga-<u=(%STFPVbAj:8EkgD8Ap
RS5s*OJtmo'2d!!!!a1oHAij$&^MZE^^>>I460d)U+^B)r"Tj8Ho?k+lkLYHf\uEdP?EiA'
f-z!'ha?[p@rVTZYFABt;0-eVVZ"8DY]q!6X6co4cmP"'-380<VCH,PuEN4qRbp!!!"0Z/4
^ZpG#Y`:VX%B]=2(&NfN.J/c[#bTTA&IQ64"k"Pg?>m3;"?!<<*"!'i.@K>D!D!U_0_A8n`
;L\BP]NK*+L7K=QkM"#*P%Hi%[>0?df6In1=2]-e3&-)\1!!#WQOH;GGqG-J=.thG(n!/\%
hMdGFWr`_A()jU:ojY[RbILt>#`8MmI7["L;ucmu!9f4%kd\`a]5f!)+XquC!YZsFA,)pDV
u(RB`r0@4;Y&/pmI>0&][$rczKaA9JZ5KouqcF4tc/;nYp[#C*q)O3(W<'g7_s`$CRcVS9=
P@i25`jJhrnB:[17%[6!<<*"!2'ZB_4SbM4*)K`+_fE/X+U;(F2=ImGb6!!X7Q1!^mFkD0g
Ch8A]!Y*T-Ni2('"=7!;&t3a7)rYf5VmV+mIG(ElhM*j1[^LGb6*$/+W>[qh;@=YeH&&`b*
/DYg=fT-O9\P!!%Q7"T!n6(uW>\oS$fad=_]'m.S$b#1Ieu,ES"KGicg&C#c[A5P(#@ArO-
=8FU9KV[3>'!!%P3nFm;.eo*G?0c6'V`X[,OHLME1XT9m`)A7>2j2UTfCUg#%87i_o^aUr[
N;&_Az?rZ!t$Q@f9-23N=,*5)R*OiRc#kSYhIBikOnDp:(_kI7#*6H,T]`/mTp](9o!6CVA
Gni<C`sV7p0gn!%(3U'uH/,t+!_Xg@ai)3=T/lH1K[H:!T?dd#6i4%[o*si1aoDDA!!$uuj
`CG&h'&fPaG9jlHZrf6Cqr:M^-81E2k7csY*BPeI?.O\zOQCcd113pS8+'kCKJD<;gF`25p
[u^*j5UeuT0'i1q&BufieZbs>BauJl@8S9/=OcOrbM!R.KBGK!'gm0?O%)*NH\>ZQ9dYS2`
[LUrA&otklXV8KS7:u2kD[j^TXQs'(2YG+t=fA3;J'>];P]0!!!$!%ptr)R.XOUYo19)pU2
Ror'GY#7"?XKDhGK9^4<DV1n'O/f*5Wo,QIfE!.YLQ]al18%kCRl2-(KNViBSSr:&OHcm[b
K&hkAX!FbkLhln!'Jbp=@8BtmakFdmp]MBgRz'8;Bi7h&eFIE[GeM3WeNN!W^L*kW0akqhc
A$E/[)gRnWi2opQYZJ^5T+`]>]W!fIj!rr<$!"]@/Wgiof=!qlKEo8j)VU5VQK>IGAYPZ?2
UPIb7eOaRHC^:K,jF(V@zBE056Ih,o4IJegJQjKNHmr6&6gtRmW%e&usLa+&dn_^s^SQDGf
m^%fJM1d:E.5l&UiR,<a0)ttP!!(8/`_L%I`I/GU.%VTq=0>\Tm)E&oaN,4TB,M7)cp.0h8
M>if#PqXVkC2,-MJ(5AS^Gi)][&>5zNBp$1A/rR:/;L0gmd9D=NSh$WlfG%*h^9`tnNPdEI
u+Gl^4,mWoBI!6VH;YXZ=#oJ3sGZb!!&)b)+Q8_G_#[I%T,=d\h1C\]D'BtgTOrg,UME3@&
">NQf*#Tc.:,U-B3/UZEWA<1*C=EXlFD+AH2]1!!%$^UFGA+-b,6'&>Q):eac/8pDht0o=;
>;@KM!g<J?7uke"<1mb2u4cI<lJ3\BHBck3$al_Y&72&lSr!!#8JA5'Dem3;;P*Fes=m^.)
UKWXY]c<\3UoMZ;:bE*5(r>4<4NZG^CEp;O;f$<'3/7SNZ=Y)b@k6CB2&HDe2!'jU*3H,of
1THW<n1K5O_tpL?T=<-Vqpdbe?U.eK0c9mOrR'.g:L)MDSN_K1IPB%+l!\:Urq(WqB-dNX!
!%NZ\T6YKYDu8cO7s2!al$JUkKVYeFjl&&B-4j8mN3A]che.4`daO9+O'HNbCb.ZY$$3qMN
(itXq'4t&7QjJf@Aj;]<?LPU]:Ap!!'UlnO&q"4]ZMDocYY!.uVBA#-V5jb@A_mo4Lhrqsa
U>TTA'C>b3f-+Xt2ko\Q-??_$a*S.lRVY^WY1]F*SFc2mtG!!)4&^\>Qo%E:.@#ZH%l>[fK
uKAG=rS"7kFhLFkFjepFrp]c6EX9j65NfN^V)g(i*b7dB.[r/pa_Z%o@$!W2X>D&>g&]TbK
\M<;X3:@Luz+A37])DuB%480=0U>>IGZl_$<M4@"mkNl@;G^P;DV5":a>e0A!rk17o?MODI
#`T+N<n1`UULF<-_T90um_-/WnHna44ZfgWY!9PPi@$-h_WX\r]&T1Z6rrGDgDL_DX55iFz
!7DGqQ`t#:IdZ5]7,R7\D)ma3^PB"b1tHg3Uht1Nmp*G3s)P`(cDs^9`dQnCXd^u>`bk[be
GmX)`Na!4%bT+^7m9I-:)^AT^4&WAPs%1\F71$An#T]9,U"=npO*q[!!!!Ab@*(AL_4SJ%3
c(0Qqj_6(@Tt'=UU:t!rr<$!9f^^7m-=bPk!4fG6%u$A5)Ge9<VZL_Y^JEz!0Zg.H\70)&H
p58):i`NbNJl;n&GD.!!!#Ws7$%"C--G<pJE,d+:+<-[<2udrlk77$ig8-!!*"Rkib"<\U1
lJ'bLR7N1<m@O2T'bn@f,0zJ?N?7(q.%^['JUSBLEC70g_rmljiBm_>Ddkz!%;*coV>:GA_
]e:889j/&q['EIbg=I^%IQ_*>\\U!!!!Qn`ki.L]L9+a,gRY+=^sXaGkY__7]6Ez!'g\G@8
ZWnn)QZq6kBJu4HB,j@UnDChdlfg!!!"LBTeMe41AJ'ZEW@QUdPas;'\:Um>i:!bPUE/z!+
^*<cDs5o*P%4_&HkC1Aluf*hG8NEhbsOU!!!"L!dkCbRpt^'I>!G"#U2:8VJHbPNT>LH"TS
N&!!%lg+.p("knNl3-6b[A0c8#IZ*IKEA^gIn`$F46;#gRr!!&ZSQS1JhgXUlPQkMasKJA+
*3b#W;z!.Enno4c)*c.kg\#_F2Kbau*bpsWm4G>/&;!!!"l3q;`sS"7l-=n!Mb+p^&N_DuD
/7gJoS40BG0#2])Iz!+7oODnd:?HR8Ek."WR4\r7Kao^pOXhY0P@z^k'joaEc6YEZ^Df#_J
klIbqfb&M^reNW9%Z!!%Ng#".st4Z@^k0&\uN71^`&VbcJe-]WHB^*s*`zPMkPDs"W*MgrH
?!Jn3P.Z$#Yb+3aUg#QXZ"g:R*W.-j$Hj8WG<Bd[-R7O<=O1UE9jVL+Ls\ThCJn-0V@W>uR
J;+a,*2&-Or2FGEgK^qGR/hH@0cCT$Q1T+qB%Jdm3HHl=G7hL0@msI=*m'?[GK(Sa0D^mg/
O\1dk\]KopmAN#,j%oaVpg)-=m;oUlJkrM3`^o]n.?8i<5tM%Vr/pcF^63/(nC^f>Af&QmO
ZmOVHM^(%GlRi'%]<+2k"Lg?T490YA94>Is(,,Uk]746J5N2AVq6j,P(pD9er"-,[Ek9B!8
rEVh@Q/6D-cYQ<`0./?rlgnk0'Go2#mVG]t5qtHMjtB#;21)Rm';fj,).G)#sZ)j4r>]"ga
)=cao9oWenXdKbi"hde_5=ct=0q!#[2I(t_]*Cs)PNi7#*0;:4IpH0(lFrVajbV\]=5RB4*
(F32;)i7"m*&`+I"._`ZF/bFl'!5Ot`8e(4ErPeEL<sBb!-&o]P9j:^!l1r03cpnfN!+X6\
T5Uk0B4^RX=OP8>P*NXnrP>)[5%k-#J7-Y]?[d"Ok2<SNUu8raI-H@;O.jlF!!)e<EZhc&f
?"mD<t4Idr(-UN>ghH6,AV%o)cJ1MisPk&#]esOpR8api7#!-i@L.W]4()XY-+AC-P-7Xr4
\KZmhX7(&q"_c1^q(.FPEXMSY8h"!!'NaA27/3i,$^2B^cU;dR.beG#A49k<g=L!!$s[ick
7-Q.8ZWX<@9t/SPK[q8DR@>poLGPG-;>!!%6Tf<9=`6u+-/b7-X=9DXQ8Z>u]DeQk,I"Vh#
f;6R+0j3=FT6B0P06dPI(#.3CW?/Jre3V6GU!!#CNe;8)[cJBCcfTpVd^%QJlm&MY1cOU!U
GUS`seDWd>o:FYII.3GDcPFj]Er'<^k[O\p!$8_&JRhJtj0LNKK+Hq(I^aSuD5d?mgu.*uk
gKS5!/=9V?[pVH-_I!92Y]Nil.9sQ8#n.9H%[gN!+T%lT%LILZg>c%i5<)^`d;ku@<t.4,R
-T-$31&;?I/#qD=?$$Ht%6f6!YC]c(8(JJ'Vj+.0'AG7Qd9p\*%kYoP!`f>oFsL9T)s>4CL
GX!.[;\fA"&apD:/KHFB"/&=].p<)_W:rMKVqn0b&fkC`Z#SpT1(ejr0`id"bn4unrL8;4e
$!<?O"8Is86EVbALRt;1E;?ld5P);&&>kIPA!!)L)%1Wl>q4dQLIr#WZj@c8Q860X-ZJ?=+
5DHn;!<=7k[($!5\8'pN$2MEXIVDcG^0-?Febo3[NR7DP!!$Q8?b5[lW&XMCPdS>/!,9B;1
HeoJ>'K"QGNeo=!!(#r6t2h_^tD05Z7>g&Y:lk7h@N=,4WFb.!5`Dbm>)NW:EH,EHomDk2K
_@cb2noFHjTiR,K.hG[s)]hCi4Dnn7CQBH6i,i5T.sj:N*2eH(t1:4S2nb!!)rJi8A!a;u=
`!Q'95L#2^GsLYA!_q9.[LFhAl`9)3-<!!!l#3]jpq9C$Vq7>%cVdZCqWp;X+n:]Adb-hMf
k!!(fH<9h4OX[W\uV`e&lI'\q6@X$^TR_GR&]lj__!2EfnXn[I\B3okW/GPs5i@)%hn/KJQ
n`iahe5SC#o^mmPP5kT5+nklrCEI@Uo'D=Pi2_WTcPFg_\81tSSK2"0mi)6,i8I;)#+JAs7
9<MS)-Iu-'9R`BcEq8!aX=2,Y(jYf!!%Q.et3d=FlM.5GuZXIXpVn4BT2[rAG*Nc]hN.nP0
$\e3s,H_#V<ZlSj(gG/Z?+\C7*29ZmL4[V(]U_rab6i!!!!9EI-Z%@s)/?0AAYgnWgrb(M.
R39O1^4Xnf9m;KBQ'VZ6_4^%E`W)GaWi.BJq#e"`3cABi@Og0Aa`I.QH!b/_U(!!!PnqodS
@GFj'Hn)]\5n8"%R?'25D,n%n><#f[hmI3uN!!'eGqPj(QrDdKr]tS"Qhu#U@ma4ssf<!)p
C8h$0qc5iOPm[QlA@VWW^q$f=je[)Q5@5>Napl&rBnS<W>jg#VhqM14+)AFHB6jRYJ0;FA`
K)sr8tn1aZ\sER8IEoDB8Y.S5l*7Gh;'%HH3=3Jpn'(o>s#:bbj#pi4EDt3S"!]jIeCFMLK
eZQ\/kFW!rr>2[uRLp7r$AP?bQL8S<De\Q2Z)n`oXokJ*Wu+6g;kfViIq,f,"De^k:saflO
eL[^EVgl([pLN6`$KE9U.VA)aM4?N'AgnqOJ`0#d;OKt`QI!!%c1^d,3u_UX;9Rb"\!^\G>
kPK%nCdKjU1q#"3"-n?aJq5!.hHX!Bq+9;HB@ng<KJ#qa(p$Paoo;Z,aZYB!*H,2GI1"Fb[
q+DO;\$>F1H7`uLm77__6=1<)!!"67It.%;`Qn=tkKC?c/ULu_k6;H6Of[=A3@26)I(ZS_^
>VUUHX!DU'EA-k^@_'i``fMbg>B8K6g_LhJ$`TaZ.E4[A<Y'sh;(XQb3G!.DJ<nR80eC+s*
k(M!+_PZ5cV/cX1>4Cp;#APd^k^e/!he<S,-5Qn?"BP;^^YPJ#<"3=$J6mel;'"EP*IgrT.
h:Ut80=!!'l,De.J'Fas#U&"bf!Wct'bg\>K/H[YR`&*?!b5%@oG9lK#!Aei(pUge1Iebbg
Hn(VnE]oAo(jfY(9U&Xoh!!)f#;Q7JOf=P6?>\uOX<e'mlFlfUimiO-<f&XUCYOoiDB^Y"c
e(-sn!^CFEl@f)g1Y9AuJ*U<3\#8ud:$W==q#8\5*d[Ht9DYjj?2Mt(\)O+]+TVQC(d@J7U
8t>mZ_OS'[3O7CjibY:`uAJXC7B"=)_6-(fN)$[?<VQ^NJ.Vd9CCWek#J7Eb$SAB^\?>e.O
hIpos]<JhN7_(CA4@&s7H6ZA$P0np2@\EiR5]joTr4#dGB*loQLfGzzzzzzz&Dhm:o`9!?~>
Q
Q Q
showpage
%%Trailer
end restore
%%EOF

View File

@ -1,585 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="104.75715mm"
height="57.028595mm"
viewBox="0 0 371.18675 202.06983"
id="svg2"
version="1.1"
inkscape:version="0.92.1 r15371"
sodipodi:docname="Logo-PCLL.svg"
inkscape:export-filename="/home/yohann/Documents/stage/Logos/Pôle Logiciel Libre/LogoPLLGrand.png"
inkscape:export-xdpi="200.87115"
inkscape:export-ydpi="200.87115">
<defs
id="defs4">
<marker
style="overflow:visible"
id="Arrow1Lend"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend">
<path
inkscape:connector-curvature="0"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path4626" />
</marker>
<linearGradient
osb:paint="solid"
id="linearGradient4664">
<stop
id="stop4666"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
</linearGradient>
<clipPath
id="clipPath3132"
clipPathUnits="userSpaceOnUse">
<path
inkscape:connector-curvature="0"
id="path3134"
d="M 0,600 H 800 V 0 H 0 Z" />
</clipPath>
<clipPath
id="clipPath3248"
clipPathUnits="userSpaceOnUse">
<path
inkscape:connector-curvature="0"
id="path3250"
d="M 205.131,405.857 H 559.926 V 579.858 H 205.131 Z" />
</clipPath>
<clipPath
id="clipPath3260"
clipPathUnits="userSpaceOnUse">
<path
inkscape:connector-curvature="0"
id="path3262"
d="M 0,600 H 800 V 0 H 0 Z" />
</clipPath>
<clipPath
id="clipPath3288"
clipPathUnits="userSpaceOnUse">
<path
inkscape:connector-curvature="0"
id="path3290"
d="M 205.131,405.857 H 559.926 V 579.858 H 205.131 Z" />
</clipPath>
<clipPath
id="clipPath3304"
clipPathUnits="userSpaceOnUse">
<path
inkscape:connector-curvature="0"
id="path3306"
d="M 0,600 H 800 V 0 H 0 Z" />
</clipPath>
<linearGradient
gradientUnits="userSpaceOnUse"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
id="linearGradient4668"
xlink:href="#linearGradient4664"
inkscape:collect="always" />
<linearGradient
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.31504,-541.38903)"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient3315"
xlink:href="#linearGradient4664"
inkscape:collect="always" />
<linearGradient
gradientTransform="matrix(0.91526376,0,0,0.91526376,-623.43531,-541.69844)"
y2="926.69495"
x2="1341.036"
y1="926.69495"
x1="1114.8962"
gradientUnits="userSpaceOnUse"
id="linearGradient3440"
xlink:href="#linearGradient4664"
inkscape:collect="always" />
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend-7"
style="overflow:visible">
<path
id="path4626-5"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt"
transform="matrix(-0.8,0,0,-0.8,-10,0)"
inkscape:connector-curvature="0" />
</marker>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3132-0">
<path
d="M 0,600 H 800 V 0 H 0 Z"
id="path3134-4"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3248-3">
<path
d="M 205.131,405.857 H 559.926 V 579.858 H 205.131 Z"
id="path3250-5"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3260-7">
<path
d="M 0,600 H 800 V 0 H 0 Z"
id="path3262-3"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3288-4">
<path
d="M 205.131,405.857 H 559.926 V 579.858 H 205.131 Z"
id="path3290-0"
inkscape:connector-curvature="0" />
</clipPath>
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath3304-6">
<path
d="M 0,600 H 800 V 0 H 0 Z"
id="path3306-1"
inkscape:connector-curvature="0" />
</clipPath>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.87885425"
inkscape:cx="-47.520975"
inkscape:cy="52.746356"
inkscape:document-units="px"
inkscape:current-layer="flowRoot7052-4-9"
showgrid="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1678"
inkscape:window-height="1028"
inkscape:window-x="0"
inkscape:window-y="20"
inkscape:window-maximized="1"
inkscape:snap-global="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0">
<inkscape:grid
type="xygrid"
id="grid4138"
originx="-168.73733"
originy="-76.130441" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Calque 2"
style="display:inline"
transform="translate(-168.73733,-774.16196)" />
<g
inkscape:groupmode="layer"
id="layer4"
inkscape:label="Calque 4"
style="display:inline"
transform="translate(-168.73733,-774.16196)" />
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Calque 3"
style="display:inline"
transform="translate(-168.73733,-774.16196)" />
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1"
style="display:inline"
transform="translate(-168.73733,-774.16196)">
<g
id="g4172"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4174"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4176"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4178"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4180"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4182"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4184"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4186"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4188"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4190"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4192"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4194"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4196"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4198"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<g
id="g4200"
transform="matrix(3.4622468,0,0,3.4622468,439.25545,270.44423)" />
<flowRoot
xml:space="preserve"
id="flowRoot4381"
style="font-style:normal;font-weight:normal;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"><flowRegion
id="flowRegion4383"
style="font-family:sans-serif"><rect
id="rect4385"
width="164.5"
height="46.75"
x="242.75"
y="422.36221"
style="font-family:sans-serif" /></flowRegion><flowPara
id="flowPara4387"
style="font-size:40px;line-height:1.25;font-family:sans-serif"> </flowPara></flowRoot> <g
style="display:inline"
id="g5969-5"
transform="matrix(0.74333811,0.11129858,-0.11129858,0.74333811,-1135.4668,488.39488)">
<g
transform="translate(0,1500)"
inkscape:label="bateau"
id="layer1-1-2" />
<flowRoot
xml:space="preserve"
id="flowRoot4297-8"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:0.01%;font-family:COUTURE;-inkscape-font-specification:'COUTURE Bold';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
transform="translate(0,1500)"><flowRegion
id="flowRegion4299-4"><rect
id="rect4301-4"
width="1088"
height="416"
x="2104"
y="1948"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:144px;font-family:COUTURE;-inkscape-font-specification:'COUTURE Bold'" /></flowRegion><flowPara
id="flowPara4303-8"
style="font-size:144px;line-height:1.25"> </flowPara></flowRoot> <flowRoot
xml:space="preserve"
id="flowRoot3677-8"
style="font-style:normal;font-weight:normal;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"><flowRegion
id="flowRegion3679-2"
style="font-family:sans-serif"><rect
id="rect3681-7"
width="772.16058"
height="100.40916"
x="2815.6992"
y="1956.3104"
style="font-family:sans-serif" /></flowRegion><flowPara
id="flowPara3683-1"
style="font-size:40px;line-height:1.25;font-family:sans-serif"> </flowPara></flowRoot> <flowRoot
xml:space="preserve"
id="flowRoot4653-7"
style="font-style:normal;font-weight:normal;line-height:0.01%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
transform="translate(0,1500)"><flowRegion
id="flowRegion4655-2"
style="font-family:sans-serif"><rect
id="rect4657-8"
width="408"
height="352"
x="1732"
y="1580"
style="font-family:sans-serif" /></flowRegion><flowPara
id="flowPara4659-8"
style="font-size:40px;line-height:1.25;font-family:sans-serif"> </flowPara></flowRoot> <g
transform="matrix(3.7418697,0,0,3.7418697,-7038.9947,-4368.125)"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#4a3f74;fill-opacity:1;stroke:none"
id="flowRoot3442-6" />
<g
id="g3550-3-3-6-3-7-9-3-2-5-0-9"
transform="matrix(0.9986786,0,0,0.9986786,450.44451,-1197.2567)"
style="display:inline" />
</g>
<rect
style="opacity:1;fill:#000000;fill-opacity:0.94117647;stroke:#483e7e;stroke-width:2.5999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0.30000001;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.94117647"
id="rect8980"
width="0"
height="0"
x="0"
y="0" />
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.95999995;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#534986;stroke-width:1.83099997;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:0.30000001;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.61711713;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect4682"
width="0"
height="0"
x="0"
y="0" />
</g>
<g
inkscape:groupmode="layer"
id="layer5"
inkscape:label="Calque 5"
style="display:inline"
transform="translate(-168.73733,-774.16196)">
<g
transform="translate(5927.9137,-1112.2775)"
style="font-style:normal;font-weight:normal;font-size:118.38638306px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.96078431"
id="flowRoot4401-3-7-5-3-0-8-5">
<g
transform="translate(-11640.668,-327.21498)"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="flowRoot7052-4-9">
<g
id="g4868"
transform="translate(-10.35097,6.2783949)">
<path
inkscape:connector-curvature="0"
id="path4648-68-3-6-1-9-9"
d="m 424.11349,770.54724 c -32.4719,0 -61.2945,15.8724 -79.223,40.2273 h 25.1918 c 14.1484,-13.1505 33.1176,-21.1917 54.0312,-21.1917 20.722,0 39.5416,7.8864 53.6495,20.8217 h 25.3536 c -17.9453,-24.1609 -46.6833,-39.8573 -79.0031,-39.8573 z m -80.7259,154.34754 c 17.7878,25.5659 47.3097,42.3949 80.7259,42.3949 32.244,0 60.8846,-15.6536 78.8356,-39.7185 h -25.3596 c -14.0868,12.8507 -32.8325,20.6887 -53.476,20.6887 -22.0376,0 -41.8989,-8.9359 -56.2509,-23.3651 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#534987;fill-opacity:1;fill-rule:evenodd;stroke:#534987;stroke-width:5.32738733;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
transform="translate(5712.7543,1439.4925)" />
<path
sodipodi:nodetypes="ccccccc"
inkscape:connector-curvature="0"
id="rect4696-6-3-6-7-6-2-4"
d="m 479.57959,820.58324 v 96.62434 l 68.2492,0.021 v -23.1886 h -41.3604 v -73.45704 z"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.65;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#534987;fill-opacity:1;fill-rule:evenodd;stroke:#534987;stroke-width:4.89254045;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:50;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
transform="translate(5712.7543,1439.4925)" />
<path
sodipodi:nodetypes="ccccccc"
inkscape:connector-curvature="0"
id="rect4696-6-3-4-3-0-3-6-4"
d="m 384.46959,820.53914 v 96.62444 l 68.2493,0.021 v -23.1886 h -41.3605 v -73.45704 z"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.65;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#534987;fill-opacity:1;fill-rule:evenodd;stroke:#534987;stroke-width:4.89254045;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:50;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
transform="translate(5712.7543,1439.4925)" />
<path
inkscape:connector-curvature="0"
id="path8859"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5997.4772,2262.256 q 4.1525,0 6.3525,1.5125 2.2275,1.5125 2.2275,4.73 0,1.6775 -0.605,2.8875 -0.5775,1.1825 -1.705,1.9525 -1.1275,0.7425 -2.75,1.1 -1.6225,0.3575 -3.7125,0.3575 h -1.7325 v 6.71 h -3.465 v -18.7825 q 1.21,-0.275 2.6675,-0.3575 1.485,-0.11 2.7225,-0.11 z m 0.2475,2.9975 q -1.32,0 -2.1725,0.082 v 6.49 h 1.6775 q 2.5025,0 3.85,-0.6875 1.3475,-0.715 1.3475,-2.6675 0,-0.935 -0.3575,-1.5675 -0.3575,-0.6325 -0.99,-0.99 -0.6325,-0.3575 -1.5125,-0.495 -0.8525,-0.165 -1.8425,-0.165 z" />
<path
inkscape:connector-curvature="0"
id="path8861"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6021.5801,2274.301 q 0,1.705 -0.495,3.1075 -0.495,1.4025 -1.4025,2.3925 -0.9075,0.99 -2.2,1.54 -1.265,0.55 -2.805,0.55 -1.54,0 -2.805,-0.55 -1.265,-0.55 -2.1725,-1.54 -0.9075,-0.99 -1.43,-2.3925 -0.495,-1.4025 -0.495,-3.1075 0,-1.705 0.495,-3.08 0.5225,-1.4025 1.43,-2.3925 0.935,-0.99 2.2,-1.5125 1.265,-0.55 2.7775,-0.55 1.5125,0 2.7775,0.55 1.2925,0.5225 2.2,1.5125 0.9075,0.99 1.4025,2.3925 0.5225,1.375 0.5225,3.08 z m -3.41,0 q 0,-2.145 -0.935,-3.3825 -0.9075,-1.265 -2.5575,-1.265 -1.65,0 -2.585,1.265 -0.9075,1.2375 -0.9075,3.3825 0,2.1725 0.9075,3.4375 0.935,1.265 2.585,1.265 1.65,0 2.5575,-1.265 0.935,-1.265 0.935,-3.4375 z m 0.495,-10.2575 -1.2925,1.4575 -2.7225,-2.2275 -2.695,2.2275 -1.32,-1.4575 4.015,-3.85 z" />
<path
inkscape:connector-curvature="0"
id="path8863"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6030.0131,2281.781 q -1.485,-0.028 -2.475,-0.33 -0.9625,-0.3025 -1.54,-0.8525 -0.5775,-0.5775 -0.825,-1.4025 -0.22,-0.8525 -0.22,-1.925 v -16.555 l 3.3275,-0.55 v 16.4725 q 0,0.605 0.082,1.0175 0.11,0.4125 0.3575,0.715 0.2475,0.275 0.66,0.44 0.44,0.1375 1.1,0.22 l -0.4675,2.75 z" />
<path
inkscape:connector-curvature="0"
id="path8865"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6032.3747,2274.3835 q 0,-1.8975 0.55,-3.3275 0.5775,-1.43 1.5125,-2.365 0.935,-0.9625 2.145,-1.43 1.21,-0.495 2.475,-0.495 2.97,0 4.62,1.8425 1.6775,1.8425 1.6775,5.5 0,0.275 -0.028,0.6325 0,0.33 -0.028,0.605 h -9.4875 q 0.1375,1.7325 1.21,2.695 1.1,0.935 3.1625,0.935 1.21,0 2.2,-0.22 1.0175,-0.22 1.595,-0.4675 l 0.44,2.7225 q -0.275,0.1375 -0.77,0.3025 -0.4675,0.1375 -1.1,0.2475 -0.605,0.1375 -1.32,0.22 -0.715,0.082 -1.4575,0.082 -1.8975,0 -3.3,-0.55 -1.4025,-0.5775 -2.31,-1.5675 -0.9075,-1.0175 -1.3475,-2.365 -0.44,-1.375 -0.44,-2.9975 z m 9.6525,-1.485 q 0,-0.6875 -0.1925,-1.2925 -0.1925,-0.6325 -0.5775,-1.0725 -0.3575,-0.4675 -0.9075,-0.715 -0.5225,-0.275 -1.265,-0.275 -0.77,0 -1.3475,0.3025 -0.5775,0.275 -0.99,0.7425 -0.385,0.4675 -0.605,1.0725 -0.22,0.605 -0.3025,1.2375 z" />
<path
inkscape:connector-curvature="0"
id="path8867"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6057.8599,2274.2735 q 0,2.2 1.045,3.465 1.045,1.2375 2.8875,1.2375 0.7975,0 1.3475,-0.055 0.5775,-0.082 0.935,-0.165 v -8.25 q -0.44,-0.3025 -1.1825,-0.55 -0.715,-0.275 -1.54,-0.275 -1.815,0 -2.6675,1.2375 -0.825,1.2375 -0.825,3.355 z m 9.5425,6.7925 q -0.99,0.3025 -2.5025,0.55 -1.485,0.2475 -3.135,0.2475 -1.705,0 -3.0525,-0.5225 -1.3475,-0.5225 -2.31,-1.485 -0.935,-0.99 -1.4575,-2.365 -0.495,-1.4025 -0.495,-3.135 0,-1.705 0.4125,-3.08 0.44,-1.4025 1.265,-2.3925 0.825,-0.99 2.0075,-1.5125 1.1825,-0.55 2.7225,-0.55 1.045,0 1.8425,0.2475 0.7975,0.2475 1.375,0.55 v -6.9025 l 3.3275,-0.55 z" />
<path
inkscape:connector-curvature="0"
id="path8869"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6070.8317,2274.3835 q 0,-1.8975 0.55,-3.3275 0.5775,-1.43 1.5125,-2.365 0.935,-0.9625 2.145,-1.43 1.21,-0.495 2.475,-0.495 2.97,0 4.62,1.8425 1.6775,1.8425 1.6775,5.5 0,0.275 -0.028,0.6325 0,0.33 -0.028,0.605 h -9.4875 q 0.1375,1.7325 1.21,2.695 1.1,0.935 3.1625,0.935 1.21,0 2.2,-0.22 1.0175,-0.22 1.595,-0.4675 l 0.44,2.7225 q -0.275,0.1375 -0.77,0.3025 -0.4675,0.1375 -1.1,0.2475 -0.605,0.1375 -1.32,0.22 -0.715,0.082 -1.4575,0.082 -1.8975,0 -3.3,-0.55 -1.4025,-0.5775 -2.31,-1.5675 -0.9075,-1.0175 -1.3475,-2.365 -0.44,-1.375 -0.44,-2.9975 z m 9.6525,-1.485 q 0,-0.6875 -0.1925,-1.2925 -0.1925,-0.6325 -0.5775,-1.0725 -0.3575,-0.4675 -0.9075,-0.715 -0.5225,-0.275 -1.265,-0.275 -0.77,0 -1.3475,0.3025 -0.5775,0.275 -0.99,0.7425 -0.385,0.4675 -0.605,1.0725 -0.22,0.605 -0.3025,1.2375 z" />
<path
inkscape:connector-curvature="0"
id="path8871"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5921.6147,2316.2935 q -2.145,0 -3.85,-0.66 -1.705,-0.66 -2.8875,-1.925 -1.1825,-1.2925 -1.815,-3.135 -0.6325,-1.8425 -0.6325,-4.235 0,-2.3925 0.715,-4.235 0.7425,-1.8425 2.0075,-3.1075 1.265,-1.2925 2.97,-1.9525 1.705,-0.66 3.6575,-0.66 1.1825,0 2.145,0.1925 0.9625,0.165 1.6775,0.385 0.715,0.22 1.1825,0.4675 0.4675,0.2475 0.66,0.3575 l -1.0175,2.8325 q -0.66,-0.4125 -1.8975,-0.77 -1.21,-0.385 -2.64,-0.385 -1.2375,0 -2.31,0.44 -1.0725,0.4125 -1.87,1.265 -0.77,0.8525 -1.21,2.145 -0.44,1.2925 -0.44,2.9975 0,1.5125 0.33,2.7775 0.3575,1.265 1.0725,2.2 0.715,0.9075 1.815,1.43 1.1,0.495 2.64,0.495 1.8425,0 2.9975,-0.3575 1.155,-0.385 1.7875,-0.715 l 0.935,2.8325 q -0.33,0.22 -0.9075,0.44 -0.55,0.22 -1.32,0.44 -0.77,0.1925 -1.7325,0.3025 -0.9625,0.1375 -2.0625,0.1375 z" />
<path
inkscape:connector-curvature="0"
id="path8873"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5943.1747,2308.676 q 0,1.705 -0.495,3.1075 -0.495,1.4025 -1.4025,2.3925 -0.9075,0.99 -2.2,1.54 -1.265,0.55 -2.805,0.55 -1.54,0 -2.805,-0.55 -1.265,-0.55 -2.1725,-1.54 -0.9075,-0.99 -1.43,-2.3925 -0.495,-1.4025 -0.495,-3.1075 0,-1.705 0.495,-3.08 0.5225,-1.4025 1.43,-2.3925 0.935,-0.99 2.2,-1.5125 1.265,-0.55 2.7775,-0.55 1.5125,0 2.7775,0.55 1.2925,0.5225 2.2,1.5125 0.9075,0.99 1.4025,2.3925 0.5225,1.375 0.5225,3.08 z m -3.41,0 q 0,-2.145 -0.935,-3.3825 -0.9075,-1.265 -2.5575,-1.265 -1.65,0 -2.585,1.265 -0.9075,1.2375 -0.9075,3.3825 0,2.1725 0.9075,3.4375 0.935,1.265 2.585,1.265 1.65,0 2.5575,-1.265 0.935,-1.265 0.935,-3.4375 z" />
<path
inkscape:connector-curvature="0"
id="path8875"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5954.7977,2308.3185 q 0,-2.255 -0.5775,-3.245 -0.55,-1.0175 -2.09,-1.0175 -0.55,0 -1.21,0.082 -0.66,0.082 -0.99,0.1375 v 11.605 h -3.3275 v -13.915 q 0.9625,-0.275 2.5025,-0.5225 1.5675,-0.2475 3.3,-0.2475 1.485,0 2.42,0.385 0.9625,0.385 1.595,1.0175 0.3025,-0.22 0.77,-0.4675 0.4675,-0.2475 1.045,-0.44 0.5775,-0.22 1.21,-0.3575 0.66,-0.1375 1.32,-0.1375 1.6775,0 2.75,0.495 1.1,0.4675 1.705,1.3475 0.6325,0.8525 0.8525,2.09 0.2475,1.21 0.2475,2.6675 v 8.085 h -3.3275 v -7.5625 q 0,-2.255 -0.55,-3.245 -0.55,-1.0175 -2.1175,-1.0175 -0.7975,0 -1.5125,0.275 -0.715,0.2475 -1.0725,0.495 0.22,0.6875 0.3025,1.4575 0.083,0.77 0.083,1.65 v 7.9475 h -3.3275 v -7.5625 z" />
<path
inkscape:connector-curvature="0"
id="path8877"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5979.9392,2308.7585 q 0,-2.2275 -1.0175,-3.465 -0.99,-1.2375 -3.2175,-1.2375 -0.4675,0 -0.99,0.055 -0.495,0.028 -0.99,0.165 v 8.2225 q 0.44,0.3025 1.155,0.5775 0.7425,0.2475 1.5675,0.2475 1.815,0 2.64,-1.2375 0.8525,-1.2375 0.8525,-3.3275 z m 3.41,-0.055 q 0,1.65 -0.44,3.025 -0.4125,1.375 -1.21,2.365 -0.7975,0.99 -2.0075,1.54 -1.1825,0.55 -2.695,0.55 -1.0175,0 -1.87,-0.2475 -0.8525,-0.2475 -1.4025,-0.55 v 5.5825 h -3.3275 v -19.0025 q 1.0175,-0.275 2.5025,-0.5225 1.485,-0.2475 3.135,-0.2475 1.705,0 3.0525,0.5225 1.3475,0.5225 2.2825,1.5125 0.9625,0.9625 1.4575,2.365 0.5225,1.375 0.5225,3.1075 z" />
<path
inkscape:connector-curvature="0"
id="path8879"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5985.981,2308.7585 q 0,-1.8975 0.55,-3.3275 0.5775,-1.43 1.5125,-2.365 0.935,-0.9625 2.145,-1.43 1.21,-0.495 2.475,-0.495 2.97,0 4.62,1.8425 1.6775,1.8425 1.6775,5.5 0,0.275 -0.028,0.6325 0,0.33 -0.028,0.605 h -9.4875 q 0.1375,1.7325 1.21,2.695 1.1,0.935 3.1625,0.935 1.21,0 2.2,-0.22 1.0175,-0.22 1.595,-0.4675 l 0.44,2.7225 q -0.275,0.1375 -0.77,0.3025 -0.4675,0.1375 -1.1,0.2475 -0.605,0.1375 -1.32,0.22 -0.715,0.082 -1.4575,0.082 -1.8975,0 -3.3,-0.55 -1.4025,-0.5775 -2.31,-1.5675 -0.9075,-1.0175 -1.3475,-2.365 -0.44,-1.375 -0.44,-2.9975 z m 9.6525,-1.485 q 0,-0.6875 -0.1925,-1.2925 -0.1925,-0.6325 -0.5775,-1.0725 -0.3575,-0.4675 -0.9075,-0.715 -0.5225,-0.275 -1.265,-0.275 -0.77,0 -1.3475,0.3025 -0.5775,0.275 -0.99,0.7425 -0.385,0.4675 -0.605,1.0725 -0.22,0.605 -0.3025,1.2375 z m 0.5775,-11.66 -4.4825,4.345 -1.65,-1.485 4.0425,-4.8125 z" />
<path
inkscape:connector-curvature="0"
id="path8881"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6002.2971,2297.7035 3.3275,-0.55 v 4.345 h 5.115 v 2.7775 h -5.115 v 5.8575 q 0,1.7325 0.55,2.475 0.55,0.7425 1.87,0.7425 0.9075,0 1.595,-0.1925 0.715,-0.1925 1.1275,-0.3575 l 0.55,2.64 q -0.5775,0.2475 -1.5125,0.495 -0.935,0.275 -2.2,0.275 -1.54,0 -2.585,-0.4125 -1.0175,-0.4125 -1.6225,-1.1825 -0.605,-0.7975 -0.8525,-1.8975 -0.2475,-1.1275 -0.2475,-2.5575 z" />
<path
inkscape:connector-curvature="0"
id="path8883"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6012.8902,2308.7585 q 0,-1.8975 0.55,-3.3275 0.5775,-1.43 1.5125,-2.365 0.935,-0.9625 2.145,-1.43 1.21,-0.495 2.475,-0.495 2.97,0 4.62,1.8425 1.6775,1.8425 1.6775,5.5 0,0.275 -0.028,0.6325 0,0.33 -0.028,0.605 h -9.4875 q 0.1375,1.7325 1.21,2.695 1.1,0.935 3.1625,0.935 1.21,0 2.2,-0.22 1.0175,-0.22 1.595,-0.4675 l 0.44,2.7225 q -0.275,0.1375 -0.77,0.3025 -0.4675,0.1375 -1.1,0.2475 -0.605,0.1375 -1.32,0.22 -0.715,0.082 -1.4575,0.082 -1.8975,0 -3.3,-0.55 -1.4025,-0.5775 -2.31,-1.5675 -0.9075,-1.0175 -1.3475,-2.365 -0.44,-1.375 -0.44,-2.9975 z m 9.6525,-1.485 q 0,-0.6875 -0.1925,-1.2925 -0.1925,-0.6325 -0.5775,-1.0725 -0.3575,-0.4675 -0.9075,-0.715 -0.5225,-0.275 -1.265,-0.275 -0.77,0 -1.3475,0.3025 -0.5775,0.275 -0.99,0.7425 -0.385,0.4675 -0.605,1.0725 -0.22,0.605 -0.3025,1.2375 z" />
<path
inkscape:connector-curvature="0"
id="path8885"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6029.3713,2301.966 q 0.9625,-0.275 2.5025,-0.5225 1.54,-0.2475 3.41,-0.2475 1.76,0 2.9425,0.495 1.1825,0.4675 1.87,1.3475 0.715,0.8525 0.99,2.09 0.3025,1.21 0.3025,2.6675 v 8.085 h -3.3275 v -7.5625 q 0,-1.155 -0.165,-1.9525 -0.1375,-0.825 -0.495,-1.32 -0.33,-0.5225 -0.935,-0.7425 -0.5775,-0.2475 -1.43,-0.2475 -0.6325,0 -1.32,0.082 -0.6875,0.082 -1.0175,0.1375 v 11.605 h -3.3275 v -13.915 z" />
<path
inkscape:connector-curvature="0"
id="path8887"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6044.6871,2308.7035 q 0,-1.595 0.495,-2.97 0.495,-1.4025 1.4025,-2.42 0.935,-1.0175 2.255,-1.595 1.32,-0.5775 2.97,-0.5775 2.035,0 3.85,0.7425 l -0.715,2.7225 q -0.5775,-0.2475 -1.32,-0.4125 -0.715,-0.165 -1.54,-0.165 -1.9525,0 -2.97,1.2375 -1.0175,1.21 -1.0175,3.4375 0,2.145 0.9625,3.41 0.9625,1.2375 3.245,1.2375 0.8525,0 1.6775,-0.165 0.825,-0.165 1.43,-0.4125 l 0.4675,2.75 q -0.55,0.275 -1.6775,0.495 -1.1,0.22 -2.2825,0.22 -1.8425,0 -3.2175,-0.55 -1.3475,-0.5775 -2.255,-1.5675 -0.88,-1.0175 -1.32,-2.3925 -0.44,-1.4025 -0.44,-3.025 z" />
<path
inkscape:connector-curvature="0"
id="path8889"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6057.6851,2308.7585 q 0,-1.8975 0.55,-3.3275 0.5775,-1.43 1.5125,-2.365 0.935,-0.9625 2.145,-1.43 1.21,-0.495 2.475,-0.495 2.97,0 4.62,1.8425 1.6775,1.8425 1.6775,5.5 0,0.275 -0.028,0.6325 0,0.33 -0.028,0.605 h -9.4875 q 0.1375,1.7325 1.21,2.695 1.1,0.935 3.1625,0.935 1.21,0 2.2,-0.22 1.0175,-0.22 1.595,-0.4675 l 0.44,2.7225 q -0.275,0.1375 -0.77,0.3025 -0.4675,0.1375 -1.1,0.2475 -0.605,0.1375 -1.32,0.22 -0.715,0.082 -1.4575,0.082 -1.8975,0 -3.3,-0.55 -1.4025,-0.5775 -2.31,-1.5675 -0.9075,-1.0175 -1.3475,-2.365 -0.44,-1.375 -0.44,-2.9975 z m 9.6525,-1.485 q 0,-0.6875 -0.1925,-1.2925 -0.1925,-0.6325 -0.5775,-1.0725 -0.3575,-0.4675 -0.9075,-0.715 -0.5225,-0.275 -1.265,-0.275 -0.77,0 -1.3475,0.3025 -0.5775,0.275 -0.99,0.7425 -0.385,0.4675 -0.605,1.0725 -0.22,0.605 -0.3025,1.2375 z" />
<path
inkscape:connector-curvature="0"
id="path8891"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5903.8876,2347.2585 v 2.9975 h -12.045 v -19.0575 h 3.465 v 16.06 z" />
<path
inkscape:connector-curvature="0"
id="path8893"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5919.0796,2343.051 q 0,1.705 -0.495,3.1075 -0.495,1.4025 -1.4025,2.3925 -0.9075,0.99 -2.2,1.54 -1.265,0.55 -2.805,0.55 -1.54,0 -2.805,-0.55 -1.265,-0.55 -2.1725,-1.54 -0.9075,-0.99 -1.43,-2.3925 -0.495,-1.4025 -0.495,-3.1075 0,-1.705 0.495,-3.08 0.5225,-1.4025 1.43,-2.3925 0.935,-0.99 2.2,-1.5125 1.265,-0.55 2.7775,-0.55 1.5125,0 2.7775,0.55 1.2925,0.5225 2.2,1.5125 0.9075,0.99 1.4025,2.3925 0.5225,1.375 0.5225,3.08 z m -3.41,0 q 0,-2.145 -0.935,-3.3825 -0.9075,-1.265 -2.5575,-1.265 -1.65,0 -2.585,1.265 -0.9075,1.2375 -0.9075,3.3825 0,2.1725 0.9075,3.4375 0.935,1.265 2.585,1.265 1.65,0 2.5575,-1.265 0.935,-1.265 0.935,-3.4375 z" />
<path
inkscape:connector-curvature="0"
id="path8895"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5925.1201,2342.6935 q 0,2.1175 0.9075,3.1075 0.935,0.9625 2.3925,0.9625 0.7975,0 1.485,-0.22 0.715,-0.22 1.155,-0.5225 v -7.4525 q -0.3575,-0.082 -0.88,-0.1375 -0.5225,-0.082 -1.32,-0.082 -1.815,0 -2.7775,1.21 -0.9625,1.1825 -0.9625,3.135 z m 9.2675,6.105 q 0,3.4375 -1.76,5.0325 -1.7325,1.595 -5.335,1.595 -1.32,0 -2.585,-0.22 -1.2375,-0.22 -2.255,-0.5775 l 0.605,-2.8325 q 0.8525,0.3575 1.925,0.5775 1.1,0.22 2.365,0.22 2.0075,0 2.86,-0.825 0.8525,-0.825 0.8525,-2.4475 v -0.55 q -0.495,0.2475 -1.32,0.495 -0.7975,0.2475 -1.8425,0.2475 -1.375,0 -2.53,-0.44 -1.1275,-0.44 -1.9525,-1.2925 -0.7975,-0.8525 -1.265,-2.1175 -0.44,-1.2925 -0.44,-2.97 0,-1.5675 0.4675,-2.8875 0.495,-1.32 1.4025,-2.255 0.935,-0.935 2.255,-1.4575 1.32,-0.5225 2.9975,-0.5225 1.6225,0 3.08,0.2475 1.4575,0.2475 2.475,0.5225 z" />
<path
inkscape:connector-curvature="0"
id="path8897"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5941.9759,2350.256 h -3.3275 v -14.3825 h 3.3275 z m 0.3575,-18.59 q 0,0.935 -0.605,1.485 -0.605,0.55 -1.43,0.55 -0.8525,0 -1.4575,-0.55 -0.605,-0.55 -0.605,-1.485 0,-0.9625 0.605,-1.5125 0.605,-0.55 1.4575,-0.55 0.825,0 1.43,0.55 0.605,0.55 0.605,1.5125 z" />
<path
inkscape:connector-curvature="0"
id="path8899"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5945.3967,2343.0785 q 0,-1.595 0.495,-2.97 0.495,-1.4025 1.4025,-2.42 0.935,-1.0175 2.255,-1.595 1.32,-0.5775 2.97,-0.5775 2.035,0 3.85,0.7425 l -0.715,2.7225 q -0.5775,-0.2475 -1.32,-0.4125 -0.715,-0.165 -1.54,-0.165 -1.9525,0 -2.97,1.2375 -1.0175,1.21 -1.0175,3.4375 0,2.145 0.9625,3.41 0.9625,1.2375 3.245,1.2375 0.8525,0 1.6775,-0.165 0.825,-0.165 1.43,-0.4125 l 0.4675,2.75 q -0.55,0.275 -1.6775,0.495 -1.1,0.22 -2.2825,0.22 -1.8425,0 -3.2175,-0.55 -1.3475,-0.5775 -2.255,-1.5675 -0.88,-1.0175 -1.32,-2.3925 -0.44,-1.4025 -0.44,-3.025 z" />
<path
inkscape:connector-curvature="0"
id="path8901"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5962.5472,2350.256 h -3.3275 v -14.3825 h 3.3275 z m 0.3575,-18.59 q 0,0.935 -0.605,1.485 -0.605,0.55 -1.43,0.55 -0.8525,0 -1.4575,-0.55 -0.605,-0.55 -0.605,-1.485 0,-0.9625 0.605,-1.5125 0.605,-0.55 1.4575,-0.55 0.825,0 1.43,0.55 0.605,0.55 0.605,1.5125 z" />
<path
inkscape:connector-curvature="0"
id="path8903"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5965.9679,2343.1335 q 0,-1.8975 0.55,-3.3275 0.5775,-1.43 1.5125,-2.365 0.935,-0.9625 2.145,-1.43 1.21,-0.495 2.475,-0.495 2.97,0 4.62,1.8425 1.6775,1.8425 1.6775,5.5 0,0.275 -0.028,0.6325 0,0.33 -0.028,0.605 h -9.4875 q 0.1375,1.7325 1.21,2.695 1.1,0.935 3.1625,0.935 1.21,0 2.2,-0.22 1.0175,-0.22 1.595,-0.4675 l 0.44,2.7225 q -0.275,0.1375 -0.77,0.3025 -0.4675,0.1375 -1.1,0.2475 -0.605,0.1375 -1.32,0.22 -0.715,0.082 -1.4575,0.082 -1.8975,0 -3.3,-0.55 -1.4025,-0.5775 -2.31,-1.5675 -0.9075,-1.0175 -1.3475,-2.365 -0.44,-1.375 -0.44,-2.9975 z m 9.6525,-1.485 q 0,-0.6875 -0.1925,-1.2925 -0.1925,-0.6325 -0.5775,-1.0725 -0.3575,-0.4675 -0.9075,-0.715 -0.5225,-0.275 -1.265,-0.275 -0.77,0 -1.3475,0.3025 -0.5775,0.275 -0.99,0.7425 -0.385,0.4675 -0.605,1.0725 -0.22,0.605 -0.3025,1.2375 z" />
<path
inkscape:connector-curvature="0"
id="path8905"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 5987.454,2350.531 q -1.485,-0.028 -2.475,-0.33 -0.9625,-0.3025 -1.54,-0.8525 -0.5775,-0.5775 -0.825,-1.4025 -0.22,-0.8525 -0.22,-1.925 v -16.555 l 3.3275,-0.55 v 16.4725 q 0,0.605 0.082,1.0175 0.11,0.4125 0.3575,0.715 0.2475,0.275 0.66,0.44 0.44,0.1375 1.1,0.22 l -0.4675,2.75 z" />
<path
inkscape:connector-curvature="0"
id="path8907"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6021.6857,2347.2585 v 2.9975 h -12.045 v -19.0575 h 3.465 v 16.06 z" />
<path
inkscape:connector-curvature="0"
id="path8909"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6027.4938,2350.256 h -3.3275 v -14.3825 h 3.3275 z m 0.3575,-18.59 q 0,0.935 -0.605,1.485 -0.605,0.55 -1.43,0.55 -0.8525,0 -1.4575,-0.55 -0.605,-0.55 -0.605,-1.485 0,-0.9625 0.605,-1.5125 0.605,-0.55 1.4575,-0.55 0.825,0 1.43,0.55 0.605,0.55 0.605,1.5125 z" />
<path
inkscape:connector-curvature="0"
id="path8911"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6041.2545,2343.0235 q 0,-2.1175 -0.8525,-3.355 -0.825,-1.2375 -2.64,-1.2375 -0.825,0 -1.5675,0.2475 -0.715,0.2475 -1.155,0.55 v 8.2775 q 0.3575,0.082 0.9075,0.165 0.5775,0.055 1.375,0.055 1.8425,0 2.8875,-1.2375 1.045,-1.265 1.045,-3.465 z m 3.41,0.055 q 0,1.7325 -0.5225,3.135 -0.495,1.375 -1.4575,2.365 -0.935,0.99 -2.2825,1.5125 -1.3475,0.5225 -3.0525,0.5225 -1.65,0 -3.1625,-0.2475 -1.485,-0.2475 -2.475,-0.55 v -20.35 l 3.3275,-0.55 v 7.4525 q 0.5775,-0.3025 1.4025,-0.55 0.8525,-0.2475 1.87,-0.2475 1.5125,0 2.695,0.55 1.21,0.5225 2.0075,1.5125 0.7975,0.99 1.21,2.3925 0.44,1.375 0.44,3.0525 z" />
<path
inkscape:connector-curvature="0"
id="path8913"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6056.2889,2338.871 q -0.4125,-0.1375 -1.155,-0.275 -0.715,-0.165 -1.6775,-0.165 -0.55,0 -1.1825,0.11 -0.605,0.11 -0.8525,0.1925 v 11.5225 h -3.3275 v -13.695 q 0.9625,-0.3575 2.3925,-0.66 1.4575,-0.33 3.2175,-0.33 0.33,0 0.77,0.055 0.44,0.027 0.88,0.11 0.44,0.055 0.8525,0.165 0.4125,0.082 0.66,0.165 z" />
<path
inkscape:connector-curvature="0"
id="path8915"
style="font-style:normal;font-variant:normal;font-weight:500;font-stretch:normal;font-size:27.5px;font-family:Ubuntu;-inkscape-font-specification:'Ubuntu Medium';text-align:end;text-anchor:end"
d="m 6058.3608,2343.1335 q 0,-1.8975 0.55,-3.3275 0.5775,-1.43 1.5125,-2.365 0.935,-0.9625 2.145,-1.43 1.21,-0.495 2.475,-0.495 2.97,0 4.62,1.8425 1.6775,1.8425 1.6775,5.5 0,0.275 -0.028,0.6325 0,0.33 -0.028,0.605 h -9.4875 q 0.1375,1.7325 1.21,2.695 1.1,0.935 3.1625,0.935 1.21,0 2.2,-0.22 1.0175,-0.22 1.595,-0.4675 l 0.44,2.7225 q -0.275,0.1375 -0.77,0.3025 -0.4675,0.1375 -1.1,0.2475 -0.605,0.1375 -1.32,0.22 -0.715,0.082 -1.4575,0.082 -1.8975,0 -3.3,-0.55 -1.4025,-0.5775 -2.31,-1.5675 -0.9075,-1.0175 -1.3475,-2.365 -0.44,-1.375 -0.44,-2.9975 z m 9.6525,-1.485 q 0,-0.6875 -0.1925,-1.2925 -0.1925,-0.6325 -0.5775,-1.0725 -0.3575,-0.4675 -0.9075,-0.715 -0.5225,-0.275 -1.265,-0.275 -0.77,0 -1.3475,0.3025 -0.5775,0.275 -0.99,0.7425 -0.385,0.4675 -0.605,1.0725 -0.22,0.605 -0.3025,1.2375 z" />
<g
transform="matrix(0.68174389,0,0,0.68174389,2141.0659,772.88352)"
id="text6302"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.99968249;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
<path
style="stroke:#000000;stroke-width:0.99968249;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0"
id="path6307"
d="m 5774.5893,2260.6745 q 2.28,0 3.36,-0.6 1.12,-0.6 1.12,-1.92 0,-1.36 -1.08,-2.16 -1.08,-0.8 -3.56,-1.8 -1.2,-0.48 -2.32,-0.96 -1.08,-0.52 -1.88,-1.2 -0.8,-0.68 -1.28,-1.64 -0.48,-0.96 -0.48,-2.36 0,-2.76 2.04,-4.36 2.04,-1.64 5.56,-1.64 0.88,0 1.76,0.12 0.88,0.08 1.64,0.24 0.76,0.12 1.32,0.28 0.6,0.16 0.92,0.28 l -0.68,3.2 q -0.6,-0.32 -1.88,-0.64 -1.28,-0.36 -3.08,-0.36 -1.56,0 -2.72,0.64 -1.16,0.6 -1.16,1.92 0,0.68 0.24,1.2 0.28,0.52 0.8,0.96 0.56,0.4 1.36,0.76 0.8,0.36 1.92,0.76 1.48,0.56 2.64,1.12 1.16,0.52 1.96,1.24 0.84,0.72 1.28,1.76 0.44,1 0.44,2.48 0,2.88 -2.16,4.36 -2.12,1.48 -6.08,1.48 -2.76,0 -4.32,-0.48 -1.56,-0.44 -2.12,-0.68 l 0.68,-3.2 q 0.64,0.24 2.04,0.72 1.4,0.48 3.72,0.48 z" />
</g>
<g
transform="matrix(0.68174389,0,0,0.68174389,2057.4567,807.42681)"
id="text6302-8"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;display:inline;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.99968249;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
<path
style="stroke:#000000;stroke-width:0.99968249;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0"
id="path6307-7"
d="m 5774.5893,2260.6745 q 2.28,0 3.36,-0.6 1.12,-0.6 1.12,-1.92 0,-1.36 -1.08,-2.16 -1.08,-0.8 -3.56,-1.8 -1.2,-0.48 -2.32,-0.96 -1.08,-0.52 -1.88,-1.2 -0.8,-0.68 -1.28,-1.64 -0.48,-0.96 -0.48,-2.36 0,-2.76 2.04,-4.36 2.04,-1.64 5.56,-1.64 0.88,0 1.76,0.12 0.88,0.08 1.64,0.24 0.76,0.12 1.32,0.28 0.6,0.16 0.92,0.28 l -0.68,3.2 q -0.6,-0.32 -1.88,-0.64 -1.28,-0.36 -3.08,-0.36 -1.56,0 -2.72,0.64 -1.16,0.6 -1.16,1.92 0,0.68 0.24,1.2 0.28,0.52 0.8,0.96 0.56,0.4 1.36,0.76 0.8,0.36 1.92,0.76 1.48,0.56 2.64,1.12 1.16,0.52 1.96,1.24 0.84,0.72 1.28,1.76 0.44,1 0.44,2.48 0,2.88 -2.16,4.36 -2.12,1.48 -6.08,1.48 -2.76,0 -4.32,-0.48 -1.56,-0.44 -2.12,-0.68 l 0.68,-3.2 q 0.64,0.24 2.04,0.72 1.4,0.48 3.72,0.48 z" />
</g>
<g
transform="matrix(0.67616411,0,0,0.67616411,2173.1135,820.26245)"
id="text6302-8-5"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:end;letter-spacing:0px;word-spacing:0px;text-anchor:end;display:inline;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.99968249;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
<path
style="stroke:#000000;stroke-width:0.99968249;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0"
id="path6307-7-4"
d="m 5774.5893,2260.6745 q 2.28,0 3.36,-0.6 1.12,-0.6 1.12,-1.92 0,-1.36 -1.08,-2.16 -1.08,-0.8 -3.56,-1.8 -1.2,-0.48 -2.32,-0.96 -1.08,-0.52 -1.88,-1.2 -0.8,-0.68 -1.28,-1.64 -0.48,-0.96 -0.48,-2.36 0,-2.76 2.04,-4.36 2.04,-1.64 5.56,-1.64 0.88,0 1.76,0.12 0.88,0.08 1.64,0.24 0.76,0.12 1.32,0.28 0.6,0.16 0.92,0.28 l -0.68,3.2 q -0.6,-0.32 -1.88,-0.64 -1.28,-0.36 -3.08,-0.36 -1.56,0 -2.72,0.64 -1.16,0.6 -1.16,1.92 0,0.68 0.24,1.2 0.28,0.52 0.8,0.96 0.56,0.4 1.36,0.76 0.8,0.36 1.92,0.76 1.48,0.56 2.64,1.12 1.16,0.52 1.96,1.24 0.84,0.72 1.28,1.76 0.44,1 0.44,2.48 0,2.88 -2.16,4.36 -2.12,1.48 -6.08,1.48 -2.76,0 -4.32,-0.48 -1.56,-0.44 -2.12,-0.68 l 0.68,-3.2 q 0.64,0.24 2.04,0.72 1.4,0.48 3.72,0.48 z" />
</g>
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 46 KiB

View File

@ -1,318 +0,0 @@
%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 262 316 372 461
%................................
%%Creator: GNU Ghostscript 510 (epswrite)
%%CreationDate: 1999/12/10 21:20:34
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%EndComments
%%BeginProlog
% This copyright applies to everything between here and the %%EndProlog:
% Copyright (C) 1997 Aladdin Enterprises, Menlo Park, CA. All rights reserved.
%%BeginResource: procset GS_pswrite_ProcSet
/GS_pswrite_ProcSet 40 dict dup begin
/!{bind def}bind def/X{load def}!
/rg/setrgbcolor X/g/setgray X/w/setlinewidth X/J/setlinecap X
/j/setlinejoin X/M/setmiterlimit X/d/setdash X/i/setflat X
/m/moveto X/l/lineto X/c/curveto X/h/closepath X
/lx{0 rlineto}!/ly{0 exch rlineto}!/v{currentpoint 6 2 roll c}!/y{2 copy c}!
/re{4 -2 roll m exch dup lx exch ly neg lx h}!
/q/gsave X/Q/grestore X/f/fill X/f*/eofill X/S/stroke X/rf{re f}!
/Y{initclip clip newpath}!/Y*{initclip eoclip newpath}!/rY{re Y}!
/@/currentfile X/|{string readstring pop}!
/Ix{[1 0 0 1 9 -1 roll neg 9 -1 roll neg]exch}!
/It{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}!
/Ic{Ix false 1 colorimage}!
/@85{@/ASCII85Decode filter}!
end def
%%EndResource
%%EndProlog
%%Page: 1 1
%%BeginPageSetup
save GS_pswrite_ProcSet begin 0.1 0.1 scale
%%EndPageSetup
0.843137 0.027451 0.317647 rg
0 0 m
6120 0 l
6120 7920 l
0 7920 l
Y
3233.33 4125.86 m
3218.39 4125.66 3236.15 4118.18 3255.66 4115.17 c
3261.06 4119.39 3265.94 4123.63 3270.29 4127.77 c
3258.15 4124.8 3245.79 4124.73 3233.33 4125.86 c
f
3313.52 4145.85 m
3322.43 4158.14 3328.92 4171.58 3331.2 4185.48 c
3329.19 4175.58 3323.84 4167.03 3318.76 4157.99 c
3290.83 4140.4 3316.12 4168.43 3318.74 4179.1 c
3288.72 4141.27 3314.61 4156.42 3313.52 4145.85 c
f
3343.14 4222.89 m
3344.95 4249.8 3337.84 4241.28 3335.46 4231.03 c
3338.23 4229.57 3340.44 4212.05 3343.14 4222.89 c
f
3176.66 4590.68 m
3184.64 4589.26 3193.91 4588.16 3192.58 4586.25 c
3201.32 4588.18 3203.3 4589.92 3176.66 4590.68 c
f
3192.58 4586.25 m
3186.96 4585.08 l
3192.21 4585.56 l
3192.58 4586.25 l
f
3441.26 4212.69 m
3442.16 4188.53 3434.21 4176.79 3427.02 4156.03 c
3414.1 4149.6 l
3403.54 4129.06 3415.15 4136.56 3407.57 4120.23 c
3391.05 4105.56 3357.51 4074.34 3346.77 4071.48 c
3338.92 4071.65 3352.08 4080.74 3353.8 4084.29 c
3331.71 4069.13 3336.06 4061.53 3302.29 4052.3 c
3301.3 4054.51 l
3218 4015.31 3102.28 4092.98 3103.8 4198.94 c
3102.92 4192.22 3101.27 4193.9 3099.43 4191.2 c
3095.13 4245.71 3124.61 4300.46 3174.33 4322.85 c
3222.96 4346.91 3279.97 4337.05 3314.79 4304.56 c
3295.66 4329.62 3257.58 4356.19 3212.45 4353.73 c
3168.24 4353.01 3126.88 4324.92 3113.07 4294.41 c
3090.43 4280.16 3087.79 4239.45 3077.93 4231.99 c
3064.64 4134.39 3102.9 4092.24 3167.63 4042.63 c
3177.79 4035.77 3170.49 4034.72 3171.85 4029.5 c
3150.35 4039.56 3130.67 4054.76 3114.47 4073.37 c
3123.07 4060.8 3132.34 4048.58 3144.33 4038.98 c
3124.04 4045.83 3096.95 4088.11 3089.06 4089.83 c
3124.01 4027.25 3230.84 3980.08 3286.81 4003.49 c
3260.92 4002.53 3228.03 4002.96 3198.94 4013.71 c
3186.7 4020 3170.1 4033.01 3173.07 4035.44 c
3249.42 4006.93 3328.29 4013.86 3394.36 4066.81 c
3411.16 4079.91 3429.52 4102.18 3434.83 4102.48 c
3426.85 4090.46 3436.2 4096.7 3430.07 4086.09 c
3446.8 4113.1 3422.78 4097.09 3447.37 4132.73 c
3456.46 4120.23 l
3453.07 4142.67 3484.31 4169.89 3481.12 4205.35 c
3488.29 4216.19 3489.11 4193.67 3481.51 4168.73 c
3492.06 4196.4 3484.31 4200.85 3487 4223.69 c
3489.92 4216.01 3493.78 4207.86 3495.75 4199.75 c
3488.88 4226.5 3502.78 4244.78 3506.24 4260.33 c
3502.82 4261.83 3495.64 4248.51 3493.98 4280.09 c
3494.23 4293.81 3497.8 4287.28 3499.17 4290.66 c
3496.49 4292.21 3489.42 4302.73 3485.13 4322.9 c
3488.22 4327.65 3493.45 4310.61 3497.69 4309.92 c
3494.96 4325.95 3490.26 4338.18 3490.07 4350.49 c
3477.67 4376.39 3485.67 4347.03 3475.64 4361.61 c
3462.44 4402.75 3486.57 4371.16 3488.21 4389.84 c
3508.19 4360.89 3519.59 4315.99 3524.83 4297.4 c
3520.83 4320.07 3514.39 4342.04 3506.49 4363.29 c
3512.59 4360.72 3496.72 4409.92 3514.4 4377.34 c
3495.52 4446.79 3433.62 4511.69 3376.67 4542.13 c
3383.62 4535.76 3392.42 4527.76 3389.27 4526.5 c
3360.94 4543.35 3365.92 4544.68 3361.85 4551.8 c
3338.8 4561.19 3337.27 4551.03 3322 4551.78 c
3278.52 4574.86 3270.13 4572.4 3230.1 4586.85 c
3231.91 4578.33 l
3203.1 4587.93 3198.34 4574.71 3167.21 4578.31 c
3165.32 4579.78 3177.19 4583.67 3186.96 4585.08 c
3159.11 4581.4 3160.41 4590.58 3133.15 4584.07 c
3139.86 4588.78 3146.98 4591.91 3154.14 4595.91 c
3131.43 4594.53 3099.9 4582.69 3109.63 4593.47 c
3072.58 4576.93 3006.77 4553.72 2969.84 4519.09 c
2968.68 4526.85 l
2951.76 4506.54 2894.89 4466.19 2890.36 4439.86 c
2885.83 4438.81 l
2877.04 4423.9 2871.33 4407.01 2864.35 4391.68 c
2852.84 4372.05 2847.47 4384.12 2849.11 4381.04 c
2826.46 4335.12 2815.19 4296.54 2805.48 4264.88 c
2812.4 4254.53 2805.65 4202.56 2808.26 4160.97 c
2796.9 3955.53 2952.44 3756.07 3122.46 3710.04 c
3147.38 3701.11 3184.43 3701.44 3215.96 3700.55 c
3178.77 3711.19 3173.97 3706.17 3137.73 3718.81 c
3111.6 3731.13 3105.88 3745.18 3087.36 3761.25 c
3094.69 3748.3 l
3058.39 3761.15 3073.58 3764.2 3044.04 3773.55 c
3051.87 3783.77 l
3040.1 3784.67 3020.7 3803.59 3015.4 3814.1 c
3002.52 3813.59 l
2987.06 3832.66 2978.81 3846.43 2979.42 3857.09 c
2975.26 3849.67 l
2970.55 3857.75 2918.35 3921.25 2945.43 3906.47 c
2940.4 3911.05 2933.71 3913.94 2926.46 3927.13 c
2931.97 3933.42 l
2918.96 3950.19 2907.99 3971.68 2908.83 3978.84 c
2915.78 3969.46 2920.6 3967.7 2925.38 3966.09 c
2892.47 4047.73 2890.62 3970.58 2865.71 4049.19 c
2870.97 4049.61 l
2866.94 4055.72 2864.47 4062.31 2861.23 4068.8 c
2863.53 4091.65 l
2839.85 4119.01 2856.91 4208.1 2860.34 4256.95 c
2862.69 4276.81 2880.11 4297.96 2893.34 4331.13 c
2885.28 4332.51 l
2900.7 4359.39 2973.3 4440.5 3006.94 4436.34 c
3023.23 4456.8 3003.7 4436.42 3000.51 4441.56 c
3036.3 4478.59 3047.55 4467.72 3071.7 4474.39 c
3097.73 4489.84 3049.35 4468.35 3061.69 4480.28 c
3106.72 4491.77 3093.59 4506.42 3152.32 4512.25 c
3158.52 4508.73 3137.95 4506.81 3132.79 4502.24 c
3170.29 4520.6 3251.48 4516.41 3304.23 4492.06 c
3365.41 4463.45 3434.17 4378.92 3436.89 4299.39 c
3439.97 4298.56 l
3438.41 4266.94 3444.81 4230.37 3433.71 4196.79 c
3441.26 4212.69 l
f
3070.23 4105.36 m
3068.12 4094.89 l
3077.95 4081.54 3085.75 4067.08 3098.28 4056.68 c
3089.26 4074.27 3082.57 4081.54 3070.23 4105.36 c
f
3093.44 4106.26 m
3088.24 4112.02 3085.18 4118.94 3081.72 4125.82 c
3085.02 4113.71 3091.78 4103.3 3098.05 4092.7 c
3093.44 4106.26 l
f
3504.27 4195.56 m
3502.08 4190.04 l
3498.06 4161.46 3489.36 4133.18 3476.03 4106.95 c
3490.75 4134.62 3500.25 4164.89 3504.27 4195.56 c
f
3179.63 4597.85 m
3189.73 4601.54 3204.45 4599.88 3215.19 4602.31 c
3201.21 4601.14 3187.3 4600.44 3173.57 4598.69 c
3179.63 4597.85 l
f
2824.92 4409.23 m
2827.25 4387.69 2808.72 4379.32 2829.02 4393.54 c
2839.92 4418.08 2824.78 4400.31 2824.92 4409.23 c
f
2801.04 4309.49 m
2805.73 4323.86 2806.57 4332.48 2808.36 4340.81 c
2795.43 4324.27 2802.4 4320.74 2801.04 4309.49 c
f
0 g
2758.02 3347.25 m
2757.57 3346.78 2757.57 3272.19 2756.64 3252.72 c
2755.72 3236.97 2754.32 3203.15 2720.96 3203.15 c
2686.67 3203.15 2678.33 3242.54 2675.55 3259.67 c
2672.31 3278.67 2672.31 3294.43 2672.31 3301.37 c
2672.31 3323.61 2673.7 3385.72 2726.06 3385.72 c
2741.82 3385.72 2750.62 3381.07 2757.57 3377.38 c
2758.02 3347.25 l
h
2623.65 3292.56 m
2623.65 3161.9 2693.16 3161.9 2703.35 3161.9 c
2732.08 3161.9 2750.62 3177.66 2758.49 3204.98 c
2759.42 3163.75 l
2768.23 3164.22 2777.03 3165.14 2791.39 3165.14 c
2796.49 3165.14 2800.65 3165.14 2804.37 3164.67 c
2808.08 3164.67 2811.78 3164.22 2815.95 3163.75 c
2808.54 3178.57 2802.98 3211.93 2802.98 3284.24 c
2802.98 3354.67 2802.98 3473.75 2809 3509.9 c
2792.33 3502.01 2777.95 3496.91 2746.44 3494.14 c
2758.95 3480.7 2758.95 3473.75 2758.95 3412.6 c
2750.16 3415.37 2739.03 3418.61 2720.03 3418.61 c
2637.09 3418.61 2623.65 3346.33 2623.65 3292.56 c
f
2874.95 3316.21 m
2875.42 3354.67 2883.3 3388.97 2916.19 3388.97 c
2952.34 3388.97 2955.1 3349.12 2954.18 3316.21 c
2874.95 3316.21 l
h
3000.05 3311.56 m
3000.05 3365.78 2989.4 3419.08 2920.82 3419.08 c
2826.3 3419.08 2826.3 3314.35 2826.3 3292.11 c
2826.3 3198.05 2868.46 3160.98 2939.36 3160.98 c
2970.85 3160.98 2986.16 3165.6 2994.5 3167.93 c
2994.04 3184.61 2996.35 3195.27 2999.15 3209.63 c
2989.4 3203.59 2976.89 3195.72 2949.09 3195.72 c
2876.8 3195.72 2875.87 3261.54 2875.87 3284.24 c
2999.15 3284.24 l
3000.05 3311.56 l
f
3150.8 3291.64 m
3150.8 3248.55 3142.93 3190.62 3089.18 3190.62 c
3081.76 3190.62 3072.5 3192.03 3066.48 3193.42 c
3065.55 3210.1 3065.55 3238.83 3065.55 3272.19 c
3065.55 3312.05 3069.71 3332.87 3072.97 3343.09 c
3082.69 3375.98 3104.47 3376.44 3108.63 3376.44 c
3143.85 3376.44 3150.8 3327.77 3150.8 3291.64 c
h
3017.82 3241.13 m
3017.82 3206.84 3017.82 3187.38 3012.26 3172.56 c
3031.26 3165.14 3054.88 3160.98 3083.16 3160.98 c
3101.23 3160.98 3153.59 3160.98 3181.85 3218.89 c
3195.29 3245.76 3199.92 3281.91 3199.92 3309.26 c
3199.92 3325.94 3198.07 3362.54 3184.63 3385.72 c
3171.66 3407.48 3150.8 3418.61 3128.57 3418.61 c
3084.08 3418.61 3071.11 3381.54 3064.17 3362.54 c
3064.17 3386.17 3064.62 3468.65 3068.32 3510.82 c
3038.21 3496.91 3019.66 3494.61 2999.75 3492.75 c
3017.82 3485.35 3017.82 3454.75 3017.82 3355.12 c
3017.82 3241.13 l
f
3288.99 3163.75 m
3279.73 3165.14 3273.22 3166.07 3259.78 3166.07 c
3244.98 3166.07 3234.77 3165.14 3224.12 3163.75 c
3228.75 3172.56 3230.6 3176.74 3231.99 3206.84 c
3233.85 3248.09 3234.32 3358.38 3231.07 3381.54 c
3228.75 3399.16 3224.59 3401.93 3218.1 3406.56 c
3256.09 3410.27 3266.76 3413.05 3284.35 3421.39 c
3280.65 3401.02 3280.18 3390.8 3280.18 3359.77 c
3279.26 3199.88 3278.79 3182.75 3288.99 3163.75 c
f
3437.37 3294.9 m
3436.46 3265.7 3435.99 3245.31 3428.1 3229.1 c
3418.37 3208.24 3402.16 3202.23 3390.11 3202.23 c
3362.29 3202.23 3356.28 3225.39 3356.28 3248.09 c
3356.28 3291.64 3395.21 3294.9 3412.8 3294.9 c
3437.37 3294.9 l
h
3309.93 3237.89 m
3309.93 3208.69 3318.74 3179.51 3344.7 3166.99 c
3356.28 3161.9 3367.86 3161.9 3371.57 3161.9 c
3414.21 3161.9 3428.56 3193.42 3437.37 3212.87 c
3436.9 3192.48 3437.37 3179.98 3438.76 3163.75 c
3447.1 3164.22 3455.44 3165.14 3469.35 3165.14 c
3477.22 3165.14 3484.64 3164.22 3492.51 3163.75 c
3487.41 3171.62 3484.64 3176.27 3483.23 3194.34 c
3482.31 3211.93 3482.31 3229.55 3482.31 3254.1 c
3482.78 3348.63 l
3482.78 3383.87 3473.51 3418.61 3403.99 3418.61 c
3358.14 3418.61 3331.26 3404.71 3317.82 3397.75 c
3323.39 3387.56 3328.02 3378.77 3332.18 3358.83 c
3350.26 3374.59 3373.9 3382.93 3397.98 3382.93 c
3436.46 3382.93 3436.46 3357.44 3436.46 3321.31 c
3427.65 3321.76 3420.22 3322.68 3407.71 3322.68 c
3348.86 3322.68 3309.93 3300 3309.93 3237.89 c
f
3704.27 3209.63 m
3704.74 3193.87 3704.74 3177.19 3711.22 3163.75 c
3701.02 3164.67 3694.99 3166.07 3676.01 3166.07 c
3664.87 3166.07 3658.86 3165.14 3650.05 3163.75 c
3651.89 3169.77 3652.84 3172.09 3653.76 3179.98 c
3655.15 3190.62 3656.08 3226.31 3656.08 3238.83 c
3656.08 3288.87 l
3656.08 3310.65 3656.08 3342.17 3654.68 3353.28 c
3653.76 3361.15 3651.46 3382.46 3624.56 3382.46 c
3598.15 3382.46 3589.36 3363.01 3586.1 3347.25 c
3582.41 3331.03 3582.41 3313.42 3582.41 3244.84 c
3582.86 3185.53 3582.86 3179.98 3587.49 3163.75 c
3579.62 3164.67 3569.89 3165.6 3555.99 3165.6 c
3544.85 3165.6 3537.45 3165.14 3528.19 3163.75 c
3531.44 3171.17 3533.29 3174.88 3534.21 3200.82 c
3535.15 3226.31 3537 3351.43 3532.8 3381.07 c
3530.5 3399.16 3525.85 3403.32 3520.77 3407.95 c
3558.31 3409.8 3570.34 3415.84 3581.94 3421.85 c
3581.94 3372.73 l
3587.49 3387.11 3599.07 3419.08 3645.42 3419.08 c
3703.35 3419.08 3703.8 3376.91 3704.27 3349.12 c
3704.27 3209.63 l
f
0.843137 0.027451 0.317647 rg
3292.9 3486.97 m
3254.53 3448.61 l
3216.17 3486.97 l
3254.53 3525.33 l
3292.9 3486.97 l
f
end showpage restore
%%PageTrailer
%%Trailer
%%Pages: 1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

View File

@ -1,20 +0,0 @@
todo
====
- un code-block:: ocaml ne passe pas (c'était lequel?)
- le tri de listes est à supprimer (ou bien le faire en python)
- donner les corrections des exos de TP
- l'abstraction de type dans les modules :
refaire le type date correctement
- l'analyse descendante avec les dates : je l'avais zappé mais c'était bien
- modules paramétrés ? à effacer
- éviter de "mélanger" le python et le ocaml
- l'appel d'une fonction n'a pas été assez clair:
- reprendre la "boite noire" plutôt avec une analogie avec la cybernétique
- plutôt que de chercher à dire procédure/fonction, dire "bloc de code qu'on
isole" et insister sur les locales et les globales
- ne pas centrer sur la programmation impérative ou fonctionnelle,
mentionner la fonctionnelle

View File

@ -1,216 +0,0 @@
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = _build
# User-friendly check for sphinx-build
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
endif
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " applehelp to make an Apple Help Book"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " xml to make Docutils-native XML files"
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
@echo " coverage to run coverage check of the documentation (if enabled)"
.PHONY: clean
clean:
rm -rf $(BUILDDIR)/*
.PHONY: html
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
.PHONY: dirhtml
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
.PHONY: singlehtml
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
.PHONY: pickle
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
.PHONY: json
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
.PHONY: htmlhelp
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
.PHONY: qthelp
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Algorithmique.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Algorithmique.qhc"
.PHONY: applehelp
applehelp:
$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
@echo
@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
@echo "N.B. You won't be able to view it unless you put it in" \
"~/Library/Documentation/Help or install it in your application" \
"bundle."
.PHONY: devhelp
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/Algorithmique"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Algorithmique"
@echo "# devhelp"
.PHONY: epub
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
.PHONY: latex
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
.PHONY: latexpdf
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
.PHONY: latexpdfja
latexpdfja:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through platex and dvipdfmx..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
.PHONY: text
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
.PHONY: man
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
.PHONY: texinfo
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
.PHONY: info
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
.PHONY: gettext
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
.PHONY: changes
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
.PHONY: linkcheck
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
.PHONY: doctest
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
.PHONY: coverage
coverage:
$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
@echo "Testing of coverage in the sources finished, look at the " \
"results in $(BUILDDIR)/coverage/python.txt."
.PHONY: xml
xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
.PHONY: pseudoxml
pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

View File

@ -1,291 +0,0 @@
Algorithmique
=============
Al-Kharezmi, auteur du traité "Kitab al jabr w'al-muqabala", est l'inventeur
des manipulations algébriques (algèbre = **al jabr**).
C'est Léonard de Pise, dit Fibonacci, qui emprunta le nom du célèbre
mathématicien arabe du 9ème siècle, mais l'algèbre existe
depuis bien plus longtemps (Depuis Babylone, puis ensuite l'Egypte ancienne).
.. glossary::
algorithme
terme désignant une suite d'opérations constituant un schéma de calcul
ou de résolution d'un problème. C'est un processus systématique de
résolution d'un problème permettant de décrire précisément des étapes.
C'est une suite finie d'instructions permettant de donner la réponse à un
problème.
L'algorithmique est l'étude et la production de règles et de techniques
qui sont impliquées dans la définition d'algorithmes.
Implémentation d'un algorithme
------------------------------
.. glossary::
implémentation
Adaptation de la méthodologie de calculabilité au calcul effectif
sur une machine abstraite ou via un langage formel.
Il ny a pas de parcours à sens unique de lalgorithme vers limplantation.
La quête dune implantation efficace nous amène souvent à effectuer
un retour vers les algorithmes eux-mêmes, et à en modifier des points
essentiels. Laspect théorique de réflexion sur les algorithmes,
et laspect pratique de l'implémentation sont donc en symbiose.
Un existant émerge de la décomposition structurale d'un
domaine de base. Le fait essentiel, c'est la genèse des genres de l'existant les
uns à partir des autres.
L'essence d'une forme (un algorithme) se réalise au sein d'une matière qu'elle créée
(un langage). L'origine d'une matière fait naître les formes (concepts)
que sa structure dessine.
- Notion structurale de non-contradiction
- Notion extensive de "réalisation dans un champ donné"
Deux aspects réciproques : l'essence d'une forme se réalise au sein d'une
matière qu'elle crée, l'essence d'une matière faisant naître les formes que sa
structure dessine.
Abandonner l'idée trop simpliste de domaines concrets et d'opérations abstraites
qui posséderaient en eux-mêmes comme une nature de matière et une nature de
forme ; cette conception tendrait, en effet, à stabiliser les existants
mathématiques dans certains rôles immuables et ignorerait le fait que les
existants abstraits qui naissent de la structure d'un domaine plus concret
peuvent à leur tour servir de domaine de base pour la genèse d'autres existants.
L'algorithme comme généralisation de la calculabilité
------------------------------------------------------
L'importance croissante de l'informatique comme outil scientifique
impose d'élaborer un nouveau mode de description des méthodes de calcul (appelées algorithmes)
susceptible de satisfaire à la fois le critère de sécurité (maîtrise du résultat) et la possibilité
d'implémenter les calculs sur un ordinateur.
Exemple d'algorithme
---------------------
.. raw:: latex
\begin{algorithm}
\caption{L'alorithme de Bellman-Kalaba}
\begin{algorithmic}[1]
\Procedure {BellmanKalaba}{$G$, $u$, $l$, $p$}
\ForAll {$v \in V(G)$}
\State $l(v) \leftarrow \infty$
\EndFor
\State $l(u) \leftarrow 0$
\Repeat
\For {$i \leftarrow 1, n$}
\State $min \leftarrow l(v_i)$
\For {$j \leftarrow 1, n$}
\If {$min > e(v_i, v_j) + l(v_j)$}
\State $min \leftarrow e(v_i, v_j) + l(v_j)$
\State $p(i) \leftarrow v_j$
\EndIf
\EndFor
\State $l(i) \leftarrow min$
\EndFor
\State $changed \leftarrow l \not= l$
\State $l \leftarrow l$
\Until{$\neg changed$}
\EndProcedure
\Statex
\Procedure {FindPathBK}{$v$, $u$, $p$}
\If {$v = u$}
\State \textbf{Write} $v$
\Else
\State $w \leftarrow v$
\While {$w \not= u$}
\State \textbf{Write} $w$
\State $w \leftarrow p(w)$
\EndWhile
\EndIf
\EndProcedure
\end{algorithmic}
\end{algorithm}
Exemple d'algorithme avec son implémentation
---------------------------------------------
Soit l'algorithme de factorielle suivant,
.. raw:: latex
\begin{algorithm}
\caption{Algorithme de la factorielle d'un nombre}\label{factorielle}
\begin{algorithmic}[1]
\Function{factorielle}{$n$}\Comment{La fonction récursive factorielle}
\BState \emph{parametre} : $n$ entier
\If{$n = 1$}
\BState \emph{Sortie} : 1
\Else
\BState \emph{Sortie} : $n * \Call{factorielle}{n-1}$ \Comment{On appelle la fonction dans l'algorithme lui-même}
\EndIf
\EndFunction
\end{algorithmic}
\end{algorithm}
et son implémentation en python :
.. literalinclude:: code/factorielle.py
:language: python
En voici une autre implémentation (en OCaml) :
.. literalinclude:: code/factorielle.ml
:language: ocaml
On remarque que le **pseudocode** est très proche de
la syntaxe du python :
.. function:: factorielle(n:int)
::
if n=1
return 1
else
return n * factorielle(n-1)
end if
Qualité d'un algorithme
-----------------------
- correction d'un algorithme
- complétude d'un algorithme
Sémantique
Étude du sens, de la signification d'un langage
Définir la sémantique dun langage formel consiste à lui donner une
signification mathématique.
Sémantique opérationnelle
on définit la sémantique par sa mise en œuvre sur
une machine abstraite.
Sémantique dénotationnelle
on associe à chaque construction syntaxique un
objet mathématique
Sémantique axiomatique
chaque construction est décrite par la manière dont
elle transforme des propriétés ou des prédicats.
Proposition
une proposition est un énoncé qui est soit vrai, soit faux
**exemple** : ``2 + 3 = 5``. Proposition vraie.
Prédicats
Une proposition dont la valeur de vérité dépend de la valeur dune ou plusieurs variables
**Exemple** : ``n est pair`` : vrai pour n = 4 mais faux pour n = 9
Axiome
une proposition qui est supposée vraie
Un ensemble daxiomes est consistant sil nexiste pas de proposition
dont on peut démontrer quelle est à la fois vraie et fausse.
Un ensemble daxiomes est complet si, pour toute proposition, il est
possible de démontrer quelle est vraie ou fausse.
Théorème dincomplétude de Gödel (1931) : tout ensemble
consistant daxiomes pour larithmétique sur les entiers est
nécessairement incomplet.
**Les concepts de base en algorithmique sont les axiomes**
inférence
règles dinférence, règles permettant de combiner des axiomes et des
propositions vraies pour établir de nouvelles propositions vraies.
Démonstration
vérification dune proposition par une séquence de déductions logiques
à partir dun ensemble daxiomes.
Lorsque le champ donné (le domaine) ne contient qu'un nombre fini d'individus,
on peut définir un choix de valeur des variables permettant de vérifier la
proposition obtenue par la *conjonction* de tous les axiomes du système proposé.
On dit alors que ce choix *réalise* un système d'axiomes.
Il ne s'agit plus de savoir si la définition entraîne l'existence, mais de
chercher si la structure d'un système d'axiomes (*règles*) peut donner naissance
à un champ d'individus qui soutiennent entre eux les relations définies pas les
axiomes.
Concret et abstrait
--------------------
Il est possible qu'un même genre d'existant joue dans un schéma de genèse le
rôle d'abstrait par rapport à un concret de base, et soit au contraire dans une
autre genèse le concret de base d'un nouvel abstrait.
Une pareille présentation des choses implique un tel renversement par rapport
aux habitudes de pensée classiques, qu'il faut encore insister sur le sens
nouveau que reçoivent ici les expressions de "concret" et "d'abstrait".
Les systèmes d'axiomes sont souvent conçus comme des structures purement
formelles, abstraites. Ces structures sont si profondément engagées dans la
genèse de leurs réalisations, qu'il valait mieux désigner par ces termes les
structures de base.
Un système d'axiome *peut* devenir le concret de base.
Ceci permet d'exprimer non seulement l'engagement du concret dans la genèse de
l'abstrait, mais encore les relations d'imitation qui peuvent exister entre la
structure de cet abstrait et celle du concret de base.
Dans certains cas, la genèse de l'abstrait à partir d'un concret de base
s'affirme jusqu'à réaliser une imitation de structure entre ces genres
d'existants qui naissent l'un de l'autre.
**C'est pourquoi on représente souvent un algorithme en pseudo-code**,
c'est-à-dire en fait dans le mode de représentation (issu du langage préféré de la
personne qui l'exprime) dominant chez la personne qui exprime un algorithme.
Comment rendre un algorithme lisible
------------------------------------
- Le bon algorithme utilise des identifiants explicites.
- Le bon algorithme est structuré.
- Le bon algorithme est indenté.
Complexité d'un algorithme
--------------------------
On peut approximer la complexité des algorithmes.
C'est utile pour pouvoir comparer des algorithmes.
complexité
estimer la complexité d'un algorithme, c'est estimer le nombre de calculs qu'il utilise.
Si f est la fonction caractérisant exactement le coût dun algorithme et n
la taille des données, on sintéresse à la façon dont augment f(n) lorsque n augmente
on va montrer que f(n) n'augmente pas plus vite quune autre fonction
g(n). Du point de vue mathématique, on dit que la fonction f est dominée
asymptotiquement par la fonction g ce qui se note f = O(g)
- Complexité temporelle : cest le nombre dop«erations effectuées par
une machine qui exécute lalgorithme.
- Complexité spatiale : cest le nombre de positions mémoire utilisées par
une machine qui exécute lalgorithme.

View File

@ -1,83 +0,0 @@
La planification agile
========================
Le mode itératif
-----------------
- livrer des versions successives et utilisables qui convergent vers
la version finale
- ne pas perdre d'énergie à maintenir des specs détaillées non nécessaires
- de nouvelles orientations fonctionnelles sont possibles, même tard
- les specs détaillées sont écrites "juste à temps"
La planification agile
-----------------------
- chaque livraison est un projet qui est planifié en tant que tel
- utiliser l'expérience acquise pour affiner les estimations
- préservation de l'écologie du projet au quotidien (code, tests...)
La confiance, feedback
-----------------------
- livraisons régulières
- progrès visibles par tous (pas d'effet tunnel)
- pilotage du projet par choix du contenu des livraisons
- investissement du Product Owner
- chercher la collaboration plutôt que la confrontation
L'agilité
----------
- le projet n'est pas joué d'avance
- cultiver la souplesse
- révolution douce
- sortir de la confrontation, jouer le "nous collectif"
mettre tout le monde sur le mme pont et amener tout le monde à bon port
Les outils agiles
------------------
- planification par itérations de 4 semaines
- entrepot de source partagé
- intégration continue
- tests automatisés
- pair programming sur points cruciaux
- sprints
- extranet :
- hitoires utilisateurs
- test cases
- gestion du backolog et des tickets
- suivi de l'avancement
- documentation
Le product owner
-----------------
idéalement,
- connaissance du métier à informatiser
- fibre projet
- dispo à 100%
Les tests
---------
- automatiser
- viser l'exhaustivité
- tester une cible mouvante
- migrer les tests d'une release à l'autre
Questions importantes en environnement agile
----------------------------------------------
- quelle durée d'itération ?
- comment découper en itérations ?
- que faire lorsque le product owner se retrouve sur le chemin critique ?
- la planification est faite en mode "juste à temps" et "juste assez"
- on ne s'échine plus à blâmer, au contraire on cherche à gagner ensemble

View File

@ -1,19 +0,0 @@
Exercices complémentaires
--------------------------
+ **Manipulation de chaînes de caractères**:
(création, accès à un caractère, concaténation), listes (création, ajout
dun élément, suppression dun élément, accès à un élément, extraction dune partie de liste), tableaux à une ou plusieurs dimensions.
+ traitement des chaines de caractères
+ s.replace()
+ s1 + s2
+ un exemple de regexp simple
+ **Fichiers** :
notion de chemin daccès, lecture et écriture de données numériques ou de type chaîne de caractères depuis ou vers un fichier.
On encourage lutilisation de fichiers en tant que supports de données ou de résultats avant divers traitements, par exemple graphiques.
+ **Piles**
Algorithmes de manipulation : fonctions 'push' et 'pop'. On utilise des listes
(ou tableaux à 1 dimension) pour leur implantation.

View File

@ -1,10 +0,0 @@
Annexes
=========
.. toctree::
:maxdepth: 2
exercices
surete
agile
scrum

View File

@ -1,176 +0,0 @@
scrum
=====
.. glossary::
scrum
Scrum est une méthode agile pour la gestion de projets
Le terme Scrum est emprunté au rugby et signifie mêlée.
Ce processus s'articule en effet autour d'une équipe soudée,
qui cherche à atteindre un but, comme c'est le cas en rugby
pour avancer avec le ballon pendant une mêlée.
Scrum définit trois rôles principaux :
- le responsable de produit -- Product Manager,
- le faciliteur -- ScrumMaster
- le développeur
et bien sûr, l'équipe (auto-gérée).
Des intervenants peuvent s'intégrer également au projet
de façon plus ponctuelle.
responsable de produit
Le responsable de produit (Product Manager) est le représentant des
clients et utilisateurs.
C'est lui qui définit l'ordre dans lequel les fonctionnalités
seront développées et qui prend les décisions importantes
concernant l'orientation du projet.
Le terme responsable n'est d'ailleurs pas à prendre au sens hiérarchique
du terme, mais dans le sens de l'orientation.
équipe, développement
outes les décisions sont prises ensemble et personne ne donne d'ordre
à l'équipe sur sa façon de procéder
facilitateur
est chargé de protéger l'équipe de tous les éléments perturbateurs
planification
--------------
Scrum utilise une planification à trois niveaux :
- release/projet
- sprint
- quotidien -- ScrumMeeting
quotidien
Au quotidien, une réunion, le ScrumMeeting (pas plus de 15 min)
permet à l'équipe et au ScrumMaster de faire un point d'avancement sur
les tâches et sur les difficultés rencontrées.
répondre à trois questions :
* Qu'est-ce que j'ai fait hier ?
* Qu'est-ce que je compte faire aujourd'hui ?
* Quelles difficultés est-ce que je rencontre ?
sprint
Scrum est un processus itératif : les itérations sont appelées des sprints
et durent en théorie 30 jours calendaires.
En pratique, les itérations durent généralement entre 2 et 4 semaines.
Chaque sprint possède un but et on lui associe une liste d'items
de fonctionnalités à réaliser.
Ces items sont décomposés par l'équipe en tâches élémentaires
de quelques heures, les items de fonctionnalités de sprint.
Pendant un sprint, les items de fonctionnalités de sprint à réaliser
ne peuvent pas être changés.
Les changements éventuels seront éventuellement réalisés
dans les sprints suivants.
releases
pour améliorer la lisibilité du projet,
on regroupe généralement des itérations en releases.
En effet, comme chaque sprint doit aboutir à la livraison
d'un produit partiel, une release permet de marquer la livraison
d'une version aboutie, susceptible d'être mise en exploitation
gestion des besoins
-------------------
tâches (backlog de sprint)
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lorsqu'on démarre un sprint, on choisit quels items des fonctionnalités
seront réalisés dans ce sprint.
L'équipe décompose ensuite chaque item en liste de tâches élémentaires
(techniques ou non), chaque tâche étant estimée en heures
et ne devant pas durer plus de 2 jours.
On constitue ainsi le backlog de sprint.
Les items de backlog de produit sont les fonctionnalités qui deviendront
les items du baclog d'un sprint.
Ces fonctionnalités sont estimées en points relatifs, sans unité.
planning poker
façon ludique et efficace de produire des estimations
sur la complexité des fonctionnalités à développer
pour évaluer les scénarios utilisateurs (user stories)
du carnet de produit (product backlog).
à la fin d'un sprint :
- revue de sprint
- rétrospective de sprint
comprendre ce qui n'a pas bien marché dans le sprint,
les erreurs commises et de prendre des décisions pour s'améliorer
mise en oeuvre
--------------
Scrum peut être mis en pratique avec trois fois rien : deux listes suffisent.
La liste des items du backlog de produit et la liste des items du backlog
de sprint. La saisie et la mise à jour des données est simplement
un peu moins agréable.
glossaire
---------
Directeur de produit (Product Owner) (responsable produit)
personne responsable de produire et maintenir à jour le backlog de produit.
C'est lui qui en détermine les priorités et qui prend les décisions
concernant l'orientation du projet.
ScrumMaster (facilitateur)
membre de l'équipe dont l'objectif principal est de la protéger
des perturbation extérieures.
Il est complètement transparent pour la communication entre l'équipe
et les clients et n'a aucun pouvoir hiérarchique sur l'équipe.
C'est en revanche un facilitateur pour les problèmes non techniques
de l'équipe.
Backlog de produit (Product Backlog) (fonctionnalités)
liste des fonctionnalités qui devront être réalisées par le logiciel.
Backlog de sprint (Sprint Backlog) (tâches)
liste des tâches à accomplir pendant un sprint.
Elles correspondent à la réalisation des items de backlog
du produit affectés au sprint.
Mêlée quotidienne (Daily Scrum) (quotidien)
réunion quotidienne de 15 minutes qui a pour but de faire le point
sur ce qui a été fait depuis la dernière mêlée,
ce qui est prévu de faire jusqu'à la prochaine
et quelles sont les embûches rencontrées durant le travail.
Sprint (sprint)
nom d'une itération dans Scrum.
Cette itération dure 30 jours calendaires en théorie,
mais en pratique on utilise plutôt entre 2 et 4 semaines.
Pendant une itération, l'équipe doit développer une liste d'items
du backlog de produit qui a été définie au début de ce sprint.
Graphique d'avancement (Burndown Chart) (avancement)
graphique qui montre la tendance du reste à faire total de jour en jour
(pour les sprints) ou de sprint en sprint (pour les releases).

View File

@ -1,93 +0,0 @@
Outils de sureté d'un programme
--------------------------------------
La preuve de programme
~~~~~~~~~~~~~~~~~~~~~~
Le niveau maximum de sûreté d'exécution d'un programme est la preuve. Qu'est-ce que la preuve
formelle d'un programme ? Selon la définition de Wikipédia, ce sont "des techniques permettant de
raisonner rigoureusement, à l'aide de logique mathématique, sur des programmes informatiques ou
du matériel électroniques, afin de démontrer leur validité par rapport à une certaine
spécification." Bref c'est un raisonnement logique sur un programmme qui permet d'être sûr que le
programme est valide et ne va pas planter.
La preuve de programme est très peu utilisée dans l'industrie, car très coûteuse et très
difficile à mettre en place. Elle quand même utilisée, mais dans des secteurs où le risque doit
absolument être évacué et où il n'y a aucun droit à l'erreur. Par exemple, le secteur médical
(informatique en bloc opératoire), militaire (peu d'informations nous parviennent dans ce
domaine), l'aviation civile (le logiciel Astrée pour Airbus), la fusée Ariane (depuis le bug qui
avait fait crasher Ariane 5 ces questions sont prises très au sérieux), et le milieu bancaire
(surtout le domaine des décisions boursières : un programme chargé de lancer des décisions
d'achat ou de vente à la bourse qui comporte un bug peut en quelque centièmes de secondes faire
perdre des millions, voire des milliards d'euros à une banque. Le programme ne doit tout simplement pas
bugger).
Le model checking
~~~~~~~~~~~~~~~~~~
Le model checking, l'analyse statique et l'interprétation abstraite procèdent d'une méthodologie
moins lourde de validation des programmes. Ces méthodes analysent exhaustivement l'évolution du
système lors de ses exécutions possibles et permetent de dire si globalement, dans un contexte
donné, le programme va fonctionner correctement. Encore très lourdes, ces techniques ne sont
utilisées que dans un contexte industriel de haute sécurité.
Les tests d'acceptation
~~~~~~~~~~~~~~~~~~~~~~~
Il y a plusieurs types de tests
- unitaires
- fonctionnels
- acceptation
Très utilisés dans l'industrie, les tests unitaires et fonctionnels ne testent que certaines
parties du programme et permettent de dire que le programme va marcher grosso-modo à peu près.
Beaucoup moins coûteux à installer, ce sont des éléments cléfs des méthodes agiles.
Les Outils de linting (validation)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- vérifications syntaxiques
- vérification sémantiques
- vérification sur les imports inutiles ou mal formés (imports croisés
Exemple en python : pylint
La dette technique
~~~~~~~~~~~~~~~~~~
Au bout d'un moment le code devient du code spaghetti et les techniques sont obsolètes.
Les tests permettent de solder la dette technique plus facilement.
**avoir le courage de payer une dette technique, et affronter une dette technique
sinon il peut y avoir un coût à payer qui sera pohibitoire.**
On solde la dette technique parce que à un moment ça va devenir beaucoup trop
cher à payer.
Les méthodologies agiles
~~~~~~~~~~~~~~~~~~~~~~~~
La manière dont le code est produit importe énormément. Par exemple, une
méthodologie ou le **refactoring** (réécriture de code) est permis et même conseillé
a plus de chance de produire du code organisé.
Les méthodologies agiles produisent en général du code mieux organisé. Ce sont les
méthodes de travail les plus en vogue aujourd'hui, elles mettent l'accent sur :
- Du logiciel fonctionnel plutôt que de la documentation exhaustive
- La réponse au changement plutôt que le suivi d'un plan
- Le logiciel fonctionnel est la principale mesure d'avancement
- Une attention continue à l'excellence technique et à une bonne
conception améliore l'agilité
- La simplicité est essentielle (il est facile de faire, il est
difficile de faire simple)
Le principe de base de la méthodologie Scrum par exemple est de focaliser l'équipe de façon
itérative sur un ensemble de fonctionnalités à réaliser, dans des itérations de durée fixe de une
à quatre semaines, appelées **sprints**. Chaque sprint possède un but à atteindre, défini par le
responsable de produit, à partir duquel sont choisies les fonctionnalités à implémenter dans ce
sprint. Un sprint aboutit toujours sur la livraison d'un produit partiel fonctionnel. Pendant ce
temps, le facilitateur a la charge de réduire au maximum les perturbations extérieures et de
résoudre les problèmes non techniques de l'équipe.

View File

@ -1,79 +0,0 @@
Aperçu des algorithmes fondamentaux
===================================
Les algorithmes sont partout. Absolument partout aujourd'hui.
Il n'est pas un domaine de nos activités qui ne soit liés à tel ou tel algorithme.
En mathématiques
-----------------
- l'algèbre (étude des structures de données)
- l'arithmétique modulaire (théorie des nombres)
- la géométrie (affine, algébrique, invariants topologiques...)
- les diagrammes (diagrammes de Venn...)
- les colorisation d'une carte
- comportements stochastiques
En informatique
----------------
- les algorithmes sur la manipulation des structures de données
Exemple : les algorithmes de tri, de recherche dans un arbre...
- les parcours de graphes (chemins le plus court, voyageur de commerce...)
- la cryptologie (code gray)
- les stratégies de jeux
Tirés du monde réel
--------------------
- les jeux (casse-tête, dominos, échiquiers...)
- énigmes, logique et paradoxes
- problèmes de raisonnements. Il n'existe pas beaucoup de méthodes
ou de moyens simples pour traiter et résoudre les énoncés de logique de raisonnement.
- La "marche de l'ivrogne" : processus de progression discrète (pas à pas)
dont l'étape suivante est lié à l'état présent et pas du tout à la mémoire du passé proche.
Il revêt seulement un caractère de type probabilité (stochastique) dit markovien.
- algorithmes de colonies de fourmis (chemins optimal pour arriver à la nourriture)
Le voyageur de commerce
~~~~~~~~~~~~~~~~~~~~~~~~
Le problème du voyageur de commerce, consiste en la recherche dun trajet minimal permettant à un
voyageur de visiter n villes. En règle générale on cherche à minimiser le temps de parcours total ou la
distance totale parcourue.
Il suffit de construire tous les chemins possibles et de calculer leurs longueurs.
Avec ``n`` villes il y a ``(n-1)!/2`` chemins possibles.
Avec 36 villes on trouve : 5166573983193072464833325668761600000000,
si le nombre de villes augmente, ça devient vite rédibitoire.
Résolution par
- algorithme de parcours de graphes
- algorithme glouton
- algorithmes génétiques
Les algorithmes génétiques sappuient sur un principe de sélection des individus dune population qui présen-
tent des caractéristiques se rapprochant au mieux de ce que lon recherche; cette population évoluant par
ailleurs selon des critères dévolution génétique à choisir. Dans le contexte du problème du voyageur de
commerce, un individu est une tournée, un chemin et une population un ensemble de tournées. Il sagit
maintenant de dé...nir un critère de sélection ainsi que des règles dévolution de la population.
- approches métaheuristiques (exemples: colonies de fourmis)
Exemple de résolution
.. raw:: latex
\begin{algorithm}
\caption{Algorithme du voyageur de commerce}\label{commerce}
\begin{algorithmic}[1]
\BState \emph{Données} : $L$ \Comment{Liste des villes à parcourir avec les distances entre les villes}
\BState \emph{Données} : $L'$ \Comment{Liste du parcours des villes à effectuer}
\State \emph{début}
\BState ...
\State \emph{fin}
\end{algorithmic}
\end{algorithm}

View File

@ -1,61 +0,0 @@
# coding: utf-8
minuscules = 'abcdefghijklmnopqrstuvwxyz'
majuscules = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def rotation(chaine, x):
"""
Effectue une rotation de x caractères vers la droite:
>>> rotation('abcde', 2)
'cdeab'
"""
return chaine[x:] + chaine[:x]
def index(c, chaine):
"""
Trouve l'index de c dans la chaine:
>>> index('n', 'bonjour')
2
"""
for i in range(len(chaine)):
if (c == chaine[i]):
return i
return -1
def chiffre_minuscules(chaine, x):
"""
Chiffre une chaîne composée de minuscules
>>> chiffre_minuscules('bonjour', 3)
'erqmrxu'
"""
r = rotation(minuscules, x)
resultat = ''
for lettre in chaine:
resultat = resultat + r[index(lettre, minuscules)]
return resultat
def chiffre(chaine, x):
"""
Chiffre une chaîne quelconque
>>> chiffre('Bonjour les amis!', 3)
'Erqmrxu ohv dplv!'
"""
r_min = rotation(minuscules, x)
r_maj = rotation(majuscules, x)
resultat = ''
for lettre in chaine:
if lettre in minuscules:
resultat = resultat + r_min[index(lettre, minuscules)]
elif lettre in majuscules:
resultat = resultat + r_maj[index(lettre, majuscules)]
else:
resultat = resultat + lettre
return resultat
#############################################################################
# Programme principal
#############################################################################
print(chiffre_minuscules('bonjour', 3))
print(chiffre('Bonjour les amis!', 3))
print(chiffre('Erqmrxu ohv dplv!', 23))
print(chiffre('Eudyr, yrxv dyhc ilql fhw hahuflfh!', 23))

View File

@ -1,17 +0,0 @@
let rec fact = function
|1 -> 1
| n -> n * fact (n-1) ;;
let print_fact n =
Printf.printf "factorielle %i = %i\n" n (fact n)
let main () =
begin
print_fact 5 ;
print_newline () ;
exit 0 ;
end
let _ = main ()

View File

@ -1,12 +0,0 @@
def factorielle(n):
if (n > 1):
r = n*factorielle(n-1)
else:
r = 1
return r
def print_fact(n):
print "factorielle {} = {}\n".format(5, factorielle(5))
if __name__ == '__main__':
print_fact(5)

View File

@ -1,370 +0,0 @@
# -*- coding: utf-8 -*-
#
# Algorithmique documentation build configuration file, created by
# sphinx-quickstart on Thu Mar 16 16:07:00 2017.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys
import os
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.'))
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'sphinx.ext.pngmath', 'sphinx.ext.ifconfig',
]
# ajout des cours avec solution des exercices ou non
def setup(app):
app.add_config_value('correction', False, 'env')
app.add_config_value('exercice', False, 'env')
exercice = False
correction = False
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
# source_suffix = ['.rst', '.md']
source_suffix = '.txt'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'Algorithmique Approfondie'
copyright = u'2017, Gwen'
author = u'Gwen'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = u'1'
# The full version, including alpha/beta/rc tags.
release = u'1'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = 'fr'
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
today_fmt = '%d/%m/%Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all
# documents.
default_role = 'literal'
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
#keep_warnings = False
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'alabaster'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (relative to this directory) to use as a favicon of
# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#html_extra_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_domain_indices = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
html_show_sphinx = False
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
html_show_copyright = False
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Language to be used for generating the HTML full-text search index.
# Sphinx supports the following languages:
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
#html_search_language = 'en'
# A dictionary with options for the search language support, empty by default.
# Now only 'ja' uses this config value
#html_search_options = {'type': 'default'}
# The name of a javascript file (relative to the configuration directory) that
# implements a search results scorer. If empty, the default will be used.
#html_search_scorer = 'scorer.js'
# Output file base name for HTML help builder.
htmlhelp_basename = 'Algorithmiquedoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
'papersize': 'a4paper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
'preamble': """\usepackage{amsmath}
\usepackage{algorithm}
\usepackage[noend]{algpseudocode}
\makeatletter
\def\BState{\State\hskip-\ALG@thistlm}
\makeatother
"""
# Latex figure (float) alignment
#'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'AlgorithmiqueApprofondie.tex', u'Cours d\'algorithmique approfondie',
u'INFAL24', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
latex_logo = '_static/cesi.jpg'
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = False
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'algorithmique', u'Algorithmique Documentation',
[author], 1)
]
# If true, show URL addresses after external links.
#man_show_urls = False
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'Algorithmique', u'Algorithmique Documentation',
author, 'Algorithmique', 'One line description of project.',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
#texinfo_appendices = []
# If false, no module index is generated.
#texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the "Top" node's menu.
#texinfo_no_detailmenu = False
# -- Options for Epub output ----------------------------------------------
# Bibliographic Dublin Core info.
epub_title = project
epub_author = author
epub_publisher = author
epub_copyright = copyright
# The basename for the epub file. It defaults to the project name.
#epub_basename = project
# The HTML theme for the epub output. Since the default themes are not
# optimized for small screen space, using the same theme for HTML and epub
# output is usually not wise. This defaults to 'epub', a theme designed to save
# visual space.
#epub_theme = 'epub'
# The language of the text. It defaults to the language option
# or 'en' if the language is not set.
#epub_language = ''
# The scheme of the identifier. Typical schemes are ISBN or URL.
#epub_scheme = ''
# The unique identifier of the text. This can be a ISBN number
# or the project homepage.
#epub_identifier = ''
# A unique identification for the text.
#epub_uid = ''
# A tuple containing the cover image and cover page html template filenames.
#epub_cover = ()
# A sequence of (type, uri, title) tuples for the guide element of content.opf.
#epub_guide = ()
# HTML files that should be inserted before the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_pre_files = []
# HTML files that should be inserted after the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_post_files = []
# A list of files that should not be packed into the epub file.
epub_exclude_files = ['search.html']
# The depth of the table of contents in toc.ncx.
#epub_tocdepth = 3
# Allow duplicate toc entries.
#epub_tocdup = True
# Choose between 'default' and 'includehidden'.
#epub_tocscope = 'default'
# Fix unsupported image types using the Pillow.
#epub_fix_images = False
# Scale large images.
#epub_max_image_width = 0
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#epub_show_urls = 'inline'
# If false, no index is generated.
#epub_use_index = True

View File

@ -1,294 +0,0 @@
Les structures de contrôle
==========================
L'instruction de saut
----------------------
.. raw:: latex
\begin{algorithm}
\caption{Exemple de saut conditionnel}\label{saut}
\begin{algorithmic}[1]
\Procedure{Euclide}{} \Comment{c'est l'algorithme d'Euclide}
\State $\textit{stringlen} \gets \text{length of }\textit{string}$
\State $i \gets \textit{patlen}$
\BState \emph{top}:
\If {$i > \textit{stringlen}$} \Return false
\EndIf
\State $j \gets \textit{patlen}$
\BState \emph{loop}: \Comment{C'est le label (l'étiquette)} \label{etiquette}
\If {$\textit{string}(i) = \textit{path}(j)$}
\State $j \gets j-1$.
\State $i \gets i-1$.
\State \textbf{goto} \emph{loop}. \label{goto}
\State \textbf{close};
\EndIf
\State $i \gets
i+\max(\textit{delta}_1(\textit{string}(i)),\textit{delta}_2(j))$.
\State \textbf{goto} \emph{top}. \Comment{C'est l'instruction de saut}
\EndProcedure
\end{algorithmic}
\end{algorithm}
.. raw:: latex
Ligne \ref{etiquette}, le bloc `loop` est aussi un label (une étiquette),
c'est-à-dire une marque posée qu'il est possible de retrouver dans le programme. \\
.. raw:: latex
Ligne \ref{goto}, l'instruction \texttt{goto} (aller à ) est le saut vers le label. \\
Description générique d'une instruction de saut::
Instruction 1
Saut Label1
Instruction 2
...
Label1:
Instruction n
.. important:: les sauts conditionnels sont à éviter, même s'ils sont implémentés
dans le langage cible, car c'est le meilleur moyen d'aboutir à
du **code spaghetti**.
L'instruction de branchement conditionnel
------------------------------------------
On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non.
.. raw:: latex
\begin{algorithm}
\caption{Exemple d'instruction de test}
\begin{algorithmic}[1]
\BState \emph{entrée}: $quality\gets 0$ \Comment{C'est cette valeur qui sera testée}
\BState \emph{locale}: $a\gets ""$
\BState \emph{sortie}: $a$ \Comment{La sortie est la valeur de $a$}
\BState \emph{corps}:
\If{$quality\ge 9$}
\State $a\gets perfect$
\ElsIf{$quality\ge 7$}
\State $a\gets good$
\ElsIf{$quality\ge 5$}
\State $a\gets medium$
\ElsIf{$quality\ge 3$}
\State $a\gets bad$
\Else
\State $a\gets unusable$
\EndIf
\end{algorithmic}
\end{algorithm}
.. ifconfig:: exercice
**Exercice** : Compacter l'algorithme suivant en une seule condition de test::
Si il fait trop chaud Alors
Si il ne pleut pas Alors
Ouvrir la fenêtre
Sinon
Fermer la fenêtre
Finsi
Sinon
Fermer la fenêtre
Finsi
.. ifconfig:: correction
**Correction** :
::
Si il fait trop chaud ET il ne pleut pas Alors
Ouvrir la fenêtre
Sinon
Fermer la fenêtre
Finsi
L'instruction switch
--------------------
L'instruction switch permet de faire plusieurs tests de valeurs sur le contenu d'une même variable.
Ce branchement conditionnel simplifie beaucoup le test de plusieurs valeurs d'une variable.
Les instructions d'itérations (boucles)
---------------------------------------
.. important:: Toutes les boucles concernent le paradigme de programmation impératif
et ne sont pas valides dans le paradigme de programmation fonctionnel
(puisque l'ordre d'évaluation importe)
- arrêt conditionnel (break)
- passage d'un pas (continue)
Répéter ... jusqu'à
~~~~~~~~~~~~~~~~~~~
.. raw:: latex
\begin{algorithm}
\caption{Exemple de répéter ... jusqu'à}
\begin{algorithmic}[1]
\BState \emph{locales}: $i \gets 1$ \Comment{déclaration et initialisation de i}
\Repeat \Comment{c'est le label de début du répéter}
\State $i \gets \textit{i+1}$
\Until{i == 100} \Comment{condition de fin de la boucle}
\end{algorithmic}
\end{algorithm}
La boucle **pour** (for)
~~~~~~~~~~~~~~~~~~~~~~~~
.. raw:: latex
\begin{algorithm}
\caption{Exemple de boucle for}
\begin{algorithmic}[1]
\BState \emph{locales}: $sum\gets 0$
\For{$i\gets 1, n$}
\State $sum\gets sum+i$
\EndFor
\end{algorithmic}
\end{algorithm}
.. ifconfig:: exercice
**Exercice** : Ecrire un algorithme qui demande successivement 20 nombres à lutilisateur,
et qui lui dise ensuite quel était le plus grand parmi ces 20 nombres
.. ifconfig:: correction
**Correction** :
::
Variables N, i, PG en Entier
Debut
PG <- 0
Pour i <- 1 à 20
Ecrire "Entrez un nombre : "
Lire N
Si i = 1 ou N > PG Alors
PG <- N
FinSi
Ecrire "Le nombre le plus grand était : ", PG
Fin
.. attention:: ne jamais manipuler le compteur dans une boucle
::
Variable Truc en Entier
Début
Pour Truc <- 1 à 15
Truc <- Truc * 2
Ecrire "Passage numéro : ", Truc
Truc Suivant
Fin
La boucle tant que (while)
~~~~~~~~~~~~~~~~~~~~~~~~~~
.. raw:: latex
\begin{algorithm}
\caption{Exemple de boucle while}
\begin{algorithmic}[1]
\BState \emph{locales}: $sum\gets 0$
\State $i\gets 1$
\While{$i\le n$}
\State $sum\gets sum+i$
\State $i\gets i+1$
\EndWhile
\end{algorithmic}
\end{algorithm}
.. ifconfig:: exercice
**Exercice** : Ecrire un algorithme de validation d'une entrée utilisateur
::
"Voulez vous un café ? (O/N)"
.. ifconfig:: correction
**Correction** : deux solutions possibles, une
::
Variable Rep en Caractère
Début
Rep <- ""
Ecrire "Voulez vous un café ? (O/N)"
TantQue Rep <> "O" et Rep <> "N"
Lire Rep
Si Rep <> "O" et Rep <> "N" Alors
Ecrire "Saisie Erronée, Recommencez"
FinSi
FinTantQue
Fin
::
Variable Rep en Caractère
Début
Ecrire "Voulez vous un café ? (O/N)"
Lire Rep
TantQue Rep <> "O" et Rep <> "N"
Ecrire "Vous devez répondre par O ou N. Recommencez"
Lire Rep
FinTantQue
Ecrire "Saisie acceptée"
Fin
.. ifconfig:: exercice
**Exercice** : "C'est plus, C'est moins", c'est-à-dire Ecrire un algorithme qui demande à lutilisateur
un nombre compris entre a et b jusquà ce que la réponse convienne.
.. ifconfig:: correction
**Correction** :
::
Variable N en Entier
Debut
N <- 0
Ecrire "Entrez un nombre entre 10 et 20"
TantQue N < 10 ou N > 20
Lire N
Si N < 10 Alors
Ecrire "Plus grand !"
SinonSi N > 20 Alors
Ecrire "Plus petit !"
FinSi
FinTantQue
Fin
Et les autres boucles : répéter... jusqu'à, etc...
.. raw:: latex
\begin{algorithm}
\caption{Exemple de boucle répéter}
\begin{algorithmic}[1]
\State $sum\gets 0$
\State $i\gets 1$
\Repeat
\State $sum\gets sum+i$
\State $i\gets i+1$
\Until{$i>n$}
\end{algorithmic}
\end{algorithm}

View File

@ -1,577 +0,0 @@
Les structures de données
===========================
.. glossary::
ATD
Abstract Data Type, structure de données abstraites.
La représentation des données est forcément un choix.
Il est impossible de rendre compte globalement d'un élément du réel,
il faut en faire une interprétation abstraite.
**Exemple**:
- Un être humain peut être représenté par les données présentes dans sa
carte d'identité. Mais un être humain n'est pas sa carte d'identité.
- Un être humain peut être représenté par les données présentes dans ses préférences
de surf sur internet. Mais un être humain **n'est pas** l'ensemble de ses logs de surf sur le net.
Les séquences
-------------
Les types séquences (listes)
.. code-block:: ocaml
# 4::1::5::8::1::[];;
- : int list = [4 ;1 ;5 ;8 ;1]
Un ensemble de valeurs portant le même nom de variable et repérées par un nombre, sappelle un tableau, ou encore une liste, ou une variable indicée.
Le nombre qui, au sein dun tableau, sert à repérer chaque valeur sappelle lindice.
Chaque fois que lon doit désigner un élément du tableau, on fait figurer le nom du tableau, suivi de lindice de lélément.
**manipulation** :
- `insert()`
- `append()`
- `remove()`
- `find()`
- `print()`
- ...
.. code-block:: python
zoo = ['bear', 'lion', 'panda', 'zebra']
print(zoo)
# But these list elements are not
biggerZoo = ['bear', 'lion', 'panda', 'zebra', ['chimpanzees', 'gorillas', 'orangutans', 'gibbons']]
print(biggerZoo)
- Lists Versus Tuples : types mutables, immutables
- Lists Versus Sets : non ordonné, collection simple
- Recherche dans une liste, recherche du maximum dans une liste
- Recherche dun mot dans une chaîne de caractères.
Algorithme de la longueur d'une liste
--------------------------------------
.. code-block:: ocaml
# let rec longueur l =
match l with
[] -> 0
| ::s -> 1 + (longueur s);;
Cette fonction est prédéfinie en Ocaml : `List.length`
.. ifconfig:: exercice
**Exercice** : écrire un algorithme qui déclare et
remplisse un tableau de 7 valeurs numériques en les mettant toutes à zéro.
.. ifconfig:: correction
**Correction** :
::
Tableau Truc(6) en Numérique
Variable i en Numérique
Debut
Pour i <- 0 à 6
Truc(i) <- 0
i Suivant
Fin
exemple d'implémentation en python
.. code-block: python
>>> liste = []
>>> for i in range(6):
... liste.append(i)
...
>>> liste
[0, 1, 2, 3, 4, 5]
>>>
.. ifconfig:: exercice
**Exercice** : Calcul du premier élément maximal dans une liste,
proposer une implémentation en python qui renvoie le maximum et
la position du max dans la liste.
.. ifconfig:: correction
**Correction** :
.. code-block: python
def max_list(L) :
k = len(L)
max, x = L[0], 0
i = 1
while i < k :
if max < L[i]:
max = L[i]
x = i
i = i + 1
return max, x
couple = max_list([4,5,6,9,12,5,10,3,18,5,6,7])
print Max de L est , couple[0]
print et se trouve à la position , couple[1]
Exemple de généricité : ce code fonctionne avec une chaîne de caractères.
.. code-block: python
couple = max_list(totovaaumarche)
print Max de L est , couple[0]
print et se trouve à la position , couple[1]
.. glossary::
Matrice
Tableaux de dimension multiple, c'est un tableau de tableau
.. ifconfig:: exercice
**Exercice** : Écrivez un algorithme remplissant un tableau de 6 sur 13, avec des zéros.
.. ifconfig:: correction
**Correction** :
implémentation en python
.. code-block:: python
>>> matrice = []
>>> for i in range(12):
... matrice.append([0 for i in range(5)])
...
>>> from pprint import pprint
>>> pprint(matrice)
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]
>>>
Algorithmes de tri
------------------
On désigne par "tri" l'opération consistant à ordonner un ensemble d'éléments en fonction de clés sur lesquelles est définie une relation d'ordre.
Les algorithmes de tri ont une grande importance pratique.
Ils sont fondamentaux dans certains domaines (exemples : map-reduce en database non relationnelle).
L'étude du tri est également intéressante en elle-même, c'est un des domaines de l'algorithmique très étudié et connu.
Tri par insertion
~~~~~~~~~~~~~~~~~~
Cet algorithme de tri suit de manière naturelle la structure récursive des
listes. Soit l une liste à trier :
- si l est vide alors elle est déjà triée
- sinon, l est de la forme x::s et on trie récursivement la suite s et on obtient une liste triée s
on insert x au bon endroit dans s et on obtient une liste triée
Description de l'algorithme
- la fonction inserer permet dinsérer un élément x dans une liste l
- si la liste l est triée alors x est inséré au bon endroit
.. code-block:: ocaml
# let rec inserer x l =
match l with
[] -> [x]
| y::s -> if x<=y then x::l else y::(inserer x s);;
val inserer : a -> a list -> a list
# inserer 5 [3 ;7 ;10];;
- : int list = [3 ; 5 ; 7 ; 10]
Tri rapide
~~~~~~~~~~~~
soit une liste l à trier :
- si l est vide alors elle est triée
- sinon, choisir un élément p de la liste (le premier par exemple)
nommé le **pivot**
- partager l en deux listes g et d contenant les autres éléments de l
qui sont plus petits (resp. plus grands) que la valeur du pivot p
- trier récursivement g et d, on obtient deux listes g et d triées
.. code-block:: ocaml
:caption: fonction de partage d'une liste
#let rec partage p l =
match l with
[] -> ([] , [])
|x::s -> let g,d = partage p s in
if x<=p then (x::g , d) else (g , x::d) ;;
val partage : a -> a list -> a list * a list = <fun>
# partage 5 [1 ;9 ;7 ;3 ;2 ;4];;
- : int list * int list = ([1 ; 3 ; 2 ; 4], [9 ; 7])
.. code-block:: ocaml
:caption: algorithme de tri rapide
# let rec tri rapide l =
match l with
[] -> []
| p::s -> let g , d = partage p s in
(tri rapide g)@[p]@(tri rapide d) ;;
val tri rapide : a list -> a list = <fun>
# tri rapide [5 ; 1 ; 9 ; 7 ; 3 ; 2 ; 4];;
- : int list = [1 ; 2 ; 3 ; 4 ; 5 ; 7 ; 9]
Définition d'un itérateur
~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: python
>>> l = range(10)
>>> for i in l:
... print l[i]
...
0
...
8
9
>>> l.__iter__()
<listiterator object at 0x7f78bb450410>
Les listes chaînées
~~~~~~~~~~~~~~~~~~~~
.. code-block:: ocaml
typedef struct list{
int elt ;
struct list* suivant ;
} ;
**Outils de manipulation** :
- `next()`
- `pointer()`
- `insert(l, a)`
- `remove(a, n)`
Les piles
----------
**manipulation**
- `insert()` : insérer un élément à la fin de la pile
- `dequeue()` : (remove and return) : retirer un élément du haut de la pile
- FIFO : "first in first out"
Traduction d'une structure de données dans une autre
-----------------------------------------------------
.. code-block:: python
>>> listOfStrings = ['One', 'Two', 'Three']
>>> strOfStrings = ' '.join(listOfStrings)
>>> print(strOfStrings)
One Two Three
>>>
>>> # List Of Integers to a String
... listOfNumbers = [1, 2, 3]
>>> strOfNumbers = ''.join(str(n) for n in listOfNumbers)
>>> print(strOfNumbers)
123
>>>
.. code-block:: python
>>> l = [('host1', '10.1.2.3', '6E:FF:56:A2:AF:18'), ('host3', '10.1.2.5', '6E:FF:56:A2:AF:19')]
>>> result = []
>>> for hostname, ip, macaddress in l:
... result.append(dict(hostname=hostname, ip=ip, macaddress=macaddress))
...
>>> result
[{'hostname': 'host1', 'ip': '10.1.2.3', 'macaddress': '6E:FF:56:A2:AF:18'},
{'hostname': 'host3', 'ip': '10.1.2.5', 'macaddress': '6E:FF:56:A2:AF:19'}]
>>>
.. ifconfig:: exercice
**Exercice** : Proposer un algorithme de traduction de cette structure de donnée
.. code-block:: python
[
{
'address': '192.168.0.0',
'mask': '255.255.255.0',
'dynamicRanges': [
{ 'low': '192.168.0.5', 'high': '192.168.0.12', 'only_unknown': True },
{ 'low': '192.168.0.50', 'high': '192.168.0.55', 'only_unknown': False },
],
},
{
'address': '192.168.0.0',
'mask': '255.255.255.0',
'dynamicRanges': [
{ 'low': '192.168.0.12', 'high': '192.168.0.45', 'only_unknown': True },
{ 'low': '192.168.0.8', 'high': '192.168.0.35', 'only_unknown': False },
],
},
{
'address': '192.168.0.1',
'mask': '255.255.255.0',
'dynamicRanges': [
{ 'low': '192.168.0.5', 'high': '192.168.0.12', 'only_unknown': True },
{ 'low': '192.168.0.50', 'high': '192.168.0.55', 'only_unknown': False },
],
},
]
En cette structure de données :
.. code-block:: python
[
{
address: '192.168.0.0',
mask: '255.255.255.0',
dynamicRanges: [
{ low: '192.168.0.5', high: '192.168.0.12', only_unknown: true },
{ low: '192.168.0.50', high: '192.168.0.55', only_unknown: false },j
], [
{ low: '192.168.0.12', high: '192.168.0.45', only_unknown: true },
{ low: '192.168.0.8', high: '192.168.0.35', only_unknown: false },
],
},
{
'address': '192.168.0.1',
'mask': '255.255.255.0',
'dynamicRanges': [
{ 'low': '192.168.0.5', 'high': '192.168.0.12', 'only_unknown': True },
{ 'low': '192.168.0.50', 'high': '192.168.0.55', 'only_unknown': False },
],
},
]
.. ifconfig:: correction
**Correction** :
.. code-block:: python
>>> from pprint import pprint
pprint(l)
[{'address': '192.168.0.0',
'dynamicRanges': [{'high': '192.168.0.12',
'low': '192.168.0.5',
'only_unknown': True},
{'high': '192.168.0.55',
'low': '192.168.0.50',
'only_unknown': False}],
'mask': '255.255.255.0'},
{'address': '192.168.0.0',
'dynamicRanges': [{'high': '192.168.0.45',
'low': '192.168.0.12',
'only_unknown': True},
{'high': '192.168.0.35',
'low': '192.168.0.8',
'only_unknown': False}],
'mask': '255.255.255.0'}]
>>> newdata = []
>>> for i in l:
... if i['address'] not in [j['address'] for j in newdata]:
... newdata.append(i)
... else:
... for k in newdata:
... if k['address'] == i['address']:
... k['dynamicRanges'].extend(i['dynamicRanges'])
...
>>> pprint(newdata)
[{'address': '192.168.0.0',
'dynamicRanges': [{'high': '192.168.0.12',
'low': '192.168.0.5',
'only_unknown': True},
{'high': '192.168.0.55',
'low': '192.168.0.50',
'only_unknown': False},
{'high': '192.168.0.45',
'low': '192.168.0.12',
'only_unknown': True},
{'high': '192.168.0.35',
'low': '192.168.0.8',
'only_unknown': False}],
'mask': '255.255.255.0'},
{'address': '192.168.10.0',
'dynamicRanges': [{'high': '192.168.0.12',
'low': '192.168.0.5',
'only_unknown': True},
{'high': '192.168.0.55',
'low': '192.168.0.50',
'only_unknown': False}],
'mask': '255.255.255.0'}]
>>>
.. ifconfig:: exercice
**Exercice** : Proposer un algorithme qui permette de récupérer la liste
des adresses IP disponibles
.. code-block:: python
{
"local": {
"leases": [
{
"mac": "02:00:c0:a8:00:66",
"name": "pcxubuntu",
"address": "192.168.0.200"
},
{
"mac": "02:00:c0:a8:00:67",
"name": "pcxubuntu",
"address": "192.168.0.201"
},
{
"mac": "02:00:c0:a8:00:68",
"name": "pcxubuntu",
"address": "192.168.0.202"
}
]
}
}
.. ifconfig:: correction
**Correction** :
.. code-block:: python
>>> l = {
... "local": {
... "leases": [
... {
... "mac": "02:00:c0:a8:00:66",
... "name": "pcxubuntu",
... "address": "192.168.0.200"
... },
... {
... "mac": "02:00:c0:a8:00:67",
... "name": "pcxubuntu",
... "address": "192.168.0.201"
... },
... {
... "mac": "02:00:c0:a8:00:68",
... "name": "pcxubuntu",
... "address": "192.168.0.202"
... }
... ]
... }
... }
>>> leases = l["local"]["leases"]
>>> from pprint import pprint
>>> pprint(leases)
[{'address': '192.168.0.200', 'mac': '02:00:c0:a8:00:66', 'name': 'pcxubuntu'},
{'address': '192.168.0.201', 'mac': '02:00:c0:a8:00:67', 'name': 'pcxubuntu'},
{'address': '192.168.0.202', 'mac': '02:00:c0:a8:00:68', 'name': 'pcxubuntu'}]
>>> addresses = [lease['address'] for lease in leases]
>>> addresses
['192.168.0.200', '192.168.0.201', '192.168.0.202']
>>>
Structures de données complexes
-------------------------------
Les types produits nommés
~~~~~~~~~~~~~~~~~~~~~~~~~~
On les appelle enregistrements, dictionnaires ou tables de hachage.
::
algorithme monAlgorithme
// déclaration d'un enregistrement
enregistrement Personne
chaine nom;
chaine prenom;
entier age;
réel taille;
finenregistrement
...
Personne[50] t;
début
// Initialisation
t[0].nom <- "Duchmol";
t[0].prenom <- "Robert";
t[0].age <- 24;
t[0].taille <- 1.80;
...
fin
.. code-block:: ocaml
# type adresse = { rue : string ; ville : string ; cp : int};;
# type fiche = {
nom : string ;
prenom : string ;
adresse : adresse ;
date naissance : int * int * int ;
tel fixe : string ;
portable : string
};;
# let v1 = { a = 1 ; b = false ; c = 'r'};;
- les sommes (constructeurs)
.. code-block:: ocaml
# type couleur = Pique | Coeur | Carreau | Trefle;;
# let v = (Pique , Coeur);;
val v : couleur * couleur = (Pique , Coeur)
.. code-block:: ocaml
type nombre =
Ent of int | Reel of float | Cplx of float × float
Ent, Reel, Cplx sont les constructeurs du type.
Autres structures de données complexes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- arbres
- graphes
- dates
- le parcours de graphes
- les calculs de dates

View File

@ -1,588 +0,0 @@
Les fonctions et les procédures
================================
Préliminaire : rappel de théorie de cybernétique
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Théorie de l'information (Claude Shannon, 1949), (ou théorie de la communication)
Canal de transmission::
entrée -> récepteur -> émetteur -> sortie
.. glossary::
cybernétique
étude des fonctions de réflexes conditionnés du cerveau humain
utilisation au mieux en PNL ("programmation neuro-linguistique")
ou en analyse transactionnelle, ou au pire en ingérinerie sociale.
La matérialité physique est considérée comme le hardware, le génétique (le
réseau neuronal) étant assimilé au network hardware.
Les objets mentaux (fonctionnements psychologiques et épigénétiques du
cerveaux) est assimilé au logiciel, au software.
IFTTT ("if this then that") : la causalité mondaine est ramenée à un ordre de
comportement affecté à un assimilé-machine.
L'humain est ramené à une machine.
C'est articulation entre "déclencheur contextuel" et "action en réponse de"
n'est pas une "black box" mais un "feedback" qui, pour l'humain,
loin d'être ramené à une entrée/sortie, constitue un **feedback**
utile pour la connaissance de soi.
A la place, la communication est ramenée à une **boucle de rétroaction**
(comme dans un prompt) entre un système comportemental et son environnement.
La représentation sujet/objet (la perspective traditionnelle) est remplacée
par le clivage intérieur/extérieur. Behaviorisme, procédural.
L'humain est donc ramené à
- un ordonnanceur
- un comportement intrinsèque (boîte noire)
- un stimuli pavlovien (déclencheur, trigger) est considéré comme un paramètre
d'entrée
- une instruction comportementale est considérée comme une action de
traitement
- le résultat est observé.
Cette articulation entre "déclencheur contextuel" et "action en réponse"
est très exactement une forclusion de la profondeur monadique (Leibniz) de
l'humain à la black box informationnelle (et cybernétique).
Pour quoi faire ? Pour pirater. Pour manipuler.
Le piratage consiste à
- isoler les constantes (les procédures répétitives, les algorithmes)
- les observer (collecter les données)
afin de
- les réécrire (influence toxique, pishing - hammeçonnage)
- les détruire (attaque en règle)
Description d'une procédure
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
En programmation impérative, un programme est une suite dinstructions qui font
évoluer létat mémoire, le résultat est dans létat final de la mémoire.
- une procédure peut prendre des paramètres
- elle modifie l'état courant du système
- Déclaration des paramètes
- Déclaration du corps
- Appel de la procédure
.. raw:: latex
\begin{algorithm}
\caption{Procédure de permutation de deux entiers}\label{permutation}
\begin{algorithmic}[1]
\Procedure{permuter}{$a,b$}{}
\BState \emph{parametres}:
\State $a: \textit{int}$
\State $b: \textit{int}$
\BState \emph{locales}:
\State $z: \textit{int}$ \Comment{Une variable intermédiaire est nécessaire}
\BState \emph{corps}:
\State $z \gets a$
\State $a \gets b$
\State $b \gets z$
\EndProcedure
\State \Call{permuter}{10, 12} \Comment{appel de la procédure}
\end{algorithmic}
\end{algorithm}
effet de bord
toute modification de la mémoire ou modification d'un support externe
instruction
commande ou phrase en mesure de modifier l'état du programme ou de la machine hôte
(allocation mémoire, support externe, disque, écran...)
Une procédure ne renvoie pas de valeur, mais provoque un 'effet de bord' (écriture dans une globale, dans un flux sortant etc.).
Une procédure permet de créer une instruction nouvelle qui deviendra une primitive pour le programmeur.
Cela permet de structurer le texte source du programme et améliorer sa
lisibilité. Cela permet aussi d'appeler plusieurs fois, et à plusieurs endroit
dans le code, cette primitive.
Appel d'une procédure
~~~~~~~~~~~~~~~~~~~~~
(ex: pseudo-pascal)
**déclaration de procédure**
.. raw:: latex
\begin{algorithm}
\caption{Procédure de permutation de deux entiers}\label{appelpermutation}
\begin{algorithmic}[1]
\Procedure{permuter}{$a,b$}{}
\BState \emph{parametres}:
\State $a: \textit{int}$ \Comment{paramètres formels de la procédure}
\State $b: \textit{int}$
\BState \emph{locales}:
\State $z: \textit{int}$ \Comment{les variables locales de la procédure}
\BState \emph{corps}:
\State ... \Comment{Le corps de la procedure}
\EndProcedure
\State \Call{permuter}{10, 12} \Comment{l'appel de la procédure}
\end{algorithmic}
\end{algorithm}
- les variables x1,...,xn sont appelées *paramètres formels* de p
- les variables v1,...,vm sont appelées *les variables locales* de p
les valeurs effectivement passées en paramètres, ici `10, 12`
sont appelées **paramètres effectifs** de p
signature
C'est l'ensemble paramètre formel + resultat de l'appel
fermeture
L'ensemble procédure + variables locales + signature + parametres effectifs
est appelé une **fermeture**. C'est la procédure + son contexte qui permet
de l'instancier dans un programme.
Environnement
Contexte dévaluation d'une expression ou d'une fonction
Portée
La portée d'un identifiant (une variable) est sa condition d'utilisation dans un contexte donné
(utilisation locale uniquement, ou bien globale, ou bien locale et globale)
La portée dune liaison est la portion du code dans laquelle cette
liaison est valide (i.e. où un identifiant est lié à une expression).
.. ifconfig:: exercice
**Exercice** : Que donne ce code ?
.. code-block:: ocaml
# let x = 42 in
let y = x - 1 in x - y ;;
.. ifconfig:: correction
**Correction** :
.. code-block:: ocaml
- : int = 1
.. code-block:: ocaml
let a = 3 (* première liaison pour l'identifiant a *)
let b = 5 and c = 6
let somme = a + b + c
val somme : int = 14
let a = 45 (* deuxième liaison pour l'identifiant a *)
somme
val a : int = 45
.. ifconfig:: exercice
**Exercice** : Que donne ce code ?
.. code-block:: ocaml
let a = 3 and b = 4 and c = 8 ;;
let somme = a + b + c ;;
val somme : int = ???
let a = 44
let b = 5
let c = 1
somme
- : int = ???
.. ifconfig:: correction
.. code-block:: ocaml
let a = 3 and b = 4 and c = 8 ;;
- : int = 15
let somme = a + b + c ;;
val somme : int = 15
let a = 44
let b = 5
let c = 1
somme
- : int = 15
Même code en python
.. code-block:: python
>>> a = 1
>>> b = 2
>>> c = 3
>>> somme = a + b + c
>>> somme
6
>>> a = 56
>>> b = 5678
>>> c = 56789
>>> somme
6
>>>
Portée locale dans une expression
.. code-block:: ocaml
# let a = 2 and b = 3 and c = 4 in
let somme = a+b+c in
somme
- : int = 9
# somme ;;
Error: Unbound value somme
# a ;;
Error: Unbound value a
.. important::
Lordre dévaluation dans un let ... in ... est bien déterminé,
sans grande importance dans un cadre purement fonctionnel, mais important
en cas deffets de bord
Exemple de variable globale modifiée localement (**attention, mauvaise pratique** !) :
.. code-block:: python
>>> a = 5
>>> def print_a():
... print("La variable a = {0}.".format(a))
...
>>> print_a()
La variable a = 5.
>>> a = 8
>>> print_a()
La variable a = 8.
>>>
niveau
Le niveau dune déclaration (de variable ou de procédure) est le nombre
de procédures sous lesquelles elle est déclarée. Le programme principal
a le niveau 0.
.. code-block:: python
:linenos:
def _get_config(name):
# return config value
if not isfile(CONFIG_FILE):
raise Exception("Fichier de configuration non existant")
from ConfigParser import ConfigParser
cfg = ConfigParser(allow_no_value=True)
cfg.read(CONFIG_FILE)
if name == "SUBNETS":
return eval(cfg.get('eole', 'subnets'))
elif name == "LEASES_FILE":
DHCP_PATH = cfg.get('eole', 'container_path_dhcp')
return join('/', DHCP_PATH, 'var/lib/dhcp/dhcpd.leases')
def get_routes(*args, **kwargs):
"""
Send list of reserved IP
return list of tuple (id, machine name, IP, MAC Adress)
"""
cfg = creole_loader(load_extra=True, rw=False, owner=MODNAME,
mandatory_permissive=False)
return zip(cfg.dhcp.dhcp.id_dhcp.id_dhcp, cfg.dhcp.dhcp.id_dhcp.hostname,
cfg.dhcp.dhcp.id_dhcp.ip, cfg.dhcp.dhcp.id_dhcp.macaddress)
On voit que l'objet `cfg` ligne 6 et 7 a le même nom que l'objet `cfg` ligne 19.
C'est autorisé et les espaces de nommages sont différents.
Description d'une fonction
~~~~~~~~~~~~~~~~~~~~~~~~~~
Une fonction renvoie une valeur et ne modifie pas l'état courant du programme
en cours d'exécution ni ne réalise d'effets de bord. Elle renvoie
**toujours** quelque chose (même la valeur ``None`` qui n'est pas rien)
- une procédure peut prendre des paramètres
- elle modifie l'état courant du système
- Déclaration des paramètes
- Déclaration du corps
- Appel de la fonction
En programmation fonctionnelle, programme est un ensemble de définitions de fonctions,
un résultat est l'application dune fonction à une structure de données effective.
- composant de base : la fonction
- opération de base : lapplication
.. raw:: latex
\begin{algorithm}
\caption{Exemple de fonction}\label{fonction}
\begin{algorithmic}[1]
\Function{permuter}{$a,b$}{} \Comment{définition de la fonction}
\BState \emph{parametres}: \Comment{déclaration (noms, types) des paramètres formels}
\State $a: \textit{int}$
\State $b: \textit{int}$
\BState \emph{locales}: \Comment{déclaration (noms, types) des valeurs locales}
\State $z: \textit{int}$
\BState \emph{corps}:
\State $z \gets a$
\State $a \gets b$
\State $b \gets z$
\BState \emph{return}: \Comment{La valeur, le résulat renvoyé par la fonction}
\EndFunction
\State \Call{permuter}{10, 12} \Comment{appel de la fonction}
\BState \emph{result}:
\State (12, 10) \Comment{Le résultat effectif de la fonction après appel}
\end{algorithmic}
\end{algorithm}
.. ifconfig:: exercice
**Exercice** : factoriser le code suivant
::
Ecrire "Etes-vous marié ?"
Rep1 <- ""
TantQue Rep1 <> "Oui" et Rep1 <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Rep1
FinTantQue
...
Ecrire "Avez-vous des enfants ?"
Rep2 <- ""
TantQue Rep2 <> "Oui" et Rep2 <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Rep2
FinTantQue
.. ifconfig:: correction
**Correction** :
::
Fonction RepOuiNon() en caractère
Truc <- ""
TantQue Truc <> "Oui" et Truc <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Truc
FinTantQue
Renvoyer Truc
Fin
Ecrire "Etes-vous marié ?"
Rep1 <- RepOuiNon()
...
Ecrire "Avez-vous des enfants ?"
Rep2 <- RepOuiNon()
Définition mathématique
~~~~~~~~~~~~~~~~~~~~~~~~~
fonction
Une fonction f dun ensemble E vers un ensemble F est une
correspondance qui associe à chaque élément de E au plus
un élément de F.
- E est appelé le domaine de définition
- F est appelé codomaine
- la **signature** de la fonction : `E → F (int -> int = <fun>)`
Exemple de signature d'une fonction
::
Fonction RepOuiNon(Msg en Caractère) en Caractère
Ecrire Msg
Truc <- ""
TantQue Truc <> "Oui" et Truc <> "Non"
Ecrire "Tapez Oui ou Non"
Lire Truc
FinTantQue
Renvoyer Truc
Fin Fonction
...
Rep1 <- RepOuiNon("Etes-vous marié ?")
...
Rep2 <- RepOuiNon("Avez-vous des enfants ?")
...
curryfication
évaluation de l'application d'une fonction
- évaluter `(f x y)`
- peut donner une **valeur fonctionnelle**
- évaluation de la valeur fonctionnelle sur une valeur des types de base
::
let g = function n -> (function p -> p + 1) n;;
Typage d'une fonction
~~~~~~~~~~~~~~~~~~~~~
.. code-block:: ocaml
# let f x y z = if x > 0 then y + x else z - x;;
val f : int -> int -> int -> int = <fun>
cest en fait une fonction à un argument qui retourne une fonction::
.. code-block:: ocaml
val f : int -> (int -> (int -> int)) = <fun>
application de f à trois valeurs
.. code-block:: ocaml
# f 1 2 3;;
- : int = 3
en programmation fonctionnelle,
les fonctions sont des valeurs comme les autres
.. code-block:: ocaml
# fun x -> x * x;;
- : int -> int = <fun>
Récursivité
~~~~~~~~~~~~
.. code-block:: ocaml
let rec fact n =
if n=0 then 1 else n * fact (n-1)
équivalent impératif utilisant une boucle
.. code-block:: c
int fact(int n){
int f = 1 ;
int i = n ;
while (i>0){
f = f * i;
i-- ;
} ;
return f ;
}
Définitions par cas
~~~~~~~~~~~~~~~~~~~
.. code-block:: ocaml
let rec fact n =
match n with
0 -> 1
| -> n * fact (n-1)
**exemple** : la fonction puissance
.. code-block:: ocaml
let rec puissance x n = match n with
0 -> 1
| -> x * puissance x (n-1)
.. ifconfig:: exercice
**Portée locale dans une fonction**
Quelles sera la valeur de la variable `a` ?
.. code-block:: python
>>> a = 1
>>> def myfunc():
... a = 2
... return a + 1
...
>>> a = myfunc() + a
.. ifconfig:: correction
Correction:
.. code-block:: python
>>> a = 1
>>> def myfunc():
... a = 2
... return a + 1
...
>>> a = myfunc() + a
>>> a
4
>>>
.. ifconfig:: exercice
**Exercice** : Portée locale dans une fonction avec variable globale
Quelles sera la valeur de la variable `a` ?
.. code-block:: python
>>> a = 1
>>> def myfunc():
... global a
... a = 2
... return a + 1
...
>>> a = myfunc() + 3
>>>
.. ifconfig:: correction
**Correction** :
.. code-block:: python
>>> a = 1
>>> def myfunc():
... global a
... a = 2
... return a + 1
...
>>> myfunc()
3
>>> a
2
>>> a = myfunc() + 3
>>> a
6
>>>

View File

@ -1,198 +0,0 @@
Présentation de l'art de programmer
====================================
Qu'est-ce que la programmation ?
--------------------------------
programmation
Description dun calcul (traitement) dans
un langage compréhensible par la machine
(langage de programmation)
Le processus d'abstraction
--------------------------
Débuter en programmation n'est pas une chose aisée. Aujourd'hui, la tendance est au
"bas niveau". Souvent, on se jette dans le grand bain :
- soit en s'approchant au maximum de la machine (admin système et réseau, noyau
linux, langage C)
- soit en faisant du dev web côté backend, ce qui ramène à une administration réseau
de bas niveau (microservices, monde nodeJS/javascript, etc...)
Soit on suit un cursus scolaire traditionnel qui commence souvent par une
explication du fonctionnement d'une machine abstraite de bas niveau, puis en
allant de plus en plus haut, mais étant sous-entendu qu'il faut rester connecté au
bas niveau (comprendre comment ça se passe derrière la scène).
Dans ces deux cas, il est sous-entendu qu'on apprend plus de choses et plus rapidement en mettant
les mains dans le cambouis, ce qui est vrai bien sûr. Mais cela sous-entend qu'un développeur doit
rester le nez dans le guidon. Qu'il doit être un expert de son domaine en accumulant des technologies
sans aucun recul. Bien sûr il se doit d'être un expert du système dans lequel il évolue
(connaissance du système d'exploitation, binding avec le C, du ramasse miette (garbage
collector), interaction avec les différentes librairies, gestion et optimisation de la mémoire,
architecture par microservices, threads...) mais il doit aussi être capable de prendre du recul.
L'approche algorithmique (algorithmique de pseudo code, algorithmique algébrique et modulaire)
est un véritable moyen pour le programmeur de prendre du recul : elle commence par se placer du
côté de l'esprit humain et de ses capacités de compréhension et d'abstraction, elle autorise une
pensée rationnelle sur l'art de programmer et permet au programmeur d'effectuer les bons choix,
en connaissance de sa discipline.
Le lien est fait ensuite avec le plus bas niveau grâce une implémentation effective
des langages à partir des paradigmes de rationalisation de la penseée (modules,
objects, généricité, polymorphisme paramétrique...) et d'un outil de communication
avec la machine qu'on appelle compilateur (dont la description est en dehors de
l'objectif de ce cours).
La tendance générale de l'évolution des langages est de se libérer de ces
contraintes de bas niveau, un peu comme en sciences physiques où les lois physiques
dépendent de l'échelle d'en dessous (du niveau microscopique/quantique) mais qu'à
l'échelle du dessus, on n'a pas affaire à des effets de bas niveau (pas d'effets
quantiques à un niveau macroscopique en général). Ce processus d'évolution est vrai
aussi dans le monde de la technique informatique lui-même (modèle OSI, comment est
construite une trame IP, indépendances de chaque couche (transport, payload) entre
elles). Même la tendance système est à la virtualisation qui accentue encore la
tendance à s'affranchir du bas niveau (le niveau système), le séparer nettement du
haut niveau (le niveau applicatif).
Il apparaît régulièrement de nouveaux langages. Comment s'orienter ? Quel(s)
langage(s) choisir pour un projet de développement ? Au delà de leurs disparités, la
conception et la genèse de chacun d'eux procèdent d'une motivation partagée : la
volonté d'abstraire.
- **s'abstraire de la machine** : un langage de programmation permet de
négliger l'aspect *mécanique* de l'ordinateur. On oublie le modèle du
microprocesseur, jusqu'au système d'exploitation sur lequel sera exécuté
le programme.
- **abstraire les erreurs** : Il s'agit ici de garantir la sûreté d'exécution; un
programme ne doit pas se terminer brutalement ou devenir incohérent en cas d'erreur.
Un des moyens pour y parvenir est le typage des programmes et la mise
en oeuvre d'un mécanisme d'exceptions.
- **abstraire le mode opératoire** : Il s'agit de choisir une représentation, un
paradigme d'implémentation qui est indépendant du domaine considéré (paradigme
objet, modulaire, générique, composants...)
- **abstraire les composants** : Les langages de programmation donnent la
possibilité de découper une application en différents composants logiciels, plus ou
moins indépendants et autonomes. La modularité permet une structuration de plus haut
niveau de l'ensemble d'une application complexe. Les langages à objets constituent
une autre approche de la réutilisabilité permettant la réalisation très rapide de
prototypes.
Description des niveaux d'abstraction par rapport à la machine
---------------------------------------------------------------
Les langages de haut niveau simplifient le travail du
programmeur là où les langages de bas niveau permettent de produire un code
plus efficace.
- **niveau 0** : le langage machine. Illisible, c'est une suite d'optcode.
impossible de coder dans ce langage.
- **niveau 1** : langage d'assemblage. Il reste très dépendant de la machine
et aujourd'hui il est rare d'en faire, sauf si on code un bootloader par exemple,
la gestion de l'accès à la mémoire est en réel (le mode protégé n'apparaît que après).
Il faut gérer les ressources,le langage est très optimisé mais presque impossible
à maintenir et rendre générique. Aujourd'hui plus personne ne code en assembleur.
- **niveau 2** : langages dits de **bas niveau** : (exemple : le C, le C++)
indépendance par rapport à la machine, grande structuration mais très verbeux
- **niveau 3** : langages dits de **haut niveau** : le raisonnement dans ces
langages ne dépent plus de la machine, et ils implémentent des paradigmes de
programmation indépendant de l'état de la mémoire de l'ordinateur,
ils sont indépendant même du système d'exploitation.
Qu'est-ce qu'une machine ?
---------------------------
Une machine, ce truc apparemment si complexe, est en fait
un assemblage de bric et de brac.
L'assemblage des connecteurs permet de simuler un additionneur,
en prenant en compte les propriétés de **reste euclidien**
de l'addition.
La structure électronique est composée de :
- un ordonnanceur.
- le stockage d'un **état**.
- une pile d'instruction
.. glossary::
adressage
Dès lors qu'on dispose de ces bases électronique au dessus du processeur,
un langage d'assemblage est possible, c'est le langage de calcul sur les registres.
registre
machines ont un espace mémoire et un espace de calcul (registres)
Un ordinateur, c'est très très stupide, mais ça permet de disposer de :
- une mémoire très grande et ordonnée,
- une capacité à effectuer inlassablement des tâches répétitives
- une grande rapidité de calcul
Apprendre à programmer, c'est-à-dire être capable de
contrôler la machine.
.. important:: Apprendre à programmer, c'est-à-dire apprendre à penser de manière structurée,
pour pouvoir accessoirement ensuite communiquer avec une machine.
Compilateur
-----------
Schématiquement, un compilateur est un programme qui traduit un
programme dun langage source vers un langage cible, en signalant
déventuelles erreurs.
Quand on parle de compilation, on pense typiquement à la traduction dun
langage de haut niveau (C, Java, Caml, ...) vers le langage machine dun
processeur (Intel Pentium, PowerPC, ...)
- xml (libre office, word) -> postscript (imprimante)
- postcript -> image
- syntaxe wiki -> html (Wikipédia...)
compilation graphique
passer une description, ça donne un dessin genre ocaml Quilt < mon_dessin.txt
passer par une api qui permet de causer avec une interface
**transpiler** : transformation d'un langage de haut niveau vers un autre
langage de haut niveau.
- cofee script, typescript -> javascript
- (babel) javascript -> javascript ES 6
- python -> javascript
Un compilateur traduit un programme P en un programme Q tel que
pour toute entrée x , la sortie de `Q(x)` soit la même que celle de `P(x)`
Un interprète est un programme qui, étant donné un programme `P` et une
entrée x , calcule la sortie s de `P(x)`
Le compilateur fait un travail complexe une seule fois, pour produire un
code fonctionnant pour nimporte quelle entrée
Linterprète effectue un travail plus simple, mais le refait sur chaque entrée
Autre différence : le code compilé est généralement bien plus efficace que
le code interprété
Typiquement, le travail dun compilateur se compose dune phase danalyse
- reconnaît le programme à traduire et sa signification
- signale les erreurs et peut donc échouer (erreurs de syntaxe, de portée, de typage, etc.)
Puis dune phase de synthèse
- production du langage cible
- utilise de nombreux langages intermédiaires
- néchoue pas

View File

@ -1,19 +0,0 @@
Introduction à l'algorithmique
================================
.. toctree::
:maxdepth: 2
presentation
fondement
langage
algo
programme
fonctions
control
donnees
apercu
modularite
modules
tp
annexes/index

View File

@ -1,336 +0,0 @@
Les langages de programmation
=============================
langage
Un langage de
programmation
doit permettre d'écrire des
programmes de bonne qualité
Un programme doit être :
- correct
- robuste
- lisible, bien documenté
- facile à modifier, extensible
Un langage de programmation doit permettre :
- la programmation structurée
- la structuration avec les types
- proposer un mécanisme dexceptions
- présenter des caractères de généricité, de polymorphisme et de surcharge
.. important:: La structuration et l'organisation modulaire sert à maintenir de grands programmes,
Elles sont une nécessité
Approche historique et chronologique
-------------------------------------
- Lambda calcul (1930)
- machines de Turing (1936)
- début des langages vers les années 1950 (A0, Fortran(impératif),
Lisp(impératif et fonctionnel), Cobol)
- années 60 : Simula (classes), CPL (compilation séparée)
- années 70 : C (référence du langage impératif de bas niveau), Pascal
(procédures), Smalltalk (programmation orientée objects), Prolog
(programmation logique), Scheme (programmation fonctionnelle pure), Modula,
C++, Ada, Turbo Pascal, Common Lisp, Eiffel (programmation par contrats)
- années 80 : ML, CAML (langages fonctionnels)
- années 90 : Perl, Python, Ruby (languages de scripting multi-paradigmes)
Haskell (fonctionnel pur), Lua, Delphi, Java (orienté objet, machine
virtuelle), PHP (impératif, dédié au web), Erlang (fonctionnel+
programmation concurrente), javascript (orienté web, objets par
prototypage), OCaml (multi-paradigme, fortement typé, orienté sécurité,
programmation générique, fonctionnelle et objets, modulaire et fonctorielle)
- 2009 : go (google, compilé, typage statique, objets par prototypage,
prgrammation concurrente), Rust (fondation mozilla, multiparadigme, programmation concurrente)
Les langages actuellement les plus utilisés dans le monde de l'entreprise sont :
- javascript/NodeJS (70% du code dans le dépôt github) mais victime de son
succès (chaos complet des librairies)
- le go est de plus en plus utilisé, c'est **le** langage qui monte
actuellement
- Python, Ruby, lua, autres langages de scripting (de plus en plus utilisés)
- PHP, Java (stagnants)
- C, C++ (de moins en moins utilisés)
Approche par typologie des langages
-----------------------------------
- **A0 (1954)** : possibilité de découpage de programmes en
sous-programmes ;
- **ALGOL (1958)** : concept de bloc de code (pas forcément nommé) et d'imbrication
de blocs de code ;
- **C (1971)** : syntaxe claire et simple, programme fortement structuré ;
- **C (1980)** : le **code objet**, qui consiste à essayer de faire fonctionner
un seul jeu d'instructions sur des machines différentes. Avant, le code
d'assemblage dépendait du processeur, donc il n'y avait pas un seul et unique
jeu d'instructions ;
- **1980** : déploiement et succès des langages à objets ;
- **1983** : turbo pascal (Borland) qui fut le tournant du C,
propose un IDE (Environnement de Développement Intégré).
aujourd'hui le turbo pascal a pratiquement disparu mais pas totalement,
il est soutenu par une communauté open source autour de **Lazarus** ;
- **depuis les années 90** : deux grands groupes de langages. Les langages à
objets, et les langages fonctionnels. Les deux mondes s'interpénètrent (les
avancées actuelles du web, les microservices (Erlang, Haskell),
viennent du monde fonctionnel, le NoSQL, etc).
Les grandes avancées architecturales (système d'exploitation, linux, etc...)
viennent du monde de l'impératif.
Approches par modèles de programmation
--------------------------------------
- **le mécanisme d'exceptions** : il est possible de rompre l'exécution normale d'un
programme à un endroit et de la reprendre à un autre endroit du programme prévu à
cet effet. Ce mécanisme permet de gérer les situations exceptionnelles.
- **le paradigme impératif** : les entrées-sorties, les modifications physiques de
valeurs et les structures de contrôle itératives sont possibles.
- **le paradigme fonctionnel** : manipule les fonctions comme étant des valeurs du
langage. Celles-ci peuvent être utilisées en tant que paramètres d'autres fonctions
ou être retournées comme résultat d'un appel de fonction.
- **le paradigme objet** : La représentation du programme colle à la réalité en
reproduisant des entités relativement proches des objets réel. Attention, le piège
est de croire qu'il s'agit *du* paradigme universel puisqu'il reproduit en miroir le
réel. **C'est en fait un processus d'abstraction comme un autre**.
Sûreté du langage, typage
~~~~~~~~~~~~~~~~~~~~~~~~~
Tri par ordre de sûreté croissant :
0. typage très faible (presque inexistant aujourd'hui) : 42 == "42" == 42.0...
1. typage dynamique faible : (javascript) (possibilité de changer le prototype
d'un objet pendant l'éxécution du programme, c'est la fête on peut faire
n'importe quoi)
2. typage dynamique fort inféré par le comportement (behavior, duck typing)
(python, ruby, PHP) Le contenu de la variable détermine le choix du typage
`var = 0 -> type int`
3. typage statique déclaré fort (Java)
`int var = 0 ;` (pas mal mais super lourd, pas **agile** du tout)
4. langages à types statiques muni d'un moteur d'inférence de types (Ocaml)
sûreté d'exécution, agilité, sécurité.
La syntaxe, la lisibilité
~~~~~~~~~~~~~~~~~~~~~~~~~
Importance de la lisibilité (notamment par rapport aux méthodes agiles).
- courte (python)
- verbeuse (C)
- l'importance des mots clef du langage
- délimiteur de phrase, de blocs (parenthèses, accolades, tabulations, blocs...)
Langages compilés ou interprétés ?
-----------------------------------
.. glossary::
langage compilé
une première passe est faite, des validations son effectuées **avant**
la génération du code objet, cette phase est faite par le compilateur.
compilateur
programme qui transforme un langage de haut niveau en un langage de base
niveau
- phase danalyse syntaxique (source -> syntaxe abstraite)
- phase de synthèse (syntaxe abstraite -> code objet)
scripting (langage de scripting)
langage interprèté
générique (langage)
Langage à usage générique, qui peut être utilisé dans n'importe quel
domaine (par opposition au DSL)
domain specific
Domain Specific Language, langage destiné à être utilisé dans un
domaine prédéfini.
paradigmes
représentation d'une vision particulière à partir d'un modèle théorique
impératif
l'algorithme ressemble à une recette de cuisine,
c'est-à-dire à une succession d'instructions à exécuter
les unes à la suite des autres
fonctionnel
l'algorithme ne dépend plus de l'ordre d'exécution d'instructions
pas de mélange entre les données et les traitements
objets (programmation)
le monde est découpé en catégories
qui permettent de créer des objets
**développement par composants**
les objets sont organisés entre eux par composants suivant des designs patterns,
(patrons de conception)
garbage collector (ramasse miettes)
la gestion automatique de la mémoire apparaît en 1989
machine virtuelle
portabilité du code (mais diminution en optimisation et performances)
JIT (just in time compiler)
code objet, programmes fonctionnant autour de machines virtuelles
- **le typage statique** : la vérification de la compatibilité entre les types des
paramètres formels et des paramètres d'appel est effectuée au moment de la
compilation du programme. Dès lors, il n'est pas nécessaire de faire ces
vérifications durant l'exécution du programme ce qui accroît son efficacité. En
outre, la vérification de type permet d'éliminer la plupart des erreurs introduites
par maladresse ou étourderie et contribue à la sûreté de l'exécution.
- **le typage dynamique** : la vérification de la compatibilité entre les types des
paramètres formels et des paramètres d'appel est effectuée au moment de l'exécution
ou de l'appel à certaines parties de codes du programme.
- **le polymorphisme paramétrique** : une fonction ou un objet qui n'explore pas la
totalité de la structure d'un de ses arguments accepte que celui-ci ait un type non
entièrement déterminé. Ce paramètre est alors dit polymorphe. Cette particularité
permet de développer un code générique utilisable pour des structures de données
différentes tant que la représentation exacte de cette structure n'a pas besoin
d'être connue par le code en question. L'algorithme de typage est à même de faire
cette distinction.
- **l'inférence de types** : le programmeur n'a besoin de donner aucune information
de type à l'intérieur de son programme. Le langage se charge seul de déduire du code
le type le plus général des expressions et des déclarations qui y figurent. Cette
inférence est effectuée conjointement à la vérification, lors de la compilation du
programme.
Les grands paradigmes de programmation
---------------------------------------
Le paradigme des objets
~~~~~~~~~~~~~~~~~~~~~~~
- 1962 (SIMULA) : premières notions de classes ;
Pui, une dizaine d'années plus tard :
- C++ : intégration des classes pour le C ;
- turbo pascal : intégration des classes pour le pascal ;
Tous les langages actuels ont intégré des traits objets mais de manière très
différentes :
- perl (1987)
- python (1991)
- Ruby (1993)
- L'implémentation des objets en python est très proche des notions initiales de
classes issues du Smaltalk et présente une tentative très intéressante
d'unification des objets et des types depuis python 2.2 ;
- Java (1995) : très grosse réussite industrielle en surfant sur la vague de la
programmation objet, et des machines virtuelles, mais en fait et avec le recul,
doté d'un support objet lourd et alambiqué.
Le monde Java est lourd, avec des outils consommant beaucoup de mémoire et
qui ne satisfont pas à la règle du KISS (Keep It Simple, Stupid) ;
Il n'y a pas **une** POO (Programmation Objet), il y a des POO.
Les implémentations objets dans les langages sont riches et variées :
- objets obligatoirement construits pas des classes (Java, C++, ...)
- objets sans définition de classes (javascript, Ocaml, go, rust)
- langages à attributs (python)
- langages ou le type des objets est défini par leur classe (python, ruby)
- langages ou le type des objets est différent du type de leur classe (Ocaml)
- objets sans classes mais construits par des prototypes (javascript)
- construction d'objets possibles objets sans classe du tout (Ocaml)
- encapsulation des attributs des objets (Java, Ocaml, C++, PHP)
- pas d'encapsulation des attributs (python, ruby, javascript...)
Le paradigme impératif
~~~~~~~~~~~~~~~~~~~~~~
Un programme est une suite d'états de la mémoire de l'ordinateur,
c'est la suite logique des machines de Turing.
La plupart des programmeur aujourd'hui raisonnent suivant ce paradigme,
et ont une très faible visibilité par rapport aux autres paradigmes existants.
Seuls les programmeurs cultivés sont aujourd'hui capable de raisonner
suivant différents paradigmes, ce sont des programmeurs chevronnés et
cultivés.
Le paradigme fonctionnel
~~~~~~~~~~~~~~~~~~~~~~~~
La notion de fonction que possède sous une forme ou une autre la plupart des
langages est empruntée aux mathématiques et non à l'électronique. D'une manière
générale, les langages substituent des modèles formels aux conceptions purement
calculatoires. Ils y gagnent en expressivité. Certains langages fondent leur
paradigme de programmation sur l'abstraction entrée-traitement-sortie, donc sur le
**mathème fonctionnel** et pas sur la boite noire électronique. La fonction
mathématique apporte un niveau opératoire dans le traitement de l'information.
Approche par fonctionnalités
----------------------------
Plusieurs domaines de l'informatique on proposé/imposé des méthodologies,
des manières de faire. Ces modèles de programmation on fortement influencé
en retour les langages. On reconnaît aujourd'hui :
- Le modèle client-serveur
- Le modèle de programmation concurrente (exécution de processus légers, threads) :
- Le modèle de développement d'une application de bureau (MVC, ergonomie d'interface)
- Le modèle de développement web (communiquer sur le réseau Internet, API
REST, microservices...)
- Le modèle de programmation système et réseau
- le modèle **Dev Ops** et les méthodes de développement virtualisés
- les langages présentant des **fonctionnalités agiles**
Conclusion
-----------
Les langages de haut niveau sont caractérisés par
des concepts tels que :
- déclaration de valeurs, types, expressions, portée
- expressions, variables, instructions, structures de contrôle
- fonctions, procédures, fermetures
- encapsulation, modules, objets
=========== ============
Paradigmes Concepts
=========== ============
impératif variables, procédures, modules
objets classes, méthodes, héritage, surcharge
fonctionnel fonctions, fermetures, modules
logique prédicats, modules
concurrent tâche/processus, communication
=========== ============

View File

@ -1,200 +0,0 @@
La programmation structurée
=============================
Un langage de programmation doit permettre la programmation structurée.
.. important:: La structuration et l'organisation modulaire sert à maintenir de grands programmes,
Elles sont une nécessité
Structuration d'un programme
-----------------------------
La réalisation d'applications importantes oblige le programmeur ou l'équipe de
développement à se poser des questions d'organisation et de structuration.
Aujourd'hui, on dispose de deux grands modèles d'organisation dont les avantages et les
particularités sont distincts.
L'écriture des vrais programmes consiste à les structurer pour les présenter
comme un assemblage de briques qui s'emboîtent naturellement.
Ce problème se révèle fondamental dès que la taille des programmes devient conséquente.
Si on ne prend pas garde au bon découpage des programmes en modules indépendants,
on se retrouve rapidement débordé par un grand nombre de variables,
et il devient quasiment impossible de réaliser un programme correct.
La programmation raisonnée
---------------------------
Un **programme** est le codage d'un algorithme dans un langage de programmation.
La programmation consiste à modéliser un problème du monde réel sous une forme
symbolique (pour faire résoudre ce problème par un ordinateur).
Certains problèmes sont **indécidables** ou **ouverts**.
On utilise un langage de programmation pour décrire la **solution** du programme.
La sémantique du programme est le sens de chacune des constructions du langage.
**Comment passer de l'énoncé d'un problème à un programme de bonne qualité ?**
spécifier
décrire de manière complète et rigoureuse le problème à résoudre
modéliser
proposer une représentation du réel qui soit accessible au calcul
algorithmique
transcrire
La transcription du modèle algorithmique se fait dans un langage
de programmation cible adapté au problème
valider
La validation du programme est une étape qui permet de s'assurer plus ou
moins fortement que le programme produit les résultats attendus.
La validation va de la série de tests unitaires (validation faible)
à la preuve de programme (validation mathématique forte).
Conception descendante
-----------------------
Une vision **centripète** : du général au particulier.
Il s'agit d'une méthode de résolution d'un problème. On le découpe en tâches
de plus en plus fines, de plus en plus détaillées, qui aboutiront au programme final.
On met des *trous* dans les algorithmes de plus haut niveau,
c'est-à-dire des phrases en langage naturel.
.. ifconfig: exercice
**Exercice** : **Calculer la date du lendemain**
.. ifconfig: correction
- l'algorithme de plus bas niveau
::
lendemain jour =
si jour [est le dernier jour du mois] alors
resultat = [calculer le 1er janvier de l'année suivante]
sinon
resultat = lendemain_dansl'année jour
- les algorithmes de plus bas niveau
::
lendemain_dans_l'année jour =
si jour [est le dernier jour du mois] alors
resultat = [calculer le premier jour du mois suivant]
sinon
resultat = jour suivant jour
::
jour_suivant jour =
jour + 1
et ainsi de suite jusqu'à ce que toutes les phrases soient calculables.
Algorithme vague
--------------------
L'algorithme vague, c'est quand on pense l'algorithme en se plaçant du côté de
l'implémentation en premier. On a le nez dans le guidon, la vue d'ensemble est
difficile.
Voici, tiré du monde réel, un exemple d'algorithme vague
("ce que doit faire une fonction"), placé dans un bout de code
(souvent la **docstring** d'une fonction).
.. code-block:: python
def upsert_route(*args, **kwargs):
"""
Create or modify an existant DHCP route
param tuple (id or null, machine name, IP, MAC Adress)
return True or False with error message
"""
# si id présent alors modification sinon ajout
# récupère la liste des réservations en cours
# y cherche la variable sur la base de l'ID
# modifie les valeurs
# applique la nouvelle conf DHCP
return True
Voici un autre bout de code avec l'algorithme en commentaire,
et l'implémentation effective de l'algorithme
.. code-block:: python
def del_route(*args, **kwargs):
"""
Delete an existant DHCP route
param tuple (id, machine name, IP, MAC Adress)
return True or False with error message
"""
# récupère la liste des réservations en cours
# y cherche la variable sur l'id donné en paramètre
# supprime l'entrée avec vérification que les données fournies
# sont bien dans l'enregistrement à supprimer
# applique la nouvelle conf DHCP
route_to_del = (1, "host2","10.1.2.4","6E:FF:56:A2:AF:17")
routes = get_routes()
if route_to_del in routes:
c = creole_loader(load_extra=True, rw=True)
c_id = c.dhcp.dhcp.id_dhcp.id_dhcp.index(route_to_del[0])
if c.dhcp.dhcp.id_dhcp.macaddress[c_id]==route_to_del[2]
and c.dhcp.dhcp.id_dhcp.ip[c_id]==route_to_del[1]:
c.dhcp.dhcp.id_dhcp.id_dhcp.pop(c_id)
config_save_values(c, MODNAME)
return True
return False
Les deux grands paradigmes
---------------------------
La modularité
~~~~~~~~~~~~~~
Les données et les traitements sont regroupés au sein d'une même entité à deux
facettes : d'un côté le code proprement dit, de l'autre son interface. La
communication entre modules s'effectue via leur interface. La description d'un
type peut être masquée en n'apparaissant pas dans l'interface du module. Ces
types de données abstraits facilitent les modifications d'implantation à
l'intérieur d'un module sans affecter les autres modules qui s'en servent. De
plus, les modules peuvent être paramétrés par d'autres modules augmentant
ainsi leur réutilisabilité.
Le paradigme objet
~~~~~~~~~~~~~~~~~~
Les descriptions des traitements et des données sont regroupées dans des
entités appelées **classes**; un objet est une instance (valeur) d'une classe.
La communication entre objets est réalisée par envoi de message, l'objet
receveur détermine à l'exécution (liaison retardée) le traitement
correspondant au message. En cela, la programmation objet est dirigée par
les données. La structuration d'un programme provient des relations entre
classes, en particulier l'héritage permet de définir une classe par extension
d'une autre.
En programmation objet, un **programme** est une collection dobjets qui communiquent
entre eux par **message**, le **résultat** est un message envoyé à un objet particulier
Comparaison entre les deux paradigmes
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Il y a dualité entre ces deux modèles.
- On ne peut pas augmenter les composants d'un type dans un module (pas
d'extensibilité des données), mais on peut ajouter de nouveaux traitements
(extensibilité des traitements) sur ces données.
- En objet, on peut ajouter des sous-classes à une classe (extensibilité des
données) pour traiter des nouveaux cas, mais on ne peut pas ajouter de nouveaux
traitements visibles de la classe ancêtre (pas d'extensibilité des traitements).
**La combinaison des deux paradigmes offre de nouvelles extensibilités pour les
traitements et les données.**

View File

@ -1,313 +0,0 @@
La programmation modulaire
===========================
Il s'agit de décomposer un grand programme en
morceaux (**modules**) connectés entre eux par des **interfaces** bien
définies.
Ces modules doivent être aussi indépendants que possible.
module
ensemble de ressources liées sémantiquement
interface
mode demploi du module, avec en plus un principe de masquage
des informations (partie publique, partie secrète)
Signatures, type abstrait et langage de modules : la programmation modulaire
permet d'aller très loin dans la programmation structurée.
Définir des fonctions dans un fichier séparé
--------------------------------------------
Les fonctions peuvent être définies dans un fichier et le programme dans un
autre fichier séparé. Dans ce cas, pour pouvoir être exécuté directement avec
la commande python `nomfichierprogramme.py`, le fichier du programme doit
importer dabord les fonctions du fichier dans lequel les fonctions sont
définies.
1. Fichier de fonctions
~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: python
# Fichier foncmaxliste.py
# Recherche le premier élément maximal dans une liste ou
#dans une chaine de caractères
def max_list(L) :
k = len(L)
max, x = L[0], 0
i = 1
while i < k :
if max < L[i]:
max = L[i]
x = i
i = i + 1
return max, x
2. Fichier de programme
~~~~~~~~~~~~~~~~~~~~~~~~
Pour utilser les fonctions définies dans dautres fichiers, le fichier de
programme doit commencer par les instructions qui importent ces fichiers de
fonctions ou directement les fonctions de ces fichiers. Dans la syntaxe
ci-dessous, on importe une ou toutes les fonctions du fichier `foncmaxlist.py`.
.. code-block:: python
# Fichier progmaxlist.py
from foncmaxliste import max_list
# ou plus simple:
# from foncmaxliste import *
print max_list([4,5,6,9,12,5,10,3,18,5,6,7])
couple = max_list([4,5,6,9,12,5,10,3,18,5,6,7])
print Max de L est , couple[0]
print et se trouve à la position , couple[1]
print max_list(totovaaumarche)
couple = max_list(totovaaumarche)
print Max de L est , couple[0]
print et se trouve à la position , couple[1]
Au lieu dimporter les fonctions, on peut importer le fichier qui définit les
fonctions avec la syntaxe qui suit. Dans ce cas, le fichier de programme sera
changé comme suit :
.. code-block:: python
# Fichier prog2maxlist
import foncmaxliste
print foncmaxliste.max_list([4,5,6,9,12,5,10,3,18,5,6,7])
# la syntaxe indiquant le chemin dacces a la fonction max_list utiliser .
couple = foncmaxliste.max_list([4,5,6,9,12,5,10,3,18,5,6,7])
print Max de L est , couple[0]
print et se trouve à la position , couple[1]
print foncmaxliste.max_list(totovaaumarche)
couple = foncmaxliste.max_list(totovaaumarche)
print Max de L est , couple[0]
print et se trouve à la position , couple[1]
Lexécution directe du premier fichier de programme::
python prog max list.py
Lexécution directe du seconde fichier de programme::
python prog2 max list.py
Définition de l'implémentation d'un module
-------------------------------------------
Tout fichier qui contient au moins une définition dune fonction ou dune
variable est appelé un module (une bibliothèque). Le nom du module est le nom
du fichier enlevé le suffixe `.py`. Ainsi, un fichier de programme qui contient
au moins une définition dune fonction ou un fichier qui ne contient que des
définition de fonctions sont des modules. On peut importer un module ou des
fonctions ou variables dun module dans un programme, comme nous avons vu dans
les exemples ci-dessus.
.. important:: on peut importer un module, ou bien lancer un module en tant que
programme executable
.. code-block:: python
if __name__ == '__main__':
main()
Pour faciliter la programmation, Python définit un certain nombre de **modules internes**,
appelés les builtins (la librairie standard).
Par exemple :
Lors de louverture dune session interactive, on est dans un module interne nommé
main . Toutes les variables définies par affectation au niveau de ce module sont valides
globalement dans la session.
Dautres modules internes sont string, math, random
Dans une session de travail sous linterpréteur Python, la première importation dun mo-
dule qui, à part des fonctions quelle définit, contient des instruction de programme fait
exécuter ces instructions. Dans la même session, les importations suivantes ne font pas
exécuter ces instructions. Pour les exécuter, on utilise la fonction reload(nomdumodule)
(sans sufffixe .py).
Exemples d'interface
--------------------
::
type: son type
arguments
arg1 : description de l'argument 1
arg2 : description de l'argument 2
préconditions:
arg1 > 10
postconditions:
result < 19
raises: TypeError, AssertionError, SystemError...
test: tests nominaux pour chaque cas spécifié
- L'interface racine carrée
::
racine:
type: float -> float
arguments x: float, flottant dont on veut calculer la racine
pré: x >= 0
test: racine 25.0 -> 5.0 ; racine (-25) -> raises TypeError
- L'interface `lendemain`
Il faut définir auparavant un type spécifique appelé `date`
::
lendemain: le lendemain est la date qui désigne
le jour suivant de la date passée en argument
type: date -> date
arguments :
d: date
description: la date dont on veut calculer le lendemain
Le langages des modules
-------------------------
.. code-block:: ocaml
module type PILE = (* signature (interface) du module *)
sig
type a t
val create : unit -> a t
val push : a -> a t -> unit
val pop : a t -> a
end
(* implémentation du module *)
module Pile : PILE = (* le module est restreint
par la signature PILE *)
struct
type a t = a list ref
let create () = ref []
let push x p = p := x::!p
let pop p = match !p with [...]
let rec print p = match p with [...]
end
- `struct .. end` introduit une collection de définitions, valeurs, types ou modules.
C'est une **structure**.
- `module Nom = struct .. end` permet de donner un nom à cette structure et
c'est ça un module. C'est une structure nommée.
- `sig ... end` introduit une signature de module : une interface pour un module.
On restreint souvent une structure par une signature pour "cacher" certaines
définitions. Une signature de module fournit une **interface** entre l'extérieur
et l'intérieur d'un module.
En dehors du module, on accède à ses composants grâce à la notation pointée
.. code-block:: ocaml
let p = Pile.create()
Pile.push 45 p
Les foncteurs
--------------
Si un langage possède un langage de modules, on peut aller plus loin : on peut
considérer un module comme étant une expression de base du langage.
- La signature d'un module peut être considérée comme le type du module
- La structure du module peut être considéré comme sa valeur
Quel est l'intérêt ? On peut alors définir des **foncteurs**.
foncteur
"fonction" d'une structure vers une autre structure.
On peut ainsi paramétrer un module par un autre module.
.. code-block:: ocaml
module Nom (M1 :S1 ) (M2 :S2 ) (M3 :S3 ) ... =
struct
...
end
On applique un foncteur à des paramètres modules, pour
obtenir un nouveau module :
.. code-block:: ocaml
module M = F (Titi) (Toto)
Contrainte de type par signature
------------------------------------
::
module M =
struct
type t = int * int * int ;;
let make d m y = d, m, y ;;
end ;;
let d = M.make 8 5 8 ;;
module type S =
sig
type t ;;
val make : int -> int -> int -> t ;;
end ;;
module MS = (M:S) ;;
MS.make 5 1 2 ;;
Type et signature
------------------
::
# module type A = sig
val a: int -> int
end ;;
module type A = sig val a : int -> int end
# module B = struct
let a x = x + 1 ;;
end;;
module B : sig val a : int -> int end
# module C = (B:A) ;;
module C : A
# C.a 2 ;;
- : int = 3
#
Module auquel on impose une signature
-----------------------------------------
::
module type DATE = sig
type t
val make: int -> t
val get_year: t -> int
val get_month: t -> int
end ;;
module MR = struct
type t = int * int
let make x y = (x, y)
let get_month (x, y) = x
let get_year (x, y) = y
end ;;
module date = (MR:DATE) ;;

View File

@ -1,72 +0,0 @@
Avant propos
============
Introduction
~~~~~~~~~~~~
| "**Que nul n'entre ici s'il n'est géomètre**"
| Maxime apposée au porche d'entrée de l'École de Platon
- L'accent est mis sur l'approche **algorithmique scientifique**, dite algorithmique
algébrique. L'algorithmique est un sous-domaine de l'algèbre et des
approches modulaires (arithmétique modulaire...)
- Le point de vue mathématique étant assez exigeant, **aucun formalisme fort** de
l'algorithmique mathématique ne sera présenté. Aucun symbole mathématique donc, et
seulement du pseudo-code.
L'approche mathématique forte utilisant le formalisme mathématique de
l'algorithmique algébrique est en général enseignée en France uniquement aux cours
des grandes écoles.
- L'algorithmique présentée ici est donc délibérément pseudo-scientifique mais en revanche
ouverte au **multi-paradigme**. En général l'évocation d'un algorithme en pseudo code est toujours
réducteur car limité au style de programmation le plus à la mode actuellement, c'est-à-dire le
**style impératif**. Nous présenterons un éventail des plus grands paradigmes de programmation
existants. Nous nous limiterons à la **programmation impérative, fonctionnelle, modulaire,
générique et objet**. Nous envisagerons les structures de données et les structures de contrôle
spécifiques à chacun des styles évoqués.
- Et parce qu'un honnête programmeur doit avoir une vue d'ensemble de **l'état de son art**,
nous évoquerons un panorama des différents langages existants -- historiques et contemporains --
en les comparants les uns aux autres.
- Durant tout le cours, nous souhaitons proposer une pédagogie par l'exemple, et nous
limiterons l'exposé à deux langages d'implémentation des algorithmes : le **Python** pour la programmation
impérative modulaire et objet, et le **OCaml**, car nous évoquerons aussi certains points
de programmation fonctionnelle et modulaire, polymorphe et teintée de généricité.
Intérêt
-------
| "**Il ne suffit pas d'avoir les mains propres, il faut avoir l'esprit pur.**"
| Thalès de Milet ; Sentences - VIe s. av. J.-C.
L'algorithmique en tant que rapport à la vérité et à la pensée juste et vraie,
en tant qu'art de découper un problème complexe en tâches élémentaires,
en tant qu'énoncés de compréhension et de sémantique,
est la seule chose vraiment profonde dans l'informatique. Le reste n'est que 0 ou 1.
Cette notion d'algorithme est profondément enracinée dans le désir humain de
transmettre des méthodes pour comprendre des problématiques,
qu'il s'agisse de processus scientifiques ou mathématiques, de secrets,
de philosophie ou de divination au sens des anciens Grecs.
De règles linguistiques, aussi, chez les Romains.
Objectifs de ce cours
~~~~~~~~~~~~~~~~~~~~~
Il s'agit de :
- maîtriser et concevoir un algorithme de base,
- choisir une représentation appropriée des données,
- décomposer en sous-problèmes et affinements successifs,
- savoir organiser son code en fonctions et en modules.
Le développement raisonné dalgorithmes et leur implantation
permet d'acquérir les qualités suivantes :
+ Analyser et modéliser un problème, spécifier,
+ Exprimer une problématique, une solution ou un algorithme,
+ Traduire un algorithme dans un langage de programmation,
+ Concevoir une réponse à un problème précisément posé.

View File

@ -1,476 +0,0 @@
Définition d'un programme
==========================
Qu'est-ce qu'un programme ?
----------------------------
- Un **programme** est une suite de **phrases** ;
- Une **phrase** est une **déclaration** ou une **expression** (*statement* en anglais) ;
Production d'un programme :
1. on écrit le code source du programme ;
2. on demande au compilateur de le traduire en code machine : c'est la compilation du programme ;
3. on demande à la machine d'effectuer le code machine : c'est l'exécution du programme.
.. important::
L'introduction à la compilation et les différentes phases de la compilation
d'un programme sont des sujets qui ne seront pas traités dans ce cours.
Dans un programme de base, il y a deux fichiers :
1. un fichier contenant le code : c'est le source du programme.
2. un fichier contenant le code machine : c'est l'exécutable.
Que peut faire un programme lorsqu'il est exécuté ?
Le programme doit communiquer. S'il reste isolé, il ne pourra pas
produire quoi que ce soit. Voici les trois moyens de communication qu'a un
programme :
1. communiquer avec l'utilisateur,
2. communiquer avec des fichiers,
3. communiquer avec d'autres programmes.
Les expressions
----------------
expression
Une expression est une valeur caculée du langage, une opération arithmétique
qui retourne une valeur (entier, texte, valeur logique...).
C'est donc une suite sémantiquement correcte de **valeurs de base** et **d'opérateurs**
Par exemple, la ligne suivante est une expression effectuant une addition::
5 + 6
Expressions à partir de types de base
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Autres exemples d'expressions :
- 5 est une expression de type int
- 4.5 est une expression de type float
- 'c' est une expression de type char
- true est une expression de type bool
- print ('c') est une expression de type None
- raw_input est une expression de type string
Les expressions se complexifient avec la complexification des données et des traitements,
mais le principe de l'expressivité d'un langage reste le même.
.. ifconfig:: exercice
**Exercice** :
Le parenthésage et les opérateurs booléens::
Variables A, B, C, D, E en Booléen
Variable X en Entier
Début
Lire X
A <- X > 12
B <- X > 2
C <- X < 6
D <- (A ET B) OU C
E <- A ET (B OU C)
Ecrire D, E
Fin
**Que valent D et E si X = 3 ?**
.. ifconfig:: correction
**Correction** : D sera VRAI alors que E sera FAUX
Les déclarations
-----------------
Un autre exemple d'expression :
.. raw:: latex
\begin{algorithm}
\caption{Exemple d'expression}
\begin{algorithmic}[1]
\BState \emph{sortie}: $l$ \Comment{C'est l'expression calculée renvoyée}
\ForAll {$v \in V(G)$}
\State $l(v) \leftarrow \infty$
\EndFor
\State $l(u) \leftarrow 0$
\Repeat
\For {$i \leftarrow 1, n$}
\State $min \leftarrow l(v_i)$
\For {$j \leftarrow 1, n$}
\If {$min > e(v_i, v_j) + l(v_j)$}
\State $min \leftarrow e(v_i, v_j) + l(v_j)$
\State $p(i) \leftarrow v_j$
\EndIf
\EndFor
\State $l(i) \leftarrow min$
\EndFor
\State $changed \leftarrow l \not= l$
\State $l \leftarrow l$
\Until{$\neg changed$}
\end{algorithmic}
\end{algorithm}
Exemple de déclarations :
- `a = 1`
- `b = 'c'`
.. important:: Le signe égal est utilisé de deux manières
- lors d'une déclaration d'une expression
- lorsque deux expressions sont équivalentes
Suivant les langages, il y a deux symboles différents, ou alors
ils sont identiques.
Il s'agit de **renseigner** une valeur dans une expression nommée
- en javascript :
.. code-block:: javascript
var b = "blabla" ;
- en python :
.. code-block:: python
b = "blabla"
- en java :
.. code-block:: java
String b = "A";
- en OCaml :
.. code-block:: ocaml
let a = 1
Grâce au mécanisme d'inférence de type dans OCaml, le mot-clef **let**
signifie ici véritablement l'instanciation d'une valeur au sens
mathématique du terme : soit `a` l'entier tel que a soit égal à 1...
En OCaml comme dans tous les langages fonctionnels, tout ce que nous avons l'habitude
d'appeler des "variables" à propos des affectations, sont en fait des **constantes**
au sens du paradigme impératif de la programmation.
.. important::
Par voie de conséquence, le symbole ``=`` est utilisé à la fois pour la définition des objets et pour le test d'égalité.
Pour les autres langages, on utilise `==` ou bien `===` (javascript) car
le `=` est sémantiquement déjà utilisé...
Toutes ces notation, apparemment anodines, correspondent donc à des paradigmes de programmation
Lorsqu'on ne déclare pas les types des symboles déclarés, c'est que soit
- le typage est faible
- le typage est dynamique (calcul du type en fonction du contenu de la
variable)
- le typage est statique et fort mais ça ne se voit pas
(var le système les calcule automatiquement par inférence de type)
Assigner, allouer, affecter une chose à quelqu'un ou à une autre chose.
Exemples dans la langue française :
- Le traitement que le budget **alloue** à ces fonctionnaires.
- Un système d'exploitation multitâche alloue le travail du processeur aux processus en attente, pour un bref laps de temps, à leur tour.
.. glossary::
affectation
Une affectation, aussi appelée assignation par anglicisme, est une structure qui permet d'attribuer une valeur à une variable.
Il s'agit d'une structure particulièrement courante en programmation impérative, et dispose souvent pour cette raison d'une notation courte et infixée,
comme ``x = expr`` ou ``x := expr`` ou encore `x <- expr`.
Dans certains langages, le symbole est considéré comme un opérateur d'affectation,
et la structure entière peut alors être utilisée comme une expression.
D'autres langages considèrent une affectation comme une instruction et ne permettent pas cet usage.
Voir aussi :
- Les déclarations de types primitifs et conversions de type
- Les types de base::
Octets (8 bits) byte
Entiers courts (16 bits) short
Entiers (32 bits) int
Entiers longs (64 bits) long
Réels (32 bits) float
Réels longs (64 bits) double
Caractères (16 bits) char
Booléens boolean
- Déclarations par lots::
x1 = e1, x2 = e2, ... xn = en;
Exercices : algorithmes sur les affectations
.. ifconfig:: exercice
**Exercice** : Calculs d'affectation::
Variables A, B, C en Entier
Début
A <- 3
B <- 10
C <- A + B
B <- A + B
A <- C
Fin
.. ifconfig:: correction
**Correction**::
Après La valeur des variables est :
A <- 5 A = 5 B = ?
B <- 2 A = 5 B = 2
A <- B A = 2 B = 2
B <- A A = 2 B = 2
.. ifconfig:: exercice
**Exercice** : Calculs d'affectation
Quelles seront les valeurs des variables A et B après exécution des instructions suivantes ?
::
Variables A, B en Entier
Début
A <- 5
B <- 2
A <- B
B <- A
Fin
.. ifconfig:: correction
**Correction**::
Après La valeur des variables est :
A <- 5 A = 5 B = ?
B <- 2 A = 5 B = 2
A <- B A = 2 B = 2
B <- A A = 2 B = 2
.. ifconfig:: exercice
**Exercice** : écrire un algorithme permettant déchanger les valeurs
de deux variables A et B, et ce quel que soit leur contenu préalable.
.. ifconfig:: correction
**Correction**::
Début
A <- n
B <- p
C <- A
A <- B
B <- C
Fin
Il faut passer par une variable dite temporaire (la variable C)
.. ifconfig:: exercice
**Exercice** :
Que produit lalgorithme suivant ?
::
Variables A, B, C de type entier
Début
A <- 423
B <- 12
C <- A + B
Fin
.. ifconfig:: correction
**Correction** : dans un prompt python
.. code-block:: python
>>> a = 423
>>> b = 12
>>> c = a + b
>>> c
435
.. ifconfig:: exercice
**Exercice** :
Que produit lalgorithme suivant ?
::
Variables A, B, C de type texte
Début
A <- "423"
B <- "12"
C <- A + B
Fin
.. ifconfig:: correction
**Correction** : dans un prompt python
.. code-block:: python
>>> a = '423'
>>> b = '12'
>>> c = a + b
>>> c
'42312'
Interaction avec l'utilisateur
------------------------------
Il est possible de communiquer de la manière suivante avec un programme :
- lire et écrire sur l'entrée/sortie standard
- lire et écrire dans un fichier
- afficher (du texte, un nombre...)
- lire (du texte, un nombre...)
- interagir avec les prompts
.. code-block:: ocaml
let x = read_int () in
let signe =
if x >= 0
then " positif "
else " négatif " in
print_string signe
.. ifconfig:: exercice
**Exercice** : écrire un algorithme qui demande le prénom d'une personne
et renvoie "bonjour, je m'appelle <Prénom>"
.. ifconfig:: correction
**Correction** : (implémentation en python)
.. code-block:: python
# coding: utf-8
prenom = raw_input("quel est ton prénom ? \n")
print("bonjour, je m'appelle " + prenom.capitalize())
La REPL (boucle d'interaction)
-------------------------------
.. glossary::
REPL
Read Eval Print Loop : outil principal de communication avec un programme
ou avec un système. Exemples : la console python, le prompt OCaml.
interface
outil de communication avec un programme.
- interface texte
- interface graphique
**Exemples de REPL**
Le prompt python::
Python 2.7.12 (default, Nov 19 2016, 06:48:10)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> dir()
['__builtins__', '__doc__', '__name__', readline', 'rlcompleter']
>>>
Le prompt ipython::
Python 2.7.12 (default, Nov 19 2016, 06:48:10)
Type "copyright", "credits" or "license" for more information.
IPython 2.4.1 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]:
Le prompt OCaml (utop)::
Type #utop_help for help about using utop.
─( 09:21:24 )─< command 0 >──
utop #
# let x = 1 in x + 2;;
- : int = 3
# let y = 1 + 2;;
val y : int = 3
# y * y;;
- : int = 9
Construire une boucle d'interaction avec l'utilisateur en python::
#!/usr/bin/env python3
error = True
while error:
try:
entier = int(input('donnez un entier : '))
error = False
except:
print('une valeur entiere est attendue')
print(entier)
Lire et écrire dans un fichier
------------------------------
Les descripteurs de fichiers (file handle)
Exemple en python
.. code-block:: python
>>> fh = file("test.txt", "w")
>>> fh.write("un contenu exemple")
>>> fh.close()
>>>
.. code-block:: python
>>> fh.read()
'un contenu exemple'
>>> fh.close()
>>>
Linéarisation (serialisation) de données par exemple en json
.. code-block:: python
import json
data = dict(a='essai', b='essai2', c=range(3))
with open('data.txt', 'w') as outfile:
json.dump(data, outfile)

View File

@ -1,101 +0,0 @@
Travaux Pratiques
=================
.. ifconfig:: exercice
**travaux pratiques :**
Ecrire un algorithme qui renvoie le résultat dune mini-calculatrice. Cette
méthode aura
comme paramètre deux nombres et une chaîne de caractère qui vaudra « + », « -
», « * »,
« / ».
.. ifconfig:: exercice
**travaux pratiques :**
Ecrire un algorithme qui renvoie si deux mots (chaîne de caractères) passés en
paramètre
sont des anagrammes lun de lautre. (Lettres identiques mais dans un ordre
différent)
.. ifconfig:: exercice
**travaux pratiques :**
ascii art (ligne d'étoiles)
Concevoir un algorithme qui, pour un caractère imprimable et un nombre n
donnés, imprime une barre
horizontale de n de ces caractères.
``****************``
2. Modifier lalgorithme pour limpression dune barre double.
::
****************
****************
3. Modifier lalgorithme pour limpression dune barre dépaisseur quelconque
donnée.
4. (optionnel) Transformer les algorithmes ci-dessus en fonctions.
5. Écrire un programme Java implémentant la dernière version de lalgorithme
(épaisseur quelconque).
3.3
Triangle de nombres
Concevoir un algorithme qui imprime pour n donné::
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
...........
.............
...............
1 2 3 4 5 6 ... n
.. ifconfig:: exercice
**travaux pratiques :**
code de césar : faire un programme pour chiffrer et déchiffrer par décalage
exemples : Effectue une rotation de x caractères vers la droite::
>>> print(chiffre('bonjour', 3))
erqmrxu
>>> print(chiffre('Bonjour les amis!', 3))
Erqmrxu ohv dplv!
>>> print(chiffre('Erqmrxu ohv dplv!', 23))
Bonjour les amis!
.. ifconfig:: exercice
**travaux pratiques :**
::
écrire “Entrer un numéro de mois”
mois <- lire
selon que mois est
cas 1 : écrire “janvier (31 jours)”
cas 2 : écrire “février (28 ou 29 jours)”
cas 3 : écrire “mars (31 jours)”
cas 4 : écrire “avril (30 jours)”
cas 5 : écrire “mai (31 jours)”
cas 6 : écrire “juin (30 jours)”
cas 7 : écrire “juillet (31 jours)”
cas 8 : écrire “août (31 jours)”
cas 9 : écrire “septembre (30 jours)”
cas 10 : écrire “octobre (31 jours)”
cas 11 : écrire “novembre (30 jours)”
cas 12 : écrire “décembre (31 jours)”
défaut : écrire “numéro invalide”
fselon

Some files were not shown because too many files have changed in this diff Show More