From 7a5a4a093e30234391244a808132000a1fe2990c Mon Sep 17 00:00:00 2001 From: Anthony Debucquoy Date: Sun, 21 May 2023 17:54:47 +0200 Subject: [PATCH 1/2] spellcheck --- JournalDeBord/rapport/rapport.tex | 54 +++++++++++++++---------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/JournalDeBord/rapport/rapport.tex b/JournalDeBord/rapport/rapport.tex index ce34da5..a0bdf5f 100644 --- a/JournalDeBord/rapport/rapport.tex +++ b/JournalDeBord/rapport/rapport.tex @@ -20,10 +20,10 @@ \section*{Introduction} -Lors de ce deuxième quadrimèstre, le projet Informatique proposé par notre université fut partie intégrante de notre emploi du temps. +Lors de ce deuxième quadrimestre, le projet Informatique proposé par notre université fut partie intégrante de notre emploi du temps. Régulièrement nous nous sommes rassemblés pour nous organiser et trouver une direction dans laquelle nous voulions voir notre projet évoluer. -Grâce aux objectifs fixés par nos enseignants, nous sommes - je le pense - maintenant plus apte à nous confronter à ce genre d'objectifs. Tant au niveau personel qu'en tant que groupe. -Il va sans dire que comme pour tout projets, notre chemin a été semé d'embuches. En l'occurence, nous souhaitons faire part de l'abandon d'un de nos membre. Eddy Jiofak qui souhaite se réorienter. +Grâce aux objectifs fixés par nos enseignants, nous sommes - je le pense - maintenant plus apte à nous confronter à ce genre d'objectifs. Tant au niveau personnel qu'en tant que groupe. +Il va sans dire que comme pour tout projets, notre chemin a été semé d'embuches. En l'occurrence, nous souhaitons faire part de l'abandon d'un de nos membre. Eddy Jiofak qui souhaite se réorienter. Nous lui souhaitons une bonne reconversion. \section*{Objectifs} @@ -90,22 +90,22 @@ Ce parser est implémenté par la classe \verb|BinaryParser|. \begin{description} \item[Header/Footer]{ Les données du niveau commencent par les 3 \emph{caractères} 'S', 'M', 'S' (ou \verb|0x534D53|) et se terminent par les 3 \emph{caractères} 'S', 'M', 'E' (ou \verb|0x534D45|)} \item[Taille de carte]{ Le premier octet des données représente la largeur de la carte, le second sa hauteur.} - \item[Forme de la carte]{ Chaques cellules de la carte est représenté par un 1 ou un 0. le 1 représente un emplacement libre, un 0 une cellule vide. + \item[Forme de la carte]{ Chaque cellules de la carte est représenté par un 1 ou un 0. Le 1 représente un emplacement libre, un 0 une cellule vide. La forme de la carte peut alors être répartie sur un nombre indéterminé d'octets. Nous pouvons déterminer ce nombre grace à $$\frac{\text{largeur} * \text{hauteur } (+1 \text{ si multiple de } 8)}{8}$$ en division entière.} \item[Nombre de pièce]{ L' (les) octet(s) qui forme(nt) la carte représente le nombre de pièce} - \item[Pour chaques pièces]{ + \item[Pour chaque pièces]{ \ \begin{description} \item[Taille de la pièce]{La taille est représentée sur un seul octet sous forme de nibble\footnote{https://en.wikipedia.org/wiki/Nibble}. La première partie du nibble est la largeur. La seconde partie du nibble est la hauteur } - \item[Forme de la pièce]{ Chaques cellules de la pièce est représentée par un 1 ou un 0. la manière de le représenter et exactement la même que pour la forme de la carte } + \item[Forme de la pièce]{ Chaque cellules de la pièce est représentée par un 1 ou un 0. La manière de le représenter et exactement la même que pour la forme de la carte } \end{description} - Dans le cas où le fichier sauvegarde l'état de la partie, à la fin, et pour chaques pièces dans le même ordre que l'apparition des pièces: + Dans le cas où le fichier sauvegarde l'état de la partie, à la fin, et pour chaque pièces dans le même ordre que l'apparition des pièces: \begin{description} \item[Position de la pièce]{2 octets par pièces, 1 octet pour sa position en x et 1 octet pour sa position en y. - Dans le cas où la pièce est flotante (n'est pas placée dans la carte.), les octets contenant les caractères F puis L (0x464C) remplacent les coordonées} + Dans le cas où la pièce est flottante (n'est pas placée dans la carte.), les octets contenant les caractères F puis L (0x464C) remplacent les coordonnées} \end{description} } \end{description} @@ -119,14 +119,14 @@ Voici le 'hexdump' du niveau 11 b0 22 70 22 b0 11 80 53 4d 45 |."p"...SME| \end{verbatim} -représente une carte de la forme : +Représente une carte de la forme : \begin{tikzpicture} \filldraw[blue] (0,0) -- (0,5) -- (3,5) -- (3,4) -- (5,4) -- (5,0) -- cycle; \draw[step=1cm,gray] (0, 0) grid (5,5); \end{tikzpicture} -avec les pièces : +Avec les pièces : \begin{tikzpicture} \fill[red] (1,1) rectangle (4,4); @@ -170,14 +170,14 @@ L'algorithme derrière est le même en voici le principe : \subsubsection*{Gestion du plateau} -Le joueur choisi une difficultée. En fonction de la difficultée choisie la grandeur du plateau de jeu sera différente. -Si la difficulté choisie est facile ou moyenne, alors un curseur parcour les extrémités du niveau. +Le joueur choisit une difficulté. En fonction de la difficulté choisie, la grandeur du plateau de jeu sera différente. +Si la difficulté choisie est facile ou moyenne, alors un curseur parcours les extrémités du niveau. Ce curseur sélectionne aléatoirement les cellules qui seront gardés ou non. Grâce à ça, la forme du plateau n'est pas trop carrée. Nous nous sommes basé sur le même principe pour le niveau de difficulté difficile mais en plus d'une taille encore plus grande, le curseur parcours les extrémités avec une profondeur de 2 afin de faire varier la carte plus grande. -Cela introduit le problème des cases isolés. c'est pourquoi une boucle vérifie chaques cellules et la supprime si celle si est isolée. +Cela introduit le problème des cases isolés. C'est pourquoi une boucle vérifie chaque cellules et la supprime si celle si est isolée. \subsubsection*{Gestion des pièces} @@ -185,14 +185,14 @@ Peu importe la difficulté du niveau voici le fonctionnement : Une taille maximum des pièces a été fixée au préalable à 3x3. Par la suite, un curseur parcours des cases de la carte préalablement conçue de manière aléatoire. -Pour chaques cases, l'algorithme teste pour chaques cases de la pièce, si l'espace est disponible. +Pour chaque cases, l'algorithme teste pour chaque cases de la pièce, si l'espace est disponible. Si ca n'est pas le cas, alors la pièce est modifiée afin de faire correspondre la pièce et la carte. L'avantage de cette méthode est que les niveaux sont tous très différents. Les désavantages sont que, par malchance, il est possible d'avoir énormément de piece 1x1. Ainsi qu'il est plus difficile d'appliquer des textures et dessins - à l'image du jeu de base - sur les pièces. -Malgrés tout, avec nos nombreux test, ce générateur de niveaux nous satisfait vraiment bien et la difficultée des niveaux coorespond bien aux attentes. +Malgré tout, avec nos nombreux test, ce générateur de niveaux nous satisfait vraiment bien et la difficulté des niveaux correspond bien aux attentes. \subsection{Interface graphique} L'interface graphique du jeu tient sur 5 classes différentes. @@ -200,12 +200,12 @@ L'interface graphique du jeu tient sur 5 classes différentes. \subsubsection*{Controller} Classe principale. Elle s'occupe de la gestion des autres classe, et de la cohérence entre elles. Toutes les autres classes (présentes dans le package \verb|Scenes|) sont des sous classe de Parents. -Celà permet de les afficher grace à la méthode statique \verb|switchRoot|. +Cela permet de les afficher grace à la méthode statique \verb|switchRoot|. C'est aussi le point d'entrée du programme. \subsubsection*{MenuAccueil} Classe s'occupant de générer la page d'accueil du jeu. -C'est-à-dire la première page que vera l'utilisateur. +C'est-à-dire la première page que verra l'utilisateur. Cette page permet d'accéder aux niveaux du jeu de base, mais également de générer les niveaux aléatoires. De plus un dernier boutons "Load Game" permet de revenir sur la dernière partie en cours du joueur. @@ -219,12 +219,12 @@ Celle-ci propose également de réessayer le niveau ou de retourner au menu prin \subsubsection*{GameUI} Classe s'occupant de l'affichage d'un niveau. -S'occupe dans un premier temps d'afficher le plateau au milieu de l'écrant. -Par la suite, les pièces sont dispérsées à la gauche de l'écrant et sont rendu disponible à l'utilisateurs. -Ces pièces sont déplacables à l'aide de la souris. -Si elles sont lachées sur un emplacement disponible du plateau, alors elle vont s'alligner avec ses cellules. +S'occupe dans un premier temps d'afficher le plateau au milieu de l'écran. +Par la suite, les pièces sont dispersées à la gauche de l'ocrant et sont rendu disponible à l'utilisateur. +Ces pièces sont déplaçables à l'aide de la souris. +Si elles sont lâchées sur un emplacement disponible du plateau, alors elle vont s'aligner avec ses cellules. Pour se faire, nous regardons si le centre d'une cellule (la plus en haut à gauche) est présente dans une cellule du plateau. -Ensuite, on vérifie que toutes les cellules de la pièces ont bien la place dans le plateau pour se poser. si c'est le cas, alors la pièce est posée. +Ensuite, on vérifie que toutes les cellules de la pièces ont bien la place dans le plateau pour se poser. Si c'est le cas, alors la pièce est posée. \section{Points Faibles} @@ -238,10 +238,10 @@ De plus suite à la perte de notre membre nous n'avons pas su gérer la partie d \subsection{Anthony} -Personellement, ce projet m'a permis de me plonger dans la conception d'un format de fichier personnalisé. -C'est une chôse que je n'avais pas encore fait jusqu'à maintenant. +Personnellement, ce projet m'a permis de me plonger dans la conception d'un format de fichier personnalisé. +C'est une chose que je n'avais pas encore fait jusqu'à maintenant. Et malgré mes efforts pour prévoir un maximum de choses à l'avance afin d'éviter de devoir -modifier ma spécification pendant le dévelopement. Je me suis vite rendu compte que je n'avais pas pensé +modifier ma spécification pendant le développement. Je me suis vite rendu compte que je n'avais pas pensé à tout et que je devrais changer des choses pour pouvoir arriver à mes fins. Je pense que ce parser de fichier est vraiment améliorable mais je suis relativement fier du résultat. @@ -252,7 +252,7 @@ J'en prend bonne notes. Il est clair que je peux tirer plusieurs enseignement grâce à la réalisation de notre projet. Tout d'abord, j'ai pu en apprendre beaucoup plus concernant la P.O.O en java, mais aussi j'en ai appris -d'avantage sur l'utilisation de la bibliotheque JavaFx. +d'avantage sur l'utilisation de la bibliothèque JavaFx. De plus, durant la réalisation du projet, comme dit précédemment nous avons utilisé plusieurs outils et dont la plus grande découverte pour moi : Git. Qui révèle son intérêt pour les travaux de groupes, et qui selon moi se révélera tout aussi essentiel pour mes futurs projets @@ -270,7 +270,7 @@ En conclusion nous pouvons séparer notre travail en trois partie différentes Malgré notre travail concentré sur le bon fonctionnement du jeu avec un parser suivant nos objectifs, une utilisation de la P.O.O de manière très efficace, ainsi qu'une approche correcte de l'utilisation du framework Javafx, d'autre améliorations sont toujours possible ! -En effet l'idée de rajouter une histoire, des trophées, un easter egg, des pièces spéciales ou un encore un table de score basée sur le temps, +En effet l'idée de rajouter une histoire, des trophées, un Easter egg, des pièces spéciales ou un encore un table de score basée sur le temps, reste possible afin de rendre notre jeu encore plus complet. En conclusion, notre jeu a encore plein de possibilité afin d'être encore plus complet et amusant! -- 2.46.0 From 512fcc069d3c94963c94ef35e0c455f82f0af860 Mon Sep 17 00:00:00 2001 From: Anthony Debucquoy Date: Mon, 22 May 2023 02:12:50 +0200 Subject: [PATCH 2/2] =?UTF-8?q?derni=C3=A8re=20correction=20par=20ma=20mam?= =?UTF-8?q?an?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JournalDeBord/rapport/rapport.pdf | Bin 131848 -> 132049 bytes JournalDeBord/rapport/rapport.tex | 84 ++++++++++++++---------------- 2 files changed, 40 insertions(+), 44 deletions(-) diff --git a/JournalDeBord/rapport/rapport.pdf b/JournalDeBord/rapport/rapport.pdf index b80bbd9bef95fce3817fed93c137ef23d06ca8d5..6fe46e33b96e20888087a58ccc305b2babdffc8b 100644 GIT binary patch delta 27019 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�(*R*?&;Kucm<+WKWVa^6;6BhR1Z9c zPf8Tn<^<-txJ8c2o5$!TzzXr|XX2ojT`efL~d9ZxjYtS_6JPQW)dQLWXk zydL_IaZE@~oVm1d=CqX4jOZG;>Hls7VvF6N!y`E{Fdbv%q{FeX8OtPitBd7IRJ>fO z)YIo*rGHyKV>S;QA6;Dg5q%xyqyuCMYNrd<6V;6TQcHfcU4~QpJLUBkb%1_BgsgHeo-B+Xc0w zweSZn2kunEh#7<;qj?pUbz>T7s?X{eJnlt9f1|Dpl$b?1gPDC$ix^f$KJZ886ZIFT zKC#_5^oLs~?*Uem(OlNcU}EE z;gUAvdOv=4XkgNn$jN<=1|V#6XPBTUv1D5&o^3SfkCpm|5lPf#10-J0U~_qMU#t2A zo&uZ(#KtPD6KVz#E4v)29)Vxm#of&N_*e{Ya_^9(9^TL79f_PI*9a13K@-ccBG#*d zyxDk0SI-Ye5o$qB6LUrlS`4Lg6!^^4zO ziHz+SargJy{)Jdo^smRl#|&cX*I1NNXX~0Ybd2BW1BxGdzBIC$^=XBuu71CNd{Hmi z6$qtlFTJNZz6@@D0*@~B$_+v{^#QEr$u;TJN0pdk_M%*v4AaD>P9>(ZDUn{>j}*Cn z8snsY`=AUvH?G(z9UN$D7FHrqQ}sfvsDhZh2|807KccOKYGmB0->#`uhn`zYxU_x% zn92u$##(pJ23cZ(67@#=(!Ug1t-KvI4Y)?vAfg~`0cAv zrP9;OKROSnP_v1&FENrF>qNTvSs7wZ?v`8Z96(^c(Vc|c@ic1R$u{6W=}G%r-AU`E45O1`m~|Zmeu-UIxTi|X|OPplhlBT5ktpM)Q6*D zWL}PgH5>KP!db_G4(=SsfL&vU(E5wnN(SwA4Lug|{|h@Q#MXZkYdD;#5fw@O>~)zQ ze`!UW8_$qNrQZEvzCTNg7~EaQV7m7?gjOvmP@Vimgb<+oaYRnVDS_=*iS0GLyq?Uc z{xF*-ujq&sD3*yg^|`CGI*)Y-gNwy9MPoAGF=7f2wH9c4v1eRltEuv}HYxC&Om0y0 z_KzD(-Z@j#$@hO9FyMNpUlZo#LxpLTvRi!<^S1e7e6yHl{9;$}y2f^fXwlDAsHiJy zgV#vV@uyiC1rK;R#$usNw;t~p^XCBldz8YB-0pl+h8OW@b02<&$RD)QFiG`)lmtZ* zZyrmVA_{2cF+8w8nLFMvzBI>n6C#H=vBeO{d={4l{se!19?rNQg4SzHHHY@DT6-LQ zIl$W89(|}SBmHX(MKxXg(41+6$~X-5OwPze=h8Q{;)hU(I0KF->KNch`0@MGC>Uw# z&D)+hcAOp;vqED|98!VDj}i?q>Nj!B7|Ae9qx;Rr-G-S~%m{R+k1oa~K85He7eybQ z7Q@6hZd!j9@RJ@@F%9?{7xW=6E*j!_U*+mI%&NvYKd_goG-a z?+mD%8#0HiKgPFh7nkGYu-&r@_P$ckn$^#4Rx{sym8uMQhp3#|@Ibdkd-eSY<3aM5 zXD_AihA`(5t6UGM6EJsmGrsxWjzMLnvhP80_uu4|F1YPZlIs#V)R%SjN_|DYXkGSYUz;t7XGA z&|nzvEe9M}X>%@6Wy%cVj+wQ~OsU*{l9Lti4R+GlM=#EF{@71d`M|rxxqN0B@PVVA zrh>nV^R73R)0{`uBx;1?>I+f-RWrIvVHtmcW6Jf+6g%_KwrNqnChMJkE$NrNTB=3^ z{0a;mF&C0aj-hn~wH(At$LoEB&zMB01g4OGubI4YPg#`B~L zdR!5XR}gR%-INEbQP!o|Iz(Yz>puOV>24HbC{5kcaH@@|j-vlbK$b*JqU3o&tki!4 zuV){0lRpub>g@$RpCIJ8a(;{|wW<~;sjBqJ+(C;Hg(&>mh9!|VPAiPQZUM?7*Ay8` z7Zc)VL1m}By7x%>9y{%5Y9DQSUX5e5{DXGf-a|NBo$Uds6jo;T3R8)wU03#Y^q8(H zN{4-*-TF|1(ogp~-d%&c=(@Wp=PrNws!P{9!7Pghhw2x2d^+C2>C1BK1Dc5so5`Fo z-!xL7;S`MHUEO^z*LV^{B4stza8IS3fKS+PnoOy@JXi`NzJPAz5F?^|Bs9rUwJK7l z?{gOxz58f6`Z6|k>*+_;8saBr%e81tnKU(y!QdoK+`eP_=r&gbFhuQJ<_~{{(#ieH zR{ly$5V^=bLYyr0Yx=M5s|@UUm~=AJr);nI{P^S}c? z#QPGv;+#uf6ncsn5?xP-r;c|XFl8i6t@Ra7$>@*Oah*ttVtz2j_q;>a@V-XuzCp9B zP+Clz&c2T*hhOH#kQdD>9WsAB+&4-|SUE8#^{w1h2G7O0N4;AL$hTu;AU?$BRnrZ4 zLp5oul!I}rMw+=wXtr)S{L1BUOcw9{(pI~zlJtLRDg2&CizkQ0 zMC8cTp`)KzFL`s1d7eoi25agDm!$Vy<0|rA<}vMw*H4v_pURc5HR;}!6S3OPbpIje zoKF0$VQXJfLrJ{&yN-OM-ndtrFy##UT1#9slb$sOs(B$K+x1l*|AW>#pQDe~!ouit zVOWiTX6b=|h_Pxpk!FAE?yCFY532_e@8f*$x1-4Sc0{icfHV}m&nK4pwxd?hSyh^7 z8t%&AZ&RGzyxLFk>zx2j0_(IT_^uM5s{_M~yM>L-x@!gwf{uj%1)raJlJAvNL2L7e z14Ipd?HeQDcLvz=lIH4j4YixGK&-g6>}3ty{N9#lUxYsh4GMo72bC%xM5Cjju4s`{ z+`lnw3N3K=W;)E13Taa_n7FSlLUf0rz=B{;RzrGr{AVOP$T4Q;OPmGmS>rwxIeC!x z{u}Bp6$+EnHEn0eW1UVsyg?V@6jI9ll?==+1?t^B!(;Ju#!2QqsP0JXbaLNyYnxi< zViF)f%QW?4VRe7j4n@bcLPXCD`fIo?--&9yhPSI3+TFR&0uXne!0T2?uZ==4a!P^1 zxpfl`!7Fr>hM3n4=U1keGrW0gacMTk+t|#{h3O!d%{?|WKSa>kF?AVoU6<|!p3}ob zMfaaZkofds^u5F;?1Oc~NqviYGR1|NNt>IPC4`sgkQ;wKCC|r3>}DXLWVlLlXSE1N z_jGi7dVo6FcTMm+ap$7yTHSQ<9AhlP%e+@0t8QhfuO?u_Dd;fmTZ+!MQ;OTqgxoz} zJJ60mfSl(*Wa6pIp2VssAlea&mTRL{w-9qCo@C7)cm7(APGs7Yh0z;J|AnaN$+sZ6 znFI7)k@|m7%Llvu>|d;jyZu|2gHq?niA12Tt34`B)9)z0wx1l|FxA_wd;*jt^u?nW+<6;dZih4(Dsz z=@}f(S!ln`kZ`qEv-X-2Rn)lQa&iI3VY2zIeRl(#fzSxXPCq@Kih%SfZM7Xz3Hdi; zpk!!O8tJlcV+j%q?eHe63A&~)Kd*DLy$*AQ_Lp?H*S$30n@Rs_231B&a((P|c@Ms-)}!}*DZ#Lh zu=iyVO|_IWw(FoAbE_b2q>gl#m`|nAmstQUWtApr0l|AhTDk>^)2bq$GQZ{Bat8f} zCzC#<*}=xLj)oo1IO-igRz*UfiGSJ<@szO$&YcCX(s-Q+?Ga($;r0H4bm4xr}h{^(o<@azuzKbGg0-_S1g` z)Ph1Drfa6+>S4Q|WG_BOQQ>X1d8ZK8&}Is%#N;N#W}nw~;f4a2z7xK(N$$!-OYr}S z_m-It=yVbv+a+;ds#m)+LbNbFBk4mJ<8qAQ-xuHMHH~ajap0BkH6l zy*jg19QbMLK<;h+>DsI&jiI)8{lR}uRE8nAQRFD+K?^48e813DQqlm6PmG!f^l307 zVXYkaLxJJ2yuPZNL^lSICjMDAZQZagJ{KkP*BOe(IyLmbd5*oyjSx-)gB5;zDTcXy z%VUI5r?`nfhzE>!7#0&uA1qXJUOHXm<(erz;MA{jNS5(oC53i8B~dTPmW6+4Wan~j z4%J5F)J-eFR;`Xog;(xwkqGmRcb%;X^v%m3OL8@rs$m{g=h>;*?MnWwDvT|exek;{ zVnhB-RUdo4x=~zxI%M4U5E90=>xa7Y4H4nSqhOQse>(0A5yE`a z+eh#Ob1QqWmK_CyLy>ESNr-=sH}oo@axS0V=(T(JrKYGQdt(tk@`{j-(~(#ZVSPsK zy&oSM_d4gJ^T}6bv;M<@UC~SHBJyp_+9Tab@Xc9zE_SNJUdA{zJ3ZPYnBp_GPuq7& zP2YTMuxrqOa&_ZVH6yebH}-hX8nt(DC%~7Qs^PlsYQ>=9c6PYV8k2t-KFLUzcICDJ z%ya~;T*jN>Y-#Snxm6`$Mfp1Eup|4Sf~e^eV2{iA&!k}23Y~fIML(j!BeZwEoGv$G zt^sp=-p{qYU1sEC-l8H5FS$;=s<@U%@5eG`Xls9EBT=+b&V@rict&qY9GKd4*Uf5~ zIu)JKCYIqx(Wr^xDlLC64a(&(skYDM(d*G{f3R)lq>PFA3oiD|;@RP`UBoMrLqF%iM2}xyncaWs=7qU(A9rv!gFkO(T`@dmx&-7{`%Pb6 z^$R<=J*}3!?nSnA?$bb${Wz)i?FScC0ZcPfI4p>Yr+N6|F5WtY#lyh92KCoo2|iO3 zgH&^T#ri0)Vd!FsfbfZ@j@hG*;)h8ZismmKT=r_TU!#9ni5rBJxZ|LExdLhiY@eBs z;9eCxJ&nN7Je?NJ1RBl?HQZBba4PK|I9w}AIQyXS3D4xvszn@C&d%%GPrF!a#wUxE zOP5qcG5tA+3;mR9fKJA7dN3#jUq=W)r z=+BlPpSFJn0Z0zsSs4Z1SRImg_UTrg{-N?(iDIF;5X7ktu~;$aoR&H@UCmQS>EY4 zo_;E{#6>4uU;7z z3%=~k_qg&QHbFnFHM9(us)@DF!87_ecSokfCcMVvby!iEfXbc1)MhI&} zAf7Gv#;EZmoqR+7!!yw>^$fAZR1CMEdzv&1VO@`2x?ks^srF-6ADZbx5n+81aAZS)7F?$0G?`#Nd>X?Ck5#kL+T@8ZMKXp~P<` zs%l>^V+&je_A^bR^FCaFXXWWUt0+H6*rYjFBA^g?yYYP%-N}#>)$2H~iGbqO^NrZM zOkfj*pANB8z`7X<5SQ?i$P#OwLX(-cXmY`}qTSEJ)LkSy=eUfg{*<~@g>iq0GPu=Z zeO4YlH`VweJfZV-m;qs*CA0SFn>>pdEWIBJ64dsmhrF&hSn^}|lpt1(%NO>VLGw{- zR0GZtnkG(*3TH5!)%U8td)&hy+pRUYZl=PCF7@%-5DtQ3IRzT-14H}CTxz)wSpuyw z%(H@Vrf)cXr*rT!V!ks|ypVtXuIxxGI+eItyAlYrPRiR04Z_GDgO{7Du_gRul8>y7 zIRlJ&DR{iA{Q(h)eoW!y5+*c@u<~c63FvZ&ijKw#K^+y4Ou&^oR@=3ENrh1^$uQ<2 zZU3M@GZA!`$c*!47nIl;;}~1))ppBcqKn6Rf!^d@u7b`RDK12&DZPIy=sA0ZKC&*f zX*8k>MRoNRqJnKfG2$&cjr#sCdcq&1XVZ5kk~&{3bbIZTp2kB85{bGcMqUnQ7O-A< zKYtf_wI=a=|fVauC9)%B2(!BA@)%O)>`b?+n zBji+DT40Gmt!&*8faRs(zv2KZa4WpgJ7jchIgKO{VS9@DnpZ64gDYH#efoXP#BtVq z0iu_leW|is3@U zs`;DC1RQ;dm)0%fslZZ`3$L_qiE&h(0QDeDlw^Bnv5u{qAx{-zsV%V@*7TqtgM5WSJ?*RcZE z4YcpUgr@80Z8;Mn>Z#8niblQ&$;qmJJT1IYAO*uj%;}~crXBT z;--E0fwF4Ic*++N%o~Yfbptl!XP zFZIYCi$?o-pZJsOQtxk{CmH+KXzy@D9Ujz%l;Au$CGxbTJWWZwa2oE~42(w4@Kn+` z5%@01YRZ4WPyi}UEf+iC98U3>lQJ)RTTe=MT$oVwX7oOZ2xH8Ah)$2JQNRKu$tp46 z5x4W6fKOPCAF6{`+jaxGwGZSe;U2X0M-!g@Gxs}|w5_Pby##gW1NhXa-VYzYXJ$;7 z3(B~mI=i;-)E5S@PFxj=Ha}bBxKP*2?rVSr{#<{fG>LC8*N%Opxb>E_7?s({EG+sP z-aDf@zzJ!wfyqyIBs%FCx`+TV48t< zkiOinWsBM-7Tw2V1fNn*``O*~sC&5d^<76O&4AgrZe?q;By$maw3vZ2;cMU4YS~)i zr^0`uL5dc#o;>J;DwM2(wUX_fjUHWMdQ8d7WdZZmi9j8(K|GC&=8evv``w~iQ{E8+K?CBs|qAT+T&u8yZevd?1_Kn0j9_hP_RY!jh zflDuC>azhlk3FHX^!RVIx+BmX zCQ5Y0`&~##7()e>l>BfjVo(0w5O#l4k!!~xO5DL1srXW<&k6@*kks722YVY>JF0|Z zipx(UM4(lpyFQKSAF7ORzuG?-{=(<=Wrvm4hwEpi9@pHAat=pVf}IRm58rC|BPzSM zKeUH;>_4$&6#OD%*lKn-wzOipz}Z4ObqDR{l`RuVw;kDRbj(KkiySu47W{whgBOk5 zqJljSpYP>7hL<=u*aGe8lea^T?Ped_svlnGcwX$48P>ZQB0!v>~J$ISjnOZ%|X$wfMO|=w8>9=))*D97O8n5>=N;zjp{)|h#3)r zOYCJ3^to|O$C~+YZO5c+!v%kjRW9CnI71=hiyvz+4g)DxcLm0-dC%{xS3xE!!w=2U zQI%e&|7>FNRrJj*#Y~-%XeUzh?#mZN-Gs;~)$A*4yWMz-9(^GTT6zBAZR(r&5mJ_c z=viw|~ z3ot-)NigWB_9Jg*b0}iI{BbR4ZbGRqjiI8ak7hG>B5QTQ48?Le-`raWW51S`PXI~h zzx_UxF!rpG|4Ppy?4hpey_W$;?b-w}gH>!&1MwCgI$`fS<5T;iT8=~F-v4YAvW)`0 zBoSVWp)DK2$+Z>e{Skk;9E7(h9v9Lj8+blJMN{K8%_NAJ;*a*j-J`Q#zf6@+0b>dD z4`Ojp_}zD!;c9y&lNJ{xj1B9%Ps_hX+t{fjgFA)!{nM%I_3S5ILpGtcd%FCL#tfk; z`hqdRG7_O203d+)4`(%!0u{v_{-M*?fDoMiTa3e)^b_ zgJ$5>yZxn-P`?l1SS~Yq{tYP+sUDS8_a6}{EH6D!sBJ08GtMuiX%ybe!*l#1JGmz? zeoWhYgFbA)kS~7;&njP?{f^0JAfd?Ju}oaKr+AmCu1htH0Dr9ZWS!@dvh9F?krP49 z47*gK-u7_KIeHaC%@-llfPdsp6`8j=s9jZJZ7U`}+OE@sWltwPdWu-(!)O6 zOG1Sx>I#1Wq1hE)W0HAh^wjw~%J2P8vIis?C^bvljw$T~30-+BWM*3uv0JeR_8Z07 zrgSTuZbXH*F4B7EBr%+;CSD7zJAlv~s!B>fd?(Rph>}0}$^nRTn0idTy^6XNBlEUC zJ2<#8!!a!em-0EC-aPptu{n2=qBYiaK{^p;Pyv50m0GjC`8&sjL`hRjlQy(sx^gy5 zu`8~4qe9U;>`9CLct1l+#sn6~93JTAyrc3WLAgLQu9cP(e@pT13afd}o0$bM6V%*w zoDcvjb)}*j)Rxsy)CoE4P!k^~_pnSdTU6@_`cWo00tk~=Y1%3(Lt5#lRQmg}XNFPl z-^+hiJq;@xUbpl1E}^8PdA@dBnNo0O#7y<38>K&LnD^+tO~{)kOmTdHyFch&cN?eO z5%(k;<#@WMyK->a-Rm&$bhcrKESPWK`Hah>SiXeF6^CcJY=&pkkE;E|SpDuw0Bdb* zFdENXdbTDkMAXGpcal-1-y0u${JHNm)w^mc{lc_O+P!S_H_?t5T|ps67UTP#ig-)7Ac9N6IgvneLzM7@ zYodiC+!LcT;f`3Ph)~2iO@t)gsh$L84v&(92&aeyJ_UlLg5DrWf)u0S8GpoBEkG>D zahxdN_YMXJNt}6tf(3Iu4uS>L!A&wE@urEgaJP~uM})N?#KRprYle46H1x7wfwDvj z7(s&`*0Y}0c!zd?qdQAlF!89B61fu}n!~Ik7_N z9;jfIVZ>@;je|x@9J4U4B!3PR1LVY^_Mo{_#u4}fxdgZnIvCVB&=M@_nN&StiRaK; z7~&;I{KP9zQE=i7V+4A73#v)ra{vW^dJlGmfjw08o;~Z)!Po1Y(6`wr@6qkqw8*E$ zf*5e>VUHf>i`mV5m@mM?q2eGvA7@*$TXMpnLVMj8)_|tG@BC>Gq<_qzI}VH7zy68? z5Rf{V&5y3LVGiDa1{|#@^7#~e6drePi|0p0R^)_-iXPnqMaZ*fgzka1HgfHO8(knl zFnv3p4Uh7IoPe~QJwgZhZ9z`cn0JHXvWbfG9|a48SA8#BwuMXo6L1OE!sUJ{Ty#%k z?pe|X=igKC>Ly+xe}CAtyANaCB$#u|vK~|Hl9rgOA`M_5e&;Q7vsKl@)!F z%2;DzgKC-U!?sa`S|j_gmv*d=drg5HPW5fzlZN+UJIawG_BODjcy3aAstbLSbZM}M z)>sqeBcH~dqgV|Om*FV71lpu3CJ4fmQhimUB}2O8h&@uRC}lV)0c_+cxg&@49H2-a z`~rQ2J`0s0Ayr$%gJoqg9nIY01jxC4ZkvmUY3;CDzcFi@pvPh2s$V z4}1ll{VMTpg!-tefVnwrn0CQq0@i}6(-ecyCIH9*p znZ+`TS$_@|807Yt%efB-9V{ZSlvoX!fHPy!Oo72cviJCEBN!5CCq1;HJFF9!evAry zKG@KRM8?v%(pNZ6)f!bqT7?`WqMyQ@^h)X#U$nS|g?!239FFEadN9@p z*>>3jM=Pn4Lk17UGRZF6AcL!ljHi@KZSYEZ8+3ClV-2D-Ualg_s<06;252K=xX8dI zwM1(&8G4Ga?*O~|&`U1m#hyvF!0im$KFLNde09i}Sv_d)YJlrh`GjJkJ4&kRMyxGe ztAAl<<-#+XKJ-{|#kQprP~AwEZBgAw$1;qEX-vDYLlZD>s}&PQDn<$JfPd9uG6Gvny!X+#l@hzx`$V zVCw@H&@jnHaJGsZTj5x>p(WW68V)^NhTR>Usx}uxJXIMFoZH#;Z~1t136IY7D1Q!v zZ5tdLUliG7Jlvd)COKg}dQ{|Bzr#H8J^CSaf~`ErxXk8wa{3S5q}z0t?$PJ;H~NCU zq6hRfeM8^UBRZh(X-2c*O_9?xI;7_`rx)~M4F8{jf@2{a(a}7Ehf6x9|DzLnMW=K+ zp5}B$XHZ_#>wG?*ozp+*oG$2Ml7B5OX+ew2d7jha%Z%R8&-9jlrGMq~*?*%A_Qs&O zc9qlPy(ZoL@b3Bk0hsiVv%4*-7+MrhMC?9`$_H80R1GS5)u6AzXkacl@J@rtM!`Ct zz&cYf%gQ8GgM6uCH*6j3hktzB-+URccSIAU&Ja!Bx$gsAcS7H!TM$h-A+m4I%mI&Y;9s6qEd-h}1lYPj0!M+$L`~LXN&em@5tbgtBtc+3Z6=YuJAM9D(;aM%Ko@G_f9)S0;n01g0UccPmeuGF{hd0eK zM_KlLkeCM}Su5SX-+l4N$74Wp^sy`73Qsn?L9gI`*6I=q09ymg27gyeG>Ubi$rd;} z7oV=O;<5_Mu9Zpmw{`{}aJ~&*bf!|XT$pil`*;^sU>VsB3$kOLlG?bsY!o$+YbBMf zcgHXHKO)FM7f22mal0*WzhChjY~yPX@o@!F2(kWhQC}<$V3EKjA}$bT^emgxvw1fB zlougaCpzYtVQYD~sDEusaLJvdEOmd{T5o5>`v$I=}cZFf4HosXv@7;1cRk%Q^* zW55ZQCJ8ugLx;g{&WiAemEiQPY>|f-`mOzM%~JT2jPQ|RZ+|>r6sRgerdQeO0c0JI z&x^|i(dkR;VD^4G1|32Djx_cybsBrex;BP4wNa+34fiW;lx=C_*Vm@8n`>wzTejgf z+lbOOrm2l%>ub~4fi$$yO>LyA*~XUIv~1(}BRo~x3N)0lEl2r^GOFSy*V09-uS4OFMvFEo4lo4sWTW*H@>x z+BMXLA(02L_*(<6;wv57M6sO`CO5Z0ABRdL+ zKl(`Dmm6KSGgty=qh9R092r>t4^_u2f0gk9Y)~^qIW{pxIYu}!K{+=!MnXhGK|(My zI59FrG($l%H#9yVJTpW&HZesxMmRA+IX5>(LPSGBLNGHpF)~CnLqRh)G(KGlFHB`_ zXLM*FGB%fy+W{(nCCfc8Ltz-k@#{LrON+LLdMT=^t*W=Gw<0l|&1|uBw-^l)zC&l} z2WSUhz+@*eN-89hia}zKNEkZsT({+y|8<}90Kl&YL`TJ#7#9>Ekbr7Ul*ymaW>xsY zBUrQBis%(RgkQH?zvv?(cQ&`hmWYZ75nS7cO|c=?MMbQCia{|zr0(s%m>4257dCf9 zLd1#UvE7D6K$MScCdCL*J+L_;Qesj}iD{7*%VI`k#H`2?`~Pp}i1V~nj<|ZY$`jqB zRe>yYt>($_(5gt*npO+s*@;z&y!5RW$(x4N68X>u`51FNhmMz1N2ld@dvd(T9UmRX oXV&o**t1;?u}6MaK##Zh1N68lO_$#S0v`%BGC2w*B}Gq03ilf-y#N3J delta 26796 zcmV)DK*7J!hX{y<2(Y9B0yHv{&=4qpg;q;%+%^!t`&S6Qm;!1=qMmzg-~Rf(`j@o zt3);>o%?Ftghv|DXgC_Rm{>OAM=E7pR8r`HMV`ItoEc(SpKMOE)4$>VM)WLq zKy}JeJn5Mj_v6mGLCxmb^DQ89h;ISNP7Id=TrQSv<>=&S0UqCj56Ft7C@Ok@AI(oZ zsoi8|RyQY&;@cuG#m>(}0M=}O0<#ikMA7-=N|4_>MQj%8;!H3}*9RCq9C~Yr?mVqC zFsCHGtpVnbwGw;Zn-fF9%N*EoMAm%iJ)`yLkUBr1COZt8X{V-14|vBzzgC|G*qq+2 zQKYbLuSPRz-UvQ{6=KG-1&QHDO$5H*IDHJIb5%Pv0(6lTqF3P19^GDlWF=pT{D5o0 z0(M++jHAEBtZ;~8rQld;P9H{RdaoUrxY}&QXZKHBY*L|GKCJu;0on%&IP@Ioy_+uS z{Ugnamvyv(cCwKaZnDWhv55#hPTK58MGl)Fz$IKvFU0-DHAvqQ$djhuo>y`R0QS zxkz)djZulCZXl>UtxL`=|NKNZ*-`hzdiFOE<$;`67?}DOoU(^7WEi|Y%fvk*l^8Pc zQAAH6pBzOOR;M7epdbBP@gg=7EH#%@*rG*n5w(;LmD*0~U<2cxn=D(Jha9 zFe4qnyH}YupO>njnjY5qcrj&eNb14!C1~raD#hJMHt%n2FhbjUr^gm6Y9S@M7&M$n zX0rZKnVE75{&ywrz zV(dHme+Gq5yjb%Cb|oH;ZXStM3#eB% z;2*n!9TRGV>oy9Q`6k)qIbnVWEO6%2d)fG(&iN;1hc&ICdwa^Ef)Pl+^GXw%5^hjm zlhtDH`n1r1Z9)p>2vDXSM}!~PaCD$!D0uD!2lWK98R~t1oE?@mlAAouAlLh$2%MWq;~Tntdc>uBYjij^oum_}Zy5;5!g;NRYQeNBJl*HE8J7;zZ5XIXqh zC|(UsBG%0GbLgS(ITGrq_dxqR8!}ow{VL6iA`>`<;nAW1qZx30eio$}BogP-O43AJQcK4%xbOIfug+nryIi$k=1=dm)DMv*np~8SIi( z9!6OuleCG@QAt^E2rysC+-Qww|gT zuO+{a$p$DWl5D}k1vqFu+F28iHIZ$K{QGpPTOQkZA)zX{*m}15@%2NBHiu2LdHy8g z|IfEiuAU`gBl1v+G}+wVZ$u=+qDVG*BtnrCo7?^7eIT|wA!Hi-ZV#%hJJr{w-G01% zdG#z#H$sGEf0|0%9Bp+g*}G!Cuq9H9TNd*XiR{=D}T~kGjQHPgAGu z4mxJA)NOd{$(rphO@dFlzl4#j40<#4y7Q~JQSXt|he*cTB#Q&>#zpK$WT20A=NETO zyEDuH$b>?OButWwgs{4|X81g(3j1Rzf)1I)#?aFLf37hHYN-#ANZcq%k7HgkN6gf` z_b=X1Rr53Uniu%(N6w@pdEz*@))RJCWNOXeB*;Jm7St}wa-yJv znwkVx(TQagDD3CKL0RT51JN}#dJ7ED{GNxJi@8W7cr!TsxE1?>c1)}r60#7MNf-l1 zjI1~be>3bjK!zTY*AJ%tf;&b~Up-4_pagKInE+(UP-Lut4^l*nO>-neGmjFOa?2eC zfxCCe|MeT}#KEENX>{tNCtH8UBhRMii9P>8M6HMfLB{QJ z;%a-;J#LjB428ynbA+`=WB5%&@7QQN2`5D5 z4_W%HL$i<*O~ry;5JrEorq$OkXmC{#xN6V49#e#y{BvNM4X-9kr)X&!=uFK7A=2$; zf9m4^`w2jYRw)y-{Hbo#9a58J8tAQXc7dil3D-Dn;|PS!p7*sp2ZxO=kNuP4wN~|W zjPS-zwcUa~W5l;s?5)}Dt#0=a13I!e@{a84|K7eYz0akAy8m)Ho`2MyG3=;zKbM&% zPs-8;m&P1I+fLVqmaX6Y8~%$Q;{TO*f0)xW6#$2opU@n$+nVBp8oqF-H|LO^2VHL* zd|lG{V-W>>a^N(P2lvK$4f)u9RK2a20soFdA$^-U{B`?3c<*SaPTM(a=zC7shg#cZ zfSIZewwTtLwD8K>dyUM9aE_Zxc>o{-{Yes=h$zcYW+|jH$X|IvJimERC-ic3f2>DJ zDokAY#Qxy_bNk0^f1FSdxoT`Co}qkH~8iiX&u0YH!~q@9L~J7XHH+V>yde_Yc|mWNp`yz#O2k#X=F2O%t0oU4Nw zP0K@I*@{|}5}{EwScEsFUUxn7 zv96$G8~LkWnQsp}dF9%Lg=zY-+RT;&0Z zaODRsaSX04O{w~aEfAMrf0La@Qd-gtr@8#L*6!8?+YV}|5CspK`V3$?b4?L&g(#Bj zJAe~Kn50vqr-hss-QYfP7)NqmjQQ&*CI!yMIh2u@I^n_$@{RS*`TFHUly@b}C!CDh zxi)}er)ujfk@J-U3Hm))@eg)>v-+e5IGfCgSD|!){TB@e6s+r9e`JY+dsQK~(>ox} zajwiw4I(XB(ucnFv>)a?N*K{7y!Gd@%`eXTUT~m-F44 z2&!=p4ROqcI{fchSJ14CwYp>WTaau|GZJrLt^jZtQU_jtwh5SX|EBJU()pI1G zHIn_%Nt2Xx6OXalf3Im8)x2I9qpC3o)ZMJw%*cT-?mnKWfK-{69<$HYQNMk$8qcz@ z6k_4y0^9<4oHO*w<#6FpO^+lFAUJebIONi8-D?e12!czGZ>HG{f^3;hB7AR6)6j+S ztCXKX-YWcBr&T;@{%26 zpq^nz!};??0fN83BKS+jFe?ksPj2|O0TDXpf>83y#?2ORW9k-vy^Cu}@N5hIU~Jz# z@GHj*>5lbE?nqPt`1dl1k$5SD!cAG3vw-;S&CKetYOy#T4b^h^uF4 zwDjD7SCUI|e+#_pV?5^tK1D!`shhf=1B=&m7Y3csDhyKR>nm_07-N=D8x|kE^eoZt@Pu`9dmQ4;)g8evSz&*|>>2W#Tr zT{Zd#+#4=3O#XRqZCti^t#SAk7cM~EzOieRGGS909h4F#Q@rbYC6mpf4S%#!WQlQghp zu>*JNoo^qy{#cHzaa{90v44p_mXB_@J>s6z;K2w65X);<3-46nov2m^n2_Xbm7bod z(u?VhY@GJO<$r3{Z*RyXRr=1=#nqFLMq&7 zZMkGHyS0gr<$U|y)P`liPNNTo<-(&YaH@fx6|SGIN#y(UT4pv}JA}PGklWh97vxsb z@Q`x8YZ=aNN@PYj8-I{YFELR`B9zW%P`>kR+5hinz5-2OLzrois|7;AQ;b~cMio+k zcN}ygau}kS!)dQ9-_vT0C7z6(>}aJkG(12>rWr5%2UFFXePMv8fZF43>>;J>;Ua?Ep>2n7pyADR zXe%HQ_fbpF3sI=Ep@Ti@B0lx*Nbv(Z9Z^~}qUx|;lhxwK)zkw=dUxvAeli3P2nQgk zaN9q+sh>Aq1_}E#5h-x?3VM3bH|wxFxTWx7NQay&e(-KzJDq)>A-8jYS%PVGxun374}y1-tcK=*0!%fNvxf(vLu`xSlfmS z#>SExHqz(-4lE13hLomS9Vd`OTgaLSR!DFqi#He0=L>{+^LhvIrK~Q)F$f!f-;=)5 zkoCiYgnx%P(m_9f!qR77yKs@W<+U{8A?OA(8)^f7(4X-GQOIR5MZuA>>8OyfIVC_k zBtST`U*ouhU05}sW#SyVISAU0^2qx>Oz>^J3FJg)8_irxHFsyP8nAZJcCKB{NyJ1+ zd)IQ3ivyb?D3E6e)KzeY`I4}#52DAutlUglNPmlY5i_`85P5=R0`{A$IYnouL1s3p-{9r1}!JO>cm++ zC6^(eMv$6VQ;-fN*;Ph1spJq2ZR_u`{$U2uQ6`EESO%$q6KhD_boh5jUQLQ1&wm8J zyO;(fnL}=X0N^7aLjkoNU-%mzKa)6JXPEoqWQ6!6_`0Pc~EYCz6vdwyi=~BVS}HMwyFD#e_@+ zrGyu>rw#B`7-wMN<8#xNunzMUhJPMB3G9QRx90>!6Y@&_lt~k6%FUVT(KT9ncjv&U0j4i%Q0>h4wa5la8L9z{Cgu68cajJ0-0Vp zD3t6_Dx@l9|1>G^wHB!iZ+s%$#?$ca?X7FYAO63dU+ZdLimrdWMbYiMg&1D2=?m-3 zG~8AZk>`1+^!h9D^V98m=LArb#cyV9~f855(v-hen9Bhoj+To z|JV&HPk-B#ytpm#99b$OivHA{a4m2;91q=aTKC`CiAK4qX^So=S-CsU>HR?mr|JGY zlz%?{1m;&%tvfZ~jVach}>q1s!I?T6Li zKjBQ=xw-8Qp#A!^-tTZ}H7iXxY2RBlL!{o^D}SDb3Dg&$K5J3^UrNb~{c$|H*621E zokw7_61=~(Y^;RI`I9sdjLN2lHFv(SYBC?}<*7d%5dd@i2So7F1{(pv3qIXF?imB( zrbidM*1-)L1BarkSkdoX*s4}hBUK)}m$Fhqxj-v0lH)WLXXlAH%d+AUc=Vk+Xor-4 z%YQ}`w5)2;`Vz3KHtcrQl|U4fmVjN}jOSk@60Y~hQ2~~y4B^Eoa zrsYv-O&M1Fsef6Gk zdAI&-{nU4U&Usc^vBb2Q%B-nuy-Y33N<+I+D?6$%XBy`?Lf+Ike|o~X9XW#xZGV{G zV2~hXB-r`54pG7blDRwJ_2K;k#eb608+!9P7x2F)$JCSgxDH;(#9Dit7&H(J)d=w7 zmEIg~KJsXz8xpI03&J?)3FVPm_! zdt7iZm=W$epizQI4JjlzS#B4f2!90g9dQv|K!0o-P5vPkb}M$*@X>Go4FXT$6aH_B z`{at#S}LZFJOG3K+ids=^=kWVNAOCrAj2%Qn zr7}&vK7yX34K=MaA}0mZvw}$(E1;eg4clI|H~3K4YcJ;octgJE_R$2tK7UR#PO!j} z!hAkdo;4rPXu#<00OY)2KpGVXT=JsH?hDutS=ixc=YEf=T#dP0CCNPZ_5+$yl1OQ& zs(rn8wy5yMww!e3nODoTVq$QjX^CLkmGIY!3HL!U;Rh7c7^);QzX0Wh5`8`oCyD($ zPluzQrlobM<7KJL*3Z>S;D2pHm8gxmf==|jWPh8QLKs@tO68slU@BX{Jqr0EuAynQ zi$+3>8$J)_x_^U~5)!kqe~BbY1}qf;ZiJhg*Zc~aYA#JfHEZ-W^nYtPZm803n0A?I zLrLdVA};7N52mJln`SY2Gu^%pC-P&OUO^{n&G6?^GQE`GX~AnL;eU3o8ExPJ=Bi`F zQWa$*C}dJQ@kS)4i4wV);-2c8Y-IV!1j6i5b0^I!IICY;rIDId`bf{FrT#7_YRH8M7@i z^{2y##V3Tn!K>s7pLs$E`1@RlmbB8w0bdX%`*R3h1^)qKQ|E+}X&xv7Ha3&c5Ga4G zSW9o*I1Ik`SIliZK;l}m<;NbkZ2~OXVu9wi*#e43N!9gZD%(N3zkW%P@{FBH(Jp$K zktk9kDe@!bWb?2|HrFo_{{Q{v#mlQyZG?y`rR3)3ej{WOXIZ)_5)q56+}!Lpe?@P) z-DQ>}(P1Z|W*TU+H@nNUs-oKPqIQ3SaThQVWn@NL-0P0no4~G_(C;o~5#1(I?vyB^ ziKsQR9h_;caXj%`6GO)gK+tv!M-RKdZ~oX^iXv93g8vMR$VvHHAM~9+y{Jg(qKt+S zk1wNo2S5MpKoNgdf#$eT+m88a?M4>8O;iGk(8PQ-?V$;qSt3pyvmWd&n3jL#X=G}q zw`Q0e3mv>8StnFJS*k76SE1lc5rd7e+xy=0Co=qPdb&y9!v|hscf=b*|NB_a)I3C@JIl#$!43=F0W5Z(8Xd63dKL3na&DPSQare6R zmcP7G`DqBMG*)E+f?nW*aaMmf_FraQMyo30vZw+pUaqXN=(9%i9(O8>wD(>Xz2c={ z7LLs@;voGA4e2RHXPOH%K8adwLmUbjXL-Ifz1#W|Qtfrq4dP<{POJhzMfbLVkWS6k;&f^*EWPF|k+bTyB57@^^`+ndvJD zc@IsF=_}Wy(HvaI7z4H+xK$~$Si2_I=@03u;zDI?feQO{ zClT*2qKw|6LlPC$jUI-x+6VzbCgoFYuE1%%`*uz#k(9BNBFG#(ei_&L>qs(Ae>j$t z0E2^8I8(@qw2C29miK?K=PRzwu)GBf-&Dap!8KmimbrSe)`lqcBH;@2IWqYUhY?iy zGMT~qaRz^I$Ru!>4X7a+fvJ#xyB64QzC)ZI5Low3y?@yMMjP_duFeHE7CL;6b{>f5|fyeof zWqCkXe$wt?nS|f>)g>Daw;31W|9R`Nw|jEefZlpE=pXbK7!%xeK@3DW@3<<9^Yea7 z)06@W{s%qziUIY(?LDrik^>f2TW}wFh<01XrVfGRYl8=a6W7K8@xZoK_`GIGF8=Ue zYbM}5F^yC!Sv7y6_0y4!CBrq%*o?U@<-GL)oyau{rVO<~u(!TQ<3jg*s}K^0;M^;N zoy*pI1-Kh{LCg#6hk`5wyq`u7j6NAM zv4KrfNLfq<=rvN9B^-Y;mOCuPD!SfDZjw}5VhBJ>aGW|l0@h+Prno^=QD+}_sfdgQ zP(71&iI0DDkr(WKbRM+5D-h|Hr8As^oc>av?ZtC2Ch#1;0KODeaw7G#2>~%E0k=t- z?65f0({jt9_dP3;PCEpgLkq#TN?j0erz~v2`FTAx<5K70WI0`#6FPz6hw2I-i^!iv z$`z_Dkn;WPBZ`2lT?t(onqXQp4Euxwmb#GBw$ygD<;p{(-;T+7>JUbO zG>J>WC~yrL5UyhGP4s_gAW^{PAIm$HCI~$~vlOH(0SEy;&V8XlrsqN&YW<~1veG|u zk@0_62E3S|eX!T~?l$Y=k8)?;K@U!Mdq$m#EH9JU@{_k}1^qs+;**z`zL$<*j)M2e z2TM}TsmvL@iR)M<`BVxG7~Id9wzk1nX#oBqoHqGl;Y`~9-e-7fYA1V0PFNYK_Czn9*9x~BA~6221(qbtfYNRlnk76$0nZ7 zfoEI7{Sk7Zw@B%Y52K7=5h(m22PmPb1>&e}6GTi`_a1P8B`~K90GKO)Jc0F?AXyd? zg!vn8rdE+m`LcMR+wp0j!6Wqe*~ov?iwA3lZ2@2&!%@Ob5YQz{VqexRm+rN7JfsgT zj(gyY!Vh2H{Ov56&4v+~9iKA=9=Rw9?;ZY_;OG)cME-%n9k10vfyd=`4ud2+i;?_p!RI@7c;e4^ zfwh(MFQn`+9U#g>MeDXOgqj@r*Thp4={z;NVzB= znfmklHb{g_C+&&A!^6Yd7sjiHRlIutDwgk0x36Bm%hXD#-9FEg)$OO1ij!ScWven) zJC#+d+r#S5=)D<6+jpC7TISKg47@nnO_E1h@r)ETacqH9qMH&g#LGE|>p@E?)il`406zF%!sw#%}Dx%{Jpt4W?lqqa@6QITw0 z{bXCDFtrFsSQ~$Mg4!rq8^mbs4?v)V^@JiMkpYRS*_N?D+UzMjkQ0;*Upl%_6S~p& z&FMBiyN~HH*r!kFZnMo)%<9&T!Hs58!(>NuMZ#~Fq@U2#MHSVP8_eW*bJVWx0l+)< z0>se+FZTdr5ZRE9*sOSYk@=Z55WVm2;xyi5X$~(N{|VtA2k^F%Y-5j45hh(brwg>S~m~9v*TlH@Dvz@I53PTe#^8< zPs0UAh$s+3k*N^8+^X1q5+&Z%X47E3`boX-T?=^IM_jW=q#ubB&-q@eUwYJ z#xDfO+JJw2z=(?E-cb)i*LYMCxB@q6dgl+dV9&Wrkh?P*b7688rtOI(3f?RefF<^h_y~pEj>?c7SUFZb^6Cy>X;qy*{ zX4t(Pz&Avo$f84Ngu%<5&EytTVyz<9U6S`3o+d= zSWZsJgV#3YW+ax*dFp!C&bR~#DJ>u;3*kaOlcHm?@zX3)PYRP=p`tgo!>B>vmuZc> zAu50IMt2%iH?E|**hWYIi^pSQL1-rkMleV7G(rST&I8PN!WiJWB_6lzglx@fABj^o zYul2Wk?&9Jv7db@^ucfsiGz=X%s>g4s@cE?3#H~|U;h9}>>~M6jPKF=MvVM@5}gf% z>7wTIt{?n@40P`dx^b3QlnCW2XM}z95WauWg(h`+q(Xw14{{?24t{4E7JOQA%b-U) zK&n9fXZz@@)Ar;j1i81SK*`<)L74!_hbej|sw{f2+|6|kj;Pmkk9rb@d zv|2Z7EAM&&;6-Nw7k-Fd&g;XyU}xJ;qBEXA(ZJxl5O zrh)MLhFGG_YkD7C29uMsU2Tt=3t&}5Z<|JrhBc?@x}Ml}0zb%?N*tuH2jATC;lK+$ zjn1!GVDR@`W#n5IWEL!5_m9tXLXm%xB#}6+^IPC}zy>9WquWiDKvOZ&%TUf6UL_rZtmhd4w@?k2B z0Y3^8q?*+e+(|->0nAC*%fV1i>&myQA^@r-gD|`{&Ah`!L@}vr&FKNA#94n50GeVR z={#~)SLpk-pv{sqWgL+rkeS+Lc%=wurv3J;A$s7KQpy!iWB10Hnys!)vz_84daR8G$V7MA~z;J>C+T5Nzpi!i&BKlcg;#Lg_ z;4GTZaOpbB_2E*kdzrd{(>W3;YubnfP9%OK}yyY z@PR*Pmb)hY!${c4j$E+zyrFfuli&=4qpl^Dy8+&1#= zujt#T0kxp6~O?CfX1gw6sjaUUE(xM)138x6hT3rt8Pt)JbL6i zpDzlQ#^9O#(Yz__`$U=3!jN0p+sElMqf_Ce1eKmr8SbE0ac_9nF zY&gF7*njpM^?x^W^WMSK4=yO0CwEM`k*aS@EIp2^Gz^lN8ZYZfMG zjC`;S%0z+^d^Cg9aRkBh3*xnBuleg~v9oy(`#gm!Cq|A|SVTUxW=s+Sst#>_)_V;GLgm48!zj$DakM%Gn0Iyuufi||3o zC{KF()S9gjWwi?Nu*_iC2@JltDLiu3M^XUF%)NXb)q3X7+y>h{TvqpDw+SNi~ zgiUSQ%aPFS0w%x=g)b@8hsF6%d41N_8Ih|W7UAchD!OLqcq!QAs5rT&&i?+Od8U+-a!j&s8UArQ=Y|?>)l{zjQCvyW+=XBvw zHKRy>fHqY>um=(e3Iyrty>vE-Z$xToYg>JAI*^_zT=MnayPVu~!6HoJES1Kls<2Wi z%cP)|$4LeO4%s`{9+#QCo(7-Kl?t?_+VY(inTJU!+WkQGR8UiBI#E=6EXTTW&tzHz zUY#Ca>`EgI&vjUGl~gDNQuH(|yxHqQIlN+jlAzNt*X+h3Cm4vRY_XmWoCv`%i7bZ! z_G+-MB!voW3u{)vbV3V;L=LgmVv2W?vJ9hM3?v{1&tb5Kj@#Q#&vp=`5#q)ZeCu^* zr_Qh?vtnyW1^&Tp#6sE79N9ZoAa~)3{(+-I0%Zgu)zZB*ttl0SRaM=!QHoC$j695g zz-~8y!kH2rH`q>=nW|b+C4nAC?X0K;=!R1%37#YaW}qK9S1?w3jB(ulvGBM9+tp5G zvP#m?)HY!l9Ja;BGY}68jJ1>u70gCMUt`^I{o1Hibu?=Uw9(@%{y@mKH4}xbv$ott zDw$iW{5#V)VmR;3f|uu2@E^uwDL>GE!I?L&9r?G~qyL4SI8s>KIZE+Bb(6QdMh<7{ z*wHOvJRNm(fcFEn6a;lJlY^X3{>;6Jh#okrxL*oz)a&iMUiY(+!vsV^5P^d1NF9ii z*`jxI?h3fVV*(mN23a;UfFDJ$L2rU9g`R3`jt-chWq+8>pY!4jTSef)@NboWP$+!l z(H)-a!;78f!Mg8dzJD~_jZ`qv?$kH_$pIL#UX}*yEc{<;tm3Ousj>eYN1PRc!OhZF zx$0v6J`2Q1YX)k?Z-(K9r`N|WxmTIxRviIE=EaP zq`)e2;JxR;LA6C|mV8BA(Sw)kfW_Ex4D}L$M!kkve4pAl-YFG)l#UGCc+`OpWz3B+ z%b{)zH1x&t_C|tN0jxQNQDLRy;LUns0@K%nlaF9zJbdZAE)$f@UCyU}*kXJG^;Hi9 zF2PQpa2iibAZV|5@hb?L$YBF>U#vLdkfV$WIJqG9egfpeU>y@b#zHd+vouG_gZ(^z_4Z4BKazg_p^$4cx zL`0S(Z`+ z5N}lSaVPIfq^gH*^k9xS0KN*K-&)bL;c!dV9PIBxosm0-z!@j(BNe$~7rvSnba#?t zw!JyJ6M@opam=EmW`Z4(V*$^b(AyqwzNA9#octXTz_xMYx%2FQC}!w=7UyK-8&lBz z&~Ky+{&1;fg^E6LbIYZVX1g-t7(~SZH>mpU@rn@L?XBF}!D;>>KoMvs=Kd-WXz&y7 zoPigG=(_See9^%xNq&1Z^4sgKLrqHyvktYQ^Hu3~5q*$M0umcG1KJDN|A@BRX= z5N%)zWo~41baG{rJvJW$HZV4m&=4qpbyrJs+cprs=T|T%kuw%U@G17#$z$SaChgSi zC23|L5|ZIkBn^FyhvUruCQ7UDdy-~RUZ$anL};U}aEl&)S(7p( z*(g3CjrBA*mqz)n4khj1GyRWw(39?I^Ek6jxi)=bh0V}grMu26wX=!-xw{RvqKb>6 zhW{KQDJgWQS2#ro~30d$I%SYHr<6y1V8sguh`om$v z0ZhY5#nCp;3dk5JchV!6Y3aa!9+X$%(D#a1{Q$OObo$-LTm;~623oKRNwCfGxWo;5 zpT{XASENPwMNX3%=*YToa3oD*QC4*1a|brS5oIS_11-d;!nv0|g@1k8A4)a9(b|X2(roBN@89unq%?bfAig2c-D-FnF!J#-_ zJ)Ko@Ziabeix57opxYW{ddYDw9WBUF7bG;n@90zfHU3IlXRH+AgT#|h5%@3Bxhe@y zQd<&|v$dL*4;z0%G6mg#^nwr~b{wf8U*u7dJYE1N)NSTTFLDdKRxwLn%kf_CJ3UPI ziaG;Y^LF7aB<|z0Yt!J`)q3yJm%3cJtnb2hHuBsckZ_k85czp%EL#8s+L?8|RGL*b z!|B9^T0MEGbw4%hZL3a;J_Y%HfNH)vA~<4qLm}IFQiqhrwN~JNh-7&$a64dgfiQ2? zME@VL)Y@2N+@1za2Y}&y}wp5$P{pYz za*qaeTxU6*C>RTHBw-su#a_XKGER4F<^#jg;*i56cP9vcs5su2D}YqH&Lp5XUR&c2 z(`*L0Rk?LXe2;;X8ML<|4WyXZ9+a1Dxd3Gd>ikl1;FwepQx#`5W1NWBGT*j{LcgiA zCHLUKb*ns-i=4n+E8|H;as-s*j6lSaQlO5~w934LaNS_Jm*(gXjW`rB5I8N?PGH`l zyh%+yrq_Lc9FF=CXNJ$jOtv2sFVL$ma=iIF+5uiQ>CK<_(qEX@ZSr$1yKYkh-1s2Z zZ<-1q3E3>j_<$> z7abG)Mb5iFSTT&wN-z5?kFH;@h;nmrHKlg+(=bnMJoi%0P1wwWZmZin8 z=Zg<+931YIC8$xvUE?nzA~OgHD|{pf|43M{Phd=hdNG>al_2IhQ9QEkwSfp7Dar<3 zV(3y*`T>+BI9WI3V3MBSx)t}fBSWJP#y~_Y)H3z*J&`a_!~em^6L_rtb3?=YOVoA$ z++6d26CN@%4G#fDI;~p>9wWvXv&6@?*##tX>o(LLG+7^3@*HNM4}o6^)1 zrOQgD_aodwQoY=hCo2vY^{Z(?m1#X*w9G2AbW0)X>F9Ql5B6m*ZT zbvei7<~+U8v6Y9@*kLzLufJAZN7OmvAbz$&o1xc2oZ+m_co5gQn~ybq_%!%(Aa)K= zHkD>YEuUcc#5m!uOqVkaMSR@u*v3DlAghzt%W=Irr+lm>#p*gbrMHv&f_3+3wvtBT z+Y1QY?P6#I(3ll*zRMUylaeq1cCgEc(2H9P_3TMaib3NK7$ZfA68G9WmY zy}kh#1UWS^HA(-BS&1Hc4w|OR$_X6wb!U&LISlR@Kqr z9 z133AFIQfM*H~?H69D@HCI>UqjG9V9#H9(aepyUh%yJ6BvJG*$pAhvdJM4o@X0vN5B z0Gxt?{H(v-0g_H&7{m$$1*n4Hc3>w&Mk|mbK-<|00)~74Cj_I29USf=1O$3|da{F@ z+}NFAwqi`I08f7i+zy}xb_2saz}A3YlmTiWC-C3Y*fHq#^PO#leN z@Na%@RxpSQ+>PB0;`oar@K+c_n`NQa(#}p!U?|)T^H+T`5E$4B(RXj)-;e76b@qh% z{)22FP-~lCG_2iSfVxnKt22=h*63x)%DIXE~3xVZsfR{+?{$`1G|fsVHe z__vbtml%J+!Qa=#*#%&OpaJ%W*nkoLFn!%X9$)|*<_`Av{ZsK@gvrSXu!dN{0hVA} z2o&=!IzkM#`3oc79|rLP7;_-Tj}yT0>+j!hricl%c7{57-v5UJfh72j~Cuu>W@X|C{k&QU0%E{=XH;xjQ=k)-(QP z@c+?+oFIU>-P`?fb39bIKl;hVCN68afV_3 zdQv_<08r|e=r6<%07~B>0RT|u4haH)vj2Y~ehvUo?hbJRfbw^U8vspGNU;{w@7)n|KgJT@WkmeAf!ZeF3_YM`G8@6#s1IYS-Hay9fAM8jfk!M2mk)51B1Q5R+wL=ovnn! z?CZkXFKQ*pJlWPqxp=Vqk7G_S^w(rbJT^5$q(v^ja~H(UNOphPh`s!Z|BZjE^yeD~ z17Z#bvn9XuSRvvs4ej@AELU0m#_&b2zPYKmb8RShbs1T3L#=Iz51O?GJWnJhnI5yc z9<5Kk+LjlgZ>~PCvO7R$Xxe3eh%y=%i~dAFfcqgzScl}Rj%umbl9Qi06=~g$B}Vs> zDde^<)BA?Gcvt#o%UO{j%jth)J3H7e$|tXO#L~8U`AC&5#sHIaYrV2hek3r4oV14p zGg`WR&`2oaA+^yte)Fx!U7b2C7}mU3x2Ev1qLOQMLi|KWYnMNa+15C5ogHUZMGB+3 zbp^)Ngpr`Z*e+toCL1*tAZ1%Ua#kcxW9TN4tLSUcb;Lk9I{jI9jFEqd+n+O-fY)J9 zYs!i$3Q~}Cbh4jcdoSwQ^6}M--&LNAM3$0#ebed?&UeK1KR!LC=^k3n{jtb6;k9zl z(lCv~=71{R;5>lUS*6Wq?I1JtJ~cuiMX zE47&hHDr+=pUgdQjeKe6<7#AIM37@rFYR89qCTF#`h44tu-|{=E1ok4aNzPp*an-~ zq?X!JB8_2VKXv+cT&$Kxl2(~h0~uZn`yL)HNAo#x$u)j-YX{yFXba;{*EVus1;}@xdnz9>O=vh0XpT zmSCu7u#Pq+QvQGVJ`*r|PT`vVvuuML$!+AeoV6uE4r^NeT#c}oYk%tLl~Mto8YTeK z(_yzQg@sLijk-yMsQNNWJr#J_@6xxD8*D=LeqFNfMc_dyY0_|KR+|m|l8_2-;p@JQ zy$-1~xi`{pcY5>aQnlO&Z$i3TMVT+GU#$ZdfD1SwB2RxAy0ZGq4`w#@L|)4d*A%z} zf7Z%LQS9^xiQnpwEU5~uV;DL09@0-yqONmWteFQjk>p75^)Ar3$*jM?0n9u-qFcz6 zetB%CeDYGfCl*;oR3&&5^_d7y(jXzSVO}JL_-i(g%*~U`X)TA0fOF5i)05YS#Y?>H z%<>;R1jT>l1G}Cq&uIoft^yzthQ5$}jUF%XnXQn1G%-KObZyMaJNbxnu&XL8B$h$v zSU1~!YMqiyBmoH*d-wE}tK%>elE!jw{FC<48s>>tXU0`brDcv~=6z1Da4vSguA&%1JN0CfMwm9E_~Q{8POG*ToVq70hrtW0>d zgCmM=kYk6wyrEL%b;{}GM61E_rA1oupRiT}zDIsI4Ih;& zvVN62U0IJxJ{T#uz!S=g=3{01BFd~Oq^baf6uW8DTjG!5QtmA` zMXeXpgGVDdidc=pGDBeLl6RUPgzf>hlB>1%;;GQ%u8OI+yGuJU>EP{fGjC`Iw4=RX zWrfP<-Bb?XM*iA~LBCFE8y{Jy?yRCNeC|l#pVm)F-RL9f|K-!WLio@Irbg!tIOChI zPwhB~$s3E(ly+9MKQ5cGeP4=ixq2BeXhe%f*3-5m9Ee)zI5ucAs?D2D%#^1HP_ImW`6jHzF}GnDKZrs@(Eox5i>rG9E1MR#*@;s) z#UB6e;n3tcFHd1Ptm?H9ZDggrKavYz_&^P1a~43GeYdx5hq2;iV@z^HiN}45+gv#? zQ$!g((h1m^Y17EUb4`S2tYUOrppIhF-eKps-@NE*fhz*E~hi|<(FEsV_{CH<7U6OaGVWB*>Qy3gr}$B@xMFiCY_ zJi2gDoIlv9ikB}}qi;kYYvHN$-supok+gBe-}RLsA+#nCVnnca+jNAOZgL@mO*AaC zqmD~HL$E~x|KaYfrFtI>m?MW?1=X>)@bk8Rr#xrNVOP=qLe6eqcg0Z+K}B>+jUt*2 z^QaQZ_4wvzoa~UPwjE;drU-a30bcmYjNV%i&<=W|j)>{74=FAGx-<6O2s5-d$Aize z8;YG?T*^Y3CNq=5b5XVi&j&`4?4q3c5O+E;kfA6( z=A`TS4ao%76w^Tmf7|5mF528US~Z0bXg71_oJx{7TlxYD0*o|&MAdMKW=F)%!XA4N z$VJkSWa8sv$8cf*TyZdCA2t~7dj1W3#wR6E*ewfocp479G)Bc{D~cgPcT=;yWd{=K zOvh`^Y@A6?N3wZmn@gD`LM*if`spzwev3N9rB6ouFQH%HksltLIH_7Es2J0sV9RwE zJZXCjA?~hx4x~!#NyGATj#YKM#YXd$B@>OCenp`@zwg+A*wY>i6v{8Nc;a1$NBm)l z+K~9>87SefRs#9T*@sq#RHqPhGnS&?OofVTVfY;15HE=|yEpUdJqHfH1)O|1ubT#I za|ym$-Yh8H+dGQwfg{$cMR-!qx0v$5b5{ve67}UbKtSClJG4d&{+$K1$pyU$?H|p# zS24mTd4u19*>IKrtb**^!T8F|mFxzCTZGiIv_cKkP>Z_$bs65+V}_%(l3YGdrh%2W zX|x7wpenx+lup`gZaoZx1U!cJWbeCz3@{$4VZS?XNGloXfnpD%Fq__+YT)}N-W0d( z{yo|_QJ0hzE=LyLf(;tN6dq9?jx_A*@YPsKif;n zZR9#?O|vuXXj9KP(RsctO*NB8gWZ)L*xYRBzP@Y?9=CQD>;F_c$9o>mI$6n#9u^O> zgoy^?{q~EUG3z9HrTl5Q-c^M1D(~08>tD^oX}Ngqd{=e69GT~yY$!C8emcqD%93Np^KWv7A`KwBxS89 z$T6EHPZYP}ELh~Gg-^QllT5AAJ@;$@=+9og79#gA5nil zsSQ~cDbsQ-QMDbM)nxNkxt0`OME_(x?}y#9cq;Ikpbngsd>hi4_!Ocz2?0=@tDMpr zEW{Dq$EC(I>M^aQ+zE{rSGgPd#OOQN+!0A9^AlZ*XiSg&1RqmP`uKch9`Q;-OcTcvHyn=}tq#`< zp)N#}JWGOLU!Kp}z+SfzWB^*f(mLquwFDyQN}eKn%5*So(S6oScFgM=Cde$xbI~DP zp5*q|fVt%THJ15vO+y3n4v+H@PtjP)b z^2UWazrIUH$06f;#DDKzpa{*Hs8s2pUP}efCUs!Kil(#L@#?{-@G{`JCi#bL?>J86 z|0k_S%JU*1x-rcM2KbE%GD3R0u${j?TXB~%DG@t#30wQ~)Xtrh()RKJc@Jps?q+Y-zk5v@7ADoGe$McFpfEm_Z}K*e`Qa&gM;`{+N$e&dYz>Wa3tckV}LE-V#f?5Uro3CT0caV z$EZ%B`}Q(f+8@D_2w{LjQd6fND2;djmpmi#oNWe`C7ZJcF_cCyAVe+Iv_+|f(T2ZW zg_V9(otWaxzhKs~vyX)3FU(arCHlaYTW&tbP_K&sr&DcxAF8KFUW-4lTI!auaav*o`T6uirE z7u*pGH~%}u%B@{7->l5}xG3O0@M!tbrR$lz0#n z@fRfX<6O0QEBE7YrA%(#31kc=peHtoqU|#v0gl+0nYkE-{nBSbfvOeo! zFl-}4yK!x}Yk{C2*z*s7Oh!B_Bba_-H82?sxAI^jA{IQjXt_6znAvYv#@{)s)TRT! z2tOzvzd7$~YgdljW*&W9uso9;y2ws^_nZU=xEM01Qm0{4Qe=XvKb_W*3rauY8GI3)UI&H*xTBbEJ`D{$j$gHys}vebHH0-L*k2?>Ffb4UoI6*uMw zMRj`tV~qEzj~(qE4sO=N?7l6)uxVSXdE$>B(H<6)hQVj*&Guo~%gHU3S=VSo6+>?g zn6J}d%Q(L#oVI(+ew_*h={5%PDrTc_5Z>9{p0b8z{=;0&H~cNy18<^_7VgqRWb;?< zfJ1~^yW6=r*NfYJq3X6y;=9+mr8+*YeVt`yz!p0>F}j)9PWDw>U1&|5X?kNaW-Llsup);FZoE;IDxBp@L^)mh40OA zf%qNF7A;t^Xu-P;AiE{4Q;?LW@_QS; zMe7VlVULjiZ^7xR>v9#oe#Z#zfDELuc=m|UnN_=*4hlma&NpK*lH~5aQY7M1t5d{S zhvRIqOb$g$)i*i%hLk+**;BL_fS9D9IKNyBP|bDVYBQ$o^@J5c-EziN}{!vgY9r98e$ylgJn7A7(c zauC194C0WHNqe$WmG$qYbnP!pMzXxQ@%Ro+*_LK(U`c73>>{W=6nc#t2qaq|+i(1D zDFQW&ir#M`gMM2g3PWY@W5m4o>*MDqh2|PsgwR@%L-Un+rFrwn2`4Ou5ufu{QuHr+V1vi%fC$7_v~x|we=C&%4t0GP56A#Hywrd1rJOHy9m zLGdDoyp~__f8N5ZBk};HkU=cN`TeKSDmCKP!`)_OQ`%w5^B9AwI_ z?}7RQ%CWK2EQ*EMgEvJ+gi`2{!e>o_(`U9LSn8Z4Iz$d~dsN$w>!9nOIJB}~96mfZ z-CG29ZpOum6t|^4fU6rG>ZNp3kiDIq+dqj*Jlt$|wOIq_%!qlAPj9V5bor2sW1%KG zLsv^nkM=wWo`p)egXp_hcU$@Md+*PmQ&#<%x|xG_*UBfxj8=0-kVIE5pf`cb@OF`+oHancp+7VrTaNrK<;8lprav;u98Qu0dh@C?{ z5fWV2Z5Lx)i%O&#?>Z@quQc0i~idF4S5l{3N?(wK-Y4QE&U-Z)^Q%46GR-#+f!=o4~Gb50(kjrt(k{5>BcoP$J`@H zNn2h*C~;P0E#ATAObrxBI$P__Eo&il2Y%Y`2+ebVO+cD2thW1)(2r^S*5;jq2V2Vy z*4*2n?zIQoWKO{qBtTUxH7O5=8?!~&F2NsaCrGp%UHuG@qne#*uBabY=Do4Crx@3LpYXTgQM8n}AVtj~)(WtkY z7hSmByZlu3hs0e%aI2S}3c5WZa!Vf1#<5 z5@-QMUeFfwNS8C(&`pf0bXG6;=|fPgX6NFjB=jOo!Q#bs1mo709m?`2J##d3I$TO} zr;2cCD;`zmR}3?CosZkl6j;zY&aX9qokN&lZ4G%Gi9r40_+ZlQ;ups>Dd7?p){STb zFN26V8;kujHC&D5diNb|Tv99^FAexB8Rkmk>P<52A`+SiCfmgh?uy^jt^?<%J}GJ> z)_5UIFKouRWkRqZm-57AL7!+lO0FHWPg8cMe^*=oM|C)=7rS z+*Jg*_lHd+X5hLYYgXCa*nfAGvfonF&x*G$I?5J@$R@TDlvu6{@RBuNQ5ysd1zZOv zPaIiqRAFKodU>C6?DnnHSent@ZDQ-q-F#iSQ<*`sr|{a*-T8E9un2-HyT_Owc~|(y zD_w!a`W)*du!W(03#=^c=okb*0DmZm)8M549NzSTz0n9)J`1#6tXN)U=EoB#%R-1z z{6o5MIHR14-k#rRj&Xw|GJfp6k%Tio7n+?e}x<4&h6Be<}Q?ftCGfo2_BrpSDU9az?ch=mbLixc*i!# zbn0t0j)u1Q)GsGFX+u0>rgg)Z6TZE@?&@A4_7v>PBLYRyRi=S09;ObH#clOtW$0(0 z{~=YWi_ffwDBIGjUUlu`;59tjNi<}aPIL3!7pJlcjZttqf1ND2;TjqWS}B57pIWGT zrYr*@7TDx9fr+11C%eFb@wZ)qj((2F59E<}EiDNg2KC?pq^71%o zwZzE@ZFGZHOV9qPA?`O-O@!{!U-|rZC5sPXxi5nKnXO93ILHeM3PFu0T28+XSSUTq z$P*lJ#xOKfQ(MdWE>S=IMBOuAHEA7bkdeeVd)&rk_3Ie8gJ1#eWkCVD&$69kdMJ@*s1&?h< zzGCIn-=F=*JIA+gz}c*i-p`lF_GoQm?tU}xR)6MY- zHt${h`5fdOzr6uBKeQE)%(2VNxMkNYnh2R@Y@J|Z(IGZyjP|*@h)A`Sur)tZGRETMmi>B2R?)3J{!DH;B^@|!P z^P;sG3q5=Jdx!t<+%T-g3i6(p# zm=U|zbqOGloGKs=)))6WPWiaAtQ;DhS-X{Y8sIi<`^c_+37I)OC1YaY)RjvQ(=-WYnZ0?D#KeuOV%bv_W`N7XS-Q*9oiHVBBY7LE!|RvEuR}UW&5H)m z=o0nsdb7HbrwEcy+jY+Cv}cVEy$aQ@;@LeZj*us=FGA zYM|A#L7emY8`ZH`^DG<75JFb25DvTu=q5u`6K6{s)1(*sfVE$K{)u+oOUgvt zef{P<>6Kx=@2dzM?5(SBk;k3s`vyJcd=zu(du5r2)T@T!y$1U(VZ7Q#VBVjZ1rb)Y zBrWO$pq27Iu*NK4GN$}7(m2EI?IXXa5J+>3I$VpMF&sy-*3$mIaOos&&+@X#F;dwh zQ9A=;K4&VRqJS^!6dNc~QwZlR7#4Tpt0FO}5xXdvSHYKMl`_pkgM^@r^^i|?_ts=w z(8R)hR|xKDX}(=|@8X4Nd95Epj5u$O=DM>$FR|0n5Lq*^rCjnG`B8}}C8TcZH=vo| z{X{tMc`-6mE#%@x@lkt`K7c<++H+U(pjTjbEuO{MzWE$#`#7E_SGLg8wB1!O-GIU~ zpTkuHmPjTiUGqJ5nCnL=rQmW8H7~O8H#vzrr7Il&Nrmx4j(tgxe-$@{$D8GYP@q$u z)NXW8oo+Q7#<3gLC_>+tQFZMd5)cT|%|vmO9YEt-N+Crp)E~a&y8oD|&`MmiJIgTk zK@CAkqq|K2(H;>Oa%{xThIq2B^<>RzR;6xL=-Eq-7aKQORLJA|BPR?QTcKn@g`XYz zzOcUHdua9gQ1G0qnhQ0b63S!B$@zZH!3mYURM*yFa;3+INk=PK)Er8(0SE0@lu5;v zbd2ie>8~q%8axu$zYy1hQ%vhnj;Q&tl$FVwEuTPFAiy(pc+1X}m$=7@RI{GFB?$BL zrKa)RtOa+q7R7$0dj`9;` z(k)jZv6s&|j&`fRtE7}den9Y#197GV)f4yM`p z-S+9tP}`NzjZM=eznlkWweb6-&VM98nTNf_AV0b4tNG{l_a5(C6j9?&zv;tw1v}4B z)9d{#tEDx*8{)8p#pz7E?tPVhgiaY34PM4x#&oMGSgd^&I=j6!V8ovc-LeZglOn)3 zl`IeU8$3y2Yi(Qg6w+b2#AH@8)Cuts0=pTyun=sko1Wnz6s8@``0*1eCL{O+`$vVXP4{;|R znrWQq*C^!JM{a^JFg-D{*8j|*p2C)W=VI2(W0Z8_+fx-v$}e!wSzrt!xwz0a=6M9u zGY-j&vI>Q(P{}N1HIx-D5}VH|Es{%$HGuUkLzeWPY&N#Pu}T67dxj#5nIjpP>(W#` zt)70P1G*@DvrqRe>kE~>y1>^zFkI*{x&O`onm8b&f24!MwPyE#AMnt#vU70ouyQc4 zveUA%(tbl=QF1buG;y~eqm$(SuQJ5J%Jo0YFqmK|H9#B+5AIl0&!qj6wq|m*W!@1nnk-5(M4!M}eK|wn7 zNRW#WjpdcFyMj8$5msuCA=J48)+P}$v!P^0HiN<5$a-!tap2h0w|qGe!#;h4G*8=O z+sU*-{4c(S7;hbIbbjuB{1xMJT(mGbzN>q3=)Wzyiz_-p*BLllg?zS%yvpPp$gW(XQ@9DL+8Ui(6$Qtdb*np^K zS{ucQ2l>h{hrqE(S)cT)nemn7rzT|b$Z+tbxkfq*r2-cCF-YX)vfT{ zcxl+YO?sie6sbQ1a1o~4y%unLf>3+KH@8KEFM`l~{apftI(ex_CTz}>Uwt?kQS%&s z<(C6yyedz7=A*0KdAt-X4s@y5{)ywOL1n@d2BdMZ6iozc;f+mZ{(^Q0ht8Ewka?V4 zs3WRzL@rH%OhazTZ|eGZ*~JRMlug5FbfmAldy0%@;UmsihJ@>->~KM>B^t(D)?*2^ zeESiL^tSlQ@~qtVi<^lOz9^-#q=$Sf&#}Pv_ddBB9m1WJm$WXHyD1$;0Y_&8^3(5m zF!_vTd+SBvJ08o4uLJ8mc&VUJD~OR;HqcM7ytX%gAR z6fmu;f*T?8nsiKgzYB~c26`3<-9zm#*EAIvUqndk!I!iU!ox*y3a_2g(5*s68()UTM9$xM;5|jo zv{bhq%*~X(fyAMC+w3^jv)?+CJsPmUX(X~|9lc^pcOzwVuaE50GUYOdn2wRkfCvsY zzqu=m1*4i*_C1yI(xGMj#KV61(Kj0*IXvICuFVUIlXgthB8QDUExSE#b2|JQS`J(3 z9ux{$F@irx>uNBzS(K;{T`?$Np};y*F*W+#6)%EYam(x2PkAeYFN)3Wh6_0BtLpL2 zF;t}gKzBhTd<`1l%bD_f{BDo>`^pq*T1%ZP9El{#BFXSs3`RRMW+VmC;a1L<(A|yE z3{lUf%Ro9sbC1jvX;ymJIWbVdHqx3MUpmV98f?=aj~e%Wf0Rmp*9E2l^g9s|;5VOS zWLWPE`=eA@Taa-Ymo>f>Q3EvFaphDSlv6&M3??x=G3ER`m+rWZK9}ZCGZ9uaTMxy| z`stCpkaob1jc}4cpsvn{3EG};?u>W8^jE|`I<&}97|WQgk6}7Bhd)tM#Dn<_0n;QF z4j(>k{s#e0IFq+TlmuFVP9DtuR`_Rl(rjLF*jywGmP-SN!Iw!GrxidaG+9l^M1aE6 z6)2fLtzT$9^k=U>W z+d%e0?yT{*Yqf! zA%7}5ooT;$@nwGrnAY<^Of^q9#(Rl(yzfmdd_w+wOlWkXti+>;;-T=wExb31$Rbi1 za}za&um;05@TLX-9sP5fR@4fjo{@YE{55IAah1P?^y}3Hc<`zBm*NyVN18kQ_0Cp$ zky`3B&lFMm3kv|voCe^4oK8)mD!gLL3DT^J?%MJP=Ip)QJcOB@Fg*v(mNe1Pklg0( zJ$adHSt0J6G+_7Jh@;bu>sTh_;Ko2ZNb(<%rUtp%iCNHhV@xXt*?b`v#yks^f&#=N zJu1=W&ib$TgEKO%3>0q)F=xsegbi_4J3T;iV>6+k9iZ*4HC+CLz+QL%{8VkUr_1Cv z^Lw)qcDI|t0&MUvJ+vF)w~#V;8Ca<1<@xO$L4qz(G_CJs_Ihgu5u_N~o`1)~PHl8d zmmAD)?_a;37@7uaZcB9!=_UeVsE@bPs#6_zu7%$p4*cp5PY)`8FbJ;Q!gL3n=vLY3 z_tkURuK~NZCb6arHQ$cg_)qd`qt4lRCTdgVo?AU(NS(Wpb88e!EF0Jk_MY~b$0ylc zn{^Y2CsG!rUt3hUVhk86E&)OBS7tmu9SbU0!n-!6+patxl(;)&%!Uq5Rk(&P&$&%T zl<&!XOcai2Wsgl6a|^m`9~xTZ+O+(~nI=|#yueHxb=zK?dR&LV5evHxL+go+y@ztE zT}k7g_h+Y;CqQ6bKyWvxMn~`kz#>%ZJ6DBB?kxA8)e)#3&Z`+ewYQKK>Bf(ru%z;* z%)3$!TWFj+geWEWm6r}i9Du-kJWmBqYq(%?pS?h@(SUByqd7To>lSeGxFL%0kDT&{ zDX>a7b&OpppKvDCQ2n#|xv25nRoVS*nm?oGSB$8P3Lu5?p37g8Y^F{)u(3{;Y&YLsW5uQj4JqWzY8mH?^v>>iRl;L*sda`lUf8cW4(I2O`f_OdC5ft9{+5OzSNI?J52su5Xw6O3 zd?+6eW585$GCBtj+srg)Rq$~Ge&2hBOU|IoKz;D0#V%_S*U-oHVo;Op;<*<8{&b#8 z!6?O0>b~|Yi!$3L0aYMyM0)p(=JuYzdje|P3zD?G&r0aF`NoQ?K`a1)^e4LX9coo9 X9YT6JBm^k}2L~GhHMJB-8sYx{shXHE diff --git a/JournalDeBord/rapport/rapport.tex b/JournalDeBord/rapport/rapport.tex index a0bdf5f..726f9d9 100644 --- a/JournalDeBord/rapport/rapport.tex +++ b/JournalDeBord/rapport/rapport.tex @@ -21,9 +21,9 @@ \section*{Introduction} Lors de ce deuxième quadrimestre, le projet Informatique proposé par notre université fut partie intégrante de notre emploi du temps. -Régulièrement nous nous sommes rassemblés pour nous organiser et trouver une direction dans laquelle nous voulions voir notre projet évoluer. -Grâce aux objectifs fixés par nos enseignants, nous sommes - je le pense - maintenant plus apte à nous confronter à ce genre d'objectifs. Tant au niveau personnel qu'en tant que groupe. -Il va sans dire que comme pour tout projets, notre chemin a été semé d'embuches. En l'occurrence, nous souhaitons faire part de l'abandon d'un de nos membre. Eddy Jiofak qui souhaite se réorienter. +Régulièrement, nous nous sommes rassemblés pour nous organiser et trouver une direction dans laquelle nous voulions voir notre projet évoluer. +Grâce aux objectifs fixés par nos enseignants, nous sommes - nous le pensons - maintenant plus aptes à nous confronter à ce genre d'objectifs, tant au niveau personnel qu'en tant que groupe. +Il va sans dire que comme pour tout projet, notre chemin a été semé d'embûches. En l'occurrence, nous souhaitons faire part de l'abandon d'un de nos membre. Eddy Jiofak qui souhaite se réorienter. Nous lui souhaitons une bonne reconversion. \section*{Objectifs} @@ -49,7 +49,7 @@ Ce blog nous sert également à garder une trace de l'évolution du projet. \subsection{Choix} \begin{itemize} - \item{le VCS git pour garder une trace de l'avancement du projet. Avec comme remote une instance privée de gitea nous permettant de vérifier les MR/PR plus efficacement.} + \item{le VCS \verb|git| pour garder une trace de l'avancement du projet. Avec comme remote une instance privée de gitea nous permettant de vérifier les MR/PR plus efficacement.} \item{Une instance de DroneCI permettant de vérifier que le projet soit toujours compilable et que les tests ne soient pas ratés sans que nous nous en rendions compte.} \item{Javafx, comme recommandé par nos enseignants.} \item{Les pièces et niveaux sont stockées sous forme de matrice de booléen} @@ -75,11 +75,11 @@ Le tout est géré par la classe \verb|Controller| qui permet de choisir entre l \subsection{Parser de fichiers} -Pour la rétention des niveaux, plusieurs possibilités s'offraient à nous. Nous avons alors décidés d'accomplir une série d'objectifs propre à notre projet avec un parser de fichiers dédié. +Pour la rétention des niveaux, plusieurs possibilités s'offraient à nous. Nous avons alors décidé d'accomplir une série d'objectifs propres à notre projet avec un parser de fichiers dédié. Nous voulions que ce parser accomplisse les objectifs suivants: \begin{itemize} \item{Les données du niveau seront encapsulées dans un header/footer pour laisser la possibilité d'enregistrer plus d'informations (images/musiques) dans un seul fichier dans le futur.} - \item{La taille du fichier devra être aussi petite que possible, tout en gardant les informations nécessaire au bon fonctionnement du jeu.} + \item{La taille du fichier devra être aussi petite que possible, tout en gardant les informations nécessaires au bon fonctionnement du jeu.} \item{Il sera possible d'enregistrer l'état d'une partie en cours.} \end{itemize} @@ -90,7 +90,7 @@ Ce parser est implémenté par la classe \verb|BinaryParser|. \begin{description} \item[Header/Footer]{ Les données du niveau commencent par les 3 \emph{caractères} 'S', 'M', 'S' (ou \verb|0x534D53|) et se terminent par les 3 \emph{caractères} 'S', 'M', 'E' (ou \verb|0x534D45|)} \item[Taille de carte]{ Le premier octet des données représente la largeur de la carte, le second sa hauteur.} - \item[Forme de la carte]{ Chaque cellules de la carte est représenté par un 1 ou un 0. Le 1 représente un emplacement libre, un 0 une cellule vide. + \item[Forme de la carte]{ Chaque cellule de la carte est représenté par un 1 ou un 0. Le 1 représente un emplacement libre, un 0 une cellule vide. La forme de la carte peut alors être répartie sur un nombre indéterminé d'octets. Nous pouvons déterminer ce nombre grace à $$\frac{\text{largeur} * \text{hauteur } (+1 \text{ si multiple de } 8)}{8}$$ @@ -102,7 +102,7 @@ Ce parser est implémenté par la classe \verb|BinaryParser|. \item[Taille de la pièce]{La taille est représentée sur un seul octet sous forme de nibble\footnote{https://en.wikipedia.org/wiki/Nibble}. La première partie du nibble est la largeur. La seconde partie du nibble est la hauteur } \item[Forme de la pièce]{ Chaque cellules de la pièce est représentée par un 1 ou un 0. La manière de le représenter et exactement la même que pour la forme de la carte } \end{description} - Dans le cas où le fichier sauvegarde l'état de la partie, à la fin, et pour chaque pièces dans le même ordre que l'apparition des pièces: + Dans le cas où le fichier sauvegarde l'état de la partie, à la fin, et pour chaque pièce dans le même ordre que l'apparition des pièces: \begin{description} \item[Position de la pièce]{2 octets par pièces, 1 octet pour sa position en x et 1 octet pour sa position en y. Dans le cas où la pièce est flottante (n'est pas placée dans la carte.), les octets contenant les caractères F puis L (0x464C) remplacent les coordonnées} @@ -138,8 +138,8 @@ Avec les pièces : \draw[step=1cm,gray] (0.5, -2.5) grid (13.5, 4.5); \end{tikzpicture} -En plus de ce parser, et dans le cas où ce premier parser ne serait pas capable de stocker certaine carte (par exemple si une pièce mesure plus de 15x15). -Nous avons également implémenté un parser très simple en utilisant l'interface \verb|Serialize| de java. Ce parser est implémenté et fonctionnel, +En plus de ce parser, et dans le cas où ce premier ne serait pas capable de stocker certaine carte (par exemple si une pièce mesure plus de 15x15), +nous avons également implémenté un parser très simple en utilisant l'interface \verb|Serialize| de java. Ce parser est implémenté et fonctionnel, mais n'est pas utilisé dans le projet à l'heure actuelle. Ces deux parseurs implémentent l'interface \verb|FileParser|. @@ -154,11 +154,11 @@ Finalement, La classe \verb|FileParserFactory| permet une utilisation simple de Dans le cas d'une sauvegarde ou d'un chargement, le parser est choisi en fonction de l'extension de fichier ('.level', '.slevel', .'serialized', '.sserialized'). -L'avantage de ce system est que nous pouvons facilement ajouter d'autres parser de fichier dans le futurs. +L'avantage de ce système est que nous pouvons facilement ajouter d'autres parser de fichiers dans le futur. \subsection{Générateur de niveaux} -Le générateur de niveaux a été conçu de sorte à proposer 3 difficultés différentes +Le générateur de niveaux a été conçu de sorte à proposer 3 difficultés différentes: \begin{itemize} \item{Niveau Facile} @@ -166,52 +166,52 @@ Le générateur de niveaux a été conçu de sorte à proposer 3 difficultés di \item{Niveau Difficile} \end{itemize} -L'algorithme derrière est le même en voici le principe : +L'algorithme derrière est le même. En voici le principe : \subsubsection*{Gestion du plateau} Le joueur choisit une difficulté. En fonction de la difficulté choisie, la grandeur du plateau de jeu sera différente. -Si la difficulté choisie est facile ou moyenne, alors un curseur parcours les extrémités du niveau. -Ce curseur sélectionne aléatoirement les cellules qui seront gardés ou non. +Si la difficulté choisie est facile ou moyenne, alors un curseur parcourt les extrémités du niveau. +Ce curseur sélectionne aléatoirement les cellules qui seront gardées ou non. Grâce à ça, la forme du plateau n'est pas trop carrée. -Nous nous sommes basé sur le même principe pour le niveau de difficulté difficile mais en plus d'une taille encore plus grande, -le curseur parcours les extrémités avec une profondeur de 2 afin de faire varier la carte plus grande. -Cela introduit le problème des cases isolés. C'est pourquoi une boucle vérifie chaque cellules et la supprime si celle si est isolée. +Nous nous sommes basés sur le même principe pour le niveau de difficulté difficile mais en plus d'une taille encore plus grande, +le curseur parcourt les extrémités avec une profondeur de 2 afin de faire varier la carte plus grande. +Cela introduit le problème des cases isoléss. C'est pourquoi une boucle vérifie chaque cellule et la supprime si celle-ci est isolée. \subsubsection*{Gestion des pièces} -Peu importe la difficulté du niveau voici le fonctionnement : +Peu importe la difficulté du niveau, voici le fonctionnement : Une taille maximum des pièces a été fixée au préalable à 3x3. -Par la suite, un curseur parcours des cases de la carte préalablement conçue de manière aléatoire. -Pour chaque cases, l'algorithme teste pour chaque cases de la pièce, si l'espace est disponible. -Si ca n'est pas le cas, alors la pièce est modifiée afin de faire correspondre la pièce et la carte. +Par la suite, un curseur parcourt des cases de la carte préalablement conçue de manière aléatoire. +Pour chaque case, l'algorithme teste pour chaque case de la pièce, si l'espace est disponible. +Si ça n'est pas le cas, alors la pièce est modifiée afin de faire correspondre la pièce et la carte. L'avantage de cette méthode est que les niveaux sont tous très différents. Les désavantages sont que, par malchance, il est possible d'avoir énormément de piece 1x1. -Ainsi qu'il est plus difficile d'appliquer des textures et dessins - à l'image du jeu de base - sur les pièces. +il est aussi plus difficile d'appliquer des textures et dessins - à l'image du jeu de base - sur les pièces. -Malgré tout, avec nos nombreux test, ce générateur de niveaux nous satisfait vraiment bien et la difficulté des niveaux correspond bien aux attentes. +Malgré tout, avec nos nombreux tests, ce générateur de niveaux nous satisfait vraiment bien et la difficulté des niveaux correspond bien aux attentes. \subsection{Interface graphique} L'interface graphique du jeu tient sur 5 classes différentes. \subsubsection*{Controller} -Classe principale. Elle s'occupe de la gestion des autres classe, et de la cohérence entre elles. +Classe principale. Elle s'occupe de la gestion des autres classes et de la cohérence entre elles. Toutes les autres classes (présentes dans le package \verb|Scenes|) sont des sous classe de Parents. -Cela permet de les afficher grace à la méthode statique \verb|switchRoot|. +Cela permet de les afficher grâce à la méthode statique \verb|switchRoot|. C'est aussi le point d'entrée du programme. \subsubsection*{MenuAccueil} Classe s'occupant de générer la page d'accueil du jeu. C'est-à-dire la première page que verra l'utilisateur. Cette page permet d'accéder aux niveaux du jeu de base, mais également de générer les niveaux aléatoires. -De plus un dernier boutons "Load Game" permet de revenir sur la dernière partie en cours du joueur. +De plus un dernier bouton "Load Game" permet de revenir sur la dernière partie en cours du joueur. \subsubsection*{MenuLevel} Classe s'occupant d'afficher les niveaux proposés dans le jeu, et qui, -en fonction du jour choisir, change les boutons et les niveaux disponibles. +en fonction du jour choisi, change les boutons et les niveaux disponibles. \subsubsection*{ScreenLevelFinish} Classe qui s'affiche à l'écran dès que le joueur a fini le niveau. @@ -220,11 +220,11 @@ Celle-ci propose également de réessayer le niveau ou de retourner au menu prin \subsubsection*{GameUI} Classe s'occupant de l'affichage d'un niveau. S'occupe dans un premier temps d'afficher le plateau au milieu de l'écran. -Par la suite, les pièces sont dispersées à la gauche de l'ocrant et sont rendu disponible à l'utilisateur. +Par la suite, les pièces sont dispersées à la gauche de l'écran et sont rendues disponibles à l'utilisateur. Ces pièces sont déplaçables à l'aide de la souris. -Si elles sont lâchées sur un emplacement disponible du plateau, alors elle vont s'aligner avec ses cellules. +Si elles sont lâchées sur un emplacement disponible du plateau, alors elles vont s'aligner avec ses cellules. Pour se faire, nous regardons si le centre d'une cellule (la plus en haut à gauche) est présente dans une cellule du plateau. -Ensuite, on vérifie que toutes les cellules de la pièces ont bien la place dans le plateau pour se poser. Si c'est le cas, alors la pièce est posée. +Ensuite, on vérifie que toutes les cellules de la pièce ont bien la place dans le plateau pour se poser. Si c'est le cas, alors la pièce est posée. \section{Points Faibles} @@ -239,28 +239,24 @@ De plus suite à la perte de notre membre nous n'avons pas su gérer la partie d \subsection{Anthony} Personnellement, ce projet m'a permis de me plonger dans la conception d'un format de fichier personnalisé. -C'est une chose que je n'avais pas encore fait jusqu'à maintenant. -Et malgré mes efforts pour prévoir un maximum de choses à l'avance afin d'éviter de devoir -modifier ma spécification pendant le développement. Je me suis vite rendu compte que je n'avais pas pensé -à tout et que je devrais changer des choses pour pouvoir arriver à mes fins. -Je pense que ce parser de fichier est vraiment améliorable mais je suis relativement fier du résultat. +C’est un exercice que je n’avais pas encore fait jusqu’a maintenant. Malgré mes efforts pour prévoir un maximum de choses à l’avance afin d’éviter de devoir modifier ma spécification pendant le développement, je me suis vite rendu compte que je n’avais pas pensé à tout et que je devrais changer des étapes pour pouvoir arriver à mes fins. Je pense que ce parser de fichier est vraiment améliorable mais je suis relativement fier du résultat. J'ai pu présenter ce parser à Dr Quoitin qui a pu me conseiller sur différentes approches à ce problème. -J'en prend bonne notes. +J'en prends bonne note. \subsection{Matteo} -Il est clair que je peux tirer plusieurs enseignement grâce à la réalisation de notre projet. +Il est clair que je peux tirer plusieurs enseignements grâce à la réalisation de notre projet. Tout d'abord, j'ai pu en apprendre beaucoup plus concernant la P.O.O en java, mais aussi j'en ai appris d'avantage sur l'utilisation de la bibliothèque JavaFx. -De plus, durant la réalisation du projet, comme dit précédemment nous avons utilisé plusieurs outils et dont la plus grande découverte pour moi : -Git. Qui révèle son intérêt pour les travaux de groupes, et qui selon moi se révélera tout aussi essentiel pour mes futurs projets +De plus, durant la réalisation du projet, comme dit précédemment, nous avons utilisé plusieurs outils dont la plus grande découverte pour moi est +Git qui révèle son intérêt pour les travaux de groupes et qui, selon moi, se révélera tout aussi essentiel pour mes futurs projets scolaires ainsi que professionnels. \section{conclusion} -En conclusion nous pouvons séparer notre travail en trois partie différentes +En conclusion, nous pouvons séparer notre travail en trois parties différentes: \begin{enumerate} \item Le parser de fichier (gestion sauvegarder/charger partie) @@ -268,9 +264,9 @@ En conclusion nous pouvons séparer notre travail en trois partie différentes \item Liaison à l'UI (Javafx) \end{enumerate} -Malgré notre travail concentré sur le bon fonctionnement du jeu avec un parser suivant nos objectifs, une utilisation de la P.O.O de manière très efficace, -ainsi qu'une approche correcte de l'utilisation du framework Javafx, d'autre améliorations sont toujours possible ! -En effet l'idée de rajouter une histoire, des trophées, un Easter egg, des pièces spéciales ou un encore un table de score basée sur le temps, +Malgré notre travail concentré sur le bon fonctionnement du jeu avec un parser suivant nos objectifs, une utilisation de la P.O.O de manière très efficace +ainsi qu'une approche correcte de l'utilisation du framework Javafx, d'autres améliorations sont toujours possibles! +En effet, l'idée d'ajouter une histoire, des trophées, un Easter egg, des pièces spéciales ou un encore une table de score basée sur le temps, reste possible afin de rendre notre jeu encore plus complet. En conclusion, notre jeu a encore plein de possibilité afin d'être encore plus complet et amusant! -- 2.46.0