From f6d545059f789fff5d1f51cf9f0b36dc1f98913a Mon Sep 17 00:00:00 2001 From: Alexis Fourmaux Date: Wed, 10 Sep 2025 16:37:35 +0200 Subject: [PATCH] =?UTF-8?q?Extrait=20le=20tuto=20VSCode=20dans=20un=20fich?= =?UTF-8?q?ier=20=C3=A0=20part?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CIEL1/01-bases-python/annexes/anglais.md | 26 +++ .../{tp => annexes/images}/image-10.png | Bin .../{tp => annexes/images}/image-11.png | Bin .../{tp => annexes/images}/image-3.png | Bin .../{tp => annexes/images}/image-4.png | Bin .../{tp => annexes/images}/image-5.png | Bin .../{tp => annexes/images}/image-6.png | Bin .../{tp => annexes/images}/image-7.png | Bin .../{tp => annexes/images}/image-8.png | Bin .../{tp => annexes/images}/image-9.png | Bin .../annexes/images/image-saved.png | Bin 0 -> 2200 bytes .../01-bases-python/annexes/images/image.png | Bin 0 -> 2336 bytes .../CIEL1/01-bases-python/annexes/vscode.md | 89 +++++++++ .../cours/python-bases-3-fonctions.md | 23 +-- .../CIEL1/01-bases-python/tp/01_decouverte.md | 1 - .../CIEL1/01-bases-python/tp/02_fonctions.md | 2 +- .../01-bases-python/tp/TP_MDP02_fonctions.md | 178 ++++++++++++++++++ .../CIEL1/01-bases-python/tp/image-1.png | Bin 15058 -> 0 bytes .../CIEL1/01-bases-python/tp/image-2.png | Bin 15984 -> 0 bytes src/cours/SUMMARY.md | 2 + 20 files changed, 297 insertions(+), 24 deletions(-) create mode 100644 src/cours/CIEL1/01-bases-python/annexes/anglais.md rename src/cours/CIEL1/01-bases-python/{tp => annexes/images}/image-10.png (100%) rename src/cours/CIEL1/01-bases-python/{tp => annexes/images}/image-11.png (100%) rename src/cours/CIEL1/01-bases-python/{tp => annexes/images}/image-3.png (100%) rename src/cours/CIEL1/01-bases-python/{tp => annexes/images}/image-4.png (100%) rename src/cours/CIEL1/01-bases-python/{tp => annexes/images}/image-5.png (100%) rename src/cours/CIEL1/01-bases-python/{tp => annexes/images}/image-6.png (100%) rename src/cours/CIEL1/01-bases-python/{tp => annexes/images}/image-7.png (100%) rename src/cours/CIEL1/01-bases-python/{tp => annexes/images}/image-8.png (100%) rename src/cours/CIEL1/01-bases-python/{tp => annexes/images}/image-9.png (100%) create mode 100644 src/cours/CIEL1/01-bases-python/annexes/images/image-saved.png create mode 100644 src/cours/CIEL1/01-bases-python/annexes/images/image.png create mode 100644 src/cours/CIEL1/01-bases-python/annexes/vscode.md delete mode 100644 src/cours/CIEL1/01-bases-python/tp/01_decouverte.md create mode 100644 src/cours/CIEL1/01-bases-python/tp/TP_MDP02_fonctions.md delete mode 100644 src/cours/CIEL1/01-bases-python/tp/image-1.png delete mode 100644 src/cours/CIEL1/01-bases-python/tp/image-2.png diff --git a/src/cours/CIEL1/01-bases-python/annexes/anglais.md b/src/cours/CIEL1/01-bases-python/annexes/anglais.md new file mode 100644 index 0000000..20006ef --- /dev/null +++ b/src/cours/CIEL1/01-bases-python/annexes/anglais.md @@ -0,0 +1,26 @@ +# Anglais - Vocabulaire de la programmation + +|Français|Anglais| +|--------|-------| +|Interpréteur|Interpreter| +|Invite de commande|Command prompt| +|Opérateur|Operator| +|Fonction|Function| +|Racine carrée|Square root| +|Affecter une variable|Assign a variable| +|Sensible à la casse|Case sensitive| +|Majuscules|Uppercase| +|Minuscules|Lowercase| +|Mot-clé|Keyword| +|Mot-clé réservé|Reserved keyword| +|Typage dynamique|Dynamic typing| +|Chaîne de caractères|String| +|Chaîne de caractères formatée|Formatted string| +|Boucle|Loop| +|Appeler une fonction|Call a function| +|Virgule|Comma| +|Deux points `:`|Colon| +|Point virgule `;`|Semi-colon| +|Parenthèses `()`|Brackets| +|Crochets `[]`|Square brackets| +|Accolades `{}`|Curly brackets| \ No newline at end of file diff --git a/src/cours/CIEL1/01-bases-python/tp/image-10.png b/src/cours/CIEL1/01-bases-python/annexes/images/image-10.png similarity index 100% rename from src/cours/CIEL1/01-bases-python/tp/image-10.png rename to src/cours/CIEL1/01-bases-python/annexes/images/image-10.png diff --git a/src/cours/CIEL1/01-bases-python/tp/image-11.png b/src/cours/CIEL1/01-bases-python/annexes/images/image-11.png similarity index 100% rename from src/cours/CIEL1/01-bases-python/tp/image-11.png rename to src/cours/CIEL1/01-bases-python/annexes/images/image-11.png diff --git a/src/cours/CIEL1/01-bases-python/tp/image-3.png b/src/cours/CIEL1/01-bases-python/annexes/images/image-3.png similarity index 100% rename from src/cours/CIEL1/01-bases-python/tp/image-3.png rename to src/cours/CIEL1/01-bases-python/annexes/images/image-3.png diff --git a/src/cours/CIEL1/01-bases-python/tp/image-4.png b/src/cours/CIEL1/01-bases-python/annexes/images/image-4.png similarity index 100% rename from src/cours/CIEL1/01-bases-python/tp/image-4.png rename to src/cours/CIEL1/01-bases-python/annexes/images/image-4.png diff --git a/src/cours/CIEL1/01-bases-python/tp/image-5.png b/src/cours/CIEL1/01-bases-python/annexes/images/image-5.png similarity index 100% rename from src/cours/CIEL1/01-bases-python/tp/image-5.png rename to src/cours/CIEL1/01-bases-python/annexes/images/image-5.png diff --git a/src/cours/CIEL1/01-bases-python/tp/image-6.png b/src/cours/CIEL1/01-bases-python/annexes/images/image-6.png similarity index 100% rename from src/cours/CIEL1/01-bases-python/tp/image-6.png rename to src/cours/CIEL1/01-bases-python/annexes/images/image-6.png diff --git a/src/cours/CIEL1/01-bases-python/tp/image-7.png b/src/cours/CIEL1/01-bases-python/annexes/images/image-7.png similarity index 100% rename from src/cours/CIEL1/01-bases-python/tp/image-7.png rename to src/cours/CIEL1/01-bases-python/annexes/images/image-7.png diff --git a/src/cours/CIEL1/01-bases-python/tp/image-8.png b/src/cours/CIEL1/01-bases-python/annexes/images/image-8.png similarity index 100% rename from src/cours/CIEL1/01-bases-python/tp/image-8.png rename to src/cours/CIEL1/01-bases-python/annexes/images/image-8.png diff --git a/src/cours/CIEL1/01-bases-python/tp/image-9.png b/src/cours/CIEL1/01-bases-python/annexes/images/image-9.png similarity index 100% rename from src/cours/CIEL1/01-bases-python/tp/image-9.png rename to src/cours/CIEL1/01-bases-python/annexes/images/image-9.png diff --git a/src/cours/CIEL1/01-bases-python/annexes/images/image-saved.png b/src/cours/CIEL1/01-bases-python/annexes/images/image-saved.png new file mode 100644 index 0000000000000000000000000000000000000000..8c78ee3dadde6413125ef78017f080b740c05b2a GIT binary patch literal 2200 zcmbVOXH?T$68{rv77!(LgMvu!(h=z;R26AT5CM_iTR^%qrG?v(Fw?;?eHDUnTJYS(3mi8^o024? zIdh*(dSH4VjUcVCO-6{nds3_k7GqdqSjdXMz z8lyWeG0FM)JtD19sfrZ&gOm1xXPbV3fr$%#39^cg@_qf%blOG$TXL}o_6h)S7U{C3 z_1A*LTGflHh%Aac={Yb^oT)&ULB+dr(;OIs2h9c?i3iTTzva>Nmf*@s_jJa4Z{3~6 z&F#|-+D1Q>u8TkDbdxtlT}vy2NOJpsas1X5ca7iuD@rE^ioC}WfM?KO*1I7LJ>Prc zZ+GK<>i(A?ZAwPQ)OK>ClZ{+HL2l%OX;mT4B(z=C#5rV_S+5vo*P+(1jh(L@wb>IU zN?;e@W1BP6ctb1)guLTc-SQ_2j~QSvF%x)Z}%079merGxH<_ z&HAgA$zsdbpFjXY$}52o6Ve~bGW1eA_RUIKZoO6^p5|U76QaSd_^L@#&+q?PD||ax zf~&N{O>Qs>0Iygi>O<)9t^Ycz~Ob@G(-j|Rada%yupQj(hP+n^~mCK?Q6HNCuFG&PS<#^WyJs{9qG-$@CpWwT}K)87x-@ z;o@QD8$%;Nwkgm~!bXcM8KqO`Z|VAcx>O? z$e%ZReV|3l4Ix$*MIQUOe~PzMZFwcs=vsxKHqR_jWrH{xTW*;#F14I5akg10NW zF1xb*S%3G^h;1c^$1|LiWA@^hv91ch5;Mk&g#YJM%3X=Y7|FqVnAGuG@!8=k%=PQe5a_ zh@-0F!59-QS)iGo-mr2rs&EO9WF63hGpe;5ks4KN-VCtD&xZ-4hu!8#M8A<0SdmfBY!VrqtIV6u$POq>29-?b z{8H+cR`rgxNBYzu>Qz5<=2d6AGlut9{^WUHn;B1Pu^p@w2eLwu8*?>=A855ud8tR; zJy*{TqNi_+%j$y_{c5t1kvcGD5J9sT?EwLpduD0GXZI{KlLq*QNIZ0TuWQrbFZRyr z=3%^rThDh!Ge>ZfGa@&!GnR)5oN7WGFZ6rICSWBrd57bL>#$_Y6LpE5gct_?N;n$m z6yo_#h17)A%=?&?mX}JnnEVVE3f8#z`I<%_W!OOS7O5&V6UELoCGBasia19|LTGK+laH3g5e)cp!z?P)4JtOD^IZ{K_ z*Wysi1G*{Y!%?T*DHvT#R%xfezMZ(^K@ns50}jb^Goxi=@;jxK7EOEKY6P8@x7`dT zx|L_o^Sl}LJiMfSB?{3_27vQp$Y$@hwrzVk*weC$mN;Q>&Juzr@pJ*K@$Ezpot=={~mNCyS%0Ao6 z$Q#DT=5?&_!_|Ez-!0$n&}`{(E9_fC2l=!STV*8(pACi?rqrdla-#`CBjMZ zt>r0GcGXD}k2lKKwGQF0A1lr(eIF%MsjC@owMm@YQ;*!^i-54?EBy-(5C<1X_levqGMN5Ji~2P&NLO< l{{y@xPDeF(cG_m0g9Jbq3&SC+6SN-(0M$3wtJQIg`xl~*I*$MV literal 0 HcmV?d00001 diff --git a/src/cours/CIEL1/01-bases-python/annexes/images/image.png b/src/cours/CIEL1/01-bases-python/annexes/images/image.png new file mode 100644 index 0000000000000000000000000000000000000000..d24100b4049f145a966a84319f65a44b93e184bc GIT binary patch literal 2336 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 literal 0 HcmV?d00001 diff --git a/src/cours/CIEL1/01-bases-python/annexes/vscode.md b/src/cours/CIEL1/01-bases-python/annexes/vscode.md new file mode 100644 index 0000000..2e38dc5 --- /dev/null +++ b/src/cours/CIEL1/01-bases-python/annexes/vscode.md @@ -0,0 +1,89 @@ +# Utilisation de Visual Studio Code + +Visual studio code est un éditeur de texte. Il en existe de nombreux, mais celui-ci est devenu courant dans l'industrie et s'adapte à de nombreux cas d'usage. + +Ce document regroupe des informations pour vous aider à prendre en main VSCode. + +## Mise en route + +Lancez Visual Studio Code depuis le menu démarrer de votre machine. Vous verrez une interface comme ci-dessous. Sur la capture d'écran, les sections dont vous aurez besoin en TP sont indiquées par des flèches. + +![alt text](./images/image-3.png) + +![alt text](./images/image-8.png) + + +### Ouvrir un répertoire + +Créez un sous-répertoire dans votre espace personnel, sous `projets/python/nom_du_tp/` et selectionnez-le. Cochez la case et cliquez sur `Yes, I trust the authors` si la fenêtre ci-dessous s'ouvre. + ![alt text](./images/image-4.png) + +```admonish tip title="Astuce" +L'explorateur de VSCode montre le contenu de votre répertoire de travail. Mais vous l'avez toujours sous les yeux, ce qui est bien plus pratique pour jongler entre de nombreux fichiers. +``` + +### Extension Python + +Vérifiez dans le menu extensions que l'extension Python proposée par Microsoft soit bien installée. Sinon, recherchez-la dans la barre de recherche du menu des extensions et installez-la. + +![alt text](./images/image-6.png) + +Cette extension vous permettra d'avoir une coloration syntaxique ainsi que des suggestions pour écrire le code qui vous seront très utiles. Elle vous permettra aussi de détecter des erreurs de syntaxe, ce qui pourra vous permettre de progresser plus vite. + +### Terminal + +Ouvrez le menu `Terminal`, et cliquez sur `Nouveau terminal`. Vous verrez apparaître un volet en bas avec un terminal prêt à l'emploi. + +![alt text](./images/image-7.png) + +Ce terminal vous permettra de saisir des commandes systèmes. + +### Python en mode interactif +Dans le terminal, tapez la commande `python`. Vous verrez apparaître l'invite de commande de l'interpréteur python. Vous pourrez l'utiliser pour essayer des commandes python au cours du TP. + +En attendant, essayez de taper `print("Hello, World!")` dans l'interpréteur pour vérifier que tout fonctionne. + +![alt text](./images/image-9.png) + +```admonish warning title="Attention" +Il faut bien distinguer le terminal système de la console Python. + +- Le terminal système a une invite qui commence par PS (pour PowerShell, sous windows) ou qui contient votre nom (sous linux) +- La console Python permet de taper du code Python directement. Son invite commence par `>>>` + +Visual studio code va parfois essayer de lancer des commandes dans le premier terminal à sa disposition, sans faire attention s'il s'agit d'une console Python. Vous verrez alors des erreurs. + +**Vérifiez toujours d'être dans le bon type de terminal**. Dans le doute, fermez-les et laissez VSCode ouvrir ce dont il a besoin. +``` + +### Exécuter un script Python + +Dans l'explorateur, faites un clic droit et créez un nouveau fichier que vous appellerez `main.py` (ou tout autre nom plus adapté, en évitant les espaces et les majuscules). Dans ce fichier, ajoutez la ligne `print("Hello, World!")`. + +![alt text](./images/image-5.png) + +#### 1e méthode : ligne de commande +Dans un nouveau terminal (vous pouvez cliquer sur le petit + en haut à droite du volet terminal actuel) tapez `python main.py`. Vous devriez voir s'afficher `Hello, World!` dans le terminal. + ![alt text](./images/image-10.png) + +#### 2e méthode : via l'interface VSCode +Cliquez maintenant sur le triangle en haut à droite de votre fichier. Vous devriez voir un nouveau terminal s'ouvrir et votre script sera exécuté. + +![alt text](./images/image-11.png) + +Remarquez que dans ce second cas, VSCode utilise des chemins absolus (depuis `C:/`). + + +### Sauvegarder un fichier + +Pour sauvegarder un fichier n'oubliez pas d'appuyer sur Ctrl+S régulièrement. + +Vous pouvez aussi faire `Fichier > Sauvegarder` (ou `File > Save` si l'interface est en anglais) dans le menu. + +Pour savoir si un fichier a des modifications en cours, regardez son onglet : + +Modifications en attente (on a un rond plein à droite): +![alt text](images/image.png) + +Tout est correctement sauvegardé (on a une croix à droite): +![alt text](images/image-saved.png) \ No newline at end of file diff --git a/src/cours/CIEL1/01-bases-python/cours/python-bases-3-fonctions.md b/src/cours/CIEL1/01-bases-python/cours/python-bases-3-fonctions.md index 360a9c3..658d4bc 100644 --- a/src/cours/CIEL1/01-bases-python/cours/python-bases-3-fonctions.md +++ b/src/cours/CIEL1/01-bases-python/cours/python-bases-3-fonctions.md @@ -180,25 +180,4 @@ def add(a, b): """ # Bloc d'instructions return True - ``` - - -# Annexes - -## Un petit peu d'anglais - -|Français|Anglais| -|--------|-------| -|Interpréteur|Interpreter| -|Invite de commande|Command prompt| -|Opérateur|Operator| -|Fonction|Function| -|Racine carrée|Square root| -|Affecter une variable|Assign a variable| -|Sensible à la casse|Case sensitive| -|Mot-clé|Keyword| -|Mot clé réservé|Reserved keyword| -|Typage dynamique|Dynamic typing| -|Chaîne de caractères|String| -|Chaîne de caractères formatée|Formatted string| -|Boucle|Loop| + ``` \ No newline at end of file diff --git a/src/cours/CIEL1/01-bases-python/tp/01_decouverte.md b/src/cours/CIEL1/01-bases-python/tp/01_decouverte.md deleted file mode 100644 index ea2bf88..0000000 --- a/src/cours/CIEL1/01-bases-python/tp/01_decouverte.md +++ /dev/null @@ -1 +0,0 @@ -# TP1 - Découverte de Python diff --git a/src/cours/CIEL1/01-bases-python/tp/02_fonctions.md b/src/cours/CIEL1/01-bases-python/tp/02_fonctions.md index a75aa96..7334d3d 100644 --- a/src/cours/CIEL1/01-bases-python/tp/02_fonctions.md +++ b/src/cours/CIEL1/01-bases-python/tp/02_fonctions.md @@ -8,7 +8,7 @@ Dans ce TP, nous allons commencer à utiliser Visual Studio Code, qui nous servi ### 1.1 - Mise en route -Pour ce TP nous n'allons plus utiliser Thonny mais Visual Studio Code. Thonny est un excellent logiciel pour débuter en python, et il sera facile à utiliser pour vous entraîner à la maison, mais il n'est pas beaucoup utilisé par les professionnels car il manque de nombreuses fonctionnalités indispensables. Visual Studio Code est un éditeur de texte libre édité par Microsoft, compatible avec toutes les plateformes. Il permet de faire ce que fait Thonny, mais également plein d'autres choses. C'est un logiciel très utilisé en entreprise et pourra vous servir pour de nombreux langages de programmation. C'est pour cela que nous allons commencer à l'utiliser, et vous vous habituerez à son fonctionnement au fil du temps. +Pour ce TP nous n'allons plus utiliser Thonny mais Visual Studio Code. Thonny est un excellent logiciel pour débuter en python, et il sera facile à utiliser pour vous entraîner à la maison, mais il n'est pas beaucoup utilisé par les professionnels car il manque de fonctionnalités indispensables. Visual Studio Code est un éditeur de texte libre édité par Microsoft, compatible avec toutes les plateformes. Il permet de faire ce que fait Thonny, mais également plein d'autres choses. C'est un logiciel très utilisé en entreprise et pourra vous servir pour de nombreux langages de programmation. C'est pour cela que nous allons commencer à l'utiliser, et vous vous habituerez à son fonctionnement au fil du temps. Lancez Visual Studio Code depuis le menu démarrer de votre machine. Vous verrez une interface comme ci-dessous. Sur la capture d'écran, les sections dont vous aurez besoin lors de ce TP sont indiquées par des flèches. diff --git a/src/cours/CIEL1/01-bases-python/tp/TP_MDP02_fonctions.md b/src/cours/CIEL1/01-bases-python/tp/TP_MDP02_fonctions.md new file mode 100644 index 0000000..f1ad7dd --- /dev/null +++ b/src/cours/CIEL1/01-bases-python/tp/TP_MDP02_fonctions.md @@ -0,0 +1,178 @@ +# Itération 2 - Fonctions et modules + +## Objectifs du TP + +### Apprendre + +- **Fonctions** : Création de fonctions +- **Refactorisation** : réorganiser le code existant +- **Modules** : Répartir le code dans différents fichiers + +### Objectif technique + +Créer un menu interactif pour que l'utilisateurice puisse choisir son option + +``` +================================================ +CIEL - Générateur de mots de passe +================================================ +Quel type de mot de passe souhaitez-vous créer ? +1 - Mot de passe avec configuration par défaut +2 - Mot de passe avec configuration personnalisée +3 - Phrase de passe avec configuration par défaut +4 - Phrase de passe avec configuration personnalisée +0 - Quitter +Saisissez votre choix : 1 +Mot de passe par défaut +``` + +## Étapes + +### 1 - Préparation + +**Objectif :** Préparer votre fichier de script et commencer à travailler avec Thonny + +```admonish travail +- Créer un fichier `main.py` dans votre répertoire de travail +``` + +### 2 - Affichage du titre et du menu + +**Objectif :** Afficher le titre et toutes les options du menu + +```admonish tip title="A utiliser" +- La fonction `print` +``` + +**Résultat attendu :** +``` +================================================ +CIEL - Générateur de mots de passe +================================================ +Quel type de mot de passe souhaitez-vous créer ? +1 - Mot de passe avec configuration par défaut +2 - Mot de passe avec configuration personnalisée +3 - Phrase de passe avec configuration par défaut +4 - Phrase de passe avec configuration personnalisée +0 - Quitter +``` + +```admonish travail +- Utilisez du code pour afficher exactement le texte ci-dessus +``` + +### 3 - Demander le choix à l'utilisateur + +**Objectif :** Afficher "Saisissez votre choix : " et récupérer la réponse de l'utilisateur + +```admonish tip title="A utiliser" +- La fonction `input` +``` + +```admonish question +1. Quel est le type de la donnée récupérée via `input` +2. Comment allez-vous stocker cette donnée ? Quel type aura la variable ? +``` + + +### 4 - Gérer les choix valides + +**Objectif :** Utiliser des conditions pour gérer les choix de l'utilisateur (1, 2, 3, 4 et 0) + +```admonish tip title="A utiliser" +- `if` +- `elif` +- Opérateurs de comparaison +``` + +**Résultat attendu :** Afficher le texte pour chacun des cas + +|Choix|Texte à afficher| +|-|-| +|1|Mot de passe par défaut| +|2|Mot de passe personnalisé| +|3|Phrase de passe par défaut| +|4|Phrase de passe personnalisée| +|0|Vous quittez le programme| + +### 5 - Gérer les choix invalides + +**Objectif :** Traiter le cas où l'utilisateur saisit un choix non valide + +```admonish tip title="A utiliser" +- Ajouter un `else` pour capturer les autres cas +- Utiliser une chaîne formatée +``` + +**Résultat attendu :** Afficher le texte `Erreur : l'option 6 n'existe pas` (si le choix de l'utilisateur est 6 par exemple) + +```admonish question +1. Que se passe-t-il lorsque l'utilisateurice saisit une lettre au lieu d'un chiffre lors du choix de l'option ? Pourquoi à votre avis ? Nous ignorerons cette possibilité pour le moment, et verrons plus tard dans l'année comment le gérer. +``` + +### 6 - Ajouter une boucle + +**Objectif :** Le programme doit pouvoir être répété autant que l'utilisateur le veut. + +```admonish tip title="Quelle boucle utiliser ?" +- La boucle `for` s'utilise pour un nombre connu d'itérations +- La boucle `while` s'utilise pour un nombre non défini à l'avance d'itérations +``` + +```admonish warning title="Gestion de la pause" +Si le choix de l'utilisateurice est différent de zéro (pour quitter), il faut avoir le temps de lire avant de réafficher le menu. + +Pour cela on peut demander une entrée (avec `input`) à l'utilisateurice, mais ignorer sa saisie. On peut alors simplement lui proposer d'appuyer sur Entrée. Une fois la saisie effectuée, on pourra alors reboucler. +``` + +```admonish question +1. Quelle boucle sera la plus adaptée ? Pourquoi ? +2. Comment éviter de déclencher la pause lorsque l'utilisateurice souhaite quitter le programme ? +``` + +## Validation + +### Checklist + +- [ ] Le programme se lance sans erreur +- [ ] Le titre s'affiche correctement +- [ ] Toutes les options s'affichent +- [ ] La saisie utilisateur fonctionne +- [ ] Chaque option affcihe le bon message +- [ ] Un choix (nombre entier) invalide affiche une erreur claire +- [ ] Le code est propre, les variables sont correctement nommées et avec des noms compréhensibles + +### Critères d'évaluation + +- Le programme fonctionne correctement +- Le code est propre : nommage des variables, lisibilité +- Documentation : commentaires pertinents +- Réponse aux questions dans le compte-rendu + +## Pour aller plus loin +### Bonus - Améliorations +- Personnaliser le titre avec votre nom +- Améliorer le texte des options et les messages +- Amélioration de la présentation du menu + +### Bonus difficile - Utiliser l'instruction `match` + +```admonish warning title='Attention' +Cette question n'est à faire **que si le reste du TP est terminé**. Elle demande plus d'autonomie et est beaucoup moins guidée. +Si vous n'êtes pas très à l'aise avec Python ou la programmation il vaut mieux se concentrer sur le reste et bien comprendre. + +Cette section n'est pas nécessaire à la bonne exécution du TP ni des séances suivantes. On peut terminer sans la faire. + +**Faites une copie de votre code dans un nouveau fichier avant toute modification afin de pouvoir revenir en arrière au prochain TP si vous ne terminez pas cette question.** +``` + +**Objectif :** Utiliser la documentation Python pour remplacer les conditions du menu par la structure `match`. + +```admonish tip title="A utiliser" +- Utiliser la documentation officielle de Python pour comprendre la structure `match` : [Documentation](https://docs.python.org/3/tutorial/controlflow.html#match-statements) +- Utiliser la structure match pour remplacer la suite de conditions +``` + +```admonish question +- Comment gérer les cas non prévus dans le menu (ce que faisait le `else`) avec `match` ? +``` diff --git a/src/cours/CIEL1/01-bases-python/tp/image-1.png b/src/cours/CIEL1/01-bases-python/tp/image-1.png deleted file mode 100644 index 1968d9a4aa6dc8b4390b22561379ba08eb9ed244..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15058 zcmXYY1zc3m_x43Pln`M-Nu|4_Q*!B0y1PN7J470k?(XjHZs~66X6gLj@9%y0vnh3tCzHhP=*h9 zt)}~#>NfB7OJ3EwDae@dR#NY4pTG3|5QsPUS9CJb!WL28VrW%0A3rn4}}m?dOmMyfpC z4F-q3REH7K(x&w#PhXCRlZyJj62mn+pY+E<1fUE(wPWf_J#2`2VeN{6Sy-cuBH=cL z+$=pmu%sixnKvIGWC*xeVm?uOgo?$V@;aoL!;S^9$TDJrbd<6`sF21ebfLdu!tzCV zMdl}jLeZD=#i^>18VI4Ed8cStWGJ00E><4&vl}M_2>RKNLS}eBnZ;K>K%(_2N(#v+ zCVdlA)snKn8?Se>N%K_jI^=jZ46R%`AdrMc+$#g-4VO4Hjz+#A3}A z$V4D0CWZ!cOTm3a7$A411}L(463K&rL=UDRZle{n#2=}+Pq^EhyqvKzhH<25F$sTs z{3(m!?#6)-#$X& zqa=B=!MZB`@dz9<5x6KEcxoEcr4_eyAwr^_tlEUzl_Y2!#ecZ-dNo7>WVmgI%rXpO zF;L(EAXD606gRO3Gqh6~ZRbsdSji}khKlL*vT%k_Z@?>PAtcZknsgBu^qic_9&B2| zid8l3f+mU!rJvoj4hw(%TddXKa%_2Bzfz}9kN);sp-p0>SQ=@7C_}DKhuX#;a#Ixl z*goi=CZsBtIoO_N)pp^`YDy*8sdJT=>M%XXD4fyEd@g54WT$8&0M6R9jLTreV79ZN4X~APg^l zh;sCZw)E>!L1D3fLE$gcqhZ{_9}|(A>ITF+q_Et=U&a&(gA%-n76|31uOig=GVa#E%FX7|`XWEt_gg_2) z(XsqX$B`sb%OjsV#6UknLqEbu9fcs;>-2$Gr=4M!K(umtnu<=Irt+hkYXwP-WpN~q z2c2ojFw^_m`+h{?#qLbo?cgf9o@%tYZR;;Hk>6Pa2UkmBTw7efu!ONLTZFUc=w=T1 zVriQ*NIx=hGH}ib@>JdwNZ~{ZMaNUj$c`y_*3=kbrgo%d33Mtw^w8zu_?aj&zCi|X zsmTKH5g2S0ET*}k#wI$e-A5&Sn~7XI4v`%Lo6m8v2iXNB+zh}-9 zT0E*;#0tAOF*VtHBD^LzC+ljs<;|1#izpD#(5U()*O8nzv5`CVMnosn79!b8>s*phE!G0vqR`*#+QdLvkJLutlgJpRJD6FYRV ziLQ;VJ+K9AI{KBL?szppD#Ki`UFy6_4DsAfI0auc4S%`9iGQ@{Q{Q24`>l}ZS(?p= z)84s$8( z19cs72?;^CLRyi;NnN9vqOVtnb1%1Bk(I5lX>$z{Eg5&08y!Fmtmn$KVLPMgp4SWE z?>R5{PFwgQvvKWnd1=H&M7qHL>0R^k@&cHR2BMVKs@&y**qGuXosJh1heN21q|}Bg zEa%FOj*d*zTzBk4sj^gPy>B;uQOYJAt+qCUAMHFipRR_7g;~uM#jXs0&%ciDxw}O6 z5%x#w?dh@8a)o}x9p=ElI4p0MOJvRc^6QOsJmVD%_5fa(E!XwFyVwS$;$e!kl>XhR zM=jsGv$ZwVA!=q;Ae){3`!|c{{pIcLZ5)H<8xjF6EQE6}C#UNK7Q-Y?+q8s)2E+b0 z)U%oc0|N;>juyq=N_iX)YOEGmQ{||d_Lm!B=Ue@2o;NEE4Gkn-x1CaCtt~C|KM{P~ zZ%$e-hUgeH>yD=K$7hOF#Z2Q^>2+FM9f5t5N&O4 z_JzL(73GH=@;aY*9M{hE6dW%%PTj>kp7)cyL+fomZF7ITJ-@vCalX^_6W#e}{&!5w zbb(?vx5JK_&R8;M`EucF0KAp^c`v?Zy$ulwiJ-%d49icr_2;JtgCV|$qiWiB@{L()SDTDZIQfv`{$FuJF`T22yhZ58AG%#F<1ic;~PTReY<}0JAr6(Iz^gIx%xSw+@@Zi#&lkf?uaUa5#6m-w6Il%VKreK6cgHj7GX9pNC&3n3 zbvtCpRcbV!qHNS^1BI+K>?h{=A!+sDTd78^UZ>wewdv`6rQ!Z$u6EOp;GiHo%F?#G zo#fqg?>10h$AjqwFpu8bw!i_^rsH`rIt_OEr>m_W`msgmnXEnR1Zu(1CHnAz&tkfu z&U%TGf+CzmunkPekK$oi2>L@YG%=GzyiR*p_lW3tF-ae{*Bf`!cXn~FKQXp=S>hx9)a^U0T{K6!mq@rrSS#^(FiSv58A5G=G`8OC%#Ph>WJnavk zp!@Yve!5o^C?L{n!sRy4rT+eW6<5GV$?b5KVJQxen}x{n-@tFsb>JgUHhFPc?dAF5 z6qGejK7F-NIUl^{bh^6oSOB{9>HaD-B!rOPjXhVTWOx+39q8c~udQ&-tgNggc5_y< zzZu=XFq6~k%q9#5|4?W*JH3AM#);AfI9sx9PyD&u?)?Iy*q=XtDCN_ZtBj>9hv=U} zRA|Le^uxBlH-@_{gBAosSvg-(&92?+^#d9_7f#QdYDr^hh#Snu$Ce0=elY0SBF($Iy68!ajf?;x@bA!eV;j}&@7w?c18F$l z+}u1M3iT~z!l{dkOM*8q0fqGD*4C(D5$Jub#_xy#`Nxme0rr1D*Z_n^lQ?>ZgMv_? zg^gbhxhyCuO~;9avD|J>7<3H6Kq$YlS!v>C`l_z%4u;~I_lu{K(`S*rjqYCtMEYA& zE-nqX-S!bNA+q=IK9P~*bmc8oVBmvp{cQHPLm2DLrg2_Q;M`9{8fNAwtUrl~=C0AZ zcgxGmo7tCDWA1aMn$94+9L|+{UoV*QIvw4Dk;5BNK9I)mPM!Oi!&iCDq?e^s+a4Ys z9*&fQqt#tdUM`GQ(!)oM?py$;tb+*9f*#sG}ehq4`9TD^NnVuf!NFQ z6HP9N;Mk|3G|_2kjCnFPHf1hr|6fTVaq&J7Rlz9px;@)qGaak3U2DrBg@)kw+wUYU z)zq-VJcqR$^o7wdF(X4lcwElbK|CE1{=nxFrL(tIlBT7G?gehz~*gR|Otr+=zzrG9rH7>3%F2EAZDgSb;& zT^$QG2H}60K}uM-6P!tV*PfrBuMTFw6w|1;(Uz1%8HXiv+SWaM)6-iA6Y@`VG)rIH z)+9I)*P2i5M9T}HqN6KQ;||9&fwC42@I7M+K9Ztz1z~^m@bv8E^+(1`~m)KVA$!J>2v@fJ2t+wm;ur9a>HokfHc-8`CCy{Jc*>NXTP3TM`r$ z9=gAO&$ylM^ z{omjVTVUXUkQj`$8OBF3YO~zp%0@wvD-}(tRLK76lW3tz9PKzLZU@X`t1o<*&HV@n z7QNWdPoFJRHr?zA1}AO)AA3>JOa@_`R`Y)|g#E#iEURpJBdp|!4y?y`L zDhiqlu9t#EG9dyUx8SrwDU+bk!qWqZe9tLI{`>ND?Ik->pvv_UoH9Ah{_26#BZw-n zv$OdYSBFM?4Q!F?qlM^%1hZK+U~i?lUWIn0+B6dO979tJBIiQBe7dTxXRYVMHI-Zn zgv&0&C4H*_bOkhblI%-h%hjyr4wL-55$xeh-FlmqcwH~o^Gz{(8qLtlza* zYnd9K|0&&(X9axw-!ckBcJo>d*rTpg!f==j<(KhKJvTwN$tiJO9Cyz!Hg6VQw=(l2 zcqWKE9XLWFtMSnOR6hKxS5W6smrZ)jx{{n=YH<#O-LX{Asio@GCg7T;$??#@&@i#@ zo3R#Oo^iuR5O~0F8yg$DzPJbp4Rt?ly`j}45B!)g$+~`AzvlIDTu-No7FgZjLLSno z$7d5#TSK81qt6WaieQ=RILS%_ZUp$kprQ27tdOuG3?!i7s5Kq~soRwqAib|iJqN$j zs|WP#L=j+ccJW~wH-~=ngL0$%03GMLdczSSB{TuD;uQN1Q>urSVuZXzO@mSlR zRp^L+wbE{T(;>|Cwda>R&CT`c(h5aoezB+lGco4}p$S%T=ZUXK**yNCJLw5StdJ8x zb((>3OJ+JeSqh&~r|Mx~co+*e=lW)gYou3+U?V z5|4nK9B*&mt{CFK3{1Jg_p09=z+MDo1_y4Uvd)0X;;)ym)FE$NI{yt65yr6OT-}&;m9+Nk ziRWP{*4QK+TwEuj7q1H$XvjH+4s?HZygv9FvuLXr%JFio1I$#DQZ^+cYM2PMXXZ@B zMI7m_pfJmMH-c8D;kw{#lceAI$*EX#SWWj-38VgNfJo~7!(o3Ug|6i2IJqdw^@VK7 z(tR!^zaQT)9yMG-lf^>Qelu}Ndv!HL zN;aN*57-e4!`f!Z(UH|emyhd(ddN$Z^z)zZ-XE8>y7c9~i{k2_V>>-z3rZ>S--u@<-D*n_1)lI z6LO)@r`_C@_SP9MvvzT!;eYSP-^+#=ZSR&oIrV3qM{ASkJcu9=0~I+3L?+?`YvuBX z%r#W$H&N6xJ}g+k`3pjYU#NT-zo3OjsCAjSEkmU(Ue8_MoRXoe=OR0*oLB?F<~_XR zCtRt?4@kb?Wq>EQc+x*?`Kihox_?#@MKz> z_mzLNrtZO4y3Zw<<@9H3Ez-dHDTCz{SAmUeIg>omU)bY1r5v)Tq?26TEzIjayXA2? zMA{4=8l1;0UCxjrTG0~8Om%bi)diUw_9UOrsIap@9KrB=sKw(;?ss|B;H3C81fkYf z7K8jAM9m`}KUN;!!=b&g^`Lt4ZO@Nvug7${+m)&AGs*SS!SwM}o9`zJD7Z@Kw&vk@ z^!zt}t=m}EiU`D)@YhYN0YZ|~9;iMTSjdvEf^d`!7%y6UcVF|3hkj8{l$p(T$Ar>= zl?e)*;DT|YMdw?ir+x|=2Bfp72@Q^{?+y-6t(JN*r@~i&9SaS^bh7j~O^erqTtfM; zTl3K9#=OO`Ihx(4rn|&j1q{jj-Y3EcUXPpRw>RFb!2xbHs0(ffLQ6q?wNDmYTN{N- zH}lA<8-mm@H)~T3#U@a_H zl;2)Dirz{q5u3h2Lby$9j*5-jra!d&3s6W}C1-k}u5>RNYDEV${K@2F(@RG%&tIS2 zTsXx_3Js7LQaX|>DyO@JQqQPS!W*tZ;CF()g>%2*A}Ciej5v%@IL#@(nmuSp{H`El zh@F`k5GXysK|274wNZX>MTXR7BPD?1*8%e*MKO>bwqGunh)f9o=q!CyHg_n79ZVYY z4;60xwGb-D*}pqiO$L%Dd(OEI^y2Fj?b==XzO%L7@+OP(InMaVY1FGIhd(VMtxA3H zLgh_NE)K$LIt$_jiqrSCtpfb*-cpfsM3MroGpw{Ie&15xPF|*V5=B0GUPrGntv6YF zwcRM>a#}svgj-f9*MJ*vm|Hbs4E(yjGeKfRqZ2O&3Oh2T18VQ$$YQX(hmbS3)QILbfyt zL<+=FF(Ixph53G4u7AEpMQbPMb_@R1R7C3brtq^b-g#XsRS&oT5qrV*#$<2+aYYyw z(0c2S+%am2)I_R)9u`WcMB9%M2 zdw&fNI2h7BUn#g`On#z>0VpgfYtrlXNA@!PZ7A2~EWU0CG<*|Ty2sXEx_M?MXGuZ{ zXxe<_d1Xg`XJA(Fsa^pY_(|NCwbtg8RZed<8vIp52OSVV8*Jp|B)av7!wX9UfPkod z_vf4L#%=;`n$y>*x%fY*%2w~s=5_twy8oj4XIuIVNPTLKf7b1#m@`K+O7nFyj{7B_ zvD_Z$+A#3GhQ|@EoM9bTK*Le45L$e8sjN0$W1RB{zwY;sVMMk&MdpM61whdUI+QRA zyYfk?IC|LXdgiEscRor!S*7a%O7y~MIAa~r$O{Cla)iWKIZ@mx6F*+nYOJ_)%K?(B z-pm$yg6Ad|&;GtdI38d8(I;7LFi0TYm+SyQX6k-JzdbBLVDCGr@wpC#46V&=F>+GF z&kj?l@;G^^)&1J>tf{jD#@BwwK6CNm7Gsa|6#xA4y~VSk0EN<|&ZQ3?{dH+NX-J(k50$yX#JEO?hRjZ98q+&M)d38E6oP?MC}a3{kpGF9@qpMt3GsU8`_w6v-_y0V?1O+Z zkdd>=L2mok%^kTIMuJVQ7d$;Bn1aSvuI$SF!B_!J$n~7W!E}f;p)U~y_d6;R${;~x z3odc3KiywzvVd{A|5;IJt){R%SGF6~nK$C30(w^bh^onU z0M~Uzm|fY7+LSIynv*cf-QAtB3FG%8{|*?Ezi{@icedA6S073&aQWqTJT8h2*J7Z? zW@gkt$p`dPn*~nKqrddIHlwN!pvia}q(#6&l~SQ74*nGbwNhbtY?Fqe<6ns!Z==wP z&+a5d0N_uGm3gV$P`1|Uxwreob9#>xtcUf3lUNJ$95bkBV~TRt^y(#o!MiZs(g^Qs zC>EMtVP%VOdUTv9O=ki;6gw^_|IwcXA4lKvu8s@*ApW-ujaU#o6l;BCIvHiFqrxpt zI7UnqS_t@vSaJ?Z-u*&r$z$%GqMDzgDu}^Hg@XbFmabqWc5#+17Z+=i+w^J)ZYTzq z&y)VsxV)qs?_72C44bv0RFF;`fHIMnr}Bv&0IRa@fu!d z{WTIi5KDS{XyYX{_6Y}D@`oko@HZ}LQ} z23sVYayrcuEOluzl-w6L6Zae+-%AYD=?+5JkFPR(I)1**pD8*Um}R0S7v!B`8nAd1 zj73Zq>?{NUUO`(PEfr{~9oVEVdUmu$g7R%iyC6O;hygghs`&q6n$zj)=JV)E#^i4< zUekOvEOgaR7n@)^)%h5p)Xza`oj4Xn?zb`EV5cda9qGS6$SYCX$#6{AV(U5W5@0sDa;tJ zxp-#1lCx4NzX<08?pF@42*dka3!#YcCkpus3lh8jp2mPrrD6rW<4G4uytaHZ&2Lgb z;ouf;LowGC5xq}NMbfx!b#;8({4>!lFFVSe>yZD`lUJJy7i&qG(&$Ue&J>&Kvqs(3 z)D_z?lbJp7&-nDNVW*j2GAA@QmtS{H-EVI{h6R%rpgXiar5?-<{!2q+5-epM@9rnT zQs}abab11R{Bz-@m5W`3KwOrMj`hT&=aLWOhbl}_KXYuU7Dk4 zUchBlA4{SbT9`6|ki*$<*g^;i>AR!;B#?GzP_0L9e1iqD%H>f3J-zv<-vJ*iTxE9C zL&@YhdZttvBAs(U_RRtNspi&JS}o z(4YD>G0Sgk%yNlh><_#j0paJYyAJF%Y+JC+iLe0o3O5gR}HLr-&jVfr zh{mi&8fMN{J*>pwdV_)~bcp~DSE>`qlHa2yj>zv7%fLEHyhECP_e|M~v9RQlBxc7BA{O51}^k}qp(+8hk%0GD02QSiXX zTVm#kix&okh(}ls-52C_+Ie*pjFLT0>M#~E1h{{+S5OAq^-|h5at0r=^)Os%`JK3A zvSM&Vz?w;}QlSjxTU$a5Bq((*c!|dGtg`+?nAwD;;osxi2U8-{=k``E+ofuo|IQJVrm@`e_RUIpfX!2+RhTo9l?MX@>rUU zAX0#m{6hom9-&2B*Xp^G2zT7~T|1|zr@OoO#Kdoa%~vM&`r_Gr;V5L`gq)NC0Y87e zr{!}s8=U|A)GS)7=6v!1tG98Z!6jBQ&-|t-Sh3SG2EW9^a%J(Qo9D{0#a=dcD5E+3 zy1+@T0X?_&H6v}wt*j~gY@+iqk6j-L)0zT}+}*6t1JBJJy| zRvaI^^{uiJQ31!RTy&c_a7xklCT8Zf4&$&8pN70>P zredvM>1qG_3PU_?{-A8%g*Op0BEkX*qe3#RY2U6h9bJ}gR9zrvhREZ-2~Ia(nG!z+ z3l`j5BJW_YHlXQ;rV<6L%jjF1AqL{G)fY}s?j#NHKLvlFQ`&SiV+yPL7%MVd_=a?3+th2PhA6iUUqfy9(NI` zPw#7oRiMQ-;UJz}_KaY~|v{{yqUN?tGc{<5?yXhwW-fRj<8a(WZiu6bUC=_;-U9x;LDw`Lr-#}) z5|Qewzjf~ox=tl^r#k}M zpBpVy99{ox?(T+P3!_*B@ORF1$)kS|Q+XU8#P$Sq6(FDJufoj--}3&CY`^fYI}Ts zn4;YrEYogIoQy-2(^6F|`Lb8AQR-KWjl0W)U^V}*!`JF2t!A$OVk3f3Q)FOJIlqUb z)jjg@YEF4aVyo}h#zsO`Mj)A;z)hXQEVn)|GnIplPGYdN5iNPJ(qON7>AKOy0SM86U97L7 zqJAP1%sfqpec`-$GU{jN{hH3l_e>&+@JL~f0$k0EqZ42`{2>7KV~^pNJUMN!d3E)0 z>W+kY@|I-HV7>y*un)tLQtLemS$WIFY~~kuuLhf3Q#I z0vr7awnvZwk%0sjHe9s3la)jF%RNaH*Yn=sn-hL6?`N`xZR2gg!$%j68U+(Q=3d~m+_9snGS8LXnfwlk9q1bAWs=#3+=^ehaAqLWn#JzhDrPw ztM&mp-|CJWj6lM@x!E0EgbE3BPzY+;aDHQMVR5!;Jl1@(R0q%PIXlwn-~L_8GoqL& znq$80iT8Y`!?zWzv@2Ly`R`BlzZEIdmB%^l@2`J6s^0c|a6(5%Z}j5dKU!$t8BbrV z&|mphniNKO)wS9x2;UL@zMe_9tx~VE=CgGY*fHN}y`g-E$xcqLMcxUvmp$d=ymrUV zN0T|@26Irz!hVa8aURC9b-r^pZ*#pmV33!Obh{#lBjx8u2jyuNh-drkNE_zaLM*2J9gyzbQM+_H(Pz)2xH0$GT zzhp+i`{>w~yxQC}7-7oG6Ce-3fH2Q`^iNH}1H=L{$bjNkfRwfBn>`#MN0Ia8UcGdD zS$Ob1*pu3Q{T@$3Y(XQ>f%QL^{oBPyLV!dHyg@?)NHIxFaGiI!w4_1NW;44Z1ER>j zP)2^>cIog*+nHMO_kR+6zI~#Q&MVh>x_fUs^0knCDz6m@@b&d-Z2YO0x`Sa_aX{Q0 z-S-NiWbL1Q*~r^Sxa4{+EHHcM72DzL)N%iB+K*wr89 zbDJ1fk$sRc!#-=Xu~i?t%@ishrh6?q!FDD}NP&^$z)i5zJ#!^y$cC} zdbQV6(^B0rMem5{wXdl zwWkMP2hS+M7^#!{vh5q_^Z1NUxKm$1E_tiN9PH-pf#^fNRByet<+HXzM$3==q+4EU z>Wps;rpNZ|ma`4A$tG+j^xD-X!bV1=mzN`cuZ$y!i3|<0z$ZSFj%M+q7;NvN*`1VPj*{Ea&8V@nGuT;OS0e!;d85U21Zy&LDjee0hAh z*tYx-MV}ZzlPxQp9me1Wy5cXhBryj!U$B{&6J1#Wq1fSCHJ^ZcthNZ7N@ErpY zx7VYUmX_{$dvEAmoG@P)=7(GI&vg?WzFY6v_jrs3{^jJj10D9uCoAuBmC8IHgu8#q zpG@_SWm;>LIz2zmu(0qaae9mAPuVOtAQ>xx$v)ew8q;Naong6F04$dYYKmQ0! z$RCLx*8XB0E&0i?f9z=at{3&~&T^Au{3Wcd`3FKsUQ!e;}If_jA{@W$YNyeAti*)A^%|7$-9j7p+ zV7e??PkXUFcL&e5B~@$^VvmQ~&tj;mCCb8dn zS3WQJx^b7({Ia`f*;CgG6&uC6-uzdm?So)^={DHOYH3ANl~)2jEJ=di2Tu=}ZBN(h z(U?!;f=o|0?Y{)?%>;6z(!LRYX_)yCp%gu6V)U#`rbNOwUuWH)vcN`n6zzE%6m(fj zBE`x^!Oi_AOoow8`cEvw;7E+oF4qfp|KWh5`33(M6{6$^)3N8@DITZW*i5s*7hV|6 zFf)sT?CoJrBO{}STNmepX}6i8#VE$4OuElMnNG2?$=Pi_q{jTF6GjeaYc( z#~St4f}VX=6E4VPpEAG1m$$ES+|Ss{Ce{1C4CHup8c&)} zFug=-*L)EtuW`8^;f-f9OXgJOu(0Fcx^*tRr0x?8{Ao;4GgTMDHXTtxo936H)8w&o zFMGV`Y_m|bvUECvJGUM1>*v$=TS<{$X(V0^+PU9zudo0>XgF?EQi?l!W_4(!rNMU1 z^y+YFmQWr?P%u4%bPj?=Z`qKR)<$!~u2C9lE%fazmqTO&`7osX(ZO-6Z*;DF&Bgd% zkQn-otDD=ajzl(ZtNY99@;c9n3jH6G$GqV77r+9^I&PPA=hjP)$uaCs%RO-nNv(Va z344P>Utj9&Iv*T%NA4~9$9kpXosSo}DJW_iFyrQ1{>(QTwic@jlgjq=qd10#wA`Fc z$O{s$bCo&di|Urzoc{}Ud>8UXv;JKgm#a4A!}r6u_j9%*9=0|Q0kSX22#;#tPR<_XG+YYO=Ob+Au}^cQPI+W?t>;bt!`It&v(xNv&qPw z_S%tLlP6V`)A6Q&ngI-YkULC@`*qbXeJyOE8VSSW{NLbIaIiLl&rYj*ovSrFAPIQ4 zn4NDBoK6?MT`17^kDM!Occ_>A6ZraliCWv`>98uLT#5)azx#c|O3<$Ml`Qv$YmUM6;iwij@69FGGl?Xkc2pJdIyqtxBp?$@z4`bmqnL$BS2yOS?{M6R)$C z^!R{Fp8U&PU)bBz(*@YdU;U5n*C$K63vieu0^~VnmU90wU`W0YkD{Cj~uKH)8UqF&3wE)Nq z+Q!!u;D3Z=rYt`aRPUs4xmt|1Aa)0~{kYxz^763X&S9xh>imwOc~Nh_yJP`omA2Tj zsi>gmN`ru$zub=L^U-3a>aguLBs~=W1$wmVKH7iicD?8ISl`WN+VU1#-}D_BFwb6U zf@lIZt?{T-6=3Dxaj>yjEO#!=ZRMWV#@m68@Z@@s&y>U-9BVfjwZ87>=Lgm-fCBC2 z&%op3@Wv)X{_D>I)Y6(JN9Lt9u4ui;Bqd=XMN?&|)s{AVtu3=mRiNW+0T775>t^v@T}w#=VPEnC#|$G zcb%PNO%rDp6K^J!@2tE}v6dc=i95$NI3MgE)zr$FGaOzp3>H1RDdw|>g!LmLp$Qeb zAJPGUWK~tCfqpy|1O>T5#R8QVuuM3ADu7J${*6%CK!!{Yd|U??eH-&C@36r2xo zAAGS%D^-vB_zi#8uon+kOv*~KK~7NevKIL2Rn>)N85oQi7`AA{wEFe}uy2bn4~f}| zkRd>rCC;+CEh^bi&ZlC{688}oC<{^h=E=i_3a#z1bmND|M0KjZso>P!cPCsOV!fuB zX@0MDV$Wi5IQ@tN#5ZQcpiUzw~bH0)CjTdD1rPYMeQqf;#dxoSW5 z{$_dz%zK>bS1W|&L*4*n_HR9mWk~RGaY4!x)r$D`5S+4xc&#tI&(MS_xMl%4$MR{r z+!4hEcb}7ksb~33_*(5G`OJ{iJ@Y+TdFX#j5`MO#j)h{2fZN%kAXQN80s%XKGPg8r z``xBoDn@i^>V;u-APaj<7BMU2>pR%syOXD{(X};U2k@q!WkW+Srkj@VNudj(xY_p| z!PN?RZ--Z8wZ$$jg!1W{F0YZwX)9&ZJ6%55pVt^=bZS3C>+E^%z9(No@KtS-PD&2husV2+<@fQFno>wGN ztu1~AmqzwmXzBlYW|>)w-Zo6eeQUr1^;4m;n+Uc!;YLO5sJmq@!WXY5Jt?jLWXuU> zLi4+(DgK|c41slO1!#fT+WZrtw$q!B*&4o`7L-Fz?07!^srIvh15&VfC2L=ZLq+>Ml$|U~_OA*2RN$0zhoL(z#-0Y-II8rDB$J~m*Ox1tfp>C7w z`4x6NkPK8rlr`C;>^zV38T5xuf~Lm5vLcYX6J`-uP&2LV+;w;r6|MY(<~O+F-InUs z<3p`5)9=v6SIf!w-_}`=!lHh_RtDp^6AtJSOSf2&aaf=S-Qx?F=yV4-vV|iG&0dQp zaA1i$0{#m?d~3PqWvV{+c^v2J^gup#JB7hCxRD z>}gP6C9j9B?0&ET&%+A&S! ze8UWxfmreRVK>g%fhQT-5-{u(Igal ztH6P@JMsz*durmqZ*kdUf6Nt=CRmsUjX7i|29`=4LA$}d0Yc2_4r$mRU-6?S3C9hL zK-EgA1U7dBBf(Hu%8hb57PXPG z(YmpPUcvbSxtnl!7)aSr|6n24G$o}4KV}HVF4j1|$*)oHHtb+29n_B@xv$Ra4IYzN3_OBiE?*!WlG8cT!T02Kp1om|2JpQ}K9`5@{Z z*~b4Jv+-1D@42Qe{oJmQnyC3VYnyEcxieG5ehyRV6kJvd*;c^z2Di4hl>aMi$9BBH ZE7EikxE>ENf`?QADKR}-5mo6D4o&_-J#Nr(k-oYgQU`((nxpA-1FZ1&-Z-r zJj`(BoE@w7-fR6PMpIqk1tvKr001wP6lJvm06`CYzln|r{=Jo{s{vn-JY41?l!->QWTv0DIqTGdO3D06$pXcV;_FFMEB=!{ z6X5U3&%J{1454r-WLkg?#tTESe{yK&m1rE?&06Y8s>)qJwc4D#L0o)ldeN=*v_)_4 zTj*IexQs(Zid2-gsXZz={6wK;0!<4|8~I6))ckEBwJ{|?UwgqT@>qV8<7@L*ol4Ji zWQbsKiBP%IpRZq7$_L(tSIM$6R&~%db1@&aVw6=C88Hn}LX;c@5_6INmK`4}=~Xz> zw$(WHOMl}Qy(Tc)`(`8los-PoEV0=gloxZ)`}6+vPjzBt`xykv<#$O3%$mv}+Q{gD zmaNlAQr3}V@wc-Xd3qi>eI;bJNGUC)P+8^_O=ZqY#7y^aL)mD6qVKJ~oQ86WR?6Jp zxU>nCLP=4gp;jwRWrXMqA}NHI#@d;me&I_;YZssg(-h3ez{_mRzt$hJ$_#Vx$)HO)e%Mg%7iT$4O+3FkuNCo4|5gO@XyerM53;s~vs>;F`jE;hs0wCh?Ez^CJ zNvTDhXr zA`{Yf4_@%^Cf|JmP(sm*`{^=Cd1QilPyl6oO>0I%q@ux$kZ3bnxnLGVWYX-n@(^8) zWNTU0H+pXh{ArzJ#?F??!!N=_06VuPd2BqIo}nN!X}yRl?x zLZzZ<@ML1@#OqDMKC`ZKBr~qbLq_a%7^NA_%M6n_*bS7PNvvNsBxNZNRm9^1T=>JL zALW(Mzok`wD=%Z=E$QoION&lo(UdLI(v)Fgv~ohI6QIDFB&{=K9J?(a=pHfltxk5h zM9(xKcdGw ze}%kSLV;W$9#*z;)uRD&G#z4a!artGc1n3din#f|>nks#6PQqdZgi#Za@?9z)tUAf zyb8$Zv^pm*l|LD_l|@|8Yh7|GM}@eAMx@#4B~8{yJQVJJN7pzF^Y1CruDLwb1`}`5X?#de6O3+p{u}rb0~?z zrmym+TFWOKSw@JbJf!^kC9?7hF_#S#@kt6F^GOP9u}Q2@h@(75Md|CXs(KWJZ&qy| zwBF#ceV9rJL^5RQ{Her(-%lr1M@19I)Waq+O52dSWt0-J5Q&7MT0Q#bet3O9nS4kt zocu_F^WdBVMkGf={Oa3J5#jgm%Z%8^SvhBk=-*YymWUt`(iQ~wCsGA#7FyA}p#wlk z-Dfu`tL4jV#>V$#YQo6Th(vstEX7uoX~G}aC=iLm0(I%~>aL}S>(2|MWWUP3z<04$ z9q2dW*BaaydzK{5_Q95aRX^f2>dt|IOk2lZLWoDY?5w?|O39w8i;euv+=%GIL623r zvxaWh)I>k=qUqlf$-%J#t2#{&wD5l7>9TuWM_x@O895Em@icimd9dD7{xBqFCK#HL z8Ysz$U1j2(vyS^(9U|z;_)`j5215g-qes(`XaCBt+Pw77L6b=CTERS-k2zj+IoX?A zj6~icrtEHa)!-^>`ggh4AElVmOBj~L>f67w30Gp$;iRbk;>6Dh?LgLQ5Z%^Xf2y@X zdanx^r5a-*Vw~-0)D`fxHGo%ZE2tsy$o7cIHR54}>?BReSy2hoT{7~{t9&0fuxCb| z7Fx`~vnO}SxL)U#W>hL+G~gVYTX-SiA~Td=aoul~kg+G}dR z%c4wf(?Gm*;|UPI1kQiTNy_&SCKs>vtU&2JFlfU=vYyFJkYBqRPnAl?kTQNL)b{4E zp@%r4l-2dr07Ik^s#+4b(W+uvE#?9qUKD)KS(lvZpkd zZ3WsyQ#IVyeNGgq?n4YV?>!jtu7G>zyza4$X?tFzyBR; zS#0bDCYA>lmIo##L&$54-29k$hf!ZN9ga6IL`HQsk7G=6jurkbrVUHK-%<67c*kxQ zjLTZb_{X1Lili=fetUJSF#jEH#DS2Mvi<~hFM_5t-c`GF<$UEEay>0Ab!q7mHg0-u z?gC5Y{MR}R=F&_Dlua2sv1{VTH=KF>4Vb4wQY7C$oUoH-AyJ|k5;^5`lo@>y58aMc zLts&0Jqy(wqnI&Pt1-?k)?OX`rH_A_QkU<8GRw~SE$SQh%eh|->Yd-j9+Yl0Gq_OS zGykGQFdjRKi;dGe{Kk>W#>uWz8-FTzXcq4FVSda1--Y~X&SB|UB9bS<+%JC)DRz6y zFR!AEK7J8aE?2MR=9v0RNVqckOMqqDU#z89I6h0y-Z&j=KR1gcBS3YVbn|DHOB$S8i*Pu9_#sX0}F z7Bj@0OCLLFQquL6c8W z{yAd!^-A-PeG?KYw$J$h$+cgg-e@mGtQE5D4GfAG0-9=un=JwN7ybSH2^4}O@9Hbk zB6@s0Uvph3>=>u1qLYdFoR#JW9rjD_P2|qkm>ty&Vb()>LT}gnCu=V9#eC~OOqU2c zuej2^wTat9PLRL680BuUpRITsg)?7k(bE2OyAB;qUrypBPbl%fJ$cEj&QMe`F2d=c zwL_GU+-hHQsNTMOKRl$xKPd?hu*TXQ&yIRc^~PSe?c=`{qSh6vQQD$7-j#M=kM+*L zRJObqmwS^gON|GceNmh)CyNbx8$Dsv(5Lfer)4W^Yff$o0mnPMq6&29ovz_nBKEDV zE&W>agnxl9`b=rXyKb<%?IgGD!6ujWPT$Mj=f~Ui@0LiDmo=k0WKCtBx#bX!9FrPR z&wU>66Vvk+?Q-N`u%q;Y(UU>78Xpeof6Fa`2BKPu3Wg(R_j~z!fB#;Am+A*zYE{mH zvr|)5eLAeHZS^{`?Sx+Lj{997HrdaPoY?&Ic(mN|gCTYQ{`xjsz-h$oWcDqeK=H0L z4y6!}(^8{)t_Y`5y==K|p0J1Q^TRd#>2fmi1%+w)P(#zOR&Kc>$H|-4prD`x)$oXj z#dv#OK0dqgtl1i~wlq!?iOVs*P@3pl4|n&$#8=DhzLzN}DKj&=EN>`B#>R3a0{trW zt6Mz}>OBv%bJdw!eUIygaHu8z8z~br^XY2ayc}&{KmbPsa`1ACOA?iMtIcQ{IEXga z&CvZZ?Z}q(pvP$q$>)={Q*uFPG2e@K6zBEz^|q6Ft3N$J5&S*h9s-rKd>r_A^N+jp z?psD9D3rFmWXY$qFqyAD*Ruw=V0RlmNawq~5m-7pI<;nPb3fd+1=j;f-HiX5~a_CBmig$mLHDu91i**2v1stH0^7!Y4oifGnPu}Z+ zg0!@og-H^Jvy}$R%}&g!89Y$f6KJuoL_dzn`BEm_vlfFQJ6vjVXs{jkyFGaZb={Ux z_wguRjpJiwYhez8_al@UPlib&uS&ntpvII85ARcEChKR#ex=nsaerb?V}6&l_DP9H z$AhWj)mE=cla`v|p@ZqtOR+AGy@_w%zOm|*4DVbRnET2F@Y_w~oUFFh8aJ`Meq9$3 zdM+mEb*LMEK38q>0=4g(T%2-Srnvu21QrP$J$*W-3Dajq4r+WE+licV{YudHSkgz+ zIgEInSALv!!Of5B^{Wi)Ko=GE*exn4;WDZ(a+t5t($cE=J4<2_aNhq?qtR)(Iq3O8 z^y9J5L2)_&naB}NnbIj$|F=*Vwk;$Ry;H1)UbFYn)6-K?aX90(^-{Bw|G%XsjF(K{ ztO91rv_ffAvjq~gv$C=(=8s4?3^i?IQo@EnH{AbI2u^Rc$zdK;bYEYeh3^iLf|ihy z!3Rg>@i3x;wGRIl=T*P$1VIio9V9fI98vF+I_n`3ufxBwVu^^7z88N>)UrWeo-5NT zJese4yuVLn#TBaIOB1R%{ODo3JC+GqgwvB$1wY=NYAF8ikFs+82L<@^?Rp#u_e9p4 zN|kgjB_$eY@OVx9;KsN)8WovtTZ!9x8FAuit(v_Jk;B&SC`f=hb(KI~w=LatXhIZG@ z-ks5Og?Q4C*HjV#cc2f@->hku6I#dPeHq;$i0R**;zjoM5M^ck@Vh`7A0Izg#49#7 zw$)<~2Ur1}W+at;x&zqucIr0hi8uCYk+3yZq;WE$g5S&?f() zl-p!5E3RXGgR5WE-YypJ2JTdM)DpK5k&rGgFU?YhJ~u>1qsO0vCVO#tx!m|+8ti~~ z2Vux-kU&9iRcV5>xKY#JjvKzz;^LAASCEx8lmJ5ta`68C{#55!M~5jF8W7e4x#y>+ z55wdAFvW2BikqAJ(uKrh=nLq@nS1%0o15UuffNje!bS9LI`7jplweTZ(dnQ?rf6U8 zkNQqgo?p*fV1@oJ)u28nunzb;{2BCyHm=mRpB>giiMgWQyMO=EgoD?Z^Ucp7JUu|?(eadF=k85`r5i1KzG~SogR2$#qz5Dj| z_9@~Q-s`6P?|;+0dE*6!H!!N4uKc`wy1&dVHRw+jp~p0Btq}c1=E1%*B?@(expX$F z`f6(80Y#;yf*+>(2h%;Ko!`G_8T1)V<9sFJ$@1JtX=~{Q`_M_a{0O!c_l8DLaK46H z!IrNsv(5juCZndYkw5&C?4ax6n{~WZ|93i)FplA}m zxu$R>ZjUwJ#>Zn{299c9LgZrO{IYin!J&>BGN08KAKrp|G(J|iO|wtZ%?&AXNcy-+^k;`Wy0 z6dPQ~LCKJjkqNwIWB!r4%$AC&ntKRt5^~bgnAVcw{`)cM3JUb``9Xuen^O*nS@;Vz zG+a2U?V=(gYI0s}9f%|8f;}Ah-yFLUMihF!aa=e9mtT7M_}>SfwtW| z$BUptQAh?o4S%M8etwpFgx-S2=6N84?j}d2kXFEMP_y#WgZcGqEwL*5-X zZ97@4mgvF?XF)sAIdD&w;JGxP6$PA@bi0C{e~k-pw~Jni!SLqB-ehb!qgQ}!o? zRp;UAfX{jm`%kyIGdQwZS|*97v$y5CtsnmxN64Iy@lCdamy?;)*j5#-;o!N9(k=kI*B(X(|nTQVbN^4ag^ z_@~#AzVZQuOZ)4O#|vg{A3+oPFrM|MW^|k7U9NhI?RXaK`4N{===+Z!3yvSX!jHTL zwe-Bd@Rg~*e_x1Nr_p}XAe=Ik%p0urxX=ZKgHb4vT9S&C)Ueq>{!J7fFKF~rH%|$E;euu}s1&O4Z@db0#i}fw~#Db%gn8 z8=iSxUpZmv$?wXWI#?Gp`aWATpRBw-k<(yZz4#??{)4>^Lkisq9`LxEB$3DK`$dM! zn+~^ETUDBA2RIMONdaariwrBrC+1n61B8?qPu%p&rjOe_?|xV79NaI4qti;jSYH@R z<}UCpEO&g20#q&PJXfoPQyG~1`taPHx8hUm(12Q|_6V5u3YY9h_pu*;ov8geYC8=^cIqXxA%*K$3Pwxc7!FUAP z;U_#g^xk52lIf|berqMx;;r)9$wWT^i{b~L(YY9FixlPJM26R-S12ebQXyy<(gfk3 zx{}hnYBij{-pDT@kr}>9CdMnkKKos;;j-8tRoC?4GK?a!$aJ3Ow-wFTJ@Y2qc{7;<0D!u&+ z2sX0RQ$C>Y`cInxM$Y$jKwvT+k&S5ivddHu#gMJ*!|y!Wo&$8jw<|P2OgJ5@x6(+l z@Dwy}&o^&!WP~6|yO$IW8#>)BeI@D%X2*2Qml}PilOBVp#LnClz7P`sjY39K63$#J zc!|#TdtVRbumFI%MCcY0A*LX>XU=eV=-ZYkT*1Lvc_%vgwtBCINBcmHes@)LA<%Ri z%#|p)hKWd+K$i>m?k!_hN3hXUzwG?ojh39IS~1w!(=(N6(^PJZSbW%$QLf683m5*G z-qkC(kec2jq84Io^AX&RB8S^9DG4X=re=bGl+P_pGwJj;^WrE|~)N z1l8ve zBt#=ip++MyAjo348PfW!bzh?9?G1eBQe`??EMzVw1Xzj*Vq_i3MZAt1KR(+tKO_M{ zF}irj7++{q`%%;e{POw~@sM+Sx-GHM0T!9O`!!aJ(mZd7$NEQ0(oZ#{xbf8R(Q%i= zl4ll)fndL8jMagI#$al-v{H9&w$MAnXH6Gb|QL3(|fNf+_YcJ{n4fXEMPnm({?`@rqU;KWtMwjvoIY)Ac+gTEV zN0DKeFpdye?HnZWXo~h`fqor11?sA&e2@RtGF)DHSdMKN0dJFg|N1LxXGkF)vh;?p zG#+vtd{5}4yXSdVC!wwM>i5w#0H7o-sh`9|Cz6Nd@Gbf@17x2DW^dn z$XfYbWDx1K2EF;aL|^I}Ch+LI&OSxa9ME9KmOM$$C&4yWEMKG=i^e%EPy(VKv;&uf~%-Juq0L961wgC#q3kIP6jm<-rq{sZFK7>$V!E8 zznB0Fux3q)Lq-xQ8jf=bT*B}KcuB1ZT z5%Jp>ShLF1nWUxzFI51XRgqW3OuyJ?5Tw4QYsHDkm)?zr8oV;o8Y4jp&X>6uN?=#- z?E$a`)e!-i;i_8b(&G?!=1=c6((_jH->*7cuUFsNMHXMh=nmV}1fVG~SaAAwZGAav zMBzQ9=@3~SeGA;fo@gGSTXyJ(V;9wMB% zB8m?5_mHRgDG>#s{5<%&hJn+e1+W3d0HcWko^lwux5up$7Am3$n$37in zf=QiUQOgJ$b0?=(k=TSTYfH~&nx!}}OIj4N%=CP+sgn&i0FY6?InWzytE?!Id2kU% zmO|G$o1YFznIj5c24bBoOi!mBf?uAZf_a#y-R;JVy>6GYZeK|qM9A@kTH9xeQo@c> zm)7sLR^R%*v!p6Aq$u|xzAvfJbVLNYRk+6Wh#ve^0y_vvw_^=7!Q!4bR()7l>Ngn4 zeOkO4L0|Ux(e+JlKCvXr7&1_fEY325b?fHyP2aGf4(e0lG*t>Ue{wx+m!h_a(4~5L z@{;;rQ_y_G_2i3ZzeP5UVQheg6q}%2)#3NAj#Se0c(`ym;-kASuCsE-vu{TYC9Mun zP_&gfN)a0v_?G|v76bpg?BOdsC6v5*qI;oSc`ZyS-}9u!ASXOk4|inDpW!6oCYiT^ zgyw%}iAYuPdn+-W|G~Iy&w}F*xNXO}UpcQl7Ai1z3)!C4#l0eDqU>T5X&11Q?i+9^ zZ}50KO1;?E&9@DWgFgE#5z!XuvNhBb3*&;G9M)4X+jo)fzl@5bFMuJgv1aPu?fX6) zFL4{7;Q)B`BBT*uh+lu++e2N-^IJ%U+!*DvV&7_g9$c7x->ARLIEz&_Pxoy+@zEdX zra_lw5uH*Itc7;Dv`h%9)8S)>o?NV|d_@R(y&2?0@T3p(e7`u2B+m2(z>`7XNX-}A z_u#A1Qs&tW)(&UHJ;@o$z)G;!wheBVt{rKYW0i|WQpVe;x?)G)E{HZ9Wm&=htjz`# zeBbXM6WuHCcEIB6c$R5@4jnyHMAt+dUa-_uzMdOUV?_z~M1AX9R4)~{hm-dP$GKy6 zQ-6@Uqt#HHovR$M(puAkcBFA4EKcSNMR{!L`^8f4*YfO5{YEIc<8LZ&wv66C>ame@PyjkqrS9!3F*##I4K!( zUuPblxIPY16MXp!?i{Gha)vlbfd|Md4hqkxhG;5x-^Wq@34nC!va}y6_#gnZ;o8dL z3ztZc?%YE`QD1m19+V7#I1+N0B)6PJ6{qvoC^Db}Ga{XG?^KPXdqUlkiL^7jYEQS> z{tb%T^@V<(GNB?USn+;H_rrfNLmsqVp~gIsYt(8p{V;!A`_uhZM3VNV_2Y>S(`}mn zqr-(q`x7GGpe!DLgl{JTSAvO+yGuk;y6JlG5FH#SzZl4^(0c0pBNx4NRP~R~p+rUl;m@ z?D-@-Y%%1L41q1D-1bQPas%-XqdTbuL_gh`I?}zrT_>O$@rGV~~bf zTEM>u7pXA=`wJXDKd9y?Fto%$HQxnI1gc5r^$saia$TL{o}c5o4ROE6)WhVacGCKq zH1(qEBVKB{Hn8!Ii#xCwFhocR9(Xj%L(40r4H|*KftaYlK*06b{Dy~Y_ljIR4Pgjj z6CpYeLZewVZ#`E2It@QmIPvT+cT-7SDP0Yv<2*bCiTOo{2Xe^%wO{NHf8T+K0WogP zFe!|$;o2dZNE$JQxC|`f3UMQBGRo!VwdslsTXa@h1Ytci>AyVvI!u|iee-3IXASd4^**~quP8^#IkqI8QpE-CQ!p)%HdW!?_X!vv&Wx$)Io>%gR#K`;^HG>{4G&SYcovh+9Xwhjjstrgk zQP(P7Y%vVpQw|oeO<9waq@?BJ1~1&l>AYpjiWL782d>m4|8{hMcSIzKST<`8Po$!mAHV9DJs;lJF*F2+{NnJIjqf>*%LXTn&K z#w#>sKt{JoS<~=w)#U>kSL8OeZYhl*z0kK#lg)5h0YVZiq~P#m1gYsV()s$HKprZu ztqp}&ZHeeuNP({v&{$jL21iW>x5NUh`R-osl=C1{dI0kE)(1Pr-R`N8epnPy9y zSsPb9TJKpH)ZVcWnrnZsbaOM+%=Jxr@!=@+d?oVk!A)fCN9gzA0+rDp)UP({cjg1P ztm%~3J>~Ar&K>4M*f;O)(C+Whgxw${>TGBql9BPVuLlp9Y}V-aW=nxpwj%xKz4LG}w{;K8|LdPE0=MqV*2*sU{ND z_R^%-w~z-5tpFUV3-|*Ca0Y);Q8KsrxBLsDi%PnX(S@jZaUrueP6D;A*1unbSLjor z_Ho9qSH2!m7!GY=G+NwM*=g1_H8hO4;30M19K3}p;QXr<6Rx0lV}{2+y5;Y@GBwO- z@I3h0DPE~u#Cwo6Raqei5tDHR04~Q`|G&Rsv~Tlk0(>i8+yzC#9YrZF8b#c{ZC1?c zYE9Gzvt_Tgby}$beX0kr^+iV-LGG3d*>ZJFa$zs>`rALW6C+!aFb3$%a1=LT*d~|l zqofIZ8+Byn- z#w#G-z}Ce-(S&#KQaJEW6mH4bw%+)@7C&mxEpO_sIe2+}OeA6O9u1K)Y<^~bDlXY;qYZQG(0 zTk)`|%gw`Ae)wL3wN#7PzC_rdL&B#ad*I>Re>l3Mt2M1BplYUOu$xbdR?ai!NN%_d~0ErP{OO zQI&yh&=1S$TS-#f)_Q@jsP8_#)G_7gt#pzZHiI}is*=4l5hetltO~$H0KgsLp z-ste-xvj13+{_0)V}_Qa8DX3AFE%2%6TURU!ix>IU4QC4T6Q^?6Db4_n!VE1(S0qC z!!cf35OAk+THvo2EuOn{@j=%toCBas>AuHz4TTo(K>_A>B26w+;4F-b$PDXfNb?R;5%4#1*WDgx)1=cM2-l=yUEB*gSDx+#8S1~m0Anxkd)U=YaNfv z%uz4yolhss#r-+V>p3_%bMbh+9^%_>PfpjaXBDy~pFXTlI?M;|Ga$@ z4_;e9uO)M(;adwaejS|*^gJhX*L9Mxr?@>|nc<$WDDwUp_|d|jDwInY{x5-t>wk;2E~iWh+k4}= zh4V+auSDo@PCGgh_F5k9?*8t!wrJ>|u8E_)p!`k4v>QPpucKVM{=@D0A)yNnvs+S0 zrs(fyU}D0i5b3|?|2tRxUu`VN_hDvt{0sTeP}lvS!-s0cwS1sih$s*Ilsr-?5z?p0iEJuspq}lOLjZ?PL%OO#Mde6BR z`|FeQ^WO6{E(jY#)VEs7QP^bf=4*wHPZ#U4vY+@&hb~XyU}?FZ8U_RFADu=i_jNDyi}PpDMeglgvz`^jg#B ze|Is?W}@jh42q?30J_hoav^A4VNZbzVQChRfd2_a=4q#g%XTZMdAY*;4ma4?%?pQ@ zJc-e9M1gXd?QLJYFeA1O;1tac^Heg!c^&Iu5rdD1=X;~VsAX3%XK;^eBE=(oq4?_O zDz54>q*Aw{SH{cG@O@vT8vxdOx?YJi(ubS2dkRZ*eop355a+A6SeF1G&P)sh%OBbJ z`H`*LosNcHi8gx6O$v9&)XKFi!M%s3qsLq70Eab7W=m8wG!!%n+z@7* z&TkHs)ax9q=eahg9dBIJbBBkIb10jPSIe!@6f6e^1>R4WTxY#GqVMhNXm4Nh-RsE6 zcmTnM)L-v*e*hbGT)AD3Ff?ULn2C#3d|Rof$|_7)rp$WirWmOldTm@LM<|DLCCSCr zEUo(7bTk(g5lQY7w7r`&@FYc}RRZ zx5?qrk?2L{pV4)H=vH_geI(pMZfDTvvc&8BJb_6qZ?3@`o^BDe(>!f(MY`?fpf3>X za@QW1K0lHBp$AL);AHuj|M>XtVYTgcj7!BXm-K*d5?ez>g<9Y^ zW~z`AT$KyTzW_};N+8ZK)?t|%4OB^PlwwTU#uYU@7!Wy?K$;XLhkP+m*GhWK=>!SeE*Qbjq`*q zs%oPCROC5(&QvfA?C1w!IW}mP-lZp;HJx-A8xnzgI5+T#tX3+-4D5jX(fw3MZSzzkzj` zmgz!#@iOwMhj;XtUx0-pVN&cA-Q4o?t^?%r2Uy{~On`NYU;;UfRKZ4>p zV3;E9{53S^-IgrOvXX#j^X_;fk;KD6en!OmWaaIb(i>^k+&2G{5EV2w(h0C2IhiMZ zg#WpMzUldC-K5LhlFIi7S=!)cHNKy z3!aHo;)e(am9%ZI{!E5iA!l9r{?2`5Y1Uz2=`cVFSSRALz*!Bb__@E@_VJ-R+>aZrsM4Acfo zoni)Z2ji<(B+CZh4LcdU6ZO5?*HP*f{pAam)4>8RNMvR5*_D)(`0-5HhcMs5-Qz&6 z3k03pW#G7aQw0W7rUgx z=~c&Wwn*57OV)Z4H+-Stg9fwP&WFq0(@gks)B2SAw61Zg_SXRa;pOC3HFv5)X`ZoV zK9^A!6VLVpEl1X-h~BBrl9oNHc$2_k)RfFUi+?vhJSl!lAvvg-C_) zpO?76zRzmzifBSFxj2iD6l*n!>7=iz(Y?_T)J(E^s4-+5?O`PFlHa%PYu!X4y_9W$ z@HUhg-m)Jfr$(QB()RuI_s&}ZX9hz=Ks#neeuCEnR$iKy1)A$bt|+rco@ruLStscu zocueYBH1f~ zCj?+q=@0vn#?R}cd)q=Pq~L-`d|8wC2ikwiI`3~mU@t%5La7ZQ@{z*9+_PZTGYmLr ztkU_#$oQJ}HSozSqr(q=m@w%?x$4FbG&=phNy>&giZ?f{Jmi1QuLCX01;@w3wl)*^ z&G&ULqK$<3*!;U)Rv&##?#q{y9xWSOK*0Gt$+qOH{7x}(amiOIuFnMzHiHoexb_ld zcGG!WgQ;epp4YA6X1t!iuJWc43QPi8W*-fff8g)kr11sdD+s#`4h=DLah-tlAQz^N zby@v6bSI>E>W2j9M4(%{V`^wuAtq%K@$_GPUYupXuC%i({C5Ep&D&U2msI|tWqkjco zps>BY9ULA34gr%~vjXp=E69G^&)8UI3zt9~E;8g+VC zl5&VOb;RB9i}hRU{icev8srO zcGHto?Ve`|2rdC0huJu8uL$~HveVaCb&>);A>La|ObjJ@x|J6Z`I(uEMM~AnJ<&@+m*JoLjexZVsg5UDV% zaQ*pwl`6qs^;qQm_v~AR8mbTYtKYWVgb83n9+D#Gvn-8&Ov2XL6l6R_R!F5)g9nXl75E*vuFBb&&HiAZg}ykeeJGKRW7->kPhvISt!zWov<Q^tiY%$pPX`bEjeRI44VGNAt;@ALWMs`u$qZyZ^YC zl1mGt?Re>T`s{z&U-J^7JM{;prNJH8|6-sW_u~gLgsBcU@20ipS$e6wrMsCwl?pmT z#W*fUYrUo5j{ifGu|i}vIW`)4MbREN8=FYbijZ6v2>W&T|HmNBgG`S*8q1|#&Qhb~ z?L%1b!tc#C^Xm24*@7jFf43XQ)u*KaW32D0nQlA{;0;uS>+r{tGC06vKT`%`uV7U1 zzP2|x(iP4SgqTNr50}tqYipFS6~)SbO=uN7aGrw#K0j|q_fGTj>jN>Peqto4@f>v( zD#W33W1e9e212~jMA(Jd?&poVnxpM4$+q)bU}O4rrxI-@4!`}B{^h@SMnzIjRG0AB z8w<8Y;@QA3V?KVibIB&%p33Fjb`Le%B*8YuJE4a4z;N|XEDo4&9q?!AB*fOH3>sR; zCyMhcsZH0V%Wgmn9HdaGz;#1bHr#~D0bmiKk0hto-iQiSY%=MU=nc4~zXw^f)i*2p4(PNXDqIzE16LjzY&SUEhJ$>* z*-v+ytNlNKW=B>qXg+h4rXCW{PX@`I75}vn{^?Jl0{m)P17vZl^hR7Fk;;@JyP{-_ zsNt6JAj3~hM5OomKs8mfjJ+S7IxkSDPTfjx^n$0G)O-K8B}mVKP;8aGQ3YxZ)4oI` zNg_vp&mSY`6Yh-!%)1f!4xd?AMA+BIcMehCqC_L#e3nj^vFZ77{i6FL%w~p=V-Nnu zlI4tt#Q`=6(Io-D?W7ZAU*1qJr*T#VCDd9|5= z*lg_+={;p^KiJ4_JSfvsQo!S4iZWyI6$sLTUYD7f+1c5tN1G^`vUb0odWuFCukeM< z1a9D0$mrs->_kB&mvNr26;`%&3s0HCBH& zvokXfz%f?nRZcAnNW}7NQx~FIet<*ER6rD^R3m@l*DnlAOl5WT-5>TBj0E5mUi4OZ z;rc&Mf><9&@~0@<9L-g~u8|o1lnFMCr}q;s3805Ud>@S6FX-Xt82>#1rk|t4&zZu( zQVpP4IXk=E)J0YTk0(b))2q9~wO(m)S&yQsW`;aWmPtc^=BxD=3y+fW<5K*ssbg>> z`V9idXWT;6kb!4t=0zKF@uzGDuc&Ky{9*k46K*6HcpTtKF@3lXk1(u|aA3WH-Yh1QbZ&XT#bMDd2qe z#AC2i9Il)vFfmTQ@U;HQ5Dq@d^X!cVqI)wOvd?x6&~(TRIHR{uFx)z(ZpMYXe60q^ zI{XI`IM4CkyJv14SpBB2X1Oxg>&QcQ2!7ZmU<>!i%%LnGZYb)O`lMK)PLA4#1cB&4 zN$SX+_`u`HLl}Y~(gu042F!}5LfG-?lOYNgZ{v50H;7z1@|UvhDB*@Zve`UP)EuQ?En1_?-p*I zWkGDr`JSIKotNzHUN4s)JJJsF2yc@=n4qq6wAS@ko`f&T0RBASpqP3QqLF}-n+eDu zR6Zem5pEVn2KI-4^IYrjf1h{4-CkrTOa3<;WNZwyGqR4ia7$|hQBCmp7f&AJ_DrqgzxPQJE-NhjDHUaL zu|ONt<}AT$QmXF5M~lcnyinV5L#EgERE}`!|8U1SI4@}v2{8OA!MrOq!eIV~)-m&}5K%w1hGq>jb>?!fP5R1k;slwmwc Zo*EE~jOa##-x&u0B{_B38W~9F{{ZMgbS(e? diff --git a/src/cours/SUMMARY.md b/src/cours/SUMMARY.md index ccc6ccc..43e7637 100644 --- a/src/cours/SUMMARY.md +++ b/src/cours/SUMMARY.md @@ -12,6 +12,8 @@ - [TP2 - Fonctions](./CIEL1/01-bases-python/tp/02_fonctions.md) - [TD1 - Bases](./CIEL1/01-bases-python/td/td01-python.md) - [TD2 - Fonctions ](./CIEL1/01-bases-python/td/td02-fonctions.md) + - [Annexe - Visual Studio Code](./CIEL1/01-bases-python/annexes/vscode.md) + - [Annexe - Un peu d'anglais](./CIEL1/01-bases-python/annexes/anglais.md) - [L'adressage IP](./CIEL1/02-reseau/cours/adressage-ip.md) - [L'environnement de développement](./CIEL1/03-dev-env/dev-env.md) - [Les conteneurs](./CIEL1/03-dev-env/conteneurs.md)