summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorthibauth <thibauth@30fcff6e-8de6-41c7-acce-77ff6d1dd07b>2011-08-20 01:01:06 +0000
committerthibauth <thibauth@30fcff6e-8de6-41c7-acce-77ff6d1dd07b>2011-08-20 01:01:06 +0000
commit486496b00ebf6630183f9a5c13fb5c1ced46f12b (patch)
treef6cf2a0488e95666ee26632e0b7615a8726c89cf
parent13a6c1dc5fa444d5d8f2ad9bb1c75f997b468472 (diff)
downloadpacemaker-486496b00ebf6630183f9a5c13fb5c1ced46f12b.tar.gz
Draft version
git-svn-id: https://scm.gforge.inria.fr/svn/pacemaker@66 30fcff6e-8de6-41c7-acce-77ff6d1dd07b
-rw-r--r--sources/thibaut/plot.py43
-rw-r--r--stage/Makefile28
-rw-r--r--stage/article.tex130
-rw-r--r--stage/biblio.bib123
-rw-r--r--stage/cdf.eps1553
-rw-r--r--stage/mesh.eps1689
6 files changed, 3492 insertions, 74 deletions
diff --git a/sources/thibaut/plot.py b/sources/thibaut/plot.py
index a4c847b..1cd4d72 100644
--- a/sources/thibaut/plot.py
+++ b/sources/thibaut/plot.py
@@ -37,15 +37,46 @@ plt.cla()
avail = os.path.join(dirname, "avail.data")
a = np.loadtxt(avail)
plt.hist(a, bins=100,range=(0,1))
-plt.savefig(os.path.join(dirname, "avail.png"))
+plt.savefig(os.path.join(dirname, "avail.png"))"""
plt.cla()
-ss = os.path.join(dirname, "
-simul_sessions = os.path.join(dirname, "sum.data")
+#s = os.path.join(dirname, "proofs.data")
+"""simul_sessions = os.path.join(dirname, "sum.data")
a,b = np.loadtxt(simul_sessions, unpack=True, usecols=(1,2))
-plt.plot(a)
-plt.plot(b*10)
+result = []
+for i in xrange(len(a)):
+ if a[i] > 3000:
+ result.append(abs(b[i]*10.-a[i])/a[i])
+#plt.plot(a)
+#plt.plot(b*10)
+plt.plot(np.sort(result))
plt.show()
#for i in xrange(len(duration)):"""
-
+"""simul_sessions = os.path.join(dirname, "simul_sessions.data")
+a, b, c = np.loadtxt(simul_sessions, unpack=True)
+result1 = [0.]*20000
+result2 = [0.]*20000
+for i in xrange(len(a)):
+ if b[i] > 20:
+ t = int(a[i])
+ result1[t] = result1[t] + b[i]
+ result2[t] = result2[t] + c[i]*10.+5.
+result=[]
+for i in xrange(len(result1)):
+ if result1[i] > 0:
+ result.append(abs(result1[i]-result2[i])/result1[i])
+a = np.sort(np.array(result))
+c = a[:-100]
+#r1 = np.array(result1)
+#r2 = np.array(result2)
+b = np.array(range(len(c)))
+#d = (abs(r1-r2))/r1
+#b,c = np.histogram(d)
+plt.ylabel("Erreur relative")
+plt.xlabel("Pourcentage de pairs")
+plt.yticks(np.arange(0,1,0.1))
+plt.plot(c,b/float(len(c)),"k-")
+#plt.hist(d)
+plt.savefig("test.eps")
+plt.show()"""
diff --git a/stage/Makefile b/stage/Makefile
index ab2b98c..ab9d8d3 100644
--- a/stage/Makefile
+++ b/stage/Makefile
@@ -6,29 +6,25 @@ LATEX=latex
DVIPS=dvips
PS2PDF=ps2pdf
-all: $(BUILD_DIR)/$(FILE).pdf
-dvi: $(BUILD_DIR)/$(FILE).dvi
-ps: $(BUILD_DIR)/$(FILE).ps
-pdf: $(BUILD_DIR)/$(FILE).pdf
-clean:
- rm -rf $(BUILD_DIR)
+all: $(FILE).pdf
+dvi: $(FILE).dvi
+ps: $(FILE).ps
+pdf: $(FILE).pdf
-$(BUILD_DIR)/$(FILE).dvi: $(SOURCES)
-
-$(BUILD_DIR):
- mkdir $@
+$(FILE).dvi: $(SOURCES)
%.ps: %.dvi
$(DVIPS) -o $@ $<
-%.dvi: %.tex
- $(LATEX) $<
-
%.pdf: %.ps
$(PS2PDF) $<
-$(BUILD_DIR)/%.dvi: %.tex $(BUILD_DIR)
- $(LATEX) --output-directory=$(BUILD_DIR) $<
-
+%.dvi: %.tex
+ $(LATEX) $<
+ $(LATEX) $<
+ bibtex $*
+ $(LATEX) $<
+ $(LATEX) $<
+
diff --git a/stage/article.tex b/stage/article.tex
index 37761ca..823c8d6 100644
--- a/stage/article.tex
+++ b/stage/article.tex
@@ -36,17 +36,17 @@ Ce rapport se situe dans le domaine des réseaux pair-à-pair. Ces réseaux poss
Le problème étudié plus spécifiquement ici est celui de la mesure de disponibilité des pairs, c'est-à-dire de la fraction du temps passée par les pairs sur le réseau. Cette information de disponibilité est importante car elle permet de localiser les nœuds qui peuvent être le plus utile au réseau et sur lesquels on peut s'appuyer pour structurer ou stabiliser le réseau. On peut par exemple utiliser cette information pour sélectionner un certain nombre de \emph{super-pairs} dans le réseau, qui seront connectés en une clique, les autres pairs s'organisant autour de chacun des super-pairs.
-L'utilisation que l'on peut faire d'une telle information a déjà été étudiée à plusieurs reprises (REFERENCE). En revanche, la réalisation effective d'une telle mesure est restée sans réponse réellement satisfaisante. À ma connaissance, les deux seuls travaux sur le sujet sont REFERENCE. La solution proposée ici met l'accent sur la non-falsifiabilité de la mesure. En effet, cette information étant calculée de façon distribuée, il est impossible d'avoir une autorité garantissant la validité de l'information. La disponibilité mesurée doit donc être exacte, même en supposant un comportement malveillant de la part des pairs.
+L'utilisation que l'on peut faire d'une telle information a déjà été étudiée à plusieurs reprises (\cite{Bustamante:2004:FLP:1061831.1061848, DBLP:journals/ppl/Garces-EriceBRFU03, DBLP:conf/edbtw/BernardF09}). En revanche, la réalisation effective d'une telle mesure est restée sans réponse réellement satisfaisante. À ma connaissance, les deux seuls travaux sur le sujet sont \cite{LeFessant2008b} et \cite{DBLP:journals/tpds/MoralesG09}. La solution proposée ici met l'accent sur la non-falsifiabilité de la mesure. En effet, cette information étant calculée de façon distribuée, il est impossible d'avoir une autorité garantissant la validité de l'information. La disponibilité mesurée doit donc être exacte, même en supposant un comportement malveillant de la part des pairs.
\subsection*{La contribution proposée}
La solution proposée ici repose sur un système de \emph{preuves} : chaque pair du réseau reçoit à intervalle régulier une preuve de sa présence. L'ensemble des preuves collectées par le pair constitue un historique de sa présence passée et permet donc de connaître sa disponibilité. L'information est non falsifiable au sens où il est impossible pour le pair de fabriquer une preuve de sa présence à un instant donné s'il n'était pas présent sur le réseau à cet instant.
-La solution que l'on trouve dans REFERENCE repose sur le partage d'un secret relatif à un instant donné. Le protocole mis au point dans ce rapport repose sur la même idée. Toutefois il fallait empêcher la transmission du secret après la période à laquelle est associé le secret. L'idée utilisée ici consiste à \emph{figer} la connaissance du secret des nœuds présents par le calcul d'un Arbre de Merkel. Cette structure de donnée contient une information globale sur le réseau et ne peut donc pas être calculé par un seul nœud. La mise au point du protocole repose donc principalement sur le calcul distribué d'un arbre de Merkel.
+La solution que l'on trouve dans \cite{LeFessant2008b} repose sur le partage d'un secret relatif à un instant donné. Le protocole mis au point dans ce rapport repose sur la même idée. Toutefois il fallait empêcher la transmission du secret après la période à laquelle est associé le secret. L'idée utilisée ici consiste à \emph{figer} la connaissance du secret des nœuds présents par le calcul d'un Arbre de Merkle. Le nœud insère son secret dans l'arbre qui est calculé globalement et qui constitue donc une empreinte de la présence de l'ensemble des nœuds à un instant donné. La mise au point du protocole repose donc principalement sur le calcul distribué d'un arbre de Merkle.
\subsection*{Les arguments en faveur de sa validité}
-La solution proposée semble robuste à la fois au niveau théorique (cf. REFERENCE) et expérimental. La simulation réalisée sur un grand nombre de nœuds montre que le protocole étudié fonctionne même à grande échelle. Certaines hypothèses simplificatrices ont éte faites au cours de l'étude (modèle cryptographique sous-jacent, communication simplifiée, \ldots), mais le déploiement effectué sur un réseau réel montre que ces hypothèses sont raisonnables au vu des applications pratiques.
+La solution proposée semble robuste à la fois au niveau théorique (cf. théorème \ref{thm}) et expérimental. La simulation réalisée sur un grand nombre de nœuds montre que le protocole étudié fonctionne même à grande échelle. Certaines hypothèses simplificatrices ont été faites au cours de l'étude (modèle cryptographique sous-jacent, communication simplifiée, \ldots), mais le déploiement effectué sur un réseau réel montre que ces hypothèses sont raisonnables au vu des applications pratiques.
\subsection*{Le bilan et les perspectives}
@@ -57,25 +57,25 @@ Le protocole étudié dans ce rapport apporte donc une solution effective au pro
\newpage
\section{Introduction}
-Tous les réseaux pair-à-pair ont en commun d'avoir un dynamique complexe : naissances, morts, arrivées, départs, indisponibilité temporaires peuvent survenir à tout instant. Ainsi, la \emph{disponibilité} d'un nœud, c'est à dire la fraction du temps passée par ce nœud sur le réseau, est une propriété importante pour déterminer l'impact de ce nœud sur le réseau.
+Tous les réseaux pair-à-pair ont en commun d'avoir un dynamique complexe : naissances, morts, arrivées, départs, indisponibilité temporaires peu\-vent survenir à tout instant. Ainsi, la \emph{disponibilité} d'un nœud, c'est à dire la fraction du temps passée par ce nœud sur le réseau, est une propriété importante pour déterminer l'impact de ce nœud sur le réseau.
C'est pourquoi de nombreux protocoles de réseaux pair-à-pair s'appuient sur la disponibilité des nœuds. Deux utilisations différentes de cette information sont à distinguer :
\begin{itemize}
-\item la structuration du réseau, ou bien par l'élection de super-peer (cf. ...) ou dans la sélection des voisins (cf. backup)
+\item l'élection de super-pairs \cite{Bustamante:2004:FLP:1061831.1061848, DBLP:journals/ppl/Garces-EriceBRFU03} à qui sont confiées des tâches plus importantes, dans la sélection des voisins \cite{DBLP:conf/edbtw/BernardF09}, ou la structuration du réseau \cite{DBLP:conf/dais/SachaDCM06}.
\item assurer une plus grande justice dans la répartition d'un service : faire en sorte que les gens qui ont la plus grande disponibilité aient plus d'avantages sur le réseau.
\end{itemize}
Malheureusement, la plupart de ces stratégies supposent donné un oracle qui fournirait cette information de disponibilité. Plusieurs approches permettent d'obtenir cet oracle :
\begin{itemize}
-\item de façon individuelle : chaque nœud est en charge de surveiller et de stocker sa propre disponibilité
-\item l'évaluation par les pairs : à chaque nœud est associé un ensemble de pairs chargés de surveiller sa disponibilité
-\item de façon centralisée : un nœud s'occupant de surveiller le réseau et de stocker la disponibilité de l'ensemble des nœuds du réseau
+\item de façon individuelle : chaque nœud est en charge de surveiller et de stocker sa propre disponibilité.
+\item l'évaluation par les pairs : à chaque nœud est associé un ensemble de pairs chargés de surveiller sa disponibilité.
+\item de façon centralisée : un nœud s'occupant de surveiller le réseau et de stocker la disponibilité de l'ensemble des nœuds du réseau.
\end{itemize}
Chacune de ces approches présente une limite manifeste :
\begin{itemize}
\item l'approche individuelle autorise les nœuds à mentir sur leur propre disponibilité, pour obtenir par exemple plus d'avantages sur le réseau. Ceci met donc en défaut une des principales utilisation de l'information de disponibilité.
-\item l'évaluation par les pairs résout le problème de passage à l'échelle, mais est très sensible à la collusion : des groupes de nœuds peuvent choisir de coopérer en se choisissant mutuellement comme évaluateurs et ainsi mentir collectivement sur leur disponibilité. Le protocole AVMON qui utilise ce procédé contourne le problème de la collusion en imposant que les évaluateurs soient choisis de façon semi-aléatoire, mais cette méthode impose malheureusement une limite inférieure sur la taille du réseau. De plus, l'évluation par les pairs n'assure pas la durabilité des informations de disponibilités : l'ensemble des mes évaluateurs à un instant donné sera-t-il toujours présent sur le réseau dans plusieurs mois ?
+\item l'évaluation par les pairs résout le problème de passage à l'échelle, mais est très sensible à la collusion : des groupes de nœuds peuvent choisir de coopérer en se choisissant mutuellement comme évaluateurs et ainsi mentir collectivement sur leur disponibilité. Le protocole AVMON \cite{DBLP:journals/tpds/MoralesG09} qui utilise ce procédé contourne le problème de la collusion en imposant que les évaluateurs soient choisis de façon semi-aléatoire, mais cette méthode impose malheureusement une limite inférieure sur la taille du réseau. De plus, l'évaluation par les pairs n'assure pas la durabilité des informations de disponibilités : l'ensemble des mes évaluateurs à un instant donné sera-t-il toujours présent sur le réseau dans plusieurs mois ?
\item l'approche centralisée n'est pas passable à l'échelle : quand le nombre de pairs dans le réseau devient trop grand, le nœud en charge de la surveillance ne peut ni garder une vision globale du réseau ni répondre à toutes les requêtes de pairs cherchant à s'informer sur la disponibilité d'autres pairs.
\end{itemize}
@@ -92,7 +92,7 @@ Le but du présent rapport est donc de présenter et d'étudier le protocole \em
Le protocole Pacemaker réalise un compromis entre l'approche individuelle et l'approche centralisée présentée ci-dessus : chaque pair présent dans le réseau reçoit à intervalle régulier une preuve de sa présence calculée par l'ensemble du réseau, celle-ci est stockée par le pair lui-même pour être présentée au besoin à la demande des autres pairs. Cette approche résout donc naturellement le problème de \textbf{durabilité temporelle} : l'information est disponible aussi longtemps qu'elle est utile, c'est à dire, aussi longtemps que le pair est présent sur le réseau. De plus, cette approche conserve la simplicité de l'approche individuelle en évitant la communication avec des tiers pour obtenir l'information de disponibilité.
-La section 2. présente le modèle et les hypothèses sur lesquels repose Pacemaker, la section 3. contient la spéficiation complète du protocole, les sections suivantes s'attachent à l'analyse théorique et expérimentale du protocole, à travers une simulation et un déploiement sur PlanetLab.
+La section 2. présente le modèle et les hypothèses sur lesquels repose Pacemaker, la section 3. contient la spécification complète du protocole, les sections suivantes s'attachent à l'analyse théorique et expérimentale du protocole, à travers une simulation et un déploiement sur PlanetLab.
\subsection*{Remerciements}
@@ -106,23 +106,23 @@ On considère un réseau pair-à-pair constitué d'ordinateurs reliés entre eux
Pacemaker repose également sur la présence de pairs particuliers : certains pairs ont un rôle distingué dans le réseau, on les appelle \emph{serveurs}. Pour que le protocole fonctionne, il est nécessaire que chaque pair soit dans la composante connexe d'au moins un serveur. Le protocole reste toutefois décentralisé au sens où il ne suppose pas que les serveurs possèdent des ressources physiques supérieures à celles des autres pairs.
-Pacemaker peut donc fonctionner comme un service au-dessus d'un protocole pair-à-pair déjà existant, mais il peut également être vu comme un protocole indéoendant qui construit et maintient son propre réseau. La section ... présente une méthode ad hoc pour la construction du réseau.
+Pacemaker peut donc fonctionner comme un service au-dessus d'un protocole pair-à-pair déjà existant, mais il peut également être vu comme un protocole indépendant qui construit et maintient son propre réseau. La section \ref{mesh} présente une méthode ad hoc pour la construction du réseau.
\subsection{Cryptographie}
-On suppose que chaque pair $p$ possède une paire de clé publique/privée \textsf{(K$^p_{pub}$, K$^p_{priv}$)} donnant accés aux primitives cryptographiques suivantes :
+On suppose que chaque pair $p$ possède une paire de clé publique/privée \textsf{(K$^p_{pub}$, K$^p_{priv}$)} donnant accès aux primitives cryptographiques suivantes :
\begin{itemize}
\item{\sf sign(data, K$_{priv}$) :} renvoie une signature pour \textsf{data} en utilisant la clé privée \textsf{K$_{priv}$}.
\item{\sf verify(S, data, K$_{pub}$) :} vérifie que \textsf{S} est une signature pour \textsf{data} créée avec la clé privée \textsf{K$_{priv}$} associée à la clé publique \textsf{K$_{pub}$}.
\item{\sf hash(data) :} renvoie un hash de \textsf{data}.
\end{itemize}
-On considére donc que les pairs connaissent toujours l'expéditeur des messages qu'ils recoivent, ceux-ci étant identifiés de façon unique par leur clé publique. Les attaques cryptographiques usuelles ne sont pas étudiées ici, et les primitives ci-dessus sont considérés comme sûres. En particulier, la fonction de hachage ci-dessus est considérée comme résistante aux attaques par collision.
+On considère donc que les pairs connaissent toujours l'expéditeur des messages qu'ils reçoivent, ceux-ci étant identifiés de façon unique par leur clé publique. Les attaques cryptographiques usuelles ne sont pas étudiées ici, et les primitives ci-dessus sont considérées comme sûres. En particulier, la fonction de hachage ci-dessus est supposée résistante aux attaques par collision.
\subsection{Notations}
On suppose pour simplifier qu'il n'y a qu'un seul serveur, et que l'on n'étudie que la composante connexe de ce serveur. Cette hypothèse n'est pas restrictive car les serveurs ne communiquent pas entre eux. La paire de clé du serveur est notée \textsf{(KS$_{pub}$, KS$_{priv}$)}. On suppose de plus que \textsf{KS$_{pub}$} est connue par l'ensemble des pairs.
-Chaque pair $p$ connaît l'ensemble des paris auxquels il est connecté, cet ensemble est noté $NS_p$. Si $q\in NS_p$ alors $p$ peut envoyer le message $m$ à $q$ en utilisant la fonction \textsf{send($q$, $m$)}.
+Chaque pair $p$ connaît l'ensemble des pairs auxquels il est connecté, cet ensemble est noté $NS_p$. Si $q\in NS_p$ alors $p$ peut envoyer le message $m$ à $q$ en utilisant la fonction \textsf{send($q$, $m$)}.
Enfin $\langle a|b|\ldots\rangle$ représente la sérialisation des données $a$, $b$ (et plus) pour utilisation dans les fonctions primitives, notamment $\textsf{sign}$ et $\textsf{send}$.
@@ -130,17 +130,17 @@ Enfin $\langle a|b|\ldots\rangle$ représente la sérialisation des données $a$
\subsection{Introduction}
-L'idée génerale du protocole est de générer un secret à un instant donné et de le diffuser sur le réseau. La possession de ce secret assure dans une certaine mesure la présence sur le réseau au moment où celui-ci a été diffusé. Dans cette version primitive, le protocole n'assure aucune protection contre la collusion ou la falsification : un pair pourrait révéler le secret à un autre pair qui n'était pas présent au moment de la diffusion.
+L'idée générale du protocole est de générer un secret à un instant donné et de le diffuser sur le réseau. La possession de ce secret assure dans une certaine mesure la présence sur le réseau au moment où celui-ci a été diffusé. Dans cette version primitive, le protocole n'assure aucune protection contre la collusion ou la falsification : un pair pourrait révéler le secret à un autre pair qui n'était pas présent au moment de la diffusion.
La solution consiste alors à calculer à un instant donné une empreinte de la connaissance du secret par l'ensemble des pairs du réseau. Le protocole procède en trois phases :
\begin{enumerate}
-\item \textbf{Semailles :} Le serveur génére une graine aléatoire et la diffuse dans le réseau.
-\item \textbf{Récolte :} Chaque pair signe la graine avec sa clé privée et calcule un hash de la signature : ce hash est appelé \emph{jeton de présence}. Il collecte ensuite les jetons de ses voisins auxquels il ajoute son propre jeton. Il obtient ainsi une table d'associations pair/jeton. Le pair hache ensuite cette table et transmet le hash obtenu à ses pairs. Enfin, le serveur calcule un hash racine de l'ensemble des jetons reçus de la part de ses fils.
-\item \textbf{Pulsation :} Le serveur signe le hash calculé à la fin de la phase précédente avec sa clé privée et le diffuse dans le réseau avec la liste des jetons qui ont servi au calcul du hash racine. Ce message est appelé \emph{pulsation}. Au cours de la diffusion, chaque pair ajoute à la pulsation la liste des jetons qui ont servi au calcul du hash transmis à ses parents pendant la phase précédente.
+\item \textbf{Semailles } Le serveur génère une graine aléatoire et la diffuse dans le réseau.
+\item \textbf{Récolte } Chaque pair signe la graine avec sa clé privée et calcule un hash de la signature : ce hash est appelé \emph{jeton de présence}. Il collecte ensuite les jetons de ses voisins auxquels il ajoute son propre jeton. Il obtient ainsi une table d'associations pair/jeton. Le pair hache ensuite cette table et transmet le hash obtenu à ses pairs. Enfin, le serveur calcule un hash racine de l'ensemble des jetons reçus de la part de ses fils.
+\item \textbf{Pulsation } Le serveur signe le hash calculé à la fin de la phase précédente avec sa clé privée et le diffuse dans le réseau avec la liste des jetons qui ont servi au calcul du hash racine. Ce message est appelé \emph{pulsation}. Au cours de la diffusion, chaque pair ajoute à la pulsation la liste des jetons qui ont servi au calcul du hash transmis à ses parents pendant la phase précédente.
\end{enumerate}
-Au cours de la phase 2, la structure de hashs obtenue est un graphe de hashs similaire à un \emph{arbre de Merkle} (REFERENCE) ; le hash calculé par la racine constituant une empreinte de l'ensemble des jetons des nœuds du réseau. Lors de la diffusion de la pulsation dans la phase 3, chaque pair reçoit une branche de l'arbre correspondant à un chemin allant de lui-même à la racine.
+Au cours de la phase 2, la structure de hashs obtenue est un graphe de hashs similaire à un \emph{arbre de Merkle} \cite{DBLP:conf/sp/Merkle80} ; le hash calculé par la racine constituant une empreinte de l'ensemble des jetons des nœuds du réseau. Lors de la diffusion de la pulsation dans la phase 3, chaque pair reçoit une branche de l'arbre correspondant à un chemin allant de lui-même à la racine.
-La succession de ces trois phases est appelée une ronde. La pulsation reçue dans la troisième phase constitue une preuve de la présence du pair pendant la ronde (REFERENCE). Les rondes se succèdent à une fréquence dépendant des applications : des rondes plus courtes permettent d'obtenir une granularité plus fine sur l'information de disponibilité au détriment d'un plus grand usage de bande passante.
+La succession de ces trois phases est appelée une ronde. La pulsation reçue dans la troisième phase constitue une preuve de la présence du pair pendant la ronde (cf. théorème \ref{thm}). Les rondes se succèdent à une fréquence dépendant des applications : des rondes plus courtes permettent d'obtenir une granularité plus fine sur l'information de disponibilité au détriment d'un plus grand usage de bande passante. Le principe des rondes se retrouve notamment dans \cite{Benaloh91efficientbroadcast}.
Le protocole utilise trois messages différents, correspondant aux trois phases :
\begin{itemize}
@@ -151,7 +151,7 @@ Le protocole utilise trois messages différents, correspondant aux trois phases
\item $T^i$ est la durée de la phase de récolte
\item \textsf{S$^i_{seed}$} est \textsf{sign($\langle$$i$|seed$^i$|$T^i\rangle$, KS$_{priv}$)}
\end{itemize}
-\item \textsf{SeedReply($i$, H$_p$)} est utilisé pour construire le graph de hashs pendant la phase de récolte où \textsf{H$_p$} est le hash envoyé par le pair $p$, c'est-à-dire le hash de la table des jetons reçus par le pair $p$.
+\item \textsf{SeedReply($i$, H$_p$)} est utilisé pour construire le graphe de hashs pendant la phase de récolte où \textsf{H$_p$} est le hash envoyé par le pair $p$, c'est-à-dire le hash de la table des jetons reçus par le pair $p$.
\item \textsf{Pulse($i$, seed$^i$, branch$^i$, S$^i_{pulse}$)} pour diffuser la pulsation:
\begin{itemize}
\item \textsf{branch$^i$} est la liste des tables de hashs collectés pendant la phase de récolte par les pairs situés sur le chemin suivi par ce message depuis la racine.
@@ -174,9 +174,9 @@ Les sous-sections suivantes présentent la spécification détaillée du protoco
wait $T^i$;
\end{lstlisting}
-Le serveur initialise la ronde en générant la graine aléatoire, en la signant et en l'envoyant à ses voisins. La durée de la phase de récolte est également incluse dans le message car elle est utilisée par les pairs. On peut ainsi changer dynamiquement la granularité du protocole. D'autres informations pourraient également être envoyées, par example le nombre maximum que doit établir chaque pair avec ses voisins, permettant des ajustements en temps réel du protocole.
+Le serveur initialise la ronde en générant la graine aléatoire, en la signant et en l'envoyant à ses voisins. La durée de la phase de récolte est également incluse dans le message car elle est utilisée par les pairs. On peut ainsi changer dynamiquement la granularité du protocole. D'autres informations pourraient également être envoyées, par exemple le nombre maximum que doit établir chaque pair avec ses voisins, permettant des ajustements en temps réel du protocole.
-Le serveur attend ensuite pendant une durée $T^i$, au cours de laquelle il reçoit les hashs de ces fils, cf. REFERENCE.
+Le serveur attend ensuite pendant une durée $T^i$, au cours de laquelle il reçoit les hashs de ces fils, cf. Spec. \ref{reply}.
\newpage
\begin{lstlisting}[caption=Pair $p$ à la réception de \textsf{Seed($i$,
@@ -210,12 +210,12 @@ Le pair initialise les données relatives à la ronde. map$^i$ contiendra les je
end if
\end{lstlisting}
-Le pair envoie le hash de la table des jetons qu'il a collectés tout en stockant l'association hash/table correspondante. Ceci est effectué toutes $\Delta$ secondes pour permettre à l'information de ``remonter'' depuis les feuilles de l'arbre jusqu'à la racine durant la phase de récolte. Plus précisément, si $D$ est le rayon du graphe par rapport à la racine, on doit avoir $D\Delta\leq T^i$. Ceci est nécessaire pour que le hash calculé par la racine à la fin de la phase de récolte constitue effectivement une empreinte de l'ensenble du graphe.
+Le pair envoie le hash de la table des jetons qu'il a collectés tout en stockant l'association hash/table correspondante. Ceci est effectué toutes $\Delta$ secondes pour permettre à l'information de ``remonter'' depuis les feuilles de l'arbre jusqu'à la racine durant la phase de récolte. Plus précisément, si $D$ est le rayon du graphe par rapport à la racine, on doit avoir $D\Delta\leq T^i$. Ceci est nécessaire pour que le hash calculé par la racine à la fin de la phase de récolte constitue effectivement une empreinte de l'ensemble du graphe.
\vspace{1cm}
\begin{lstlisting}[caption={Serveur ou pair à la réception de \textsf{SeedReply($i$,
-X$_q$)} depuis le pair $q$}]
+X$_q$)} depuis le pair $q$}, label=reply]
if phase$^i$ = SEEDING then
map$^i$ = $\{ q \rightarrow $X$_q \} \oplus$map$^i$;
end if
@@ -226,7 +226,7 @@ Le pair $p$ met simplement à jour sa table pair/jeton. Si la table contient dé
\subsection{Pulsation}
\begin{lstlisting}[caption=Serveur après avoir attendu pendant $T^i$]
- phase$^i$ = IDLE;
+ phase$^i$ = PULSE;
let H$^i$ = hash(map$^i$);
let branch$^i$ = $\emptyset$;
branch$^i$[0] = map$^i$;
@@ -240,10 +240,11 @@ Le pair $p$ met simplement à jour sa table pair/jeton. Si la table contient dé
\vspace{1cm}
\begin{lstlisting}[caption={Pair $p$ à la réception de \textsf{Pulse($i$, seed$^i$, branch$^i$, S$^i_{pulse}$)}}]
- if
- verify(S$^i_{pulse}$, $\langle$$i$|seed$^i$|hash(branch$^i$[0])$\rangle$,
- KS$_{pub}$) then
- phase$^i$ = IDLE;
+ if
+ verify(S$^i_{pulse}$, $\langle$$i$|seed$^i$|hash(branch$^i$[0])$\rangle$, KS$_{pub}$) and
+ phase$^i$ = SEEDING or phase$^i$ = PULSE
+ then
+ phase$^i$ = PULSE;
let level = length(branch$^i$)-1;
if
$\exists$ {$p$ $\rightarrow$ H$^i$} $\in$ branch$^i$[level] and
@@ -260,13 +261,13 @@ Le pair $p$ met simplement à jour sa table pair/jeton. Si la table contient dé
end if
\end{lstlisting}
-Le pair $p$ reçoit en plus de \textsf{S$^i_{pulse}$} (la signature du hash racine par le serveur), une branche, qui est la liste des tables de jetons aggrégés par les pairs sur le chemin allant de la racine à lui-même. Le pair $p$ commence donc par vérifier que la branche reçue est consistante, c'est-à-dire que :
+Le pair $p$ reçoit en plus de \textsf{S$^i_{pulse}$} (la signature du hash racine par le serveur), une branche, qui est la liste des tables de jetons agrégés par les pairs sur le chemin allant de la racine à lui-même. Le pair $p$ commence donc par vérifier que la branche reçue est consistante, c'est-à-dire que :
\begin{itemize}
\item le premier élément de la branche est effectivement la table des jetons reçus par la racine (dont le hash a été signé par la racine)
\item chaque table de jetons qui fait partie de la branche a effectivement été reçue par son père (sur le chemin de la racine au pair $p$) lors de la phase de récolte : son hash doit appartenir à la table de jetons du père
\end{itemize}
-Si de plus le pair $p$ apparaît dans la dernière table de la branche, c'est-à-dire dans la table d'un de ses voisins, cela signifie que le pair $p$ a envoyé un jeton à ce voisin durant la phase de récolte, et peut donc retrouver dans l'historique de ses réponses (tableau \textsf{replies} constitué pendant la récolte) la table qui a permis le cacul du jeton. Cette table est alors agrégée à la branche courante. La branche ainsi augmentée constitue la preuve (REFERENCE) de la présence du pair $p$ au cours de cette ronde et peut donc être ajoutée à son historique (tableau \textsf{History}). La variable \textsf{included$^i$} et le test \textsf{included$^i < n$} assurent que la preuve retenue par le pair $p$ correspond au jeton calculé le plus tard pendant la phase de récolte. Cette propriété est utilisée dans l'application à l'authentification de fichiers (REFERENCE).
+Si de plus le pair $p$ apparaît dans la dernière table de la branche, c'est-à-dire dans la table d'un de ses voisins, cela signifie que le pair $p$ a envoyé un jeton à ce voisin durant la phase de récolte, et peut donc retrouver dans l'historique de ses réponses (tableau \textsf{replies} constitué pendant la récolte) la table qui a permis le calcul du jeton. Cette table est alors agrégée à la branche courante. La branche ainsi augmentée constitue la preuve (cf. Théorème \ref{thm}) de la présence du pair $p$ au cours de cette ronde et peut donc être ajoutée à son historique (tableau \textsf{History}). La variable \textsf{included$^i$} et le test \textsf{included$^i < n$} assurent que la preuve retenue par le pair $p$ correspond au jeton calculé le plus tard pendant la phase de récolte. Cette propriété est utilisée dans l'application à l'authentification de fichiers (cf. Section \ref{sign}).
\subsection{Vérification}
@@ -279,7 +280,7 @@ Le protocole prévoit trois messages supplémentaires pour la transmission et la
Ces messages sont utilisés comme suit :
\vspace{1cm}
-\begin{lstlisting}[caption=Pair $p$ transmettant à $q$ son historique de présence au cours des $N$ derniers rounds]
+\begin{lstlisting}[caption=Pair $p$ transmettant à $q$ son historique de présence au cours des $N$ dernières rondes]
let bits$^i$ = new bitfield[$N$];
for $x$ in [1..$N$]
if History[$i-N+x$] = $\emptyset$ then
@@ -301,6 +302,8 @@ Ces messages sont utilisés comme suit :
\end{lstlisting}
La requête est sauvée en attendant la réponse du pair questionné.
+\vspace{1cm}
+
\begin{lstlisting}[caption={Pair $p$ recevant la demande \textsf{Challenge($i$)} du pair $q$}]
let M$^i_{proof}$ = Proof(History[$i$]);
send($q$, M$^i_{proof}$);
@@ -325,11 +328,9 @@ La vérification de la preuve est assez similaire à la vérification effectuée
\section{Analyse}
-\subsection{Non falsifiabilité}
-
Nous nous intéressons ici à ce que garantie une preuve fournie par un pair et approuvée par la vérification de la Spec. \ref{lst-proof}.
-\begin{thm}
+\begin{thm}\label{thm}
Si :
\begin{itemize}
\item le serveur n'est pas corrompu
@@ -365,16 +366,16 @@ Par récurrence :
\end{proof}
\begin{rem}
-Malheureusement nous n'avons pas du tout la garantie que le pair $p$ ait respecté le protocole. Il peut par exemple avoir reçu \textsf{seed$^i$} d'un pair complice $q$, puis avoir calculé et envoyé S$^i_{p}$ à $q$ qui l'aurait inséré lui-même dans le graph de hashs. Dans ce cas, le pair s'apparente à un pair \emph{paresseux} qui refuse de coopérer au sein du réseau : il ne reçoit que l'information minimale qui lui permet de prouver sa présence, et ne transmet aucune information utile aux autres pairs.
+Malheureusement nous n'avons pas du tout la garantie que le pair $p$ ait respecté le protocole. Il peut par exemple avoir reçu \textsf{seed$^i$} d'un pair complice $q$, puis avoir calculé et envoyé S$^i_{p}$ à $q$ qui l'aurait inséré lui-même dans le graphe de hashs. Dans ce cas, le pair s'apparente à un pair \emph{paresseux} qui refuse de coopérer au sein du réseau : il ne reçoit que l'information minimale qui lui permet de prouver sa présence, et ne transmet aucune information utile aux autres pairs.
\end{rem}
\section{Simulation}
-N'ayant pas à ma disposition de réseau pair-à-pair de grande échelle, j'ai choisi de réaliser un simulateur de réseau pair-à-pair : il s'agit d'un programme permettant de tester l'efficacité du protocole sur un grand nombre de nœuds (ici 40000). La simulation effectuée est haut niveau : chaque nœud est un élément d'un tableau et peut communiquer instantanément avec les autres nœuds. En particuler, le protocole de communication sous-jacent (IP dans la pratique) n'est pas reproduit.
+N'ayant pas à ma disposition de réseau pair-à-pair de grande échelle, j'ai choisi de réaliser un simulateur de réseau pair-à-pair : il s'agit d'un programme permettant de tester l'efficacité du protocole sur un grand nombre de nœuds (ici 40000). La simulation effectuée est haut niveau : chaque nœud est un élément d'un tableau et peut communiquer instantanément avec les autres nœuds. En particulier, le protocole de communication sous-jacent (IP dans la pratique) n'est pas reproduit.
\subsection{Modélisation de la présence des pairs}
-Plusieurs analyes (REFERENCE) ainsi que des analyses que j'ai faites sur des traces de réseaux pair-à-pair réels montrent que la durée des sessions (périodes durant laquelle un pair est connecté) peut être modélisée par une loi géométrique. J'ai donc choisi de modéliser la présence des pairs par une chaine de Markov à deux états, ON et OFF. La matrice de transition de la chaine est entièrement déterminée par deux paramètres, $\lambda$ et $\mu$, respectivement la probabilité de passer de OFF à ON et de OFF à ON. Il est immédiat que la durée d'une session (temps passé dans l'état ON) suit une loi géométrique de paramètre $\mu$ (et donc d'espérance $\frac{1}{\mu}$). De plus il est connu que les fractions du temps passé dans l'état ON et OFF sont les probabilités de la loi stationnaire associée à la chaîne :
+Plusieurs analyses \cite{Chu02availabilityand, Sacha09exploitingheterogeneity} ainsi que des analyses que j'ai faites sur des traces de réseaux pair-à-pair réels montrent que la durée des sessions (périodes durant laquelle un pair est connecté) peut être modélisée par une loi géométrique. J'ai donc choisi de modéliser la présence des pairs par une chaîne de Markov à deux états, ON et OFF. La matrice de transition de la chêne est entièrement déterminée par deux paramètres, $\lambda$ et $\mu$, respectivement la probabilité de passer de OFF à ON et de OFF à ON. Il est immédiat que la durée d'une session (temps passé dans l'état ON) suit une loi géométrique de paramètre $\mu$ (et donc d'espérance $\frac{1}{\mu}$). De plus il est connu que les fractions du temps passé dans l'état ON et OFF sont les probabilités de la loi stationnaire associée à la chaîne :
\begin{displaymath}
t_{OFF} = \frac{\mu}{\lambda + \mu} \qquad t_{ON} = \frac{\lambda}{\lambda + \mu}
@@ -386,37 +387,62 @@ $t_{ON}$ est la fraction du temps passée dans l'état ON, c'est-à-dire la disp
E = \frac{1}{\mu} \qquad d = \frac{\lambda}{\lambda + \mu}
\end{displaymath}
-\subsection{Construction du réseau}
+\subsection{Construction du réseau}\label{mesh}
-Comme mentionné plus haut, \emph{Pacemaker} peut être utilisé au-dessus d'un réseau pair-à-pair déjà existant, ou comme un service indépendant. Dans ce cas, c'est au protocole qu'il incombe de construire et maintenir les connections entre les pairs. Le protocole choisi dans cette simulation est relativement simple. Chaque nœud du réseau à un de gré égal à 10, c'est-à-dire qu'il peut établir au plus 10 connections avec d'autres pairs du réseau (ce qui semble raisonnable au vu des applications pratiques). Au moment où le pair se connecte, il envoie un message \textsf{Mesh} à la racine. Celle-ci accepte le pair si elle a une place vacante, et envoie au pair la liste de ses fils dans le réseau. Le pair contacte alors les fils en envoyant à chacun un message \textsf{Mesh}. Si le nœud contacté a une place vacante, il accepte le pair, sinon il lui indique un pair choisi au hasard parmi ses fils. Le processus est répeté jusqu'à que le pair ait 10 voisins.
+Comme mentionné plus haut, \emph{Pacemaker} peut être utilisé au-dessus d'un réseau pair-à-pair déjà existant, ou comme un service indépendant. Dans ce cas, c'est au protocole qu'il incombe de construire et maintenir les connections entre les pairs. Le protocole choisi dans cette simulation est relativement simple. Chaque nœud du réseau à un degré égal à 10, c'est-à-dire qu'il peut établir au plus 10 connections avec d'autres pairs du réseau (ce qui semble raisonnable au vu des applications pratiques). Au moment où le pair se connecte, il envoie un message \textsf{Mesh} à la racine. Celle-ci accepte le pair si elle a une place vacante, et envoie au pair la liste de ses fils dans le réseau. Le pair contacte alors les fils en envoyant à chacun un message \textsf{Mesh}. Si le nœud contacté a une place vacante, il accepte le pair, sinon il lui indique un pair choisi au hasard parmi ses fils. Le processus est répété jusqu'à que le pair ait 10 voisins.
-Le but de ce processus d'insertion est d'avoir un faible rayon par rapport à la racine (cf. REFERENCE), et ainsi permettre une diffusion rapide des messages au cours des rondes. À noter également que le réseau ainsi obtenu est redondant au sens suivant : il existe plusieurs chemins allant d'un nœud à la racine. Ceci est capital pour assurer la robustesse du protocole en cas de déconnection des pairs.
+Le but de ce processus d'insertion est d'avoir un faible rayon par rapport à la racine, et ainsi permettre une diffusion rapide des messages au cours des rondes. À noter également que le réseau ainsi obtenu est redondant au sens suivant : il existe plusieurs chemins allant d'un nœud à la racine. Ceci est capital pour assurer la robustesse du protocole en cas de déconnexion des pairs.
\begin{center}
\begin{figure}[h]
\includegraphics[scale=0.6]{mesh.eps}
-\caption{Rėpartition des pairs dans le réseau. Pour 100,000 pairs, la distance maximale à la racine est de 7.}
+\caption{Répartition des pairs dans le réseau. Pour 100,000 pairs, la distance maximale à la racine est de 7.}
\end{figure}
\end{center}
-Une optimisation consiste à arrêter le processus de recherche de voisins à partir d'un certain seuil. L'effet recherché est d'éviter les pairs déjà présent de consistuer des cliques, qui rendrait l'insertion de nouveaux pairs trés difficile. Les tests effectués au cours de la simulation montrent que pour un degré 10, le seuil de 8 (c'est-à-dire qu'un pair stoppe le processus de recherche dès qu'il est connecté à 8 voisins) semble réaliser un bon compromis entre connectivité suffisante et facilité d'insertion. En effet, dans les simulations effectuées, tous les nœuds trouvent au moins un voisin en moins de trois itérations du processus d'insertion dans le réseau.
+Une optimisation consiste à arrêter le processus de recherche de voisins à partir d'un certain seuil. L'effet recherché est d'éviter les pairs déjà présent de constituer des cliques, qui rendrait l'insertion de nouveaux pairs très difficile. Les tests effectués au cours de la simulation montrent que pour un degré 10, le seuil de 8 (c'est-à-dire qu'un pair stoppe le processus de recherche dès qu'il est connecté à 8 voisins) semble réaliser un bon compromis entre connectivité suffisante et facilité d'insertion. En effet, dans les simulations effectuées, tous les nœuds trouvent au moins un voisin en moins de trois itérations du processus d'insertion dans le réseau.
\subsection{Résultats}
-Le simulateur a été écrit en OCaml. Le code final comprend environ 800 lignes, dont 250 pour les définitions des types et des modules servant à représenter les pairs, 150 pour l'implémentation du protocole en lui-même, 70 pour la construction du réseau, 70 pour la simulation de connection des pairs, 150 pour la simulation des actions des pairs, le reste étant les fonctions générales d'entrée/sortie et la journalisation des données.
+Le simulateur a été écrit en OCaml. Le code final comprend environ 800 lignes, dont 250 pour les définitions des types et des modules servant à représenter les pairs, 150 pour l'implémentation du protocole en lui-même, 70 pour la construction du réseau, 70 pour la simulation de connexion des pairs, 150 pour la simulation des actions des pairs, le reste étant les fonctions générales d'entrée/sortie et la journalisation des données.
+
+La simulation a été effectuée pour 40000 nœuds, sur une période simulée de 10 jours. Le simulateur procède par itérations successives : à chaque itération, chaque pair traite l'ensemble des messages qu'il a reçus au cours de l'itération précédente conformément à la spécification du protocole. Chaque itération simule une période de 20 secondes, en particulier, les messages envoyés ne sont reçus que 20 secondes plus tard, ce qui est pessimiste comparé à la réalité.
+
+La disponibilité des pairs a été choisie uniforme sur l'intervalle $[0, 1]$, et la durée moyenne de connexion en minutes uniforme sur l'intervalle $[20, 500]$. La fréquence des rondes du protocole a été choisie égale à 10 minutes.
+
+\begin{figure}[!h]
+\begin{center}
+\includegraphics[scale=0.55]{cdf.eps}
+\caption{Fonction cumulative empirique de l'erreur relative de la mesure de disponibilité des pairs. 90\% des pairs ont une erreur relative inférieure à 2\%}
+\end{center}
+\end{figure}
-La simulation a été effectuée pour 40000 nœuds, sur une période simulée de 10 jours. Le simulateur procéde par itérations successives : à chaque itération, chaque pair traite l'ensemble des messages qu'il a reçus au cours de l'itération précédente conformément à la spécification du protocole. Chaque itération simule une période de 20 secondes, en particulier, les messages envoyés ne sont reçus que 20 secondes plus tard, ce qui est pessimiste comparé à la réalité.
+L'erreur de mesure sur la disponibilité d'un pair est définie comme étant la différence entre le temps de présence réel du pair et le temps de présence qu'il est capable de prouver avec les preuves qu'il a reçues. On considère que l'obtention d'une preuve prouve la présence du pair pendant toute la durée de la ronde. En effet :
+\begin{itemize}
+\item le pair n'a aucun moyen de prévoir le moment de la ronde ou il recevra la preuve, ce qui protège le protocole des pairs opportunistes qui se connecteraient juste assez longtemps pour obtenir une preuve.
+\item si le pair quitte le réseau entre la phase de semailles et la phase de récolte, sa position dans le réseau change et il n'apparaîtra donc pas dans les tables de jetons qu'il recevra de ses parents.
+\end{itemize}
-La disponibilité des pairs a été choisie uniforme sur l'intervalle $[0, 1]$, et la durée moyenne de connection en minutes uniforme sur l'intervalle $[20, 500]$. Les résultats obtenus figurent ci-dessous :
+Si $M$ représente le nombre de minutes pendant lesquelles le pair a été connecté, $N$ le nombre de preuves reçues par le pair, et $T$ la durée des rondes, l'erreur relative de disponibilité est donc définie par :
+\begin{displaymath}
+\delta = \frac{M-TN}{M}
+\end{displaymath}
-IMAGE
+À noter également que si la durée typique des sessions d'un pair est plus petite que la durée d'une ronde du protocole, le pair risque de ne pas recevoir de preuve pour cette session et donc la mesure de disponibilité perd de sa précision. Toutefois, dans la pratique, on cherche principalement à obtenir une garantie pour les pairs à forte disponibilité. Le risque principal étant les \emph{faux-positifs} par exemple dans le cas de l'élection de super-pairs.
\section{Implémentation}
-L'implémentation réelle a également été écrite en OCaml et comprend envrion 800 lignes de code, dont 250 pour les déclarations de type, 200 pour le protocole lui-même, 150 pour la construction du réseau, le reste étant les fonctions générales d'entrée/sortie et appels systèmes. Le protocole de communication utilisé est UDP et le protocole de construction du réseau est celui décrit en REFERENCE.
+L'implémentation réelle a également été écrite en OCaml et comprend environ 800 lignes de code, dont 250 pour les déclarations de type, 200 pour le protocole lui-même, 150 pour la construction du réseau, le reste étant les fonctions générales d'entrée/sortie et appels systèmes. Le protocole de communication utilisé est UDP et le protocole de construction du réseau est celui décrit en section \ref{mesh}.
+
+Le déploiement a été fait sur PlanetLab, un réseau d'ordinateurs mis en commun par différentes institutions et universités à travers le monde. Je n'ai malheureusement pu avoir accès qu'à 161 ordinateurs du réseau. Le nombre d'ordinateurs connectés en même temps a varié entre 139 et 161 au cours de l'expérimentation. L'expérimentation est encore en cours sur PlanetLab, les résultats seront donc présentés au cours de la soutenance.
+
+\section{Application à la signature de documents}\label{sign}
+
+Ce protocole peut également être utilisé pour la preuve de possession de documents électroniques. En effet, si l'on reprend la conclusion du théorème~\ref{thm}, le protocole assure que pour tout pair $p$ présent durant la ronde $i$ commençant à l'instant $t_i$, S$^i_{p}$ a été calculé par $p$ après $t_i$ et transmis avant $t_i+T^i$. Dans le protocole, S$^i_{p}$, le jeton du pair $p$, n'est rien d'autre que la graine aléatoire de la ronde $i$ signée avec la clé privée du pair $p$. Le pair pourrait en fait signer des informations supplémentaires, comme le hash d'un fichier qu'il possède au moment de la ronde $i$, l'insertion du jeton dans l'arbre de Merkle calculé au cours de la ronde, constitue alors une preuve qu'il possédait ce fichier à cet instant : en effet, il lui suffira d'exhiber ultérieurement le fichier dont le hash est celui qui avait été inséré dans l'arbre de Merkle.
-Le déploiement a été fait sur PlanetLab, un réseau d'ordinateurs mis en commun par différentes institutions et universités à travers le monde. Je n'ai malheureusement pu avoir accés qu'à 161 ordinateurs du réseau. Le nombre d'ordinateurs connectés en même temps a varié entre 139 et 161 au cours de l'expérimentation qui a duré 19 jours.
+Dans le cas de la preuve de possession de plusieurs documents, l'utilisateur pourrait ajouter à son jeton l'ensemble des hashs de ses propres documents. Toutefois, ceci devient problématique dans le cas où le nombre de documents devient important, car la taille des données échanger entre les pairs doit rester la plus petite possible. La solution consiste à utiliser localement un abre de Merkle, de façon analogue à \cite{DBLP:conf/eurocrypt/BenalohM93} : le pair organise ses fichiers selon un arbre de Merkle binaire, et seul le hash de la racine est ajouté au jeton. La preuve de la possession du fichier consiste alors, comme dans \cite{DBLP:conf/sp/Merkle80}, à fournir les hashs des fichiers qui permettent de recalculer le hash de la racine. Il suffit alors de vérifier que le hash obtenu correspond au hash qui a été inséré par le protocole au cours de la ronde.
-\section{Conclusion, application à la signature de documents}
+\bibliographystyle{plain}
+\bibliography{biblio}
-\end{document} \ No newline at end of file
+\end{document}
diff --git a/stage/biblio.bib b/stage/biblio.bib
new file mode 100644
index 0000000..6bc873c
--- /dev/null
+++ b/stage/biblio.bib
@@ -0,0 +1,123 @@
+@article{DBLP:journals/tpds/MoralesG09,
+ author = {Rams{\'e}s Morales and
+ Indranil Gupta},
+ title = {AVMON: Optimal and Scalable Discovery of Consistent Availability
+ Monitoring Overlays for Distributed Systems},
+ journal = {IEEE Trans. Parallel Distrib. Syst.},
+ volume = {20},
+ number = {4},
+ year = {2009},
+ pages = {446-459},
+ ee = {http://dx.doi.org/10.1109/TPDS.2008.84},
+ bibsource = {DBLP, http://dblp.uni-trier.de}
+}
+
+@inproceedings{DBLP:conf/sp/Merkle80,
+ author = {Ralph C. Merkle},
+ title = {Protocols for Public Key Cryptosystems},
+ booktitle = {IEEE Symposium on Security and Privacy},
+ year = {1980},
+ pages = {122-134},
+ bibsource = {DBLP, http://dblp.uni-trier.de}
+}
+
+@incollection{Bustamante:2004:FLP:1061831.1061848,
+ author = {Bustamante, Fabian E. and Qiao, Yi},
+ chapter = {Friendships that last: peer lifespan and its role in P2P protocols},
+ title = {Web content caching and distribution},
+ editor = {Douglis, Fred and Davison, Brian D.},
+ year = {2004},
+ isbn = {1-4020-2257-3},
+ pages = {233--246},
+ numpages = {14},
+ url = {http://dl.acm.org/citation.cfm?id=1061831.1061848},
+ acmid = {1061848},
+ publisher = {Kluwer Academic Publishers},
+ address = {Norwell, MA, USA},
+}
+
+@article{DBLP:journals/ppl/Garces-EriceBRFU03,
+ author = {Luis Garc{\'e}s-Erice and
+ Ernst W. Biersack and
+ Keith W. Ross and
+ Pascal Felber and
+ Guillaume Urvoy-Keller},
+ title = {Hierarchical Peer-To-Peer Systems},
+ journal = {Parallel Processing Letters},
+ volume = {13},
+ number = {4},
+ year = {2003},
+ pages = {643-657},
+ ee = {http://dx.doi.org/10.1142/S0129626403001574},
+ bibsource = {DBLP, http://dblp.uni-trier.de}
+}
+
+@inproceedings{DBLP:conf/edbtw/BernardF09,
+ author = {Samuel Bernard and
+ Fabrice Le Fessant},
+ title = {Optimizing peer-to-peer backup using lifetime estimations},
+ booktitle = {EDBT/ICDT Workshops},
+ year = {2009},
+ pages = {26-33},
+ bibsource = {DBLP, http://dblp.uni-trier.de}
+}
+
+@TECHREPORT{LeFessant2008b,
+ title = {{P}ace-{M}aker: {T}racking peer availability in large networks},
+ author = {{L}e {F}essant, {F}abrice and {S}engul, {C}igdem and {K}ermarrec, {A}nne-{M}arie},
+ keywords = {peer-to-peer, cryptography, availability, monitoring},
+ language = {{A}nglais},
+ affiliation = {{ASAP} - {INRIA} {S}aclay - {I}le de {F}rance - {INRIA} - {CNRS} : {UMR} - {U}niversit{\'e} {R}ennes {I} - {INSA} - {I}nstitut {N}ational des {S}ciences {A}ppliqu{\'e}es - {ASAP} - {IRISA} - {CNRS} : {UMR}6074 - {INRIA} - {U}niversit{\'e} {R}ennes {I} - {I}nstitut {N}ational des {S}ciences {A}ppliqu{\'e}es de {R}ennes },
+ pages = {33 },
+ type = {Research Report},
+ institution = {INRIA},
+ number = {{RR}-6594},
+ year = {2008},
+ url = {http://hal.inria.fr/inria-00305620/en/}
+}
+
+@inproceedings{DBLP:conf/dais/SachaDCM06,
+ author = {Jan Sacha and
+ Jim Dowling and
+ Raymond Cunningham and
+ Ren{\'e} Meier},
+ title = {Discovery of Stable Peers in a Self-organising Peer-to-Peer
+ Gradient Topology},
+ booktitle = {DAIS},
+ year = {2006},
+ pages = {70-83},
+ ee = {http://dx.doi.org/10.1007/11773887_6},
+ bibsource = {DBLP, http://dblp.uni-trier.de}
+}
+
+@INPROCEEDINGS{Chu02availabilityand,
+ author = {Jacky Chu and Kevin Labonte and Brian Neil Levine},
+ title = {Availability and Locality Measurements of Peer-To-Peer File Systems},
+ booktitle = {In Proceedings of ITCom: Scalability and Traffic Control in IP Networks},
+ year = {2002}
+}
+
+@MISC{Sacha09exploitingheterogeneity,
+ author = {Jan Sacha},
+ title = {Exploiting heterogeneity in peer-to-peer systems using gradient topologies},
+ year = {2009}
+}
+
+@inproceedings{DBLP:conf/eurocrypt/BenalohM93,
+ author = {Josh Cohen Benaloh and
+ Michael de Mare},
+ title = {One-Way Accumulators: A Decentralized Alternative to Digital
+ Sinatures (Extended Abstract)},
+ booktitle = {EUROCRYPT},
+ year = {1993},
+ pages = {274-285},
+ ee = {http://dx.doi.org/10.1007/3-540-48285-7_24},
+ bibsource = {DBLP, http://dblp.uni-trier.de}
+}
+
+@TECHREPORT{Benaloh91efficientbroadcast,
+ author = {Josh Benaloh and Michael de Mare},
+ title = {Efficient Broadcast Time-Stamping},
+ institution = {},
+ year = {1991}
+}
diff --git a/stage/cdf.eps b/stage/cdf.eps
new file mode 100644
index 0000000..169b852
--- /dev/null
+++ b/stage/cdf.eps
@@ -0,0 +1,1553 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Title: test.eps
+%%Creator: matplotlib version 0.99.3, http://matplotlib.sourceforge.net/
+%%CreationDate: Fri Aug 19 21:15:37 2011
+%%Orientation: portrait
+%%BoundingBox: 18 180 594 612
+%%EndComments
+%%BeginProlog
+/mpldict 8 dict def
+mpldict begin
+/m { moveto } bind def
+/l { lineto } bind def
+/r { rlineto } bind def
+/c { curveto } bind def
+/cl { closepath } bind def
+/box {
+m
+1 index 0 r
+0 exch r
+neg 0 r
+cl
+} bind def
+/clipbox {
+box
+clip
+newpath
+} bind def
+%!PS-Adobe-3.0 Resource-Font
+%%Title: DejaVu Serif
+%%Copyright: Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain
+%%Creator: Converted from TrueType by PPR
+25 dict begin
+/_d{bind def}bind def
+/_m{moveto}_d
+/_l{lineto}_d
+/_cl{closepath eofill}_d
+/_c{curveto}_d
+/_sc{7 -1 roll{setcachedevice}{pop pop pop pop pop pop}ifelse}_d
+/_e{exec}_d
+/FontName /DejaVuSerif def
+/PaintType 0 def
+/FontMatrix[.001 0 0 .001 0 0]def
+/FontBBox[-769 -346 1679 1242]def
+/FontType 3 def
+/Encoding StandardEncoding def
+/FontInfo 10 dict dup begin
+/FamilyName (DejaVu Serif) def
+/FullName (DejaVu Serif) def
+/Notice (Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain ) def
+/Weight (Book) def
+/Version (Version 2.31) def
+/ItalicAngle 0.0 def
+/isFixedPitch false def
+/UnderlinePosition -130 def
+/UnderlineThickness 90 def
+end readonly def
+/CharStrings 29 dict dup begin
+/space{318 0 0 0 0 0 _sc
+}_d
+/period{318 0 94 -13 224 116 _sc
+94 51 _m
+94 69 100 84 112 97 _c
+124 109 140 116 159 116 _c
+177 116 192 109 205 97 _c
+217 84 224 69 224 51 _c
+224 33 217 17 205 5 _c
+192 -7 177 -13 159 -13 _c
+140 -13 124 -7 112 5 _c
+100 17 94 32 94 51 _c
+_cl}_d
+/zero{636 0 66 -13 570 742 _sc
+318 34 _m
+368 34 405 61 430 116 _c
+454 170 467 253 467 364 _c
+467 474 454 557 430 612 _c
+405 666 368 694 318 694 _c
+268 694 230 666 206 612 _c
+181 557 169 474 169 364 _c
+169 253 181 170 206 116 _c
+230 61 268 34 318 34 _c
+318 -13 _m
+238 -13 176 20 132 86 _c
+88 152 66 244 66 364 _c
+66 483 88 576 132 642 _c
+176 708 238 742 318 742 _c
+397 742 459 708 503 642 _c
+547 576 570 483 570 364 _c
+570 244 547 152 503 86 _c
+459 20 397 -13 318 -13 _c
+_cl}_d
+/one{636 0 122 0 494 742 _sc
+142 0 _m
+142 52 _l
+269 52 _l
+269 658 _l
+122 563 _l
+122 627 _l
+300 742 _l
+367 742 _l
+367 52 _l
+494 52 _l
+494 0 _l
+142 0 _l
+_cl}_d
+/two{{636 0 68 0 538 742 _sc
+128 555 _m
+73 555 _l
+73 685 _l
+107 703 142 717 178 727 _c
+213 737 248 742 282 742 _c
+358 742 418 723 462 687 _c
+506 650 528 600 528 537 _c
+528 465 478 380 378 281 _c
+370 273 365 268 361 264 _c
+177 80 _l
+481 80 _l
+481 170 _l
+538 170 _l
+538 0 _l
+68 0 _l
+68 53 _l
+289 274 _l
+337 322 372 367 393 408 _c
+414 449 425 492 425 537 _c
+425 586 412 624 386 652 _c
+360 680 325 694 281 694 _c
+234 694 198 682 173 659 _c
+147 636 132 601 128 555 _c
+_cl}_e}_d
+/three{{636 0 76 -13 562 742 _sc
+97 698 _m
+135 712 171 723 206 731 _c
+241 738 274 742 305 742 _c
+376 742 432 726 472 696 _c
+512 665 532 622 532 568 _c
+532 524 518 487 490 458 _c
+462 428 423 408 373 398 _c
+433 389 479 367 512 332 _c
+545 297 562 252 562 197 _c
+562 129 539 77 493 41 _c
+447 5 382 -13 296 -13 _c
+258 -13 220 -9 184 -1 _c
+148 6 112 18 76 35 _c
+76 177 _l
+131 177 _l
+134 129 150 94 178 70 _c
+206 46 246 34 298 34 _c
+348 34 387 48 416 77 _c
+444 106 459 146 459 196 _c
+459 253 444 296 414 326 _c
+384 355 341 370 284 370 _c
+238 370 _l
+238 420 _l
+262 420 _l
+319 420 362 431 390 455 _c
+418 479 433 514 433 562 _c
+}_e{433 604 421 637 398 660 _c
+374 682 341 694 297 694 _c
+253 694 218 683 194 662 _c
+170 641 156 610 152 570 _c
+97 570 _l
+97 698 _l
+_cl}_e}_d
+/four{636 0 31 0 586 742 _sc
+349 247 _m
+349 635 _l
+100 247 _l
+349 247 _l
+564 0 _m
+232 0 _l
+232 52 _l
+349 52 _l
+349 195 _l
+31 195 _l
+31 248 _l
+350 742 _l
+447 742 _l
+447 247 _l
+586 247 _l
+586 195 _l
+447 195 _l
+447 52 _l
+564 52 _l
+564 0 _l
+_cl}_d
+/five{{636 0 85 -13 559 729 _sc
+503 729 _m
+503 649 _l
+169 649 _l
+169 440 _l
+185 452 205 460 228 466 _c
+250 472 276 475 304 475 _c
+382 475 444 453 490 409 _c
+536 365 559 306 559 231 _c
+559 153 536 93 490 51 _c
+444 8 379 -13 296 -13 _c
+262 -13 228 -9 193 -1 _c
+157 6 121 18 85 35 _c
+85 177 _l
+140 177 _l
+143 130 158 94 184 70 _c
+210 46 248 34 296 34 _c
+347 34 386 51 414 85 _c
+442 119 456 167 456 231 _c
+456 294 442 342 415 376 _c
+387 410 348 427 296 427 _c
+266 427 240 421 218 411 _c
+196 401 176 385 159 363 _c
+117 363 _l
+117 729 _l
+503 729 _l
+_cl}_e}_d
+/six{{636 0 67 -13 573 742 _sc
+327 34 _m
+373 34 408 50 433 84 _c
+457 118 470 166 470 230 _c
+470 293 457 341 433 375 _c
+408 409 373 426 327 426 _c
+280 426 244 409 220 377 _c
+196 344 184 297 184 236 _c
+184 171 196 121 221 86 _c
+245 51 281 34 327 34 _c
+168 401 _m
+190 425 215 444 243 456 _c
+271 468 302 474 338 474 _c
+410 474 468 452 510 408 _c
+552 364 573 305 573 230 _c
+573 156 550 97 505 53 _c
+459 9 399 -13 323 -13 _c
+241 -13 177 17 133 78 _c
+89 139 67 227 67 341 _c
+67 468 93 567 145 637 _c
+197 707 271 742 367 742 _c
+393 742 420 739 448 735 _c
+476 730 505 723 535 713 _c
+535 593 _l
+480 593 _l
+476 625 463 650 442 668 _c
+421 685 393 694 357 694 _c
+}_e{293 694 246 670 215 622 _c
+184 574 168 500 168 401 _c
+_cl}_e}_d
+/seven{636 0 84 0 564 729 _sc
+564 679 _m
+279 0 _l
+206 0 _l
+478 649 _l
+141 649 _l
+141 559 _l
+84 559 _l
+84 729 _l
+564 729 _l
+564 679 _l
+_cl}_d
+/eight{{636 0 67 -13 569 742 _sc
+466 199 _m
+466 251 453 291 427 320 _c
+401 349 364 364 318 364 _c
+271 364 235 349 209 320 _c
+183 291 170 251 170 199 _c
+170 147 183 106 209 77 _c
+235 48 271 34 318 34 _c
+364 34 401 48 427 77 _c
+453 106 466 147 466 199 _c
+393 388 _m
+448 380 491 360 522 327 _c
+553 293 569 251 569 199 _c
+569 131 547 78 504 42 _c
+460 5 398 -13 318 -13 _c
+237 -13 175 5 132 42 _c
+88 78 67 131 67 199 _c
+67 251 82 293 113 327 _c
+144 360 187 380 243 388 _c
+193 396 156 415 130 444 _c
+104 472 91 509 91 553 _c
+91 611 111 657 151 691 _c
+191 725 247 742 318 742 _c
+388 742 444 725 484 691 _c
+524 657 545 611 545 553 _c
+545 509 531 472 505 444 _c
+479 415 441 396 393 388 _c
+}_e{446 553 _m
+446 597 434 632 412 657 _c
+389 681 358 694 318 694 _c
+278 694 246 681 224 657 _c
+201 632 190 597 190 553 _c
+190 508 201 473 224 449 _c
+246 424 278 412 318 412 _c
+358 412 389 424 412 449 _c
+434 473 446 508 446 553 _c
+_cl}_e}_d
+/nine{{636 0 63 -13 569 742 _sc
+468 327 _m
+446 302 420 284 392 272 _c
+364 260 332 254 297 254 _c
+224 254 167 275 125 319 _c
+83 363 63 422 63 498 _c
+63 572 85 631 131 675 _c
+176 719 237 742 313 742 _c
+395 742 459 711 503 650 _c
+547 588 569 501 569 387 _c
+569 259 542 161 490 91 _c
+438 21 364 -13 269 -13 _c
+243 -13 216 -10 188 -6 _c
+160 -2 131 5 101 15 _c
+101 136 _l
+156 136 _l
+160 103 172 78 194 60 _c
+215 42 243 34 279 34 _c
+342 34 389 57 420 105 _c
+450 153 466 227 468 327 _c
+309 694 _m
+263 694 227 677 203 643 _c
+178 609 166 561 166 498 _c
+166 434 178 386 203 352 _c
+227 318 263 302 309 302 _c
+355 302 390 318 415 351 _c
+439 383 452 430 452 492 _c
+}_e{452 556 439 606 415 641 _c
+390 676 355 694 309 694 _c
+_cl}_e}_d
+/E{730 0 55 0 650 729 _sc
+55 0 _m
+55 52 _l
+148 52 _l
+148 677 _l
+55 677 _l
+55 729 _l
+642 729 _l
+642 567 _l
+582 567 _l
+582 669 _l
+247 669 _l
+247 425 _l
+486 425 _l
+486 516 _l
+546 516 _l
+546 274 _l
+486 274 _l
+486 365 _l
+247 365 _l
+247 60 _l
+590 60 _l
+590 162 _l
+650 162 _l
+650 0 _l
+55 0 _l
+_cl}_d
+/P{{673 0 55 0 637 729 _sc
+247 371 _m
+376 371 _l
+424 371 461 384 487 410 _c
+512 436 525 474 525 524 _c
+525 574 512 612 487 638 _c
+461 664 424 677 376 677 _c
+247 677 _l
+247 371 _l
+55 0 _m
+55 52 _l
+148 52 _l
+148 677 _l
+55 677 _l
+55 729 _l
+400 729 _l
+472 729 530 710 573 673 _c
+615 636 637 586 637 524 _c
+637 461 615 411 573 374 _c
+530 337 472 319 400 319 _c
+247 319 _l
+247 52 _l
+360 52 _l
+360 0 _l
+55 0 _l
+_cl}_e}_d
+/a{{596 0 50 -13 568 533 _sc
+398 163 _m
+398 273 _l
+282 273 _l
+237 273 204 263 182 244 _c
+160 224 150 195 150 156 _c
+150 120 161 91 183 70 _c
+205 48 235 38 273 38 _c
+310 38 340 49 363 72 _c
+386 95 398 125 398 163 _c
+488 324 _m
+488 52 _l
+568 52 _l
+568 0 _l
+398 0 _l
+398 56 _l
+378 32 355 14 329 3 _c
+303 -7 272 -13 238 -13 _c
+180 -13 134 2 100 32 _c
+66 62 50 104 50 156 _c
+50 209 69 250 108 280 _c
+146 310 201 325 272 325 _c
+398 325 _l
+398 361 _l
+398 400 386 430 362 452 _c
+338 474 304 485 261 485 _c
+225 485 197 476 176 460 _c
+154 444 141 420 136 388 _c
+90 388 _l
+}_e{90 493 _l
+121 506 151 516 181 523 _c
+210 529 239 533 267 533 _c
+339 533 393 515 431 479 _c
+469 443 488 392 488 324 _c
+_cl}_e}_d
+/c{{560 0 50 -13 514 533 _sc
+514 156 _m
+501 100 477 58 441 30 _c
+405 1 358 -13 301 -13 _c
+225 -13 165 11 119 61 _c
+73 111 50 177 50 260 _c
+50 342 73 408 119 458 _c
+165 508 225 533 301 533 _c
+333 533 366 529 399 521 _c
+431 513 464 502 497 487 _c
+497 354 _l
+445 354 _l
+438 399 423 432 400 453 _c
+377 474 344 485 302 485 _c
+253 485 216 466 192 428 _c
+167 390 155 334 155 260 _c
+155 184 167 128 192 90 _c
+216 52 253 34 302 34 _c
+340 34 371 44 394 64 _c
+417 84 433 115 442 156 _c
+514 156 _l
+_cl}_e}_d
+/d{{640 0 50 -13 611 760 _sc
+525 52 _m
+611 52 _l
+611 0 _l
+435 0 _l
+435 81 _l
+417 48 395 24 368 9 _c
+340 -5 307 -13 267 -13 _c
+203 -13 150 12 110 62 _c
+70 112 50 178 50 260 _c
+50 341 70 407 110 457 _c
+150 507 203 533 267 533 _c
+307 533 340 525 368 510 _c
+395 494 417 470 435 438 _c
+435 708 _l
+350 708 _l
+350 760 _l
+525 760 _l
+525 52 _l
+435 234 _m
+435 285 _l
+435 347 423 394 399 427 _c
+375 460 340 477 295 477 _c
+249 477 214 458 190 422 _c
+166 386 155 332 155 260 _c
+155 188 166 133 190 97 _c
+214 60 249 42 295 42 _c
+340 42 375 58 399 91 _c
+423 123 435 171 435 234 _c
+}_e{_cl}_e}_d
+/e{{592 0 50 -13 542 533 _sc
+542 250 _m
+155 250 _l
+155 246 _l
+155 176 168 123 194 87 _c
+220 51 259 34 311 34 _c
+350 34 382 44 408 65 _c
+433 85 451 116 461 157 _c
+533 157 _l
+519 100 492 57 454 29 _c
+415 1 364 -13 302 -13 _c
+226 -13 165 11 119 61 _c
+73 111 50 177 50 260 _c
+50 342 72 408 118 458 _c
+163 508 222 533 296 533 _c
+374 533 435 508 477 460 _c
+519 412 540 342 542 250 _c
+436 302 _m
+434 362 421 408 397 439 _c
+373 469 340 485 296 485 _c
+254 485 222 469 198 438 _c
+174 407 160 362 155 302 _c
+436 302 _l
+_cl}_e}_d
+/g{{640 0 50 -221 611 533 _sc
+525 467 _m
+525 11 _l
+525 -63 504 -120 463 -160 _c
+422 -200 364 -221 288 -221 _c
+254 -221 221 -218 190 -212 _c
+158 -206 128 -196 100 -184 _c
+100 -75 _l
+147 -75 _l
+153 -109 166 -133 188 -149 _c
+210 -165 241 -173 282 -173 _c
+334 -173 373 -158 398 -128 _c
+422 -98 435 -51 435 11 _c
+435 81 _l
+417 48 395 24 368 9 _c
+340 -5 307 -13 267 -13 _c
+203 -13 150 12 110 62 _c
+70 112 50 178 50 260 _c
+50 341 70 407 110 457 _c
+150 507 203 533 267 533 _c
+307 533 340 525 368 510 _c
+395 494 417 470 435 438 _c
+435 519 _l
+611 519 _l
+611 467 _l
+525 467 _l
+435 285 _m
+}_e{435 347 423 394 399 427 _c
+375 460 340 477 295 477 _c
+249 477 214 458 190 422 _c
+166 386 155 332 155 260 _c
+155 188 166 133 190 97 _c
+214 60 249 42 295 42 _c
+340 42 375 58 399 91 _c
+423 123 435 171 435 234 _c
+435 285 _l
+_cl}_e}_d
+/i{320 0 36 0 297 736 _sc
+97 680 _m
+97 695 102 708 113 719 _c
+124 730 137 736 153 736 _c
+167 736 180 730 191 719 _c
+202 708 208 695 208 680 _c
+208 664 202 651 192 641 _c
+181 630 168 625 153 625 _c
+137 625 124 630 113 641 _c
+102 651 97 664 97 680 _c
+212 52 _m
+297 52 _l
+297 0 _l
+36 0 _l
+36 52 _l
+122 52 _l
+122 467 _l
+36 467 _l
+36 519 _l
+212 519 _l
+212 52 _l
+_cl}_d
+/l{320 0 29 0 290 760 _sc
+205 52 _m
+290 52 _l
+290 0 _l
+29 0 _l
+29 52 _l
+115 52 _l
+115 708 _l
+29 708 _l
+29 760 _l
+205 760 _l
+205 52 _l
+_cl}_d
+/n{{644 0 36 0 616 533 _sc
+41 0 _m
+41 52 _l
+122 52 _l
+122 467 _l
+36 467 _l
+36 519 _l
+212 519 _l
+212 427 _l
+228 461 250 488 276 506 _c
+302 524 333 533 369 533 _c
+426 533 468 516 495 484 _c
+522 451 536 400 536 330 _c
+536 52 _l
+616 52 _l
+616 0 _l
+368 0 _l
+368 52 _l
+446 52 _l
+446 302 _l
+446 365 438 408 422 432 _c
+406 456 379 468 340 468 _c
+298 468 266 452 244 422 _c
+222 391 212 347 212 289 _c
+212 52 _l
+290 52 _l
+290 0 _l
+41 0 _l
+_cl}_e}_d
+/o{602 0 50 -13 552 533 _sc
+301 34 _m
+349 34 385 53 410 91 _c
+434 129 447 185 447 260 _c
+447 334 434 390 410 428 _c
+385 466 349 485 301 485 _c
+253 485 216 466 192 428 _c
+167 390 155 334 155 260 _c
+155 185 167 129 192 91 _c
+216 53 253 34 301 34 _c
+301 -13 _m
+225 -13 165 11 119 61 _c
+73 111 50 177 50 260 _c
+50 342 72 408 118 458 _c
+164 508 225 533 301 533 _c
+377 533 437 508 483 458 _c
+529 408 552 342 552 260 _c
+552 177 529 111 483 61 _c
+437 11 377 -13 301 -13 _c
+_cl}_d
+/p{{640 0 29 -207 590 533 _sc
+205 285 _m
+205 234 _l
+205 171 217 123 241 91 _c
+265 58 299 42 345 42 _c
+391 42 425 60 449 97 _c
+473 133 485 188 485 260 _c
+485 332 473 386 449 422 _c
+425 458 391 477 345 477 _c
+299 477 265 460 241 427 _c
+217 394 205 347 205 285 _c
+115 467 _m
+29 467 _l
+29 519 _l
+205 519 _l
+205 438 _l
+222 470 244 494 272 510 _c
+299 525 333 533 373 533 _c
+437 533 489 507 529 457 _c
+569 407 590 341 590 260 _c
+590 178 569 112 529 62 _c
+489 12 437 -13 373 -13 _c
+333 -13 299 -5 272 9 _c
+244 24 222 48 205 81 _c
+205 -155 _l
+290 -155 _l
+290 -207 _l
+29 -207 _l
+29 -155 _l
+}_e{115 -155 _l
+115 467 _l
+_cl}_e}_d
+/r{478 0 36 0 478 533 _sc
+478 520 _m
+478 390 _l
+426 390 _l
+424 416 417 435 405 448 _c
+392 460 373 467 349 467 _c
+305 467 271 451 247 421 _c
+223 390 212 346 212 289 _c
+212 52 _l
+316 52 _l
+316 0 _l
+41 0 _l
+41 52 _l
+122 52 _l
+122 468 _l
+36 468 _l
+36 519 _l
+212 519 _l
+212 427 _l
+229 463 251 489 279 507 _c
+307 524 341 533 381 533 _c
+395 533 411 531 427 529 _c
+443 527 460 524 478 520 _c
+_cl}_d
+/s{{513 0 56 -13 462 533 _sc
+56 29 _m
+56 150 _l
+108 150 _l
+109 111 121 82 144 63 _c
+167 43 201 34 246 34 _c
+286 34 317 41 338 57 _c
+359 72 370 94 370 123 _c
+370 145 362 164 347 178 _c
+331 192 299 207 249 223 _c
+184 245 _l
+139 259 107 277 87 299 _c
+67 320 57 347 57 381 _c
+57 428 74 465 109 492 _c
+144 519 192 533 254 533 _c
+281 533 310 529 340 522 _c
+370 515 402 505 434 491 _c
+434 378 _l
+382 378 _l
+380 411 369 437 347 456 _c
+325 475 295 485 257 485 _c
+219 485 190 478 171 465 _c
+151 451 142 431 142 405 _c
+142 383 149 365 164 352 _c
+178 339 208 326 252 312 _c
+323 290 _l
+372 274 407 255 429 232 _c
+451 209 462 180 462 144 _c
+}_e{462 94 443 56 405 28 _c
+367 0 316 -13 250 -13 _c
+216 -13 184 -9 152 -3 _c
+120 3 88 14 56 29 _c
+_cl}_e}_d
+/t{402 0 29 -13 394 680 _sc
+108 467 _m
+29 467 _l
+29 519 _l
+108 519 _l
+108 680 _l
+198 680 _l
+198 519 _l
+367 519 _l
+367 467 _l
+198 467 _l
+198 137 _l
+198 93 202 64 211 52 _c
+219 40 235 34 258 34 _c
+281 34 298 41 309 55 _c
+319 69 325 91 326 122 _c
+394 122 _l
+391 74 378 40 355 19 _c
+332 -2 297 -13 250 -13 _c
+198 -13 161 -1 140 21 _c
+118 43 108 82 108 137 _c
+108 467 _l
+_cl}_d
+/u{{644 0 27 -13 607 519 _sc
+354 519 _m
+522 519 _l
+522 52 _l
+607 52 _l
+607 0 _l
+432 0 _l
+432 92 _l
+415 57 393 31 367 13 _c
+341 -4 310 -13 276 -13 _c
+218 -13 175 3 148 35 _c
+121 67 108 119 108 189 _c
+108 467 _l
+27 467 _l
+27 519 _l
+198 519 _l
+198 217 _l
+198 153 205 110 221 87 _c
+237 63 264 52 304 52 _c
+346 52 377 67 399 98 _c
+421 128 432 173 432 231 _c
+432 467 _l
+354 467 _l
+354 519 _l
+_cl}_e}_d
+/v{565 0 -2 0 562 519 _sc
+247 0 _m
+56 467 _l
+-2 467 _l
+-2 519 _l
+236 519 _l
+236 467 _l
+153 467 _l
+299 110 _l
+445 467 _l
+367 467 _l
+367 519 _l
+562 519 _l
+562 467 _l
+504 467 _l
+313 0 _l
+247 0 _l
+_cl}_d
+end readonly def
+
+/BuildGlyph
+ {exch begin
+ CharStrings exch
+ 2 copy known not{pop /.notdef}if
+ true 3 1 roll get exec
+ end}_d
+
+/BuildChar {
+ 1 index /Encoding get exch get
+ 1 index /BuildGlyph get exec
+}_d
+
+FontName currentdict end definefont pop
+end
+%%EndProlog
+mpldict begin
+18 180 translate
+576 432 0 0 clipbox
+1.000 setlinewidth
+1 setlinejoin
+2 setlinecap
+[] 0 setdash
+1.000 setgray
+gsave
+0 0 m
+576 0 l
+576 432 l
+0 432 l
+0 0 l
+gsave
+fill
+grestore
+stroke
+grestore
+gsave
+72 43.2 m
+518.4 43.2 l
+518.4 388.8 l
+72 388.8 l
+72 43.2 l
+fill
+grestore
+0.000 setgray
+gsave
+446.4 345.6 72 43.2 clipbox
+72 43.2 m
+72 49.0007 l
+72.5674 49.3523 l
+72.7204 50.53 l
+73.6007 55.8385 l
+73.7429 56.8756 l
+74.1084 59.4596 l
+74.2222 60.3209 l
+74.7041 64.4166 l
+74.8972 65.6119 l
+75.2264 68.1431 l
+75.7299 71.6763 l
+76.0611 74.5063 l
+79.7259 102.244 l
+80.0549 104.758 l
+80.3784 107.184 l
+80.7094 109.434 l
+80.9267 111.104 l
+81.3017 114.197 l
+81.4237 115.234 l
+82.8648 125.711 l
+84.0779 134.517 l
+84.2536 135.836 l
+84.5869 138.42 l
+84.9617 140.951 l
+85.2149 142.603 l
+85.5457 145.029 l
+95.0434 205.989 l
+95.25 207.167 l
+95.5766 208.837 l
+95.7875 209.839 l
+96.9022 215.429 l
+97.162 216.712 l
+97.7907 220.21 l
+98.0461 221.546 l
+98.5116 223.954 l
+98.8592 226.099 l
+99.1864 227.487 l
+99.3529 228.278 l
+99.6727 229.931 l
+99.8113 230.546 l
+100.015 231.495 l
+100.373 232.989 l
+100.469 233.464 l
+100.799 235.221 l
+101.078 236.399 l
+101.847 240.302 l
+101.984 240.987 l
+102.803 244.995 l
+102.957 245.61 l
+103.282 247.21 l
+103.439 247.948 l
+103.905 250.286 l
+103.98 250.725 l
+104.933 255.155 l
+105.14 255.999 l
+105.457 257.211 l
+105.589 257.809 l
+105.921 259.374 l
+112.306 283.069 l
+113.187 285.758 l
+113.607 287.076 l
+115.219 292.403 l
+115.347 292.983 l
+117.857 300.172 l
+118.068 300.787 l
+119.547 304.883 l
+119.769 305.375 l
+120.075 306.096 l
+120.239 306.588 l
+120.778 307.818 l
+120.947 308.275 l
+121.262 308.943 l
+121.641 309.682 l
+121.965 310.666 l
+123.125 313.373 l
+124.087 315.711 l
+124.569 316.678 l
+124.9 317.31 l
+128.364 324.183 l
+128.676 324.781 l
+129.096 325.326 l
+130.583 327.734 l
+130.914 328.191 l
+134.48 334.203 l
+134.91 334.801 l
+135.844 336.049 l
+137.017 337.631 l
+137.455 338.07 l
+137.818 338.509 l
+141.14 342.517 l
+141.605 343.132 l
+141.896 343.466 l
+142.189 343.906 l
+142.521 344.222 l
+142.975 344.838 l
+143.502 345.453 l
+144.233 346.173 l
+144.546 346.525 l
+145.125 347.07 l
+147.533 349.338 l
+148.21 349.988 l
+148.608 350.357 l
+148.966 350.814 l
+149.27 351.289 l
+150.316 352.097 l
+150.608 352.625 l
+151.39 353.275 l
+151.637 353.451 l
+152.144 353.873 l
+152.489 354.154 l
+152.87 354.628 l
+153.19 354.998 l
+154.21 355.718 l
+154.5 355.982 l
+155.195 356.492 l
+156.173 357.353 l
+156.47 357.582 l
+156.975 358.039 l
+159.367 359.708 l
+159.658 359.919 l
+160.41 360.376 l
+161.132 360.886 l
+173.069 366.529 l
+174.318 366.915 l
+174.967 367.197 l
+176.299 367.9 l
+176.605 368.023 l
+179.05 368.972 l
+179.347 369.095 l
+181.412 369.781 l
+181.636 369.869 l
+183.045 370.29 l
+183.342 370.396 l
+188.25 372.066 l
+188.554 372.154 l
+190.443 372.751 l
+200.276 375.089 l
+200.361 375.177 l
+202.683 375.669 l
+202.932 375.722 l
+204.41 376.109 l
+206.772 376.566 l
+213.891 377.726 l
+216.085 378.236 l
+219.327 378.745 l
+219.592 378.816 l
+222.889 379.238 l
+227 379.659 l
+227 379.835 l
+230.298 380.24 l
+230.298 380.31 l
+234.99 380.855 l
+235.627 380.978 l
+240.373 381.47 l
+263.383 383.597 l
+273.081 384.089 l
+273.192 384.177 l
+283.707 384.652 l
+283.707 384.669 l
+294.212 385.214 l
+299.755 385.443 l
+309.447 385.882 l
+309.447 385.9 l
+333.053 386.585 l
+390.857 387.833 l
+410.182 388.273 l
+410.182 388.325 l
+444 388.8 l
+444 388.8 l
+stroke
+grestore
+0.500 setlinewidth
+0 setlinecap
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 4 l
+stroke
+grestore
+} bind def
+72 43.2 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 -4 l
+stroke
+grestore
+} bind def
+72 388.8 o
+grestore
+/DejaVuSerif findfont
+12.000 scalefont
+setfont
+gsave
+59.429688 30.121875 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /zero glyphshow
+19.083984 0.171875 m /zero glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 4 l
+stroke
+grestore
+} bind def
+146.4 43.2 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 -4 l
+stroke
+grestore
+} bind def
+146.4 388.8 o
+grestore
+gsave
+134.025000 30.121875 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /zero glyphshow
+19.083984 0.171875 m /two glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 4 l
+stroke
+grestore
+} bind def
+220.8 43.2 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 -4 l
+stroke
+grestore
+} bind def
+220.8 388.8 o
+grestore
+gsave
+208.135938 30.121875 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /zero glyphshow
+19.083984 0.171875 m /four glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 4 l
+stroke
+grestore
+} bind def
+295.2 43.2 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 -4 l
+stroke
+grestore
+} bind def
+295.2 388.8 o
+grestore
+gsave
+282.614062 30.121875 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /zero glyphshow
+19.083984 0.171875 m /six glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 4 l
+stroke
+grestore
+} bind def
+369.6 43.2 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 -4 l
+stroke
+grestore
+} bind def
+369.6 388.8 o
+grestore
+gsave
+357.037500 30.121875 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /zero glyphshow
+19.083984 0.171875 m /eight glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 4 l
+stroke
+grestore
+} bind def
+444 43.2 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 -4 l
+stroke
+grestore
+} bind def
+444 388.8 o
+grestore
+gsave
+431.429688 30.121875 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /one glyphshow
+19.083984 0.171875 m /zero glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 4 l
+stroke
+grestore
+} bind def
+518.4 43.2 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 -4 l
+stroke
+grestore
+} bind def
+518.4 388.8 o
+grestore
+gsave
+506.025000 30.121875 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /one glyphshow
+19.083984 0.171875 m /two glyphshow
+grestore
+230.7 13.325 m
+0 2.672 rmoveto
+(Pourcentage de pairs) show
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+4 0 l
+stroke
+grestore
+} bind def
+72 43.2 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+-4 0 l
+stroke
+grestore
+} bind def
+518.4 43.2 o
+grestore
+gsave
+50.500000 38.660937 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /zero glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+4 0 l
+stroke
+grestore
+} bind def
+72 77.7618 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+-4 0 l
+stroke
+grestore
+} bind def
+518.4 77.7618 o
+grestore
+gsave
+51.406250 73.222695 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /one glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+4 0 l
+stroke
+grestore
+} bind def
+72 112.324 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+-4 0 l
+stroke
+grestore
+} bind def
+518.4 112.324 o
+grestore
+gsave
+50.890625 107.784453 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /two glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+4 0 l
+stroke
+grestore
+} bind def
+72 146.885 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+-4 0 l
+stroke
+grestore
+} bind def
+518.4 146.885 o
+grestore
+gsave
+50.593750 142.346211 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /three glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+4 0 l
+stroke
+grestore
+} bind def
+72 181.447 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+-4 0 l
+stroke
+grestore
+} bind def
+518.4 181.447 o
+grestore
+gsave
+50.312500 176.907969 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /four glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+4 0 l
+stroke
+grestore
+} bind def
+72 216.009 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+-4 0 l
+stroke
+grestore
+} bind def
+518.4 216.009 o
+grestore
+gsave
+50.640625 211.469726 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /five glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+4 0 l
+stroke
+grestore
+} bind def
+72 250.571 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+-4 0 l
+stroke
+grestore
+} bind def
+518.4 250.571 o
+grestore
+gsave
+50.468750 246.031484 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /six glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+4 0 l
+stroke
+grestore
+} bind def
+72 285.132 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+-4 0 l
+stroke
+grestore
+} bind def
+518.4 285.132 o
+grestore
+gsave
+50.578125 280.593242 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /seven glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+4 0 l
+stroke
+grestore
+} bind def
+72 319.694 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+-4 0 l
+stroke
+grestore
+} bind def
+518.4 319.694 o
+grestore
+gsave
+50.515625 315.155000 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /eight glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+4 0 l
+stroke
+grestore
+} bind def
+72 354.256 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+-4 0 l
+stroke
+grestore
+} bind def
+518.4 354.256 o
+grestore
+gsave
+50.515625 349.716758 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /nine glyphshow
+grestore
+45.312 170.789 m
+gsave
+90 rotate
+0 0.172 rmoveto
+(Erreur relative) show
+grestore
+1.000 setlinewidth
+2 setlinecap
+gsave
+72 388.8 m
+518.4 388.8 l
+stroke
+grestore
+gsave
+518.4 43.2 m
+518.4 388.8 l
+stroke
+grestore
+gsave
+72 43.2 m
+518.4 43.2 l
+stroke
+grestore
+gsave
+72 43.2 m
+72 388.8 l
+stroke
+grestore
+
+end
+showpage
diff --git a/stage/mesh.eps b/stage/mesh.eps
new file mode 100644
index 0000000..614122b
--- /dev/null
+++ b/stage/mesh.eps
@@ -0,0 +1,1689 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Title: mesh.eps
+%%Creator: matplotlib version 0.99.3, http://matplotlib.sourceforge.net/
+%%CreationDate: Fri Aug 19 21:16:38 2011
+%%Orientation: portrait
+%%BoundingBox: 18 180 594 612
+%%EndComments
+%%BeginProlog
+/mpldict 9 dict def
+mpldict begin
+/m { moveto } bind def
+/l { lineto } bind def
+/r { rlineto } bind def
+/c { curveto } bind def
+/cl { closepath } bind def
+/box {
+m
+1 index 0 r
+0 exch r
+neg 0 r
+cl
+} bind def
+/clipbox {
+box
+clip
+newpath
+} bind def
+%!PS-Adobe-3.0 Resource-Font
+%%Title: DejaVu Serif
+%%Copyright: Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain
+%%Creator: Converted from TrueType by PPR
+25 dict begin
+/_d{bind def}bind def
+/_m{moveto}_d
+/_l{lineto}_d
+/_cl{closepath eofill}_d
+/_c{curveto}_d
+/_sc{7 -1 roll{setcachedevice}{pop pop pop pop pop pop}ifelse}_d
+/_e{exec}_d
+/FontName /DejaVuSerif def
+/PaintType 0 def
+/FontMatrix[.001 0 0 .001 0 0]def
+/FontBBox[-769 -346 1679 1242]def
+/FontType 3 def
+/Encoding StandardEncoding def
+/FontInfo 10 dict dup begin
+/FamilyName (DejaVu Serif) def
+/FullName (DejaVu Serif) def
+/Notice (Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. DejaVu changes are in public domain ) def
+/Weight (Book) def
+/Version (Version 2.31) def
+/ItalicAngle 0.0 def
+/isFixedPitch false def
+/UnderlinePosition -130 def
+/UnderlineThickness 90 def
+end readonly def
+/CharStrings 28 dict dup begin
+/space{318 0 0 0 0 0 _sc
+}_d
+/period{318 0 94 -13 224 116 _sc
+94 51 _m
+94 69 100 84 112 97 _c
+124 109 140 116 159 116 _c
+177 116 192 109 205 97 _c
+217 84 224 69 224 51 _c
+224 33 217 17 205 5 _c
+192 -7 177 -13 159 -13 _c
+140 -13 124 -7 112 5 _c
+100 17 94 32 94 51 _c
+_cl}_d
+/zero{636 0 66 -13 570 742 _sc
+318 34 _m
+368 34 405 61 430 116 _c
+454 170 467 253 467 364 _c
+467 474 454 557 430 612 _c
+405 666 368 694 318 694 _c
+268 694 230 666 206 612 _c
+181 557 169 474 169 364 _c
+169 253 181 170 206 116 _c
+230 61 268 34 318 34 _c
+318 -13 _m
+238 -13 176 20 132 86 _c
+88 152 66 244 66 364 _c
+66 483 88 576 132 642 _c
+176 708 238 742 318 742 _c
+397 742 459 708 503 642 _c
+547 576 570 483 570 364 _c
+570 244 547 152 503 86 _c
+459 20 397 -13 318 -13 _c
+_cl}_d
+/one{636 0 122 0 494 742 _sc
+142 0 _m
+142 52 _l
+269 52 _l
+269 658 _l
+122 563 _l
+122 627 _l
+300 742 _l
+367 742 _l
+367 52 _l
+494 52 _l
+494 0 _l
+142 0 _l
+_cl}_d
+/two{{636 0 68 0 538 742 _sc
+128 555 _m
+73 555 _l
+73 685 _l
+107 703 142 717 178 727 _c
+213 737 248 742 282 742 _c
+358 742 418 723 462 687 _c
+506 650 528 600 528 537 _c
+528 465 478 380 378 281 _c
+370 273 365 268 361 264 _c
+177 80 _l
+481 80 _l
+481 170 _l
+538 170 _l
+538 0 _l
+68 0 _l
+68 53 _l
+289 274 _l
+337 322 372 367 393 408 _c
+414 449 425 492 425 537 _c
+425 586 412 624 386 652 _c
+360 680 325 694 281 694 _c
+234 694 198 682 173 659 _c
+147 636 132 601 128 555 _c
+_cl}_e}_d
+/three{{636 0 76 -13 562 742 _sc
+97 698 _m
+135 712 171 723 206 731 _c
+241 738 274 742 305 742 _c
+376 742 432 726 472 696 _c
+512 665 532 622 532 568 _c
+532 524 518 487 490 458 _c
+462 428 423 408 373 398 _c
+433 389 479 367 512 332 _c
+545 297 562 252 562 197 _c
+562 129 539 77 493 41 _c
+447 5 382 -13 296 -13 _c
+258 -13 220 -9 184 -1 _c
+148 6 112 18 76 35 _c
+76 177 _l
+131 177 _l
+134 129 150 94 178 70 _c
+206 46 246 34 298 34 _c
+348 34 387 48 416 77 _c
+444 106 459 146 459 196 _c
+459 253 444 296 414 326 _c
+384 355 341 370 284 370 _c
+238 370 _l
+238 420 _l
+262 420 _l
+319 420 362 431 390 455 _c
+418 479 433 514 433 562 _c
+}_e{433 604 421 637 398 660 _c
+374 682 341 694 297 694 _c
+253 694 218 683 194 662 _c
+170 641 156 610 152 570 _c
+97 570 _l
+97 698 _l
+_cl}_e}_d
+/four{636 0 31 0 586 742 _sc
+349 247 _m
+349 635 _l
+100 247 _l
+349 247 _l
+564 0 _m
+232 0 _l
+232 52 _l
+349 52 _l
+349 195 _l
+31 195 _l
+31 248 _l
+350 742 _l
+447 742 _l
+447 247 _l
+586 247 _l
+586 195 _l
+447 195 _l
+447 52 _l
+564 52 _l
+564 0 _l
+_cl}_d
+/five{{636 0 85 -13 559 729 _sc
+503 729 _m
+503 649 _l
+169 649 _l
+169 440 _l
+185 452 205 460 228 466 _c
+250 472 276 475 304 475 _c
+382 475 444 453 490 409 _c
+536 365 559 306 559 231 _c
+559 153 536 93 490 51 _c
+444 8 379 -13 296 -13 _c
+262 -13 228 -9 193 -1 _c
+157 6 121 18 85 35 _c
+85 177 _l
+140 177 _l
+143 130 158 94 184 70 _c
+210 46 248 34 296 34 _c
+347 34 386 51 414 85 _c
+442 119 456 167 456 231 _c
+456 294 442 342 415 376 _c
+387 410 348 427 296 427 _c
+266 427 240 421 218 411 _c
+196 401 176 385 159 363 _c
+117 363 _l
+117 729 _l
+503 729 _l
+_cl}_e}_d
+/six{{636 0 67 -13 573 742 _sc
+327 34 _m
+373 34 408 50 433 84 _c
+457 118 470 166 470 230 _c
+470 293 457 341 433 375 _c
+408 409 373 426 327 426 _c
+280 426 244 409 220 377 _c
+196 344 184 297 184 236 _c
+184 171 196 121 221 86 _c
+245 51 281 34 327 34 _c
+168 401 _m
+190 425 215 444 243 456 _c
+271 468 302 474 338 474 _c
+410 474 468 452 510 408 _c
+552 364 573 305 573 230 _c
+573 156 550 97 505 53 _c
+459 9 399 -13 323 -13 _c
+241 -13 177 17 133 78 _c
+89 139 67 227 67 341 _c
+67 468 93 567 145 637 _c
+197 707 271 742 367 742 _c
+393 742 420 739 448 735 _c
+476 730 505 723 535 713 _c
+535 593 _l
+480 593 _l
+476 625 463 650 442 668 _c
+421 685 393 694 357 694 _c
+}_e{293 694 246 670 215 622 _c
+184 574 168 500 168 401 _c
+_cl}_e}_d
+/seven{636 0 84 0 564 729 _sc
+564 679 _m
+279 0 _l
+206 0 _l
+478 649 _l
+141 649 _l
+141 559 _l
+84 559 _l
+84 729 _l
+564 729 _l
+564 679 _l
+_cl}_d
+/D{802 0 55 0 744 729 _sc
+247 52 _m
+338 52 _l
+432 52 505 79 556 133 _c
+606 187 632 264 632 365 _c
+632 466 606 543 556 597 _c
+505 650 432 677 338 677 _c
+247 677 _l
+247 52 _l
+55 0 _m
+55 52 _l
+148 52 _l
+148 677 _l
+55 677 _l
+55 729 _l
+345 729 _l
+471 729 569 697 639 633 _c
+709 569 744 479 744 365 _c
+744 250 708 160 638 96 _c
+568 32 470 0 345 0 _c
+55 0 _l
+_cl}_d
+/P{{673 0 55 0 637 729 _sc
+247 371 _m
+376 371 _l
+424 371 461 384 487 410 _c
+512 436 525 474 525 524 _c
+525 574 512 612 487 638 _c
+461 664 424 677 376 677 _c
+247 677 _l
+247 371 _l
+55 0 _m
+55 52 _l
+148 52 _l
+148 677 _l
+55 677 _l
+55 729 _l
+400 729 _l
+472 729 530 710 573 673 _c
+615 636 637 586 637 524 _c
+637 461 615 411 573 374 _c
+530 337 472 319 400 319 _c
+247 319 _l
+247 52 _l
+360 52 _l
+360 0 _l
+55 0 _l
+_cl}_e}_d
+/grave{500 0 83 615 306 799 _sc
+179 799 _m
+306 615 _l
+249 615 _l
+83 799 _l
+179 799 _l
+_cl}_d
+/a{{596 0 50 -13 568 533 _sc
+398 163 _m
+398 273 _l
+282 273 _l
+237 273 204 263 182 244 _c
+160 224 150 195 150 156 _c
+150 120 161 91 183 70 _c
+205 48 235 38 273 38 _c
+310 38 340 49 363 72 _c
+386 95 398 125 398 163 _c
+488 324 _m
+488 52 _l
+568 52 _l
+568 0 _l
+398 0 _l
+398 56 _l
+378 32 355 14 329 3 _c
+303 -7 272 -13 238 -13 _c
+180 -13 134 2 100 32 _c
+66 62 50 104 50 156 _c
+50 209 69 250 108 280 _c
+146 310 201 325 272 325 _c
+398 325 _l
+398 361 _l
+398 400 386 430 362 452 _c
+338 474 304 485 261 485 _c
+225 485 197 476 176 460 _c
+154 444 141 420 136 388 _c
+90 388 _l
+}_e{90 493 _l
+121 506 151 516 181 523 _c
+210 529 239 533 267 533 _c
+339 533 393 515 431 479 _c
+469 443 488 392 488 324 _c
+_cl}_e}_d
+/c{{560 0 50 -13 514 533 _sc
+514 156 _m
+501 100 477 58 441 30 _c
+405 1 358 -13 301 -13 _c
+225 -13 165 11 119 61 _c
+73 111 50 177 50 260 _c
+50 342 73 408 119 458 _c
+165 508 225 533 301 533 _c
+333 533 366 529 399 521 _c
+431 513 464 502 497 487 _c
+497 354 _l
+445 354 _l
+438 399 423 432 400 453 _c
+377 474 344 485 302 485 _c
+253 485 216 466 192 428 _c
+167 390 155 334 155 260 _c
+155 184 167 128 192 90 _c
+216 52 253 34 302 34 _c
+340 34 371 44 394 64 _c
+417 84 433 115 442 156 _c
+514 156 _l
+_cl}_e}_d
+/d{{640 0 50 -13 611 760 _sc
+525 52 _m
+611 52 _l
+611 0 _l
+435 0 _l
+435 81 _l
+417 48 395 24 368 9 _c
+340 -5 307 -13 267 -13 _c
+203 -13 150 12 110 62 _c
+70 112 50 178 50 260 _c
+50 341 70 407 110 457 _c
+150 507 203 533 267 533 _c
+307 533 340 525 368 510 _c
+395 494 417 470 435 438 _c
+435 708 _l
+350 708 _l
+350 760 _l
+525 760 _l
+525 52 _l
+435 234 _m
+435 285 _l
+435 347 423 394 399 427 _c
+375 460 340 477 295 477 _c
+249 477 214 458 190 422 _c
+166 386 155 332 155 260 _c
+155 188 166 133 190 97 _c
+214 60 249 42 295 42 _c
+340 42 375 58 399 91 _c
+423 123 435 171 435 234 _c
+}_e{_cl}_e}_d
+/e{{592 0 50 -13 542 533 _sc
+542 250 _m
+155 250 _l
+155 246 _l
+155 176 168 123 194 87 _c
+220 51 259 34 311 34 _c
+350 34 382 44 408 65 _c
+433 85 451 116 461 157 _c
+533 157 _l
+519 100 492 57 454 29 _c
+415 1 364 -13 302 -13 _c
+226 -13 165 11 119 61 _c
+73 111 50 177 50 260 _c
+50 342 72 408 118 458 _c
+163 508 222 533 296 533 _c
+374 533 435 508 477 460 _c
+519 412 540 342 542 250 _c
+436 302 _m
+434 362 421 408 397 439 _c
+373 469 340 485 296 485 _c
+254 485 222 469 198 438 _c
+174 407 160 362 155 302 _c
+436 302 _l
+_cl}_e}_d
+/g{{640 0 50 -221 611 533 _sc
+525 467 _m
+525 11 _l
+525 -63 504 -120 463 -160 _c
+422 -200 364 -221 288 -221 _c
+254 -221 221 -218 190 -212 _c
+158 -206 128 -196 100 -184 _c
+100 -75 _l
+147 -75 _l
+153 -109 166 -133 188 -149 _c
+210 -165 241 -173 282 -173 _c
+334 -173 373 -158 398 -128 _c
+422 -98 435 -51 435 11 _c
+435 81 _l
+417 48 395 24 368 9 _c
+340 -5 307 -13 267 -13 _c
+203 -13 150 12 110 62 _c
+70 112 50 178 50 260 _c
+50 341 70 407 110 457 _c
+150 507 203 533 267 533 _c
+307 533 340 525 368 510 _c
+395 494 417 470 435 438 _c
+435 519 _l
+611 519 _l
+611 467 _l
+525 467 _l
+435 285 _m
+}_e{435 347 423 394 399 427 _c
+375 460 340 477 295 477 _c
+249 477 214 458 190 422 _c
+166 386 155 332 155 260 _c
+155 188 166 133 190 97 _c
+214 60 249 42 295 42 _c
+340 42 375 58 399 91 _c
+423 123 435 171 435 234 _c
+435 285 _l
+_cl}_e}_d
+/i{320 0 36 0 297 736 _sc
+97 680 _m
+97 695 102 708 113 719 _c
+124 730 137 736 153 736 _c
+167 736 180 730 191 719 _c
+202 708 208 695 208 680 _c
+208 664 202 651 192 641 _c
+181 630 168 625 153 625 _c
+137 625 124 630 113 641 _c
+102 651 97 664 97 680 _c
+212 52 _m
+297 52 _l
+297 0 _l
+36 0 _l
+36 52 _l
+122 52 _l
+122 467 _l
+36 467 _l
+36 519 _l
+212 519 _l
+212 52 _l
+_cl}_d
+/l{320 0 29 0 290 760 _sc
+205 52 _m
+290 52 _l
+290 0 _l
+29 0 _l
+29 52 _l
+115 52 _l
+115 708 _l
+29 708 _l
+29 760 _l
+205 760 _l
+205 52 _l
+_cl}_d
+/n{{644 0 36 0 616 533 _sc
+41 0 _m
+41 52 _l
+122 52 _l
+122 467 _l
+36 467 _l
+36 519 _l
+212 519 _l
+212 427 _l
+228 461 250 488 276 506 _c
+302 524 333 533 369 533 _c
+426 533 468 516 495 484 _c
+522 451 536 400 536 330 _c
+536 52 _l
+616 52 _l
+616 0 _l
+368 0 _l
+368 52 _l
+446 52 _l
+446 302 _l
+446 365 438 408 422 432 _c
+406 456 379 468 340 468 _c
+298 468 266 452 244 422 _c
+222 391 212 347 212 289 _c
+212 52 _l
+290 52 _l
+290 0 _l
+41 0 _l
+_cl}_e}_d
+/o{602 0 50 -13 552 533 _sc
+301 34 _m
+349 34 385 53 410 91 _c
+434 129 447 185 447 260 _c
+447 334 434 390 410 428 _c
+385 466 349 485 301 485 _c
+253 485 216 466 192 428 _c
+167 390 155 334 155 260 _c
+155 185 167 129 192 91 _c
+216 53 253 34 301 34 _c
+301 -13 _m
+225 -13 165 11 119 61 _c
+73 111 50 177 50 260 _c
+50 342 72 408 118 458 _c
+164 508 225 533 301 533 _c
+377 533 437 508 483 458 _c
+529 408 552 342 552 260 _c
+552 177 529 111 483 61 _c
+437 11 377 -13 301 -13 _c
+_cl}_d
+/p{{640 0 29 -207 590 533 _sc
+205 285 _m
+205 234 _l
+205 171 217 123 241 91 _c
+265 58 299 42 345 42 _c
+391 42 425 60 449 97 _c
+473 133 485 188 485 260 _c
+485 332 473 386 449 422 _c
+425 458 391 477 345 477 _c
+299 477 265 460 241 427 _c
+217 394 205 347 205 285 _c
+115 467 _m
+29 467 _l
+29 519 _l
+205 519 _l
+205 438 _l
+222 470 244 494 272 510 _c
+299 525 333 533 373 533 _c
+437 533 489 507 529 457 _c
+569 407 590 341 590 260 _c
+590 178 569 112 529 62 _c
+489 12 437 -13 373 -13 _c
+333 -13 299 -5 272 9 _c
+244 24 222 48 205 81 _c
+205 -155 _l
+290 -155 _l
+290 -207 _l
+29 -207 _l
+29 -155 _l
+}_e{115 -155 _l
+115 467 _l
+_cl}_e}_d
+/r{478 0 36 0 478 533 _sc
+478 520 _m
+478 390 _l
+426 390 _l
+424 416 417 435 405 448 _c
+392 460 373 467 349 467 _c
+305 467 271 451 247 421 _c
+223 390 212 346 212 289 _c
+212 52 _l
+316 52 _l
+316 0 _l
+41 0 _l
+41 52 _l
+122 52 _l
+122 468 _l
+36 468 _l
+36 519 _l
+212 519 _l
+212 427 _l
+229 463 251 489 279 507 _c
+307 524 341 533 381 533 _c
+395 533 411 531 427 529 _c
+443 527 460 524 478 520 _c
+_cl}_d
+/s{{513 0 56 -13 462 533 _sc
+56 29 _m
+56 150 _l
+108 150 _l
+109 111 121 82 144 63 _c
+167 43 201 34 246 34 _c
+286 34 317 41 338 57 _c
+359 72 370 94 370 123 _c
+370 145 362 164 347 178 _c
+331 192 299 207 249 223 _c
+184 245 _l
+139 259 107 277 87 299 _c
+67 320 57 347 57 381 _c
+57 428 74 465 109 492 _c
+144 519 192 533 254 533 _c
+281 533 310 529 340 522 _c
+370 515 402 505 434 491 _c
+434 378 _l
+382 378 _l
+380 411 369 437 347 456 _c
+325 475 295 485 257 485 _c
+219 485 190 478 171 465 _c
+151 451 142 431 142 405 _c
+142 383 149 365 164 352 _c
+178 339 208 326 252 312 _c
+323 290 _l
+372 274 407 255 429 232 _c
+451 209 462 180 462 144 _c
+}_e{462 94 443 56 405 28 _c
+367 0 316 -13 250 -13 _c
+216 -13 184 -9 152 -3 _c
+120 3 88 14 56 29 _c
+_cl}_e}_d
+/t{402 0 29 -13 394 680 _sc
+108 467 _m
+29 467 _l
+29 519 _l
+108 519 _l
+108 680 _l
+198 680 _l
+198 519 _l
+367 519 _l
+367 467 _l
+198 467 _l
+198 137 _l
+198 93 202 64 211 52 _c
+219 40 235 34 258 34 _c
+281 34 298 41 309 55 _c
+319 69 325 91 326 122 _c
+394 122 _l
+391 74 378 40 355 19 _c
+332 -2 297 -13 250 -13 _c
+198 -13 161 -1 140 21 _c
+118 43 108 82 108 137 _c
+108 467 _l
+_cl}_d
+/u{{644 0 27 -13 607 519 _sc
+354 519 _m
+522 519 _l
+522 52 _l
+607 52 _l
+607 0 _l
+432 0 _l
+432 92 _l
+415 57 393 31 367 13 _c
+341 -4 310 -13 276 -13 _c
+218 -13 175 3 148 35 _c
+121 67 108 119 108 189 _c
+108 467 _l
+27 467 _l
+27 519 _l
+198 519 _l
+198 217 _l
+198 153 205 110 221 87 _c
+237 63 264 52 304 52 _c
+346 52 377 67 399 98 _c
+421 128 432 173 432 231 _c
+432 467 _l
+354 467 _l
+354 519 _l
+_cl}_e}_d
+/agrave{596 0 50 -13 568 799 _sc
+false CharStrings /a get exec
+gsave 28 0 translate
+false CharStrings /grave get exec
+grestore }_d
+end readonly def
+
+/BuildGlyph
+ {exch begin
+ CharStrings exch
+ 2 copy known not{pop /.notdef}if
+ true 3 1 roll get exec
+ end}_d
+
+/BuildChar {
+ 1 index /Encoding get exch get
+ 1 index /BuildGlyph get exec
+}_d
+
+FontName currentdict end definefont pop
+%!PS-Adobe-3.0 Resource-Font
+%%Title: cmr10
+%%Copyright: Copyright (C) 1994, Basil K. Malyshev. All Rights Reserved.012BaKoMa Fonts Collection, Level-B.
+%%Creator: Converted from TrueType by PPR
+25 dict begin
+/_d{bind def}bind def
+/_m{moveto}_d
+/_l{lineto}_d
+/_cl{closepath eofill}_d
+/_c{curveto}_d
+/_sc{7 -1 roll{setcachedevice}{pop pop pop pop pop pop}ifelse}_d
+/_e{exec}_d
+/FontName /Cmr10 def
+/PaintType 0 def
+/FontMatrix[.001 0 0 .001 0 0]def
+/FontBBox[-43 -249 1009 750]def
+/FontType 3 def
+/Encoding StandardEncoding def
+/FontInfo 10 dict dup begin
+/FamilyName (cmr10) def
+/FullName (cmr10) def
+/Notice (Copyright (C) 1994, Basil K. Malyshev. All Rights Reserved.012BaKoMa Fonts Collection, Level-B. ) def
+/Weight (Regular) def
+/Version (1.1/12-Nov-94) def
+/ItalicAngle 0.0 def
+/isFixedPitch false def
+/UnderlinePosition -133 def
+/UnderlineThickness 20 def
+end readonly def
+/CharStrings 5 dict dup begin
+/zero{{500 0 39 -21 460 666 _sc
+250 -21 _m
+168 -21 112 12 83 79 _c
+53 146 39 226 39 319 _c
+39 377 44 431 55 482 _c
+65 533 86 576 118 612 _c
+149 648 193 666 250 666 _c
+294 666 330 655 358 634 _c
+386 612 407 585 422 551 _c
+436 517 446 480 452 441 _c
+457 402 460 361 460 319 _c
+460 261 454 208 444 158 _c
+433 108 412 65 381 31 _c
+350 -3 306 -21 250 -21 _c
+250 4 _m
+287 4 315 23 333 61 _c
+351 99 362 141 366 187 _c
+370 233 373 283 373 335 _c
+373 385 370 431 366 473 _c
+362 515 351 554 333 588 _c
+315 622 287 640 250 640 _c
+212 640 184 622 166 588 _c
+148 554 136 515 132 473 _c
+128 431 126 385 126 335 _c
+126 297 126 262 128 230 _c
+130 197 135 163 143 128 _c
+151 93 163 64 181 40 _c
+198 16 221 4 250 4 _c
+_cl}_e}_d
+/four{{500 0 28 0 471 666 _sc
+28 165 _m
+28 200 _l
+337 661 _l
+339 664 342 666 347 666 _c
+362 666 _l
+369 666 373 662 373 655 _c
+373 200 _l
+471 200 _l
+471 165 _l
+373 165 _l
+373 67 _l
+373 53 382 44 402 40 _c
+422 36 444 35 470 35 _c
+470 0 _l
+195 0 _l
+195 35 _l
+220 35 242 36 262 40 _c
+282 44 292 53 292 67 _c
+292 165 _l
+28 165 _l
+61 200 _m
+298 200 _l
+298 554 _l
+61 200 _l
+_cl}_e}_d
+/one{500 0 87 0 421 666 _sc
+93 0 _m
+93 35 _l
+176 35 218 45 218 67 _c
+218 592 _l
+183 575 139 567 87 567 _c
+87 602 _l
+168 602 230 623 272 666 _c
+286 666 _l
+288 666 291 665 293 663 _c
+295 661 296 659 296 657 _c
+296 67 _l
+296 45 337 35 421 35 _c
+421 0 _l
+93 0 _l
+_cl}_d
+/three{{500 0 42 -21 457 666 _sc
+95 77 _m
+111 54 132 37 158 26 _c
+184 15 213 10 243 10 _c
+281 10 309 26 325 59 _c
+341 92 350 130 350 172 _c
+350 190 348 209 345 228 _c
+341 247 335 265 327 281 _c
+319 297 308 310 294 320 _c
+280 330 262 335 242 335 _c
+176 335 _l
+170 335 167 338 167 344 _c
+167 353 _l
+167 358 170 361 176 361 _c
+231 365 _l
+254 365 273 373 289 391 _c
+305 409 316 430 323 456 _c
+330 481 334 505 334 528 _c
+334 560 326 586 311 606 _c
+296 626 273 637 243 637 _c
+217 637 193 632 170 622 _c
+147 612 129 598 115 579 _c
+116 579 117 580 118 580 _c
+119 580 120 580 122 580 _c
+137 580 150 574 160 564 _c
+170 554 175 541 175 527 _c
+175 512 170 499 160 489 _c
+150 479 137 474 122 474 _c
+}_e{107 474 94 479 84 489 _c
+74 499 69 512 69 527 _c
+69 555 77 580 95 601 _c
+112 622 134 638 161 649 _c
+188 660 215 666 243 666 _c
+263 666 284 663 307 657 _c
+329 651 350 642 368 631 _c
+386 619 401 605 413 588 _c
+424 570 430 550 430 528 _c
+430 500 423 474 411 450 _c
+399 426 382 406 360 389 _c
+338 371 314 358 288 350 _c
+317 344 345 333 371 317 _c
+397 301 417 280 433 255 _c
+449 229 457 202 457 173 _c
+457 136 446 103 426 73 _c
+406 43 379 19 347 3 _c
+314 -13 279 -21 243 -21 _c
+211 -21 180 -15 149 -3 _c
+117 8 92 25 72 49 _c
+52 73 42 101 42 135 _c
+42 151 47 165 58 176 _c
+69 187 83 193 100 193 _c
+110 193 120 190 129 185 _c
+138 180 145 173 150 164 _c
+155 154 158 145 158 135 _c
+158 118 152 104 141 93 _c
+129 82 116 77 100 77 _c
+95 77 _l
+_cl}_e}_d
+/five{{500 0 50 -21 449 666 _sc
+87 114 _m
+93 94 104 76 118 60 _c
+132 44 149 32 169 23 _c
+188 14 208 10 229 10 _c
+277 10 310 28 328 66 _c
+346 103 356 148 356 202 _c
+356 225 355 244 355 260 _c
+354 276 352 291 348 306 _c
+342 329 331 349 315 367 _c
+299 385 281 394 259 394 _c
+236 394 217 390 201 384 _c
+185 377 171 369 161 360 _c
+151 350 142 341 134 331 _c
+126 321 122 315 120 315 _c
+109 315 _l
+107 315 104 316 102 318 _c
+100 320 99 322 99 324 _c
+99 658 _l
+99 660 100 661 102 663 _c
+104 665 106 666 109 666 _c
+112 666 _l
+156 644 204 634 255 634 _c
+304 634 352 644 398 666 _c
+401 666 _l
+403 666 405 665 407 663 _c
+409 661 410 660 410 658 _c
+410 649 _l
+}_e{410 645 409 644 408 644 _c
+385 614 356 590 322 573 _c
+288 556 252 548 216 548 _c
+189 548 162 551 134 559 _c
+134 370 _l
+156 388 175 400 193 408 _c
+210 416 232 420 260 420 _c
+296 420 329 409 358 388 _c
+387 366 409 339 425 305 _c
+441 271 449 236 449 201 _c
+449 161 439 124 419 90 _c
+399 56 373 29 339 9 _c
+305 -11 269 -21 229 -21 _c
+196 -21 166 -12 138 4 _c
+110 20 89 43 73 72 _c
+57 100 50 131 50 163 _c
+50 178 54 190 64 200 _c
+74 209 86 214 101 214 _c
+115 214 128 209 138 199 _c
+148 189 153 177 153 163 _c
+153 149 148 137 138 127 _c
+128 117 115 112 101 112 _c
+99 112 96 112 93 112 _c
+90 112 88 113 87 114 _c
+_cl}_e}_d
+end readonly def
+
+/BuildGlyph
+ {exch begin
+ CharStrings exch
+ 2 copy known not{pop /.notdef}if
+ true 3 1 roll get exec
+ end}_d
+
+/BuildChar {
+ 1 index /Encoding get exch get
+ 1 index /BuildGlyph get exec
+}_d
+
+FontName currentdict end definefont pop
+end
+%%EndProlog
+mpldict begin
+18 180 translate
+576 432 0 0 clipbox
+1.000 setlinewidth
+1 setlinejoin
+2 setlinecap
+[] 0 setdash
+1.000 setgray
+gsave
+0 0 m
+576 0 l
+576 432 l
+0 432 l
+0 0 l
+gsave
+fill
+grestore
+stroke
+grestore
+gsave
+72 43.2 m
+518.4 43.2 l
+518.4 388.8 l
+72 388.8 l
+72 43.2 l
+fill
+grestore
+0 setlinecap
+[6 6] 0 setdash
+0.000 setgray
+gsave
+446.4 345.6 72 43.2 clipbox
+72 43.209 m
+135.771 43.3802 l
+199.543 44.7862 l
+263.314 56.6554 l
+327.086 143.552 l
+390.857 363.787 l
+454.629 99.7885 l
+518.4 44.1553 l
+stroke
+grestore
+[1 3] 0 setdash
+gsave
+446.4 345.6 72 43.2 clipbox
+72 43.2965 m
+135.771 45.1308 l
+199.543 60.1913 l
+263.314 166.58 l
+327.086 362.946 l
+390.857 74.5761 l
+454.629 43.3931 l
+stroke
+grestore
+2 setlinecap
+[] 0 setdash
+gsave
+446.4 345.6 72 43.2 clipbox
+72 44.1246 m
+135.771 61.6912 l
+199.543 183.733 l
+263.314 355.701 l
+327.086 64.4648 l
+390.857 43.2 l
+stroke
+grestore
+0.500 setlinewidth
+0 setlinecap
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 4 l
+stroke
+grestore
+} bind def
+72 43.2 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 -4 l
+stroke
+grestore
+} bind def
+72 388.8 o
+grestore
+/DejaVuSerif findfont
+12.000 scalefont
+setfont
+gsave
+68.976562 30.121875 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 4 l
+stroke
+grestore
+} bind def
+135.771 43.2 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 -4 l
+stroke
+grestore
+} bind def
+135.771 388.8 o
+grestore
+gsave
+133.537054 30.293750 translate
+0.000000 rotate
+0.000000 0.000000 m /one glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 4 l
+stroke
+grestore
+} bind def
+199.543 43.2 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 -4 l
+stroke
+grestore
+} bind def
+199.543 388.8 o
+grestore
+gsave
+196.722545 30.293750 translate
+0.000000 rotate
+0.000000 0.000000 m /two glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 4 l
+stroke
+grestore
+} bind def
+263.314 43.2 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 -4 l
+stroke
+grestore
+} bind def
+263.314 388.8 o
+grestore
+gsave
+260.400223 30.121875 translate
+0.000000 rotate
+0.000000 0.171875 m /three glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 4 l
+stroke
+grestore
+} bind def
+327.086 43.2 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 -4 l
+stroke
+grestore
+} bind def
+327.086 388.8 o
+grestore
+gsave
+323.757589 30.293750 translate
+0.000000 rotate
+0.000000 0.000000 m /four glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 4 l
+stroke
+grestore
+} bind def
+390.857 43.2 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 -4 l
+stroke
+grestore
+} bind def
+390.857 388.8 o
+grestore
+gsave
+388.013393 30.278125 translate
+0.000000 rotate
+0.000000 0.171875 m /five glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 4 l
+stroke
+grestore
+} bind def
+454.629 43.2 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 -4 l
+stroke
+grestore
+} bind def
+454.629 388.8 o
+grestore
+gsave
+451.589509 30.121875 translate
+0.000000 rotate
+0.000000 0.171875 m /six glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 4 l
+stroke
+grestore
+} bind def
+518.4 43.2 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+0 -4 l
+stroke
+grestore
+} bind def
+518.4 388.8 o
+grestore
+gsave
+515.525000 30.450000 translate
+0.000000 rotate
+0.000000 0.000000 m /seven glyphshow
+grestore
+gsave
+234.973437 15.356250 translate
+0.000000 rotate
+0.000000 0.171875 m /D glyphshow
+9.621094 0.171875 m /i glyphshow
+13.458984 0.171875 m /s glyphshow
+19.617188 0.171875 m /t glyphshow
+24.439453 0.171875 m /a glyphshow
+31.593750 0.171875 m /n glyphshow
+39.322266 0.171875 m /c glyphshow
+46.042969 0.171875 m /e glyphshow
+53.144531 0.171875 m /space glyphshow
+56.958984 0.171875 m /agrave glyphshow
+64.113281 0.171875 m /space glyphshow
+67.927734 0.171875 m /l glyphshow
+71.765625 0.171875 m /a glyphshow
+78.919922 0.171875 m /space glyphshow
+82.734375 0.171875 m /r glyphshow
+88.470703 0.171875 m /a glyphshow
+95.625000 0.171875 m /c glyphshow
+102.345703 0.171875 m /i glyphshow
+106.183594 0.171875 m /n glyphshow
+113.912109 0.171875 m /e glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+4 0 l
+stroke
+grestore
+} bind def
+72 43.2 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+-4 0 l
+stroke
+grestore
+} bind def
+518.4 43.2 o
+grestore
+gsave
+50.500000 38.660937 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /zero glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+4 0 l
+stroke
+grestore
+} bind def
+72 92.5714 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+-4 0 l
+stroke
+grestore
+} bind def
+518.4 92.5714 o
+grestore
+gsave
+51.406250 88.032366 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /one glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+4 0 l
+stroke
+grestore
+} bind def
+72 141.943 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+-4 0 l
+stroke
+grestore
+} bind def
+518.4 141.943 o
+grestore
+gsave
+50.890625 137.403795 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /two glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+4 0 l
+stroke
+grestore
+} bind def
+72 191.314 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+-4 0 l
+stroke
+grestore
+} bind def
+518.4 191.314 o
+grestore
+gsave
+50.593750 186.775223 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /three glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+4 0 l
+stroke
+grestore
+} bind def
+72 240.686 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+-4 0 l
+stroke
+grestore
+} bind def
+518.4 240.686 o
+grestore
+gsave
+50.312500 236.146652 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /four glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+4 0 l
+stroke
+grestore
+} bind def
+72 290.057 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+-4 0 l
+stroke
+grestore
+} bind def
+518.4 290.057 o
+grestore
+gsave
+50.640625 285.518080 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /five glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+4 0 l
+stroke
+grestore
+} bind def
+72 339.429 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+-4 0 l
+stroke
+grestore
+} bind def
+518.4 339.429 o
+grestore
+gsave
+50.468750 334.889509 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /six glyphshow
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+4 0 l
+stroke
+grestore
+} bind def
+72 388.8 o
+grestore
+gsave
+/o {
+gsave
+newpath
+translate
+0 0 m
+-4 0 l
+stroke
+grestore
+} bind def
+518.4 388.8 o
+grestore
+gsave
+50.578125 384.260938 translate
+0.000000 rotate
+0.000000 0.171875 m /zero glyphshow
+7.634766 0.171875 m /period glyphshow
+11.449219 0.171875 m /seven glyphshow
+grestore
+45.312 151.5 m
+gsave
+90 rotate
+0 2.672 rmoveto
+(Pourcentage de pairs) show
+grestore
+1.000 setlinewidth
+2 setlinecap
+gsave
+72 388.8 m
+518.4 388.8 l
+stroke
+grestore
+gsave
+518.4 43.2 m
+518.4 388.8 l
+stroke
+grestore
+gsave
+72 43.2 m
+518.4 43.2 l
+stroke
+grestore
+gsave
+72 43.2 m
+72 388.8 l
+stroke
+grestore
+gsave
+79.2 307.68 m
+197.04 307.68 l
+197.04 381.6 l
+79.2 381.6 l
+79.2 307.68 l
+cl
+gsave
+1.000 setgray
+fill
+grestore
+stroke
+grestore
+0 setlinecap
+[6 6] 0 setdash
+gsave
+89.28 367.88 m
+109.44 367.88 l
+stroke
+grestore
+gsave
+125.280000 359.840000 translate
+0.000000 rotate
+/Cmr10 findfont
+14.4 scalefont
+setfont
+0.000000 3.173063 moveto
+/one glyphshow
+
+7.195312 3.173063 moveto
+/zero glyphshow
+
+/Cmr10 findfont
+10.08 scalefont
+setfont
+14.390625 9.295312 moveto
+/five glyphshow
+
+/DejaVuSerif findfont
+14.4 scalefont
+setfont
+24.034838 3.173063 moveto
+/space glyphshow
+
+28.609194 3.173063 moveto
+/p glyphshow
+
+37.821153 3.173063 moveto
+/a glyphshow
+
+46.400713 3.173063 moveto
+/i glyphshow
+
+51.003176 3.173063 moveto
+/r glyphshow
+
+57.882280 3.173063 moveto
+/s glyphshow
+
+
+grestore
+[1 3] 0 setdash
+gsave
+89.28 344.68 m
+109.44 344.68 l
+stroke
+grestore
+gsave
+125.280000 336.640000 translate
+0.000000 rotate
+/Cmr10 findfont
+14.4 scalefont
+setfont
+0.000000 3.173063 moveto
+/one glyphshow
+
+7.195312 3.173063 moveto
+/zero glyphshow
+
+/Cmr10 findfont
+10.08 scalefont
+setfont
+14.390625 9.295312 moveto
+/four glyphshow
+
+/DejaVuSerif findfont
+14.4 scalefont
+setfont
+24.034838 3.173063 moveto
+/space glyphshow
+
+28.609194 3.173063 moveto
+/p glyphshow
+
+37.821153 3.173063 moveto
+/a glyphshow
+
+46.400713 3.173063 moveto
+/i glyphshow
+
+51.003176 3.173063 moveto
+/r glyphshow
+
+57.882280 3.173063 moveto
+/s glyphshow
+
+
+grestore
+2 setlinecap
+[] 0 setdash
+gsave
+89.28 321.48 m
+109.44 321.48 l
+stroke
+grestore
+gsave
+125.280000 313.440000 translate
+0.000000 rotate
+/Cmr10 findfont
+14.4 scalefont
+setfont
+0.000000 3.173063 moveto
+/one glyphshow
+
+7.195312 3.173063 moveto
+/zero glyphshow
+
+/Cmr10 findfont
+10.08 scalefont
+setfont
+14.390625 9.295312 moveto
+/three glyphshow
+
+/DejaVuSerif findfont
+14.4 scalefont
+setfont
+24.034838 3.173063 moveto
+/space glyphshow
+
+28.609194 3.173063 moveto
+/p glyphshow
+
+37.821153 3.173063 moveto
+/a glyphshow
+
+46.400713 3.173063 moveto
+/i glyphshow
+
+51.003176 3.173063 moveto
+/r glyphshow
+
+57.882280 3.173063 moveto
+/s glyphshow
+
+
+grestore
+
+end
+showpage