"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Cette fois il s'agit de tracer des fractales, issues **des mathématiques et non de la nature** comme pour les Lsystem. \n",
"Gaston Maurice JULIA est un mathématicien du début du XX eme siècle. Il a travaillé sur les itérations de fonctions complexes. \n",
"Remarque: Il ne disposait pas alors d'ordinateur avec écran graphique pour représenter son travail ;-) \n",
"Dans les années 1970, Benoît MANDELBROT c'est intéressé aux travaux de JULIA et a inventé le terme de fractale. \n",
"Voir: https://fr.wikipedia.org/wiki/Ensemble_de_Mandelbrot\n",
"\n",
"![image](./images/julia.png)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
1/ Rappel: les équations du second degré :
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"La théorie développée par Julia est basée sur les nombres complexes. Ces derniers trouvent leur justification dans la résolution des équations du second degré : \n",
"$a.x² + b.x + c = 0$ \n",
"La résolution d'une telle équation se fait par le calcul de son discriminant : \n",
"$\\Delta = b² - 4.a.c$ \n",
"Le signe de ce dernier nous renseigne sur les solutions de l'équation: \n",
"$\\Delta > 0 \\rightarrow$ l'équation admet deux racines qui sont distinctes: $x_1 = (-b +\\sqrt \\Delta)/2.a$ et $x_2 = (-b -\\sqrt \\Delta)/2.a$ \n",
"$\\Delta = 0 \\rightarrow$ l'équation a pour solution une racine double: $x_1 = -b/2.a$ \n",
"$\\Delta < 0 \\rightarrow$ l'équation n'a pas de solution dans l'ensemble des réels: $\\mathbb{R}$ ... $\\Rightarrow$ mais peut-être dans un autre ensemble, tel que:$\\mathbb{C}$ "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"En résumé: \n",
"![image](./images/Equation2degre.png)\n",
" \n",
"$\\Rightarrow$ Écrire un script permettant à partir d'une équation donnée par l'utilisateur, de préciser si cette équation a des solutions et leurs valeurs."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"L'ensemble des solutions est {2.6666666666666665, -5.0}.\n"
]
}
],
"source": [
"'''Résolution de l'équation du 2° degré '''\n",
"\n",
"from math import sqrt\n",
"\n",
"def solve(a, b, c):\n",
" d = b**2 - 4*a*c\n",
" if d<0:\n",
" return set()\n",
" return {(-b-sqrt(d))/(2*a), (-b+sqrt(d))/(2*a)}\n",
"\n",
"a,b,c = (float(x.strip()) for x in input(\"aX² + bX + c = 0. Entrer a, b, c [format: 'a,b,c']\").split(','))\n",
"print(f\"L'ensemble des solutions est {solve(a,b,c)}.\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
2/ Au secours Valentin : c'est quoi un nombre complexe ? De quoi on parle, tu nous expliques ?
\n",
"\n",
"Introduction à l'ensemble des complexes: $\\mathbb{C}$"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"'''Les nombres complexes avec Python'''\n",
"\n",
"a = int(input('Saisir la partie réelle du nombre complexe z: '))\n",
"b = int(input('Saisir la partie imaginaire du nombre complexe z: '))\n",
"z = complex(a,b)\n",
"print(f'z = {z} \\n')\n",
"print(f'La partie réelle de z est : {z.real}')\n",
"print(f'La partie imaginaire de z est : {z.imag}i \\n')\n",
"print(f'Le module de z est : {abs(z)}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
Ce qu'il faut retenir :
\n",
"\n",
"$\\Rightarrow$ Il existe un ensemble $\\mathbb{C}$ appelé ensemble des complexes, dans lequel l'ensemble des réels $\\mathbb{R}$ est inclus \n",
"Un complexe est définit par deux nombres réels : \n",
"le premier représente la partie réel du complexe, le deuxième sa partie imaginaire à laquelle est associée à la lettre i (ou j) : $z = -2 + 3i$ ou encore $z = -2 + 3j$ \n",
"\n",
"**Propriété de l'imaginaire i** : $~i^2 = -1$ (ou encore : $~j^2 = -1$). \n",
"C'est cette dernière propriété qui permet de résoudre le cas $\\Delta < 0$ pour les équations du 2° degré : \n",
"![image](./images/DeltaNegatif.png)\n",
"\n",
"Puisque d'un nombre complexe est constitué de deux parties (partie réelle et partie imaginaire), il est tentant de lui associé un point du plan de tel sorte que : \n",
"- sa partie réelle est portée par l'axe des abscisses (Ox) \n",
"- sa partie imaginaire est portée par l'axe des ordonnées (Oy). \n",
"\n",
"Ainsi au nombre complexe $z = a + bi$ correspond le point M de coordonnées a et b : $M(a, b)$. \n",
"On dit que : **z est l'affixe du point M**. \n",
"\n",
"Application: Utiliser le logiciel ```Geogebra``` (sélectionner le mode **Tableur** => voir menu *Affichage*) pour représenter dans **le plan complexe** les points d'affixe : \n",
"$z_1 = 2 + 3i; ~ z_2 = 1; ~ z_3 = -1i = -i$ (ne pas oublier de cocher dans Géogebra : *Afficher l'objet*).\n",
"\n",
"On constate que la distance du point M (affixe de z) à l'origine est donnée par : $\\sqrt{a^2 + b^2}$. \n",
"Cette distance représente aussi le module du nombre complexe $~z = a + ib$ : \n",
"$|z| = \\sqrt{a^2 + b^2}$\n",
"\n",
"![lien](http://www.jaicompris.com/image/playvideo.png)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
3/ Compléter votre algorithme sur la résolution d'une équation du 2° degré :\n",
" => Ajouter le cas où le discriminant est négatif
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Le point maths, par Valentin\n",
"\n",
"## Théorème d'Alembert-Gauss\n",
"\n",
"Tout polynôme non constant à coefficients complexes admet une racine dans $\\mathbb{C}$.\n",
"\n",
"$\\boxed{\\forall P \\in \\mathbb{C}[X], \\deg P \\geqslant 1, \\exists z \\in \\mathbb{C} \\quad P(z) = 0}$\n",
"\n",
"On peut aussi dire que tout polynôme de $\\mathbb{C}[X]$ peut être factorisé, de la forme :\n",
"\n",
"$\\displaystyle P(X) = a_n\\prod_{k=1}^n (X - a_k)$ (où $n$ est le degré de $P$).\n",
"\n",
"Cela entraîne que la somme des multiplicités des racines distinctes d'un polynôme vaut le degré de ce polynôme.\n",
"\n",
"## Un cas particulier : $\\deg P = 2$\n",
"\n",
"Soit $P = aX^2 + bX + c$ et soit $\\Delta = b^2 - 4ac$.\n",
"\n",
"Soient $\\delta_1$ et $\\delta_2$ les deux racines carrées de $\\Delta$.\n",
"\n",
"Alors $z_1 = \\dfrac{-b-\\delta}{2a}$ et $z_2 = \\dfrac{-b+\\delta}{2a}$ vérifient $P(z_1) = 0$ et $P(z_2) = 0$\n",
"\n",
"Dans le cas où $z_1 = z_2$, on dit que $z_1$ est de multiplicité 2.\n",
"\n",
"Remarquons que $\\delta_1 + \\delta_2 = 0$.\n",
"\n",
"La fonction python sqrt du module cmath associe à un complexe $z$ une de ses deux racines carrées. Notons $\\delta$ une telle racine. Alors $\\{\\delta, -\\delta\\}$ est l'image de $z$ par la multifonction (i.e correspondance) qui à un complexe associe ses racines carrées. C'est aussi la coupe du graphe $\\{(x, y) \\in \\mathbb{C}^2 \\mid y^2 = x \\}$ suivant $\\{z\\}$. L'application $f: z \\mapsto z^2$ n'étant pas injective, la correspondance $f^{-1}$ n'est pas univoque."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{(-0.6180339887498949+0j), (1.618033988749895+0j)}"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"'''Résolution d'une équation du second degré dans l'ensemble des complexes'''\n",
"\n",
"from cmath import sqrt\n",
"\n",
"def solve(a, b, c):\n",
" d = b**2 - 4*a*c\n",
" return {(-b-sqrt(d))/(2*a), (-b+sqrt(d))/(2*a)}\n",
"\n",
"solve(1, -1, -1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
4/ Les suites de Julia :
\n",
"\n",
"Une **suite d'éléments de $E$** est une application de $\\mathbb{N}$ dans $E$. Ces suites sont soit définies explicitement, soit définies par récurrence.\n",
"Exemple: $u_{n+1} = u_n * 2 + 3$. On suppose ici que le terme initial est: $u_0 = 1$ :\n",
"- $u_0 = 1$\n",
"- $u_1 = 5$\n",
"- $u_2 = 13$\n",
"- ... \n",
"\n",
"Le calcul d'un terme n d'une suite, avec n très grand, peut-être long et fastidieux. \n",
"$\\Rightarrow$ La technologie numérique et les ordinateurs s'avèrent d'une grande aide pour le calcul des suites. \n",
"- Exemple 1 : La suite de Fibonacci, déjà rencontrée en exercice, pour laquelle l'élément $u_n$ dépend de $u_{n-1}$ et $u_{n-2}$ \n",
"$\\Rightarrow ~f_0 = 0; ~ f_1 = 1 ~~ \\Rightarrow ~ f_n = f_{n-1} + f_{n-2}$ \n",
"\n",
"- Exemple 2 : avec le programme du calcul du Lsystem : \n",
"$\\Rightarrow$ Voir le code ci-dessous : **mettre en évidence** la ligne permettant le ***calcul de la suite*** des termes du Lsystem: à l'aide d'un commentaire."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"ordre 0 => A\n",
"ordre 1 => AB\n",
"ordre 2 => ABA\n",
"ordre 3 => ABAAB\n",
"ordre 4 => ABAABABA\n"
]
}
],
"source": [
"def codage_lSystem(chaine: str, ordre: int) -> str:\n",
" \"\"\"\n",
" Prends en entrée une chaîne initiale (l'axiome) et l'ordre souhaité\n",
" Retourne la chaîne obtenue après n applications du L-system\n",
" \"\"\"\n",
" for n in range(ordre): # Itérer le lSystem jusqu'à l'ordre n\n",
" chaine = lSystem_convert(chaine)\n",
" return chaine\n",
"\n",
"def lSystem_convert(chaine: str) -> str:\n",
" \"\"\"\n",
" Prends en entrée une chaîne de caractères\n",
" Retourne la chaîne obtenue après application des règles du L-System\n",
" \"\"\"\n",
" rules = {'A': 'AB', 'B': 'A'} # A compléter : règles\n",
" return ''.join([rules[car] for car in chaine ]) \n",
"\n",
"axiome = 'A'\n",
"for k in range (5): # Pour affichage des générations jusqu'à l'ordre n\n",
" print(f'ordre {k} => {codage_lSystem(axiome, k)}')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
5/ Les ensembles de Julia :
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Un ensemble de Julia $J(c)$ est défini à partir d'une suite ```complexe```, et consiste à voir si la suite $u_n$ \"s'échappe\" d'un domaine donné, lorsque n augmente. \n",
"Exemple : on considère la suite de Julia telle que: \n",
"- $u_0 = z$\n",
"- $u_{n+1} = u_n ^2 + c$ \n",
"\n",
"Dans laquelle $~z~$ et $~c~$ sont des nombres complexes : $~~z = a + bi~~$ et $~~c = p + qi$ , avec : \n",
"- $~z~\\Rightarrow$ qui représente la valeur initiale de la suite $u_0$ ;\n",
"- $~c~\\Rightarrow$ un paramètre (sous forme *complexe*) de la suite de Julia.\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"u0 = 0.0 + 0.0 i\n",
"(-0.5+0.6j)\n",
"(-0.61+0j)\n",
"(-0.1279+0.6j)\n",
"(-0.84364159+0.44652j)\n",
"(0.012351021977728305-0.1534056855336j)\n",
"(-0.5233807566101395+0.596210566012932j)\n",
"(-0.5815396226356586-0.024090274277615786j)\n",
"(-0.1623920086195465+0.6280188980251884j)\n",
"(-0.8680365718132812+0.396029499397311j)\n",
"(0.09664812561246894-0.08753617798754354j)\n",
"(-0.49832172227226335+0.5830795849484489j)\n",
"(-0.5916572634952607+0.018877554013384867j)\n",
"(-0.1502980445988279+0.5776619161019134j)\n",
"(-0.8111037871043028+0.42635708714134046j)\n",
"(-0.02389101230070656-0.091639696078201j)\n",
"(-0.5078270534285525+0.6043787302124746j)\n",
"(-0.6073853333393171-0.013839739437382148j)\n",
"(-0.13127459523198132+0.6168121095030072j)\n",
"(-0.8632241590762293+0.43805647998161634j)\n",
"(0.05326246915897892-0.1562818731200477j)\n"
]
}
],
"source": [
"def suiteJulia(z: complex, c: complex) -> complex :\n",
" \"\"\"\n",
" Calcul de la suite de Julia: \n",
" En entrée: z et c sont des complexes.\n",
" Retourne un complexe.\n",
" \"\"\"\n",
" u = z\n",
" print(f'u0 = {(u.real)} + {(u.imag)} i')\n",
" for i in range (20):\n",
" u = u **2 + c\n",
" print(u)\n",
"\n",
"z = complex(0, 0)\n",
"suiteJulia(z, complex(-0.5, 0.6))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
6/ Analyse et exploitation des résultats :
\n",
"
61/ Mise en place des points dans le plan complexe : => avec Geogebra :
\n",
"\n",
"Examiner les valeurs obtenues en retour à l’exécution du code précédent. \n",
"Utiliser le logiciel ```Géogebra``` pour placer directement dans le *plan complexe*, les points obtenus : => tester tout d'abord pour un point, saisie en mode tableur et sans oublier de cocher \"Afficher l'objet\". \n",
"***Remarque*** : *Le mode tableur de ```Géogebra``` accepte de charger des points à partir d'un fichier, .dat par exemple (clic droit).* \n",
"**Cependant cette fonctionnalité dépend de la version de ```Géogebra``` à votre disposition:** *si votre version ne propose pas cette fonctionnalité, vous pouvez réaliser cette partie avec : Matplotlib*. \n",
"**Remarque** : Matplolib est moins adapté, puisqu'il vous faudra vous même mettre en place les points dans le plan complexe, à l'aide de leur partie réelle et partie imaginaire. \n",
"\n",
"Afin de pouvoir charger les points à partir d'un fichier, il faut adapter le code ci-dessus afin d'enregistrer les points dans un fichier ```Julia.dat``` et transformer le type ```complex``` de Python pour l'adapter au type reconnu par ```Géogebra``` : \n",
"$~a+bj \\Rightarrow a+bi~$. \n",
"A voir : l'exercice sur le tracé d'une spirale dans les activités de révision et aussi [ici](https://python.doctor/page-lire-ecrire-creer-fichier-python \"python.doctor: lire ecrire dans un fichier\")."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0j"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\" Saisir ici le code précédent, adapté pour générer un fichier : Julia.dat => et l'importer dans Géogebra \"\n",
"\n",
"def suiteJuliaFichier(z: complex, c: complex) -> complex :\n",
" \"\"\"\n",
" Calcul de la suite de Julia: \n",
" En entrée: z et c sont des complexes.\n",
" Retourne un complexe.\n",
" \"\"\"\n",
" with open('Julia.dat', 'w') as file:\n",
" u = z\n",
" print(f'u_0 = {(u.real)} + {(u.imag)} i', file=file)\n",
" for i in range (20):\n",
" u = u **2 + c\n",
" print(f'u_{i+1} = {(u.real)} + {(u.imag)} i', file=file)\n",
" return z\n",
"z = complex(0, 0)\n",
"suiteJuliaFichier(z, complex(-0.5, 0.6))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
=> avec Matplotlib :
\n",
"\n",
"Pour représenter les points avec Matplotlib, il vous faut extraire la partie réel et la partie imaginaire des résultats renvoyé par la fonction ```suiteJulia()```. \n",
"**=> Compléter le code suivant :**"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"u0 = 0.0 + 0.0 i\n"
]
},
{
"data": {
"image/png": "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oqqqKvr27RtHHnlkzJ49OzZs2BA///nPIyLixz/+cZSXl8enP/3p2LFjR9x2223xyCOPxH//93/nc5oAAAAtlteIevbZZ+Pkk09uuD9r1qyIiLjgggtiwYIFUV1dHevXr294fOfOnXHFFVfEhg0bolevXvGZz3wmHn744UbPAQAA0J4KsizL2nsSram2tjZKSkoil8tFcXFxe08HAABoJ/lqg4N+YQkAAICDiYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIkNeIevzxx2Py5MkxcODAKCgoiAceeGC/+yxdujRGjRoVhYWFceyxx8aCBQvyOUUAAIAkeY2o7du3x/Dhw+Omm25q0fh169bFGWecESeffHJUVVXF5ZdfHl/72tfi97//fT6nCQAA0GKH5PPJTzvttDjttNNaPH7+/PlRXl4e119/fUREfOpTn4onnngibrjhhpg4cWK+pgkAANBiB9V7oiorK2PChAmNtk2cODEqKyv3uU9dXV3U1tY2ugEAAOTLQRVRNTU1MWDAgEbbBgwYELW1tfHuu+82uc+8efOipKSk4TZo0KC2mCoAANBFHVQR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xBFHHBHDhg2L2bNnxzvvvJOvaQIAACTJ25mompqa6N+/f+MXO+SQ6Nu3b9TU1Oxzvy9/+ctx1FFHxcCBA+P555+P7373u7FmzZq47777mhxfV1cXdXV1Dfdra2tb5wsAAABoQnJEXXnllXHNNdc0O+all1464AldfPHFDf/7uOOOi7KysjjllFPilVdeiWOOOWav8fPmzYu5c+ce8OsBAACkSI6oK664Ii688MJmxxx99NFRWloamzZtarT9L3/5S2zevDnp/U5jx46NiIi1a9c2GVGzZ8+OWbNmNdyvra2NQYMGtfj5AQAAUiRHVL9+/aJfv377HVdRURFbtmyJFStWxOjRoyMi4pFHHon6+vqGMGqJqqqqiIgoKytr8vHCwsIoLCxs8fMBAAB8GHlbWOJTn/pUTJo0KaZPnx7Lly+PJ598Mi699NI499xzG1bm27BhQwwZMiSWL18eERGvvPJKfP/7348VK1bEq6++Gr/5zW9i6tSpceKJJ8ZnPvOZfE0VAACgxfL6Ybu/+MUvYsiQIXHKKafE6aefHp///Ofj1ltvbXh8165dsWbNmobV93r27BkPP/xwnHrqqTFkyJC44oor4qyzzoqFCxfmc5oAAAAtVpBlWdbek2hNtbW1UVJSErlcLoqLi9t7OgAAQDvJVxvk9UwUAABAZyOiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASJC3iPrBD34Q48aNi169ekWfPn1atE+WZXH11VdHWVlZHHrooTFhwoT4wx/+kK8pAgAAJMtbRO3cuTPOPvvsmDFjRov3ufbaa+MnP/lJzJ8/P5YtWxYf+chHYuLEibFjx458TRMAACBJQZZlWT5fYMGCBXH55ZfHli1bmh2XZVkMHDgwrrjiivjWt74VERG5XC4GDBgQCxYsiHPPPbdFr1dbWxslJSWRy+WiuLj4w04fAADooPLVBgfNe6LWrVsXNTU1MWHChIZtJSUlMXbs2KisrGzHmQEAAPzVIe09gT1qamoiImLAgAGNtg8YMKDhsabU1dVFXV1dw/3a2tr8TBAAACASz0RdeeWVUVBQ0Ozt5ZdfztdcmzRv3rwoKSlpuA0aNKhNXx8AAOhaks5EXXHFFXHhhRc2O+boo48+oImUlpZGRMTGjRujrKysYfvGjRtjxIgR+9xv9uzZMWvWrIb7tbW1QgoAAMibpIjq169f9OvXLy8TKS8vj9LS0liyZElDNNXW1sayZcuaXeGvsLAwCgsL8zInAACAD8rbwhLr16+PqqqqWL9+fezevTuqqqqiqqoqtm3b1jBmyJAhcf/990dEREFBQVx++eXxL//yL/Gb3/wmXnjhhZg6dWoMHDgwpkyZkq9pAgAAJMnbwhJXX3113HnnnQ33R44cGRERjz76aIwfPz4iItasWRO5XK5hzHe+853Yvn17XHzxxbFly5b4/Oc/H4sWLYqioqJ8TRMAACBJ3j8nqq35nCgAACCiC3xOFAAAQEcgogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABLkLaJ+8IMfxLhx46JXr17Rp0+fFu1z4YUXRkFBQaPbpEmT8jVFAACAZIfk64l37twZZ599dlRUVMS///u/t3i/SZMmxR133NFwv7CwMB/TAwAAOCB5i6i5c+dGRMSCBQuS9issLIzS0tI8zAgAAODDO+jeE7V06dLo379/DB48OGbMmBFvv/12s+Pr6uqitra20Q0AACBfDqqImjRpUvz85z+PJUuWxDXXXBOPPfZYnHbaabF79+597jNv3rwoKSlpuA0aNKgNZwwAAHQ1SRF15ZVX7rXwwwdvL7/88gFP5txzz40vfvGLcdxxx8WUKVPioYceimeeeSaWLl26z31mz54duVyu4fb6668f8OsDAADsT9J7oq644oq48MILmx1z9NFHf5j57PVcRxxxRKxduzZOOeWUJscUFhZafAIAAGgzSRHVr1+/6NevX77mspc33ngj3n777SgrK2uz1wQAAGhO3t4TtX79+qiqqor169fH7t27o6qqKqqqqmLbtm0NY4YMGRL3339/RERs27Ytvv3tb8fTTz8dr776aixZsiTOPPPMOPbYY2PixIn5miYAAECSvC1xfvXVV8edd97ZcH/kyJEREfHoo4/G+PHjIyJizZo1kcvlIiKie/fu8fzzz8edd94ZW7ZsiYEDB8app54a3//+912uBwAAHDQKsizL2nsSram2tjZKSkoil8tFcXFxe08HAABoJ/lqg4NqiXMAAICDnYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABIIKIAAAASiCgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAgQd4i6tVXX41p06ZFeXl5HHrooXHMMcfEnDlzYufOnc3ut2PHjpg5c2Ycfvjhcdhhh8VZZ50VGzduzNc0AQAAkuQtol5++eWor6+PW265JV588cW44YYbYv78+XHVVVc1u983v/nNWLhwYdx7773x2GOPxZtvvhlf+tKX8jVNAACAJAVZlmVt9WI//OEP4+abb44//vGPTT6ey+WiX79+cffdd8ff//3fR8R7MfapT30qKisr44QTTtjva9TW1kZJSUnkcrkoLi5u1fkDAAAdR77a4JBWe6YWyOVy0bdv330+vmLFiti1a1dMmDChYduQIUPiyCOP3GdE1dXVRV1dXaPXiHjvGwYAAHRde5qgtc8btVlErV27Nm688ca47rrr9jmmpqYmevbsGX369Gm0fcCAAVFTU9PkPvPmzYu5c+futX3QoEEfar4AAEDn8Pbbb0dJSUmrPV9yRF155ZVxzTXXNDvmpZdeiiFDhjTc37BhQ0yaNCnOPvvsmD59evosmzF79uyYNWtWw/0tW7bEUUcdFevXr2/VbxQtV1tbG4MGDYrXX3/dJZXtxDFof45B+3MM2p9j0P4cg/bl+9/+crlcHHnkkc1eDXcgkiPqiiuuiAsvvLDZMUcffXTD/37zzTfj5JNPjnHjxsWtt97a7H6lpaWx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nom68sorm3zj3ftvH/xHesOGDTFp0qQ4++yzY/r06e00887jQI5BinPPPTe++MUvxnHHHRdTpkyJhx56KJ555plYunRp630RHVy+jwH7l+9jcPHFF8fEiRPjuOOOi/PPPz9+/vOfx/333x+vvPJKK34VcHCoqKiIqVOnxogRI+Kkk06K++67L/r16xe33HJLe08N2sTgwYPj61//eowePTrGjRsXt99+e4wbNy5uuOGG9p5ahzdz5sxYtWpV/OpXv2qT1ztoz0RdccUVceGFFzY75uijj27432+++WacfPLJMW7cuLj11lub3a+0tDR27twZW7ZsaXQ2auPGjVFaWvphpt2ppB6DD+voo4+OI444ItauXRunnHJKqz1vR5bPY7DnZ33jxo1RVlbWsH3jxo0xYsSIA3rOzqilx6C0tHSvN9P/5S9/ic2bNyf9uzJ27NiIeO+s+jHHHJM8367iiCOOiO7du++1qmpz/46XlpYmjad5B3IMPqhHjx4xcuTIWLt2bT6myAfs63eguLjYWah2NGbMmHjiiSfaexod2qWXXtqwoNP+zmq31t+Cgzai+vXrF/369WvR2A0bNsTJJ58co0ePjjvuuCO6dWv+BNvo0aOjR48esWTJkjjrrLMi4r1VUtavXx8VFRUfeu6dRcoxaA1vvPFGvP32243+g76ry+cxKC8vj9LS0liyZElDNNXW1sayZcuSV1nszFp6DCoqKmLLli2xYsWKGD16dEREPPLII1FfX98QRi1RVVUVEeH3YD969uwZo0ePjiVLlsSUKVMi4r1LOZYsWRKXXnppk/tUVFTEkiVL4vLLL2/YtnjxYv/uH6ADOQYftHv37njhhRfi9NNPz+NM2aOiomKvpZz9DrS/qqoq/+YfoCzL4hvf+Ebcf//9sXTp0igvL9/vPq32t+BAVr44mLzxxhvZsccem51yyinZG2+8kVVXVzfc3j9m8ODB2bJlyxq2XXLJJdmRRx6ZPfLII9mzzz6bVVRUZBUVFe3xJXQKr732Wvbcc89lc+fOzQ477LDsueeey5577rls69atDWMGDx6c3XfffVmWZdnWrVuzb33rW1llZWW2bt267OGHH85GjRqVffKTn8x27NjRXl9Gh5Z6DLIsy/71X/8169OnT/bggw9mzz//fHbmmWdm5eXl2bvvvtseX0KHN2nSpGzkyJHZsmXLsieeeCL75Cc/mZ133nkNj3/w36K1a9dm3/ve97Jnn302W7duXfbggw9mRx99dHbiiSe215fQofzqV7/KCgsLswULFmSrV6/OLr744qxPnz5ZTU1NlmVZ9tWvfjW78sorG8Y/+eST2SGHHJJdd9112UsvvZTNmTMn69GjR/bCCy+015fQ4aUeg7lz52a///3vs1deeSVbsWJFdu6552ZFRUXZiy++2F5fQoe2devWhn/rIyL70Y9+lD333HPZa6+9lmVZll155ZXZV7/61Ybxf/zjH7NevXpl3/72t7OXXnopu+mmm7Lu3btnixYtaq8vocNLPQY33HBD9sADD2R/+MMfshdeeCG77LLLsm7dumUPP/xwe30JHdqMGTOykpKSbOnSpY0a4J133mkYk6+/BR0+ou64444sIpq87bFu3bosIrJHH320Ydu7776b/eM//mP20Y9+NOvVq1f2d3/3d43CizQXXHBBk8fg/d/ziMjuuOOOLMuy7J133slOPfXUrF+/flmPHj2yo446Kps+fXrDH17SpR6DLHtvmfN/+qd/ygYMGJAVFhZmp5xySrZmzZq2n3wn8fbbb2fnnXdedthhh2XFxcXZRRdd1ChiP/hv0fr167MTTzwx69u3b1ZYWJgde+yx2be//e0sl8u101fQ8dx4443ZkUcemfXs2TMbM2ZM9vTTTzc8dtJJJ2UXXHBBo/G//vWvs7/5m7/JevbsmX3605/Ofvvb37bxjDuflGNw+eWXN4wdMGBAdvrpp2crV65sh1l3DnuWy/7gbc/3/IILLshOOumkvfYZMWJE1rNnz+zoo49u9DeBdKnH4JprrsmOOeaYrKioKOvbt282fvz47JFHHmmfyXcC+2qA9/9c5+tvQcH/TgAAAIAWOGhX5wMAADgYiSgAAIAEIgoAACCBiAIAAEggogAAABKIKAAAgAQiCgAAIIGIAgAASCCiAAAAEogoAACABCIKAAAggYgCAABI8P8DHNixtVLaByAAAAAASUVORK5CYII=",
"text/plain": [
"