From f167bff2177493397705a13b793bc4333971fe46 Mon Sep 17 00:00:00 2001 From: HHK Date: Thu, 10 May 2018 18:23:07 +0200 Subject: [PATCH 01/10] relecture partie 1 --- 9. Table View/Content/part1.md | 131 +++++++++++++++++++++++---------- 1 file changed, 94 insertions(+), 37 deletions(-) diff --git a/9. Table View/Content/part1.md b/9. Table View/Content/part1.md index e088982..c679cd8 100755 --- a/9. Table View/Content/part1.md +++ b/9. Table View/Content/part1.md @@ -53,13 +53,13 @@ Pour arriver à nos fins, nous allons nous suivre le plan suivant : Vous êtes prêts ? Alors, allons-y ! ### Découvrez les protocoles -C'est parti ! Nous allons parler des protocoles ! +C'est parti ! Nous allons parler des protocoles ! > **:information_source:** Si vous suivez [le parcours](https://openclassrooms.com/paths/developpeur-se-dapplication-ios), je sais, on en a déjà un peu parlé. Mais cette fois-ci, on va vraiment rentrer dans le détail ! #### Une histoire d'héritage... -Pour découvrir les protocoles, je vous ai concocté un petit Playground ! +Pour découvrir les protocoles, je vous ai concocté un petit Playground ! > **:information_source:** Je vous invite à le télécharger [ici](https://s3-eu-west-1.amazonaws.com/static.oc-static.com/prod/courses/files/Parcours+DA+iOS/Cours+9+-+Table+View/Animal+-+Starter.playground.zip). @@ -84,7 +84,7 @@ Autrement dit, la classe `Animal` est **trop générique** et du coup, elle ne s En programmation, on n’aime pas trop ce qui ne sert à rien ! En biologie, non plus d'ailleurs... mais c'est un autre débat ! Du coup, on va supprimer cette classe `Animal` ! -> **:question:** Mais attends ! Elle permet quand même aux sous-classes d'hériter de ces méthodes et de cette propriété ! +> **:question:** Mais attends ! Elle permet quand même aux sous-classes d'hériter de ces méthodes et de cette propriété ! On pourrait en faire une classe abstraite non ? Je sais, mais faîtes moi confiance, supprimez cette classe ! On va faire ça différemment... Avec un protocole ! @@ -106,9 +106,9 @@ Pour déclarer un protocole, on utilise le mot-clé `protocol` suivi d'un nom et protocol Animal { } -``` +``` -Oui, ça ressemble à une classe. Et la ressemblance ne s'arrête pas là ! +Oui, ça ressemble à une classe. Et la ressemblance ne s'arrête pas là ! ##### Méthodes @@ -123,7 +123,7 @@ protocol Animal { > **:question:** Hé, mais attends ! Tu as oublié l'implémentation des méthodes. -Eh oui comme je l'ai dit, un protocole, c'est une liste d'exigences. Ensuite, on va demander à une classe de **se conformer** à ces exigences. +Eh oui comme je l'ai dit, un protocole, c'est une liste d'exigences. Ensuite, on va demander à une classe de **se conformer** à ces exigences. > **:information_source:** En gros, un protocole peut définir des méthodes, mais ce sont les classes qui les implémentent. @@ -143,11 +143,11 @@ protocol Animal { Je définis ici dans mon protocole une propriété description de type `String`. Jusque là rien de nouveau. Ensuite, j'ajoute entre accolades les mots `get` et `set`. Cela signifie que cette propriété pourra être modifiée. > **:information_source:** Si j'avais voulu définir une propriété en lecture seule, j'aurais écrit : -> +> > ```swift -> var description: String { get } +> var description: String { get } > ``` - + > **:question:** Je veux bien toute cette histoire de protocole, mais à quoi ça sert vraiment ? Je comprends que ce soit un peu flou pour le moment, mais on y vient ! @@ -161,15 +161,15 @@ Je le répète : un protocole, c'est **une liste d'exigences**. Autrement dit, u Par exemple, dans notre cas : > Si tu veux être un `Animal`, il faut que tu saches faire les choses suivantes : -> +> > - `makeSound` > - `move` -> +> > Et donner une valeur à la propriété suivante : -> +> > - `description` -Nous avons dans notre Playground deux classes qui voudraient bien être des animaux : `Dog` et `Bird`. +Nous avons dans notre Playground deux classes qui voudraient bien être des animaux : `Dog` et `Bird`. ```swift class Dog { @@ -186,8 +186,8 @@ class Bird { ``` > **:information_source:** J'ai supprimé de ces classes tout ce qui était lié à l'héritage d'`Animal,` car nous avons supprimé cette classe. - -Pour que `Dog` et `Bird` soient des animaux, ils doivent **se conformer au protocole **. Cela se fait en deux étapes : + +Pour que `Dog` et `Bird` soient des animaux, ils doivent **se conformer au protocole**. Cela se fait en deux étapes : 1. Adopter le protocole 2. Répondre à ses exigences @@ -259,13 +259,13 @@ On a remplacé notre classe inutile et trop générique par un protocole qui rem #### En résumé - Un protocole est une **liste d'exigences**. Ces exigences peuvent être des méthodes ou des propriétés. - Souvenez-vous de la phrase suivante. Un protocole est une entité qui déclare : "*Si tu veux être ça, il faut que tu fasses ça !*" -- Un protocole se déclare avec la syntaxe suivante : +- Un protocole se déclare avec la syntaxe suivante : ```swift protocol NomDuProtocole { func maMethode() func maMethodeAvecParametresEtValeurDeRetour(param1: Type, Param2: Type) -> Type - + var maPropriete: Type { get set } var maProprieteEnLectureSeule: Type { get } } @@ -314,7 +314,7 @@ protocol UnProtocole { (...) } var uneVariable: UnProtocole var unTableau: [UnProtocole] func uneFonction(param: UnProtocole) -> UnProtocole { (...) } -``` +``` La seule différence, c'est que vous ne vous pouvez pas créer d'instance à partir d'un protocole. En effet, une classe/structure/énumération définit des objets. Vous pouvez donc en créer des instances. Alors que les protocoles définissent seulement des listes d'exigences. @@ -325,7 +325,7 @@ var uneVariable = UnProtocole() ``` > **:question:** Euh... Mais du coup, ça ne veut rien dire ça : -> +> > ```swift > var uneVariable: UnProtocole > ``` @@ -354,9 +354,9 @@ Du coup, on peut faire des trucs sympas avec les protocoles comme ceci : ```swift var monTableauDAnimaux: [Animal] = [Dog(), Bird()] -``` +``` -On a un tableau qui contient des objets qui ne sont pas du même type, mais qui se conforment tous au type `Animal`. +On a un tableau qui contient des objets qui ne sont pas du même type, mais qui se conforment tous au type `Animal`. Lorsque je vais programmer en utilisant mon tableau d'animaux, je vais programmer autour de *l'interface* définie par mon protocol: je ne me soucie pas de savoir quel type d'animal je manipule, et c'est une bien meilleure pratique qui rend mon code plus *modulaire* ! #### Des protocoles partout ! @@ -371,25 +371,27 @@ class MaClasse: MonProtocole {} struct MaStructure: MonProtocole {} enum MonEnumeration: MonProtocole {} -``` +``` -Cela fonctionne exactement de la même manière ! +Cela fonctionne exactement de la même manière ! Avant, seulement les classes pouvaient partager des comportements grâce à l'héritage. Mais les structures et les énumérations n'ont pas l'héritage. +> **:information_source:** Vous voyez que comparé à notre classe abtraite Animal, le protocol est bien plus puissant ! + Mais grâce aux protocoles, toutes les structures de donnée peuvent partager des comportements ! Encore mieux, une classe peut partager des méthodes avec une énumération. > **:information_source:** On peut même aller encore plus loin ! Un protocole peut se conformer à un autre protocole : -> +> > ```swift > protocol MonProtocole {} -> +> > protocol UnAutreProtocole : MonProtocole {} > ``` #### Plusieurs protocoles -Une même classe/structure/énumération peut se conformer à plusieurs protocoles. En effet, un protocole est simplement une liste d'exigences, du coup, on peut combiner ces listes pour obtenir une plus grande liste. +Une même classe/structure/énumération peut se conformer à plusieurs protocoles. En effet, un protocole est simplement une liste d'exigences, du coup, on peut combiner ces listes pour obtenir une plus grande liste. Je vous propose qu'on rajoute du coup un deuxième protocole. On va appeler ce protocole `Nameable`. Et il sera implémenté par toute classe qui veut pouvoir avoir un nom et un prénom : @@ -400,13 +402,13 @@ protocol Nameable { func getFullName() -> String } -``` +``` Notre classe `Dog` va adopter le protocole. Lorsqu'une classe adopte plusieurs protocoles, on les sépare par une virgule : ```swift class Dog: Animal, Nameable { (...) } -``` +``` Et ensuite il suffit de répondre à ses exigences. @@ -418,7 +420,7 @@ class Dog: Animal, Nameable { func getFullName() -> String { return firstName + " " + lastName } - + // (...) } ``` @@ -437,7 +439,7 @@ Le monde de la programmation est généralement sous le paradigme de l'orienté Mais en Swift, les protocoles sont tellement puissants que beaucoup considèrent que **Swift est un langage de programmation orienté protocole** (*POP : Protocol Oriented Programming*). -Pour comprendre ce que cela change, je vous propose de créer dans notre Playground, une classe `Human`. +Pour comprendre ce que cela change, je vous propose de créer dans notre Playground, une classe `Human`. ```swift class Human { @@ -445,7 +447,7 @@ class Human { print("Bonjour !") } } -``` +``` Un humain n'est pas un animal. Mais en revanche, il a un nom et un prénom. Donc nous allons lui faire adopter le protocole `Nameable`. @@ -457,7 +459,7 @@ class Human: Nameable { func getFullName() -> String { return firstName + " " + lastName } - + func speak() { print("Bonjour !") } @@ -466,6 +468,61 @@ class Human: Nameable { Vous voyez ici que le protocole `Nameable` peut s'appliquer à des objets qui n'ont a priori rien à voir entre eux. Il s'agit en effet d'**une brique de fonctionnalités que je peux donner à n'importe quelle classe/structure/énumération**. +> **:question:** Très bien, mais je dois redonner dans Human une implémentation de getFullName, qui en plus est la même que pour Dog ! C'est un peu pénible si ma brique de fonctionnalité devient plus complexe, non ? + +Et oui, c'est bien vu. Mais c'est de ma faute, je vous ai fait un petit mensonge tout à l'heure ! +Je vous ai dit: + +> un protocole peut définir des méthodes, mais ce sont les classes qui les implémentent. + +Et en Swift, c'est un peu faux. Et c'est précisement la raison pour laquelle les protocoles sont si important dans ce language ! + +En Swift, **un protocol peut définir l'implémentation de ses méthodes**. + +Je répète: **En swift, un protocol peut définir l'implémentation de ses méthodes.** + +> **:question:** Ok... Et, c'est bien ? + +C'est incroyable, tout simplement. On va voir ça avec notre example de `Nameable` tout de suite. Voici la définition du protocole qu'on avait: + +```swift +protocol Nameable { + var firstName: String { get set } + var lastName: String { get set } + + func getFullName() -> String +} +``` + +Et pour implémenter `getFullName`, on va faire ça: + +```swift +extension Nameable { + + func getFullName() -> String { + return firstName + " " + lastName + } +} +``` + +Du coup, pour que `Human` adopte `Nameable`, je peux simplifier le tout en: + +```swift +class Human: Nameable { + var firstName: String = "" + var lastName: String = "" + + // Pas besoin d'implémenter getFullName, mais toute instance de Human pour l'appeler !! + + func speak() { + print("Bonjour !") + } +} +``` + +Et voilà le travail. On utilise ce qu'on appelle une **extension de protocole** pour aller donner une implémentation par défaut de certaines de ses exigences. Du coup je peux vraiment facilement ajouter une brique de fonctionnalité bien définie à n'importe quelle classe/structure/énumération ! + + #### L'orienté protocole en image ! Je vous propose les schémas suivants pour comparer les approches orientées objet et orientées protocole. @@ -491,7 +548,7 @@ Prenons un exemple avec `Equatable`. `Equatable` est un protocole qui permet de > **:information_source:** Littéralement `Equatable` signifie qui peut être égal. -Il y a donc des centaines de types qui implémentent ce protocole comme String, Int, Double, et [beaucoup beaucoup d'autres](https://developer.apple.com/documentation/swift/equatable#relationships). +Il y a donc des centaines de types qui implémentent ce protocole comme String, Int, Double, et [beaucoup beaucoup d'autres](https://developer.apple.com/documentation/swift/equatable#relationships). > **:information_source:** La fonctionnalité de pouvoir être égal à quelqu'un a donc été mis en boîte dans un protocole adopté ensuite par des centaines de types. @@ -501,7 +558,7 @@ Je vous propose d'essayer d'implémenter ce protocole pour notre classe `Human`. class Human: Nameable, Equatable { (...) } ``` -Ensuite, le Playground affiche une erreur, car on ne se conforme pas au protocole. +Ensuite, le Playground affiche une erreur, car on ne se conforme pas au protocole. ![](Images/P1/P1C4_3.png) @@ -514,8 +571,8 @@ static func == (lhs: Human, rhs: Human) -> Bool { Cette fonction prend deux paramètres du type avec lequel on travaille, en l'occurrence `Human`. Ce sont les deux valeurs que nous essayons de comparer : -- `lhs` (*left hand side*) : la valeur à gauche du `==` -- `rhs` (*right hand side*) : la valeur à droite du `==` +- `lhs` (*left hand side*) : la valeur à gauche du `==` +- `rhs` (*right hand side*) : la valeur à droite du `==` Et la fonction renvoie un booléen, résultat de l'égalité. @@ -548,4 +605,4 @@ Grâce aux protocoles, notre classe supporte maintenant la fonctionnalité `==` Maintenant que les protocoles sont, je l'espère, un peu plus clairs pour vous, nous allons nous attaquer à notre application et rajouter une liste ! -Rendez-vous dans la prochaine partie ;) ! \ No newline at end of file +Rendez-vous dans la prochaine partie ;) ! From 0af9067160c1338a82ed11db5679d9a86835d296 Mon Sep 17 00:00:00 2001 From: HHK Date: Thu, 10 May 2018 18:25:04 +0200 Subject: [PATCH 02/10] readd whitespaces --- 9. Table View/Content/part1.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/9. Table View/Content/part1.md b/9. Table View/Content/part1.md index c679cd8..b7d4a5c 100755 --- a/9. Table View/Content/part1.md +++ b/9. Table View/Content/part1.md @@ -147,7 +147,7 @@ Je définis ici dans mon protocole une propriété description de type `String`. > ```swift > var description: String { get } > ``` - + > **:question:** Je veux bien toute cette histoire de protocole, mais à quoi ça sert vraiment ? Je comprends que ce soit un peu flou pour le moment, mais on y vient ! From 18097baabb7ba2e3f23709d5e738d0391e0e7e2a Mon Sep 17 00:00:00 2001 From: HHK Date: Thu, 10 May 2018 18:34:34 +0200 Subject: [PATCH 03/10] override default implementation --- 9. Table View/Content/part1.md | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/9. Table View/Content/part1.md b/9. Table View/Content/part1.md index b7d4a5c..ca9ef8e 100755 --- a/9. Table View/Content/part1.md +++ b/9. Table View/Content/part1.md @@ -147,7 +147,7 @@ Je définis ici dans mon protocole une propriété description de type `String`. > ```swift > var description: String { get } > ``` - + > **:question:** Je veux bien toute cette histoire de protocole, mais à quoi ça sert vraiment ? Je comprends que ce soit un peu flou pour le moment, mais on y vient ! @@ -481,9 +481,9 @@ En Swift, **un protocol peut définir l'implémentation de ses méthodes**. Je répète: **En swift, un protocol peut définir l'implémentation de ses méthodes.** -> **:question:** Ok... Et, c'est bien ? +> **:question:** Ok... ça a l'air chouette ? -C'est incroyable, tout simplement. On va voir ça avec notre example de `Nameable` tout de suite. Voici la définition du protocole qu'on avait: +C'est vraiment très très chouette. On va voir ça avec notre example de `Nameable` tout de suite. Voici la définition du protocole qu'on avait: ```swift protocol Nameable { @@ -512,7 +512,7 @@ class Human: Nameable { var firstName: String = "" var lastName: String = "" - // Pas besoin d'implémenter getFullName, mais toute instance de Human pour l'appeler !! + // Pas besoin d'implémenter getFullName, mais toute instance de Human pourra l'appeler !! func speak() { print("Bonjour !") @@ -522,6 +522,27 @@ class Human: Nameable { Et voilà le travail. On utilise ce qu'on appelle une **extension de protocole** pour aller donner une implémentation par défaut de certaines de ses exigences. Du coup je peux vraiment facilement ajouter une brique de fonctionnalité bien définie à n'importe quelle classe/structure/énumération ! +> **:question:** Mais si je veux donner une autre implémentation, par example dans Dog, je fais comment ?! Parque `override`, ça marche pour les classes seulement ! + +En effet, on n'utilisera pas override dans ce genre de situation. Si dans ma classe `Dog`, je veux une implémentation de `getFullName` différente de celle par défaut, et bien je n'ai qu'à la redonner: + +```swift +class Dog: Nameable { + var firstName: String = "" + var lastName: String = "" + + // Lorsque j'appelle cette méthode sur un chien, c'est cette implémentation qui sera appellée, et non celle définie par défaut + func getFullName() -> String { + return "Waaaf \(firstName) ! WoofWoof \(lastName)" + } + + func speak() { + print("Bonjour !") + } +} +``` + +L'implémentation donnée par l'objet qui adopte le protocol sera toujours prioritaire aux implémentations par défaut. Ce qui est rassurant, puisque les protocoles sont à la base, un moyen de s'abstraire de la façon dont sont implémentés les choses, en se limitant à connaître simplement les exigences. #### L'orienté protocole en image ! Je vous propose les schémas suivants pour comparer les approches orientées objet et orientées protocole. From 672a9cb5a8ff66724e30c739e5c47062d7748f75 Mon Sep 17 00:00:00 2001 From: HHK Date: Thu, 10 May 2018 18:40:11 +0200 Subject: [PATCH 04/10] last touch and typos --- 9. Table View/Content/part1.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/9. Table View/Content/part1.md b/9. Table View/Content/part1.md index ca9ef8e..cf421b8 100755 --- a/9. Table View/Content/part1.md +++ b/9. Table View/Content/part1.md @@ -522,23 +522,22 @@ class Human: Nameable { Et voilà le travail. On utilise ce qu'on appelle une **extension de protocole** pour aller donner une implémentation par défaut de certaines de ses exigences. Du coup je peux vraiment facilement ajouter une brique de fonctionnalité bien définie à n'importe quelle classe/structure/énumération ! -> **:question:** Mais si je veux donner une autre implémentation, par example dans Dog, je fais comment ?! Parque `override`, ça marche pour les classes seulement ! +> **:question:** Mais si je veux donner une autre implémentation, par example dans Dog, je fais comment ?! Parce que `override`, ça marche pour les classes seulement ! -En effet, on n'utilisera pas override dans ce genre de situation. Si dans ma classe `Dog`, je veux une implémentation de `getFullName` différente de celle par défaut, et bien je n'ai qu'à la redonner: +En effet, on n'utilisera pas `override` dans ce genre de situation. Si dans ma classe `Dog`, je veux une implémentation de `getFullName` différente de celle par défaut, et bien je n'ai qu'à la redonner: ```swift class Dog: Nameable { var firstName: String = "" var lastName: String = "" - // Lorsque j'appelle cette méthode sur un chien, c'est cette implémentation qui sera appellée, et non celle définie par défaut + // Lorsque j'appelle cette méthode sur un chien, c'est cette implémentation qui sera appellée, + // et non celle définie par défaut func getFullName() -> String { return "Waaaf \(firstName) ! WoofWoof \(lastName)" } - func speak() { - print("Bonjour !") - } + // (...) } ``` @@ -558,6 +557,7 @@ En orienté protocole, on partage des comportements grâce aux protocoles. C'est - On peut partager des comportements entre des classes/structures/énumérations. - Une même classe/structure/énumération peut adopter plusieurs protocoles. - En utilisant un protocole par fonctionnalité, on peut ajouter certaines fonctionnalités à certains objets sans l'ajouter à d'autres. +- On peut donner une implémentation par défaut de certaines fonctionnalités en utilisant les extensions de protocole > **:information_source:** L'orienté protocole est un peu à imaginer comme des legos. On va créer des objets. Et ensuite, on va leur ajouter des briques de fonctionnalités en leur faisant adopter à chaque fois un nouveau protocole. From aa1492fe92b1c7e6844e7af873b7177c1647cbd9 Mon Sep 17 00:00:00 2001 From: HHK Date: Sun, 13 May 2018 12:17:14 +0200 Subject: [PATCH 05/10] copy original --- 9. Table View/Content/part1.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/9. Table View/Content/part1.md b/9. Table View/Content/part1.md index 41fcec8..098eca9 100755 --- a/9. Table View/Content/part1.md +++ b/9. Table View/Content/part1.md @@ -84,7 +84,7 @@ Autrement dit, la classe `Animal` est **trop générique** et du coup, elle ne s En programmation, on n’aime pas trop ce qui ne sert à rien ! En biologie, non plus d'ailleurs... mais c'est un autre débat ! Du coup, on va supprimer cette classe `Animal` ! -> **:question:** Mais attends ! Elle permet quand même aux sous-classes d'hériter de ces méthodes et de cette propriété ! On pourrait en faire une classe abstraite non ? +> **:question:** Mais attends ! Elle permet quand même aux sous-classes d'hériter de ces méthodes et de cette propriété ! Je sais, mais faîtes moi confiance, supprimez cette classe ! On va faire ça différemment... Avec un protocole ! @@ -376,8 +376,6 @@ Cela fonctionne exactement de la même manière ! Avant, seulement les classes pouvaient partager des comportements grâce à l'héritage. Mais les structures et les énumérations n'ont pas l'héritage. -> **:information_source:** Vous voyez que comparé à notre classe abtraite Animal, le protocol est bien plus puissant ! - Mais grâce aux protocoles, toutes les structures de donnée peuvent partager des comportements ! Encore mieux, une classe peut partager des méthodes avec une énumération. > **:information_source:** On peut même aller encore plus loin ! Un protocole peut se conformer à un autre protocole : From 7ef53a7298aac2afdd3b54687337fcf1da939108 Mon Sep 17 00:00:00 2001 From: HHK Date: Sun, 13 May 2018 18:09:27 +0200 Subject: [PATCH 06/10] add part on weak and ARC --- 9. Table View/Content/Images/P2/P2C4_7.png | Bin 0 -> 21726 bytes 9. Table View/Content/Images/P2/P2C4_8.png | Bin 0 -> 16417 bytes 9. Table View/Content/Images/P2/P2C4_9.png | Bin 0 -> 17476 bytes 9. Table View/Content/part2.md | 148 ++++++++++++++++----- 4 files changed, 117 insertions(+), 31 deletions(-) create mode 100644 9. Table View/Content/Images/P2/P2C4_7.png create mode 100644 9. Table View/Content/Images/P2/P2C4_8.png create mode 100644 9. Table View/Content/Images/P2/P2C4_9.png diff --git a/9. Table View/Content/Images/P2/P2C4_7.png b/9. Table View/Content/Images/P2/P2C4_7.png new file mode 100644 index 0000000000000000000000000000000000000000..8c5d8990375b19d993c583b4224c11c250b589a9 GIT binary patch literal 21726 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 ZHgDH}UK9g4aA7HlqP*Ip0y(pn{|6rDz8e4l literal 0 HcmV?d00001 diff --git a/9. Table View/Content/Images/P2/P2C4_8.png b/9. Table View/Content/Images/P2/P2C4_8.png new file mode 100644 index 0000000000000000000000000000000000000000..a639cdd2279e0bd0bc81ab0bd09b7b91dc7bfc0e GIT binary patch literal 16417 zcmeI3XH-*9_wN-^iULXi1*Az0Rl4-vA@p7qA_5}4g%VK^krH|@3WVMXRf-}VA<{cY zCscvZ0!c33=l}ffoBQIHb=SHtp0#G3oHbdK$=Nfr&z|r8Or#!2jf|9z^u~=FWE$$q z1~+aH$Xwqq6W_VMvK|ozU4Pv4GEh^zQ91k=b>oKIoQAT3k^jxTY@%r^Qzj$45Jd{zmtoJyB8q^p@}*p@OD*C_2nr zku>fl1b^V@IO%{452FtiggIL#|wv> z1UT#nx;cMU*>>!_I*B$K?8uPx**+FUsUUM?=EPq8`pq~nxoXkkG*;;LGe;)SP-okd z_HSp?0K)BqNKNY^l3iCq$jSD^mk=!GmgmV=P`2ctX}Ou8>)}fGj@SCsq)1YFJG!C{ zW7_y;p(c@2*Cu^o3WvS)TdJ||wT`ZN5OAiGE(A7e&^BJ>l4dR53|cca+$1saFV(Ev z_Eh?C&#Bs>KjBW`oLkK{E24m8*POrva>{Ev)t-7^epw=%zWbLeh2*P@&#^7?P`LtZ?vm*D=ZuL4LavMqj$`Dg8jDX zQds3cPi#pi?^Po6*jh7m`E?--9G41Qw`+{KVcI^4n|i+udQP={?mnri32M8u&dqZ~ zoJGg#4Z8U~s?TyLd2nU&-4R2xgI|-0(#BXZc ziW(#xjXHN#4)hW&Gp$;L9m@3@mo1bUm$lDSKmT!1n&`DTTw!M}FA)$`F8kH~K5vw@ z{ut!Wy+=>)_1N15-}Gs<9fKsSS0|J+ut;Oq??+j)ksGf!wpw^V(?#uX13SH zU~(*Y;Yy^tOoDZTRw{pt{;Of-eGg2BgjDW&Ck%r|c|8-VDALWfvF;Z7D%q=Jm&;}c zcg$_wWAtVr(B`I}#y=@jaX)wwnWo#46h@5qzbH6imR5ewQEFP9QtmuiKC>A~KHK86 zV_h!$(~vRIysS_sGv~wZjY^I_5XS|Wqal2NB9;VW)_F)T4LGnjd+{Ofb#`=+)@ZK* ze(U0Rvuc1-7fQ~2z&*RAenEda=ho3~RtQng(YRvQ$@ucR2$Y?Hcs+AuIIGM~g@8mH1%_%A_$@IiReM>6fVjd@wGI@DWXA0*#!90(^U zETfdoOhQ|L7auX3@s(I1L-xd^UW?kK^F+4B&ZSuBEmEZD`C$%YIn56e*m6Q`A(kJ? zJgwz1k?U+vdy*?~_daJ8xt)D&iai^pRHrGRiEe#^{0cZecHef{QavhlfE_tK(IbPn zI5}MHbz_k$Qrft=R#nj9A!{s6l6cSjh*8!2W5t`2=$53fp?{LCBJ^e7q=rX0SswCeX|sWh8pcY?4Sy*tr}%occZQ%C)K+e3oyjxWw1EGsEm z$pU(qNAZf)jH%_MNcW0$$xJPi^jy}uj7W@MnDAr3YPNRBfqNT>K`kMG(A0EP?fJr1 zPO#7?4b;sw3$RfFYiG?-EE{aYc^FP|3cNB&nqUiJ#y!G_y!}IZq`E@Ew#OFKELbAj zZ^2SDX0bF+8@;H<=mC7U@TcneSVb*DLNfP~nii>FDR9(C*`DZPWsv5WK!Y;BC{krC)NMebOIx)%RDsl@m2#gh=)SjSvbHoNq---PG1z&FYf} z@;>skY=o(FRxq~Z!^^37>Zv2gTWg=5HxD|`>I0^+gex6=3$_(5BB5=mHxd<0IbdH6 zS$`EwMj@7^&sW(x&x(#l83Q8XLIiNu+OO`CxUm=xgi|q^gNI)V1)4u!td;`gzI|<3 ziT~Yn#j4@**1;XgBET~u#&0gpsA6LBId*rfnGP>*<)mgqwB1U3cPLk%YBVJrAzI8!HiSkEvSYb z)V&;fO^t8=j28v$x6%v*AO0A1NM;3+cF&-@J7Qj#QT#=-XxqSBq_S zza&ng)bYn`#HN%AB{8l+HRx-9Qh7(~q&#XyA?Ct0DzzT3GHsh_;uOwP9}In6V+p{x zliHO38fh#U2W%(56U>o5sk!M>f>a1)YwDdhn9!c9oi}o~YcDM;6{&zrHwqq4+%# zf%}5zA~X1P)O>m&5h_2TfLc-J8@D^tDZOZ5!Q{IQB877n7z`_ z25B1VSToF~cK&g@;C}lZ?T{k|vNsNhM|ickYiAo;))so_0cgot z*B&1cQ|rotpEX_f5uHNpVegTITyPiA$2w(CZQ?}J@1<|++0Fg#5B>2e&y)?8&y#hZ ziiN0Fv!$5W7%*ACeoy`4ZlE+SSwD^VsAiozSypr{Q5FUXxxb=aKt?-uqdWbN7q^mv ziR^l}hStl70fDu+wuJUZwa}g9D(`?1CAUdR^;iW@ke?a>rpl-7I5RexGaGT!A5<2WaTz>vO5Z)MN0HORL7BaE@YUN{Q>ei#lFl zKfgS5k9cm>5EyWGmyZz5+;AP@Upr4F$AJEel2#J!#W7D2 zC=nRL&49OSMN?9K>dKc`D@*F?@`Y;Z?MOBjrL=C3^q{oSiTeIM@geq_s-zm8&0F`x zu&0iX_okm>sf2h8JxvorNS{x5-N#`|BX)FpW~A8@r<7*WK~i(gi220jVz(kEXH#d} zH8BsqnPjRe3hTUQ_I=fH?BLqYkCT_OC*^j$)TblWN#_p&41z=sA9^C6_T-@J6qk%Y z>ddxzQ5OzzijwzKhU_@}23T2o^_vJ+SYVeM3x!6EWJcnZ%8Hur#!o5Gp9$&Y*@k zd*Z<>*Za6f9j@vHKL@i!ApBirJIDI%Ovk}=I=|YA&tCGXi;sL*++CH8$FW>Sh9nh> zw~4&}>0}U{R($Y{+k?j>-;KqO0!5UFdvekzSpd*Ke94Z1_*J%vM7FGc7W-*1^`p-= z7Ag=4v+Fn4%;waa@SFZ2%sZ}RrKPd?MQ=eZu!9v;!;n#3AE7yDS(Il~>3A@q+`X<| zrqw2=0P3ALeQ+>*qSN`lxl%I(;o%s`HM&T*4Sm==c38C`I~4a$u~kqj*Y>VwmNQ-d z(Rk`de7sm}=cvdhNz+j|V0o(EzV>LK!AlSqt8I$NC|>o?s1fD_DEGsDcc@v-FiBM7$J^1TBzUn(+bZ+Am*&OqgMvHMm)1t0y?>-pNYCJp>uZRl zpA;IYLNrnix$BVRKE8y_kUk9Ba%EP{M`U2+eU05d^bK=>@R8*D$sOGKxTpkhprkOS z3$}t04iHzr$Uj&mUP4YJ2yHs@NJk#QxT5EK`_`-&^MeAF*&f<ljsz1xlQ~1(;0I%1Ky;+DVdbg`UThKfbdfm?qE1sRx6{D(O?w2Y2F;C9*kqZUK9Golcu9F(T6V#h9%Yt?U zVi%JPnT7RjnPqQWK)8G?=mss_YSY@`V|gl3i<+w;>dQa`A^c#zZ)H4g%=fqeU1~*Q z?Yg5&qTl2MnAZ5F34@Yw=xGtJ89QO%r`>P2i2p7A7hXIsTlZh-Ke%XnepR)&Av2wmg`+C>4- z4`xzPp;tIfqC+npO)gQa}h|!GQJXvIP1x6FQVQ)Q$QkV@22byXou5HRy{n~3bK=w zx#DY_uhJN=vEF$W{G(@Rq?Mhi7uoz$hYk+Dd;6$9wd^NuC{u-~-j&vo59{xPcrnys z^#X-}`0S{*kxOvJR?SrdExsK$Nb+A~S=7IjIUXn_?cRwSEpmzQ#&og|=D#=e($|^Q zHeHjiCrOGK6@IOU+$s)PcyU8OH|>GU(OC_(-97qw;g;X$-#swpXQ?Vx+F7*07p>1d zuF|3H^w{LGr2REkjPk?mr);IRRe3k}+f)Wu1o<%TVEwPt9hSXY->{ZluI-{eZxAUF zojLBNSsvQn_cdeZO`)e9HF81fxm$$$W%Je)uutB|-D|g`sr1>kY-1$mVJ@Y3d%)o2 z7UnBc>8}SsaRt@%Ww&M|%U-@f7PiDJWSEFaMecHSX~og{AgNaWOI~?c&>lFldn8mw zQYAGTV)QuVyt^?^P}5h?1-$1%*JzHM!2fud&XXRC@AWD22YO}5*XTD-cx|8jv}iCZrhFGo%p zq*lUWT`doz-?Z}xQ`2Ro1#%#<%(JaNmbYm+sUqZO%pireY_%k0797))Lzz8=V+HB8 zWP@x(Oif-u7a}=5poS37qR7#58al-le))i$ex8T!SDWEH#mU~x6sO9;aEKhn|72Eu zP&St~MESMr429vJ)L{l1ESdsIy*agP^4I&@Q9L-G%S_Cl;zWX`WIqS?zIv5g>0yQ3 zA6YFdI&N@X$|0X>cw4?yN5dcWZo=6e`9A+)4`^tsaP-~S-Ls4n`Y|tLLsBQz(cXbM z0XQH1TEQ#l-5r^NDUeHSxugc%QEx>}Ja8mpq+`-GIyrxzi`sLR2;p$CeQ(yHY%eq% zerxB)ph;!qMs3y0aV;YI7X zzXHpP$!t{K4BoDeW56C9yE#Y`a}1eN@tHM9x9n*>RMw#r{n*mrMz0ZSiL0{S8Fwyn zOC{HL+)fdFiTX4#BE1bdH7464Q@#ved)d|@GP;zZ{XKhjkE!BwJL)ct+VhKYok8qM z!>R6GiGF%Wxkgm~&v32$9x{4|@%kJeO#Y=0?D9|N+*sZ^*K5zxqN(pMrX^>)%)qz_ z$&MbZMs~Tawb?_rAv&DmqqYbq$$pg+3Q2_UWF3Te(A9yW)1YToQZi3B)gPIfqOkYh zXFGGCZd^*wyV3m35zDa+lP$AG@;yEN+2br1N~c_;=IPGXMd_xWY|(nz4~X~13<8R9 z-otEVpV6o?9Z6S}x{Q>2j9>mf)pyJ}gAAjZWg?pGb{ecdrP<^i17(~W`H%_{e6IbY z`F!`V(~``bx7Cs31w1|TtUZ@`JoIoiaktK&x1Hc>n!^BmT3mZkKfJ=DuU})izrIL~ zevbc<*fU9=S4(Cd8m5ZB>opEkDBAwKM8wE7ou&zOq*)Y&oGh4+yw6{ZRspYE4P0<` zJ;y$ue|Gc*&D7WZBcc%hEacBuPCYhB)mb~fBDt=$Ox>(Lx!I(OdM7MPpQzJ#9MlhI zm+X6D-Ya;~7;~I}FRoNm>&P~FT7W2+YMD9qo{h)8xXqn3(|~pF`6C&e2H@c~%?_~Y z`-Iiaea3c*KaPL6(jL|lg8%6Jxtax)6b6i=t-l5u=2!z{Vk^n;ssroy3aiAit2 zaQKorA6Kf1zTcA2PNps+qA0NdSfF3X|6OTUVND|>Q%wF^hO=cCkantB7Vo4)4kLguHg24rhy5SM zQAB%xQWF4FwClP(rHM#X#b&=LXU|mLxTTI#%F!D;`{#Q8g-BaUx7oWiW%fkqkFu%T zF1~H4InpAs4243OVs0^YI};TE>u0ak3*=h6vmkK+0W+VV@F-{2x>2-mviD{_^M^!Q z7Hrp#z}`>!Jpyo@PkqXa_Y4T?ulyH^A{?V-lFEKgDXq6efj&_)E@-vYYiNwor(vqd zM$}ICEWTuj@tsD=1|G%NbQ-dZkzD)E`iyVvS9^ED)sXQ^GFXc8m8xEvK%cAeFRkC; z<-q>XtZ$Q{cckCr4u{LpS}8d{a^K#;C-_r;0xJt<6J3J@f|1-Y*er45VWFCNNthxY$Q6p;=Z~)&-AK6Q#}(s6%1a|`KDajr4}RS~&S4K! zlZn@mOpX_;%FkMMNWrzyOT4>pXhKkQHcaaH9YLW(qKs zI|$mkNK*kU=Ix&kgdfgDlyeaw-Y^br>Zqpv>{~`pa!r=Jr)_piwU!z4%uLF7Xg-Vf6t@cUEH|@;48)Htz}lP2^0>ofeaw)EgrY#e;v^%( z0y73RB@2-IJS_RrPQ-V%HF{Qr{A3+ww(3pE&s9dN7<;`z8P_C$aPWaILr-0CxOCGo z`p}cslulMo6*k_o2!*Zi9W`kvB8<(C(Ilr1#_&ik0vwsrEs;7FWn1mAbK8gTk_-GL zKJf%&#ouP;LjU6#@0_QF6S2V5`)L~%b`9k4pBH6AgR_-!Nb11-{wbKJt^kh~?2XA0 zmFZI+#++%Sa7fR)cV|X4^x1_8W3V;>EyZQhz%VqCV1a3>*+zC(NsZm!hz&r(Tz{Jq^Wby3t(APL)t_O)Fx4>!`aoBA3Jwp7ove6G+pF`9(3vST_xRnZQfvTz4VoKM(GB^Y)EO^LoxF2V z@^I?&pI1f#M=OPn5muFs%30s#ARodWYRa4i+I^uwW~?m^oV_J zkj}bS?c=_-A8d4|k?JKQv*qRN8CSW1_6FlbJaLo$;NW-_bmnLO zYNTnl#}m@UsG=gpOrd=dEM?mW77NgsDNTM5=xh_)b@sTPs_?{H3h*>E> zFdUR^jf{1V{`#^4oHF{-VXtQVgTo&DoF{5V<1je0J}nFb zH1z?YPRksF$UNBaoCb3 zoACSHc4=HDvm-BRsO7xerO!s(c*QjIX(Ij7^xf4JT#ApiRF~$?-dwyVJn^0jdwca^qws@l{>H3>&e{}&J9@zGKiypk3$O@?$hdUNg zMGKo34s3eLLJg2TI+;gufeFWNb5$1PfqlESv{LEmnd zosPZAZTlZu$_=k_|h(1AfxiVB-XCRqS3>!XVf$f zxK{Qi9ez?+!g?whPMt;dO^h$ITc2T0w}o)nq4qDSVa&$7Q-8{^-4PHcm6513+nC_} z9TV4iw+oRg9eLQSDYSFdCpFyNe`85mgl5;HkbeUQn@Cq?Ifw3 z;4S%uC+b`>WgroRJiQyiz{tsd$-(2*@GgzF$h~&x#ZQ@;y#t;@>xModx*A^K48Wrm zA?o!Uo_{Y;mW?a1kXJmz4&2j<*>V#=)91n5&wHm2>C^8(ftR+NI>xTWEf^jGT$TaIVhs&S)i zMMPcZy}Ln|BXdflwNz_m+dGzzzLV{Zu`@<2{vmBXn_102IP4=s1*^YaH!vGCr_+5( z(jfs~@q5N*+7})(m>{uQeDhE!y>s?{$l!WW@0nUI%XG^5hYv@8!%JC-&_)0eA^&;@ zq$x`a*>6we4a+s;WEv4)=*u+plgYiFx5R9CXk~S}*~C^rsx)nKnX^n?XFFa0;0wli z^o3OJ5K9iaeqP`%EDP5m2=s^Sqq@pdX5L^|0uJj`1A`MlT4x&T>}$rp&RU+`If05x zr=lHycI#6|e|biQRQKnvV$zaiwT;saXXIeCy(63Ut3FGa0urJoLI`E*hIyRK;i1e# zk=%Wqqfy*?!K zy`ANY>JY;fIz#w?AMiud!V~L^-;7XjP|yJHb;5yjs!Mkhk;WffR1}vex=rzzvu(Xr z_=U=5Sy0`pTZInk8SwKy6nfgw+)X!p`(D7x1&7+^$^Frg5~iT#`KC9nbV-JDur_Ia zu^$mar`O)ym*S>*JCU<3nE-9=?6!JSEy$OCmL|J}*SWi;zdNuQ3tWtQqHvl?*rq zoA!37@Vi73i6u2=Evyw|u6>)vaNvaupEhhkBm@-cc5q->agc>6m18nb7OnPZT10`kKeRfW#SF*39yZQSU0HZmY!Dp(-M2dityMtH8CDvMo76emXc^tvx zcQcc?ff7viGgYX&mc|%52Tj4Vu!g~jspDGS)JES;vc#j$y0H((`h~7hEKjEr?!6uR z$d=QvvBi8l^O85%+WjzA%mklhdg~%@S?z0cbD6*Sgkr{?Z@Ux(CRHh=T08Ia znokFf;CFz)<#89|wK}lFLID1UHU8j*FD~a}>Wlpuz-qCpPs-kriR-OB+&_wSQp&Yz zJbL7}^DkxN`l|9*!&d*i5dDv8>_l>{|MEc_-~1y-vt4V%p9p7%{_`{cvCY5pSpS(f z|0I3>m)6v{>9J0#Hm|F|{IyekOR~#Oc-1H31xwyHf<1}V%rYfTdR}t5<|y}Pt-hxd^WBA!If9D86SkkQrmq@ z@Y|CWQocuP{XBJ-vmH?UzLf87Q$tF>maK+B7X$Z zgvTgsWIKcq=i4!8oNHOpH@Gc@>|gh|NER@0;&f~@(E8aE(H1F2Z`v69Vqk1Z7JV#t z?wVy-Wz&YB4!TBEai5pa$2igmE{1@Tr27^PL?8E ztC`BhK-c!?pnHlEkrg({B&M9X5Q=w8OF*wDQ@TyV%aYj$f!_k5QIF>S_Pu_MUe64= zeg2x8djl}3obsMOmC)p_xdP-tN6ag?%9pJ}_(ymztNPgri~8+MGJ3JAN=XU7{rUQt zY?W*B8X-G_5{<0m^;OXsSm#!<9#n@?v9Bv%wSF?GtZg3sOJhd|KKl?DaP#6|Goi$Z z?!@M&TmCKFg_(B_Xi^C;z_G}kzEMq*_HFSR2|z9eEY0t5-~YWAbnDXAp`Li(dU0zr zk)NHVQ_e=#Nrsq0KTYF+x}3c%L)7IoAn$#{n+3?!&vfBUVAVCdT`|4nL05aLDT7%m zeJwSe?IE|^Gmd_HlHN&T4qR__*FCVJ4DCfq0St~CIo?FtChO+l9?LHpBSzwn#CIE) zLV|0wPvU}Lj50PaU_)yEGqyTewjwV2wCFQimJ;ScL2oxPMIkJ;I$GH08WcBFv_{OO zwyvVeuFkm5BrgDpAwEHvnM(b9Rl0*w?xZr<)qlsV-}q3kmGKxjVP9mIdMo&@SDzC( z4b_e*N&8ShM)4HO^=t(Pz}#RL>#1_{y7F&}2uL6LxA<6En+DU*4AGrcO^iXKZm#S? z0Ld>m2!BU5=_eod^=wyyK(f$m-S2IMU-yeis5riL1+xRDZvjiD^yy-?QtWEw;{4M- zipMP_2~Fv5bg=by`P@##HInpXeu<j6ap@t53D+bY%|WIhhY=Wz6StSzmx_EU2bel_@>O$`R zF5JJ9FCTXdzBx+R-?P>n+3FpKIrxmTEGc4%^m8w%>JQN*X)W?t?Xj&IP_+Sub46Lu zVR%mv`bu=S79}e`ASTS5fTpRwZp=aKQ_mxPi}W^*`wGt}S+b{MQ&{{C6=>GyXE=S^`uoTbnnR+=bwj4ouD_kRO34#5O z=ERcW__{49M%F-8)5Rs3#qIXqW9>FpV%yjt`m308&SOh|Ya!1PLq80Ijb_fi({7wK z=nB@i_-J&^Z)dWCUGqw}za!(y-K~KVPlml>9KdB1wEp1GBPSGMbYFkU4Es*V&El^A z1mC9ojQr>i{z0hOGD(28_Iq{w-Bc<@pajfgq4$Kv6i}JV>O~fEJA%N6Gcqwv9Y+tf z()`SW%CCO2Rbc$V{zYP^3Ce&Jki`qgZx+$7%)=2i=?VS%FYd4?ZvO z*S)oD`4yf%>z*c9Pe+=I+-NSd%*AUA^`Tb(R~h5TH0LTkOx~4%LBRJi5cYuyP;jJh z=Pqq8VY$~PVEEGDqk$*$YtGTB#XjrMB_g~?rFc^#{#GC`zQ(Yld7tdCKo|B=@i{=AzobkNMbRa*xZc8@e97X4a5cJ>-Amn1Ef0L(Jj`|_hBG}Ji^Yk) z9xdqKDaci`o*J>y6*_tMIV2>#CPw|PlpO(B`P-l+*jrd8Nt;0W*ViNW4yoi)@glli1ZrGZ? zR0w&1d1Qk}KjsftZ7qS1L+}r6_GB*u6VzJQV9SzJAl~u7>C}BK9e~)@9!Q{K8K0$;q zYceNPKN|KL9Qn|pghmT?*L={+R6_RQvF$qW9K9;4>ch1X7+JAaFgYpP zckPJXi-Oh!_#X#SW4;EX7vp~N6J2F|$&DdRZiNjy`i~F71{=42OjuEPz^c@0q*K8q z>t94ikstbb%maIpDguKZo}J%20)sDHxsEl0wnzJG5v=@hH+gmD5SnGDXcnbqec52F zRPZRJ{cOB14fy416*y>NjFwOxnuF%iEB{JaKbjb}`o~81`n_fYy({xJh|u5P?TMTD z6Wc)g!lyT*SI915k!bHYA&8c)6cuSY)*k-0R(OoIaG<#8tKdU#$&zC+*&5-_&AEY(b+5qw5YIE+D*)A%IWvn)F6|`(Uc$j#a{^Z^1vW zd+i;AKXWItvpy)O=o1Q}zaH=0^^{ z)<1N5N&vpL3MF$2&^4ye+C$&D2G^Z$`LSy}D7&77G>4j;@rr_;b!QZHQzM4xA`10gb?BTvl9*!^ag>1BdO=SW z&-d63Z>swINndYDnGt3@P8TD+eWCDCxL@2s`;d|pUn!^`05j;AdVbanc9+5pliEK z8P&+ClYt-?(;_ZPO|2d18dT{+Y8F%(JsQjnQKOB;%)MkYlB>;@9G|?uAiTf4F;J@B z->7s7A8^QaBUo3q({1-j0&v2>OYEN;PwX^MKMRDO_-vQ*1JIjk(}+}+Hw1}zME3V+ z=)q@gTljCLXg|k3m3V)Vu(BOtr-fYZF+%+5c!H_S>@({@9xiE%;U+wrTwL~!6 z#lFt67xz{9K~G##%(1?2A!`*0P8dZ{a%0cIQliuv>YL31$_43!bB2ptajMHDEPXqS zMBKm1==q>1F3HCH)#!Q8=U`i>h}v_Ni66!aw3>H~`R;=r;;0Vq-8SrQu8LS?PhN0* zRmVBcU7aMI*%LU}C>-j^YNw^!yr2(rYy_Bfgkb%iEe3KVc73;6dKtN`$`Pd#W?3xA z(G)C6Yyh>7q zo+`3gi*3xkv?-;Us+x6%$?J9^s%-X3t0l!`Sm{d(>@-B}aSeklr%qro zqSc3+v>S42qhn+RqM_LidDJ|3c)*T&Kotc?1QHxAJ*Plc|3YSr>jvlMEpis)B?biS zv|Ic(y{tjAw$+~s&bs3Y0miAnH+=vvMM0;{GwO-Ml z?9j_fmiUQa1JeEk4fuVR3xx>0+oXOjK!3#A%;bCt>thNByHeHipc1LjT3k>LlniR{ z@yhif6S2Q%N&gb1yFda9(2LQL56hQnj|z50RuVevV$NT2d<^A!TI+4(zGmBXqPu1v zuD0IHXg50Ilu7qhC5pz?ZiQa+cE|FpJl3;@QuRuu67Zft-mJIXHs3n{H zv;s{|dV;Y`Y4mTkK4@y~k_m)`^LDIcrMxPAIaATO(bXImo^!OLu(kl3^2eAovC{40 zDhu(W8S&uKypp0uI=e7v{x3zIvaBax#foJa&}{Y()v%aMoofoIsG=fT-kyYAodGYo zrXt7jmRI`oUcolnndK}YY%#_hh4+qQdR%NQOHzApo#CxNYMaUIqk^L$pYuqban+QRJZUIq>84h|1y z>CFNcGJ1*3l?i zUZ$KnLP$bX)gwJVLt04FzS%!oL&@Y(w(UOBLD*PJ!%RWa#nVBt+#9K)8lJ4ST?;EB z0+?zgeYohy7d}zb59TSR2KZXHf6oI~+}okj(!*4VK}HUe%?LJ(*R_7mxZ1J&(x}{s zHk^br%v{WPl+#80%7vo?4Sj9epRKyy8e~M&QH8s(cm~Xsyu|vTpr+fdx88%tv9dl7 z=N)e&Kg=I2W{SJn*v$C3{+@eOxlkO);3Lo{-maTw6CpV0JQXX;S5mHvFwPb1>zs@m z3qLMcgLa-;&l5WHUBAHUPbZt~19?KNt~aKVG-q>vspWylx2cT-s5cPae{_@p5`R`N z8zQM^n^nWL$UJ8QV%}g+NRZ+bcQ1he#T^PQE~U7;OK^7r6o*1^cX!v~MN`~eg6H!4 z|Iayh-H%s3+z)51cO`H3$|N(-%%0i%*?YfX%8F8$=)~wRUcA7Rkrr2Z@d6q2e82YQ z_46zBIf~cw8*}g$kZ3uWx3eO>z>3Dj) zqse!-IcF9%PxTgfdfVz_c^%&uBU5DB@BcTiO6vE8b<~*sh8#$^gTj77-gi1O6?FL? zPa6;h)y$G%`exUYcF#7CtK&Qy(ueh{gL$y$_GrpM$yCz8PhYg3A`0&cwQ-}G6>$G7 zyt&++%=KPrcD^_M;990tC#2o%w0BSLeL0zGwIyIdHY{)3KPR(MqT6!)M<#)mWrV~M z*6!V6v(kK}w*AMq+LKl(^T8`$USgVFu;KSO(O^aP7U(A@8&(hrt5b=vh- z{6~*)7?=%$Ph}(+kTS1vHFnd$ZljsSxcT$K3I!g=?${LFw5*jAzV&AESRfLL{ll7Y zqS$IZ^4_cek=>zy`l2FFzQJaNxKz8rhPb0gZ7h{Xzz)c&dEEGn+bxPkGTRR{Ty`V? zRTH&xbU*xXp~jKp-QG$I{PSoo2F77RiF$=l%*{6Q1rXv6OF9>;h74#z7f1T4iUlf;QQo{7R{L9{ zx$KhbgZf~jaa^46EqbkS5G6dqmj%@43<9NDP;`p&`$=pe^YkUOmr{VF5fCFKuLPj; z{<6FqrB8^HM}TdFKSdh#NUAZn2eUQUP9z)z({OBY1%~gNtEkN2&_o*VE%Y-)A)b#D|xI zF(vQG2MH&PBW%$ljyHb;9%V zvouYn`1C0$j)F828JvE)0ltZux*I^xBm@l-;Fo(Ct&38h62(KnIH)#cAPAe7{M}y%$zUPE%Z%k1+#d-2&OT zBsgW1FwA4lD^4asSRl9UhBw9aZmcPYgKRNoJTGrr1h~9 z(5IiJM}%R$(Kk?WR*9yjI6Kax8M?0z!1MJohaoQ4D|O;Tv}NS6~*Op$*f~vEWnD0WX{ZBix4~9jn<57aOimpXKj=}ufIE)?9E97p}7=Po5 zvIFB$?MVK60qu9FX+gUenHL$F*=O|QfOlw=7(EKTa4hp6X2O?);B+(6)>3q(HT5;6 zt`WuyCL^^iP+PH24AyDJ5k>+CvpcCS?+k6F3T;_ zL7(@qw-v9hWx4?~vsA5gYi9j3F*hp1!MN9SCxoI+lSLduT9gG1b?r4Q#BD{KQz|Ge z?|d@E8W^Y6cB_}k8Qg+B+TuDgZz|4CJ_eE5)+ zyv}mjoR@s>nGxARDI9redUGKSCI}LpU!(U*Bq`0iY5Uyr!;MC*Qhl!k(_LklHP^fD z-ujU`WHfgWYX_Jq##wYJeab!j)OAAHRwv={{+8JCP+E@Tm~1M=fTmweRU4L5)|Fyy zlvnqtiQVL-am?B5GKEr{CGtR^`8d`rf&0fDt&;GtXWd@g;)6vz}weBo{)B$C@sidG<5k~*3?fF4oF&EHWaKIj4Jyj(O zS76^A{;*L|BkR>An8h#=pMoBw#GVf;Vqg~aj%|~)PuFus?AM!>9=3@uOy0;9f?pbA zh-z}?l~v^p{D1=E&vYgl^?On&XqXFf+iEybR)1w}Z?2#fJk{RYNH#&Dz$!}N(sm~l zOOX#FJg)UoPq^reM0ydecmaO32)*KR$T}aPs$sY7FSAun!~RI@Z~cD&(y)boN~-OAHQUr){(4p&`}iF(FUA2q0wlH3LmE>rsdJDq%lE33S;< zC#}q?Oz}_BWe07gBW~qXjibJBO#ACMm4s$Y78*nf!ejoY_sqr{LkN$-dC~6caZ1@5 zlSnADnj0hur_=w2{fqT$HY!d~zWg(!Py;cX# zA4gQqa2`z=VpO!XS-wfaw01K`Xr&fxj+Pp1(+^&{MdsKN3d;uI)mH1YRHGNCX5GbZ z@)cH;5owO7z3aDYl>Gcfo^L{<;X6l4!nm{quhk#+4>V#$I7{&<4qJJiQyq9^DJc$q zO2vY@k=19eKIGt!V(2*#GI5IxnH%wPE@g;%?>9HW%J`|=@xC*bhug|jr9Ws)+5Ne& zW@gX^+L3%V{Tq!vhVYSHnXhz606%*TL#z_{H0HNiMuT(>KWmL4d-3iv3mVY{Cr0iw z*`EVEa*+B9%4%?;gScxDI9sxnv1PwjKIun%I1<#5rBCeYT0TFH~j@L z*DxJs5&B(WukVk((IF<Q_S{0s`;oa=V=(R&a{voGG} z(~daV5kFg(=ZZ(8miw)BG?ubbiwsqDiKVJxZb1V9R5$N8ZbIu(M>u8N01q})g7_5; z?+l?Kr+jV#xb*1ATPuIUf5c}7qRnt40U~fhOrMYQDv^qO80}5KS>2gTikQp*R*(>#55SM0-oWzP|v&JdnTOnYsQVH#V%j38f| zUYBPJe^%)`lY-Dsi+Ws)L6)L|y+!8V1l6(Waf}}()*pS6j&1W4ZMSfbC1O`aMdJul zB-%wanXTaYD0LN%ViqGMSl;QKqQYoFJEZ3oGDFgoGByMmgE_GF(OgW_{48-3P1)lg z=P}gfE{iy;B`&9iKTT^O@+nBe<6rL<{O4Vi(4;(<YvBPPdHwpI2?Ftx+7lxh2eGlS6Z zf;&@rEZZj%9%PuqJ=Z!00JA*I(Fb8C`R}WC%M2%*BF$8)-UQ4t{RUDzFsvO@CIHzk z@+Y|{br)h|&R0g^=Cva5>=nx@3d~$=(87Qr6~b^FcLid`*TxetdZrSoQE1!CXb)1$ zMSMP1Jcm<(@s0+8d3?Xtdt@W8>a9%8ajXZvkp6_0NyT>fp0aXEeIL@4Pm`LOf%Erp zeXJGJ(v~U6RbCMTyT;}(sKrS;TJhJ-)||kdU29PMDi<3XO`yrtn`9F zQ-`n0>@z~cW0sdCCu@+!;~$hA5&ULV>8zS{x&5KTvga@NeUxtT?de0+RlXr6x7B08 zNKgZ+HKjAKUX#OC{O{LWcRq3LL%E3PHU9IgesJX0<_%;tW+<5xAYhc$-yypW9C8F1 zdEYUaXXFA2w|2WU*zbka6WWm6+qSM~*Iw1~Ffa^jD;!9Z2ZAH3OP~)N*RG+k2wTMr zE>8SR@yGY!)Nlq)&4z(O7}ootzRcRYsU&kCw(;Hfsj8AgH|3w)YMRb-*=9nS7LxPl z@B0{t$(=s7b1A;mMWR7wPG(<`+2m%)2bsLt2UE%|!lXH&0s`<(o)` zz>)usN*SxLx9~Z5+u(nk_%H8HuhqWjNGf%s$antFl`V+uJc4W2^z5mwzG;x7S{w<&QuTpTBQ6D6|j3pq40Z~`DXVS zhXz`EuVbk!Ny|Cg!GoX6&-&i!f{eL88`bQxOg;Yl(Q&a=VhKaF>dyHYo;caZD8Y|FF}4=>tcny)NpX8YC#;BUJ&&l=C_*sU?En9=&0C^U`9 zuVRiYk$d@;=r;&hsFY0DIkHh8LHz`($BU$V*&=01#=$-;U>`GGm;^4xcwkbg}Pnz}PR#aemfgubzH|$!`rH z9SaH-8~;f39+*Q#+meJn|JJF7&s<2Bc!$^S!j0ZM7t{)3K~J4q`o!70ZiKKQ&AkXA z!y6zcx>Dm#z4u}*KpkT@Suu2~D2hCo%29AS3k&K0CM3Srv~~p&gq8lq02!)2kFLH_g)%VlGnwqSuQyzFAR+Ft09wT}aQ?5@KxIa!CpmLyz10e_snegf zSMXhvf9BdRtj=`m5IYw$jW;>oUef0cUKG?6U7PA)GTYeSdZEyr49}b58G}3-D&(1D(m}n?@Oer zIw(W_---<0k9W5(CpLHH*Yy55in4>>2nv{}T=wUs?9JUfAHBmou2V{%YrF4r&Ceg< zwOxphJ~4Z**Nf2!ceIv<-JAoK1iGdjDcp>x&brR}gXy(YmiPg$ zRivV@SBEmm3Sv2p#s&q~lqGVT<(BzwZ+<+In5U57XxauYjlOJ}WeY1%6K)e|hyhO4 zmvTfTmxpfuc5x`(7g3@BvVG(;>{^!wTXMc~wVGzslJ!*G@x}`}s+k*0>-Vmc%_#bk zA#^AcF?4wwksEwJyDz0yNP7rfL zce5$pXGw=^6CsnRKl2lGW}bY#1q?tXJ@w1LaSCRWa+che9?sDdUgjTW#-C?_9fflO z#oUsa9@I?UcJ*|q^73G+9dlSh;Mg&WD&s=4-<@)_cI?<}JMn|%Ppx|kRes2BHH7S{MF9Sp-`aX;Dwq1L z_a`6)-79JMOy0=AB6WYuFD7EB6oKu-rMo#)N_HF;Nop2-{gH@lw zZ}gqp$?inMUWQL}vo4HW9J_;^c5#$kM?gMBU*Sl#<8C!_w`*sh_ZO$Vo=<!#0V$3tiq zE6hasaw3SdJ7yH9XQp{3>n3^7kEyN~jVY(2EGCj_eqF=}f11h>We`#GK&AHSn;LxFfqn;@$ZwC8#`0s&uFl_SCUbaaYz=Dj{PR5RsZEa9Yh z`LKZ%PW~x@6Bzn9(9wa%#5@dk?SHsgE%qD{qBj{!;|^CVUA^X1m>SMSbz~44Bj%H@ z00F0QA(>v~prPAC*|T5#)4376=GWb|4wFee4Qt;^eZK4ROVbt{<)Se_>Ba}oCp4vw z$(c~9v(2hz{B}-F=GPwKQLNwBAZgr=l*1Fe)*S>%Nq?^u9t>o2=cmJT9!$jck5DsC zljCvmh!T~$i&c}RRVRe?GTz+>6&0l3S#9Z#b#-T-%4f9D3)K=ZtA$)20Cay6Tbi`& zkP3YA5s-JDv;BidFkht01hgE?mIk|#pUnk~j>skXWR@2Pj1Esvf1Aqi^Cw&#eRC^y z1mjX8;Q=#PtBBLu8OGui9t|*cxH*M2g?MZQH5cjJ1{wYclA2dhvR0Y8M9Dup5V`bg zgEP#^AFQNG>I1JkHP#ru?Y_lj_aja1Y#8e9!V&1!W}w)FzQ<+^MR{R7 zxvrEkBy0YaTq6T48^p|Uz|@9Ib{$=$tvW`;@KkP}wl>{jb=-$Rzim_Dv|enxipv<) z3LjKV!KJ<=oL>!vn??*xCkuR2KVbYPZp;+c)TGC=OM2BB@}_JJt~)MOw<;l#P!eY; z+P$w*i>-QFZ*5KXu+>@VO~OqXafe5?6a@=y@#?eUZL^AE4D^YKWp3k z^Vq@!HDT700`?wxls8y0Y>pc{YKyYe-UFAFzJw+){n_>SLy5MVS^IMX71-boSFOm$ zMn3Ri36fF_m;R%Mo$&kRyuvcLHt3@(P%Tpx>xdi{VjPy#$DcMGpkHZpfOG{I|1vB} zO?Pl*?gr90AnXy)sNbrcen(c0YS$_%8-JX!)}6o>GMU?!>KCX z*8Ww^`cv42;70z~h`WMu)#TDwhr24ci5&fnouoAQU4VyEwDGD!D-WO)1hk~0V+v1) zknv}c+$CQG8~0WzlaI*W6P(5zQ?B``z#nZic6-`r-CZuSS9L}4nHQGk0U3snAo|kJ zIH~cAi?Zs2p_`sZL%Tl7GJr&=l)6F%_P$hE85Zf{Y`xsgDa2=A21>v5?f7^8GmmAf zkho>UAM2Sc!JUp9r;^*IsVP@`BYd&lTS%Zradb9(M->s9UP`$Zdq!0s=Wp3FEw8D# zqu$Ls$9?xZXT_xm+pbKbjn>Uk0Z1U|{|0cNuX}=axaudru>m+Qw z_gceDRoeup%uEZ^dE_7uE-jq)Gvn9Q*Nhx?Xcof2fjQ2o{k)z&dNwzTCBMt9V-{DF zsaeb}`kcI}uvaf@h_7=Z)HG#wrqDEH=m{{FDVi#(oF$jN^lk9(8C5a6mi7iSLuh)g z!<#gQ0}aX1$b+N$eZS_}IJBZV>r zFbU_?zyxan8{`&bB$j;-JBYO!c>Yc>v_36f5!Ef=zBaYpt^$?BJD1tZK^!~jyxCQ@ z>rpi0BW||;AeY2TD%u+!6oL)mrYxG^LaSGgcrf>*EY@3kb>+eI(_)`EeQiC z%DrU2amJnE@ry;=Ec}C0|88y1>%1kj9d`&vO3!?Cuo+lGiEGDUT*B7R{0p{?^2E4# zkd$?>ut?Om9djpTZO_%AdG?k(y*~911DI6aA(QU@xI+1o4bEEm&<6?yYf86zh+=+Kqie6%3TmM8Y z5Foz>T(&pq1K=w=Bt7_$*u8VqiRu8^Z-JGepA1VUN_(S>;_(P!^-uDpCQco4?L>)X z<|{SbO~gYZKggD6nwE~oC^O#Ht*~Llq(60VFt|0J>_ur>*XSZ9+b}fb4*|LRW#G(1TFFF22WQ#I6bc-!-rr}N669puvzd8=*2+R# zadNroP%R1SJjk2R0RJf6^$M^Bl=VTFRcr9b`P)F(M*Y*O<-B4kZqaMA?kj;#dizrP z{46%wA+NV);JIuaxM^!*q#@5}&Wed7ojd{6d&GiE>pf_6gr?h~B=V^+yiMAy%&m9i z7UH_?39*C9ZXN=snx$TsMD6oPKZZ;X@j9_RZKp`}v9WP)lD#jTy<2?jfGs?oOI0g| z9;E3DH|}mW>OXcE=nEM*KD;0~Ht_HU6`=%sctps-P|+2&wVz#`H$$8~qNN~Xto%@n z@TsZXgGBf5O|1>}@$)xVVO+Uut+J$}SsqYr^cWvVOb4gX-Tkh;%-N^%7}ZyN7du;6rVL)2wlmo~XO<%&(={SKYvz(!nTKOr7j z)MEqq!?z!n3^PUYH&cy88sYV%SQYZ1HcXd|Hbl7oY;rsuRGbfE<;CS#WEwrw#Im*; z7%upz^^jE&{CJst8hVvQ4(3;59w|QXdRFLS+}~+A4T7gm5Al*y`#4%N0npXW)(Gq* zwd84UxMF?nC7|%w-h)yc)-?&*?%HYSaLDxXqq;1!z1`(Glhktn``E5G@5*@wsg`LT%$QY!g*+4Ad zK}XK-H0|oruLaWvqTXm)OS(Wj9ioD?pv)w?o zxSOzX>r@>%Xc4!pRVlDD_Z$`S%LshlUId1M&e{K? zX8%I=-&*(IkN-~)$OgWdDUOz04t|c*nIn7OT{gupaZY9ihxBkeSow3_a$B8RnHDB}hw1s|kmgqP?AWN-T2qkAI0g8X zHCa;)li=x6OjE7G*o8A;`EdG0IfRVcOu5bZVD4xvU3)Egu1M8%vNsG@{Y3VypgQj0 zKasy%suopq*euN!IiA|2(;?$_&k@?}#ph6L5ii815E(@% zjoUoF6wnnVHaWTQQ=eW;sR6~+Zdw>pnQ*SrOD180{VQ2{)$ek4IQd{QcR+|)Rw}OI zo8pcrZB^SDvZB- zq7{{+n75DghkvRJbGOIRu%RoDansjxgzFX6l`P-f5l@e4?9r-2!oFU{61}KXJ55#t z@&*DX4(UU}qb+>KQg*bmYp64x0q18qg4)s$^jrTfa;pwBYZEf2KTb<7VS55LscC4BOYrg6Z$^S z<*uL&d{L5}56Y3JbkBX(?S7t;fedb$g`^Qvjk;*T;=|dx@4NW9#92~y%^m6n%&ugxjMwpr*c1SLGTvGTt(-aP2W~5X>j_Tw7@>|FU5PO z*Ky(XS;ZH`*1Hdr4ekOb9C$(4V%oL$Z0qMV>3AlPX8pL^Z~b_P<2^_Gz573sZPBob zMsr1B+MBTT%QMWy`;v8s!4ByaL%f2rOWOcoOoDUL`Bov{3x1H-1GW#jk7Mz@?&6fK zu!~C4?a?mZoj2!mD*1B(1x-WdrRoD&IeJH%HP3p-Qi<8URPBnE`}3Ze_;A6nfUV+y zC7<2@#%-dp|9A5mI*v5Vtm%DH^PW9dYmAH5$E6=%n&WE$E}ANUwUch)==rgFYQ8nP zI5a?%(d_4stm4P~-Op4B6g`C3d}?z%?|Z1}fiQ$d3{Z}hr{62L78kT3)XI#nqIhjo zn%mUmxO5~w^;OX}0-7d3`g=Sh3*;;Wi^GMe>;xH)qe)u~F zH$I&}eO}P7T+zS>irmshRzpzK&Ew7XrEtV4+YN_X)S8ID`e{|L-;d%8IqU>jY^zcz z;)RVV4)_JzZQB`4RWQx4q=0KU9I#Ojsh|!9*u*IHzd$@}9q|h@Rc=GM=hgA&!u*Pi~pucC`Q;B}E z`FN2tioDs!F>1}_pp?)~48|3_ynk14aB3ccjCj{kk@W?R|FEE8jU{p|jq)V^$cA&A z0if-+-FNZV|8nhVbdP%yg<#l2s=c5;yMc?FnIiK@b|z&KiyZ`Wq1hPL@%gNZI>R{3Mljl?4S`; zbdZtCAg})WpyM71#oud)J(4`fVD@UO)RR{jHoeYbmg}!teIQ;iscp#oaMxwEBd^X6 zh@@oRtx%>7`U_l~|KZN!%^>)i4US@XmqDd6_pfyJc`5>d{(Br_sSUQACrk*-8)Kpz zyks{&Q8kRY$C)FEKeU4!;{gJ$$IHrdevnAF=jxORDki2-fa;b4Bb%ka#|wAf0A@l=JG;$ZV_E&QgpSBj0Ktf4{zX zV3_yhu(C0kMCgtrv4EG0zm>q=A*}zB8l_a=;b`iy7Gw#C3ax1@-slXYt}SRxlO;+- zbtH^MYKP0C(bbQdv!@WyVwhcA#pXXC?Xzw+lYi*{ys8`N_^BfWP#qdCM0V?V+L3E> z)7GzWng$bDu@v(}9}@Wa*Yd_7lJcpHi5!l*n5wko`aV-Zvnjpd+eHVhGS747Q*r-T zU9pJohb6zS32bYPT{e^(1Jn5mAJl*Oq8Mw5Z}dqUFaL?zdJSWyaRn>8LAFg0%zWcv z;!x>589k-ww6m(*GUw+Z$-(T*T^S;VvKVIIPL~j`kL`g|2@Bw5HlQce+r$Lyz!`Y=3TSCQHc&Re0wFDb+)dg zJEm}q`5-bCRf$E?O~vb13;5jhMQgLLg?!7?dL+C*Cz4E2kFjZN9U`kE@(DSb8t*j{ zL;lR3;@t>k%$Z5sJUc8T)|`QV`(CVk&8%<4G4kZ?;wu}oF?2EJ}e-5v-cH7{UhA%jZTMZzg$e?P~pC=ymDaV-Zl;Tg=5X%xc^SKd6 z5ff8LyF);!}||s1?kpeS=mR7o~bN)Z!O)gE{i@j8I7TIbK*wXj$K8T09IAlomD-><`>x(NZj#S0xKOv- z6ir=~7Y~eApjf_*;mkbb~`Z|jtpzq0Q^C>tzb5po)#DmuOny1_K^y<`@KLecVTiQPrRJAJV z=B(Kr=B2xX&Lrqjf^|z!1g3c0yAzCrNw2O37W|#xC^=+Y5*l4RU)ql~SXu6c4cIc= z|Fj2UB~o4~B6yUaNN^>iX_;xpcW%UNsg4%n zWo0g7oWCRWM6!7Mk zP%&xXN$Hzoo>hvwukVef4V8haUyOx_#k@Jx_>V1T!U&A|T{SApW!{@T7tXRiN4fU| zi`(TsOrHU{%gQna8eNPTwDy&3g!Jb1;gt$EwYgC)#8?J`wD_k)ev~NHqKR&4MgLPt zCtg7fwr=)|fA2l_9Tu+%RZX-wrPN`!PuhPHS_v$$ey2Txv}5#P#- zxQjg}9QUGFoHKNWDr7IBWuxrAmGw&4qVotDIxMqgu6fe-TUR2|f1l7_RYIJ-x9bj{AGr zzwWZrro2qqcPakljKPOM?sFVC#n<>1Ne0sh&xv|)dk=UlW_F98VfBG0 zzq5@Tou*+QA=nGHN+=TjGeV3pA_3mwMOk%IA-0b7e z3S}6?%+w;3+OZXndfSN_ec)L4*y0ZTas zZV+3+dUYm4`B^_!gh*>BG+x`lOG38ELVne|)>*(^MY_BDk{08DI=&!A{mpBpXq+6e znF^d)%fmaHxN4ed?r6vv_Qey%6|01zb9416BCQRz}VJ`>nAk&mAyY6DVnl2laototK*DsFMV;v>5qOn5ktvT&i77M zbMk8H8aV|N_~OOO^M9TNkU6fhB634)NF+nJ3^>oCv}e8W2)ZGBkjaCdw)zT_f*Bo& zC6<8f6+Qy-bn0ntuKO7+EJPD0M|SPf?!Eds)+>Jy%P;C;dw)B2n)vp#}dq7O7OeP|+kT7QyBe zOQd-~biKBd$zPXMdZIz(O2!)SuzF=9Nz|d#P4=nu?JeuM)~Djbe@c@9P)Q8Lk(;-r z=sDWXg@r8$5pf zdvY`4U^Wk2w#e=s&^i)kL!}gPV%b~w37aNeqL57nCe<1kaFwx%2zBu8Jo^mT-pe}~ z=sr*7AK z+(IPe=D5X_PDMG99Z9#SdIH?v;4JnCcIMPQ{wg=0?lEUqo5n1M+-L&5Okf@T{EnnR zRAujvxN?mvY3tFe6%CYB!?>T?(XWblH!Qo5wbHnFMs^(>tCz;T2!goiKpHwpXW_T$ zR<m zKDybS#Udwt+~_UT=OWC0ucI`!uaX0h0UxS3hIuUGFE!oSg03m6-U_MIIz-99juz5j z(_|0j1m~_T^ftYSpCV-c)ET@qa{Z!#%q$9pWOhdnwx#_~u>hXGZ$kt6=N0eNf7cFd zW{9k`!gsM0C?-(;@c!n1O^TwIvQxg2@$XuPe}C~mbf@!M0*|i R{8*3|G7^g7<)YvH{|{+SOSS+2 literal 0 HcmV?d00001 diff --git a/9. Table View/Content/part2.md b/9. Table View/Content/part2.md index 3c97168..92f9446 100755 --- a/9. Table View/Content/part2.md +++ b/9. Table View/Content/part2.md @@ -13,7 +13,7 @@ Et je vous propose de commencer par faire un petit tour du propriétaire histoir > **:information_source:** Si vous n'avez pas encore téléchargé le projet, il est encore temps ! Vous le trouverez [ici](https://s3-eu-west-1.amazonaws.com/static.oc-static.com/prod/courses/files/Parcours+DA+iOS/Cours+9+-+Table+View/Whishmas+-+Starter.zip). #### Découverte du projet -Le projet est divisé en 5 fichiers organisés bien évidemment selon le modèle MVC. +Le projet est divisé en 5 fichiers organisés bien évidemment selon le modèle MVC. ![](Images/P2/P2C1_1.png) @@ -43,13 +43,13 @@ class ToyService { toys.append(toy) } } -``` +``` Cette classe utilise le singleton pattern comme on peut le voir dans les deux premières lignes. > **:information_source:** Besoin d'un rappel sur le pattern singleton ? C'est par [ici](https://openclassrooms.com/courses/faites-des-appels-reseaux-dans-votre-application-ios/gerez-les-requetes-concurrentes-avec-le-singleton-pattern). -Ensuite on définit une variable `toys` qui est un tableau de `Toy`. +Ensuite on définit une variable `toys` qui est un tableau de `Toy`. > **:information_source:** Ici, vous remarquerez le mot-clé `private(set)` dont nous n'avons pas encore parlé. Il permet de **laisser public l'accès à la propriété, mais de rendre privé sa modification**. Autrement dit, n'importe qui peut accéder à la propriété `toys`, mais seule la classe `ToyService` peut modifier sa valeur. @@ -80,7 +80,7 @@ Cette classe gère la page qui permet de rajouter un jouet. Il s'agit principale } ``` -> **:information_source:** Il y a aussi une petite extension qui permet de gérer le clavier. Vous avez [un chapitre dédié à la gestion du clavier](https://openclassrooms.com/courses/ajoutez-plusieurs-pages-a-votre-application-ios/gerez-le-clavier) si besoin ;) ! +> **:information_source:** Il y a aussi une petite extension qui permet de gérer le clavier. Vous avez [un chapitre dédié à la gestion du clavier](https://openclassrooms.com/courses/ajoutez-plusieurs-pages-a-votre-application-ios/gerez-le-clavier) si besoin ;) ! ##### ListViewController.swift @@ -102,7 +102,7 @@ Et cet objet mérite un cours, car : - Il est un peu plus complexe qu'un bouton par exemple - Surtout, il y a des Table View partout en iOS -Partout où vous avez une liste qui défile, c'est une Table View qui se cache derrière. +Partout où vous avez une liste qui défile, c'est une Table View qui se cache derrière. Prenons quelques exemples : ![](Images/P2/P2C1_3.png) @@ -120,10 +120,10 @@ Et je vous ai fait un joli schéma que l'on va détailler ensemble : ![](Images/P2/P2C1_5.png) -Une Table View peut-être divisée en **sections**. Ces sections permettent d'organiser les données. +Une Table View peut-être divisée en **sections**. Ces sections permettent d'organiser les données. + +> **:information_source:** Par exemple, dans l'application *Contact*, il y a une section par lettre de l'alphabet. Ou encore dans l'application *Réglages*, les réglages sont découpés en thématiques. -> **:information_source:** Par exemple, dans l'application *Contact*, il y a une section par lettre de l'alphabet. Ou encore dans l'application *Réglages*, les réglages sont découpés en thématiques. - > **:warning:** Le découpage en sections n'est pas obligatoire ! Vous pouvez très bien ne pas utiliser de sections si vous n'en avez pas besoin. C'est ce que fait l'application message, par exemple. Ensuite, au sein d'une section, vous avez trois éléments : @@ -143,9 +143,9 @@ Enfin, la Table View peut également avoir un header et un footer. À ne pas con Enfin, il est important que vous fassiez la distinction entre `row` et `cell` : - `row` représente le numéro de la ligne à laquelle on se trouve dans la section. Elle est de type `Int`. -- `cell` représente la vue, elle est de type `UITableViewCell` qui hérite comme toutes les vues de `UIView`. +- `cell` représente la vue, elle est de type `UITableViewCell` qui hérite comme toutes les vues de `UIView`. -Maintenant qu'on a dit tout ça : je vous remets le schéma, ça ne vous fera pas de mal ;) ! +Maintenant qu'on a dit tout ça : je vous remets le schéma, ça ne vous fera pas de mal ;) ! ![](Images/P2/P2C1_5.png) @@ -157,7 +157,7 @@ Mais vous devez savoir qu'il existe deux styles par défaut, `plain` et `grouped ![](Images/P2/P2C1_6.png) -En général, mais ce n'est pas obligatoire, on utilise le style `plain` pour des **données dynamiques** et `grouped` pour des **données statiques**. +En général, mais ce n'est pas obligatoire, on utilise le style `plain` pour des **données dynamiques** et `grouped` pour des **données statiques**. > **:information_source:** Une liste contient des données dynamiques **si on ne peut pas prévoir à l'avance le contenu exact de la liste, car il est susceptible de varier**. C'est le cas d'une liste de contact ou de messages par exemple. À l'inverse, si on connaît à l'avance le contenu exact d'une liste, on dit qu'elle contient des données statiques. Elles ne bougeront pas. C'est le cas d'une liste de réglages ou d'un menu de navigation par exemple. @@ -175,7 +175,7 @@ Dans le prochain chapitre, nous allons installer notre Table View ! C'est parti ! Nous allons rajouter notre Table View dans le storyboard ! #### Installation de la Table View -Pour cela, ouvrez le fichier Main.storyboard et allez chercher l'objet Table View dans la bibliothèque des objets. +Pour cela, ouvrez le fichier Main.storyboard et allez chercher l'objet Table View dans la bibliothèque des objets. ![](Images/P2/P2C2_1.png) @@ -206,9 +206,9 @@ Je vous laisse jouer avec les attributs `separator` qui concernent la petite lig Pour bien prendre en main la Table View, il faut comprendre comment elle fonctionne. -Comme vous le savez maintenant, une Table View, c'est simplement une liste de cellules organisée éventuellement en sections. Et **cette liste n'a pas de limite de tailles** ! +Comme vous le savez maintenant, une Table View, c'est simplement une liste de cellules organisée éventuellement en sections. Et **cette liste n'a pas de limite de tailles** ! -Et c'est toute la magie des Table View ! Vous pouvez mettre 100 000 éléments dans la liste, ça ne posera pas de problème de performance. Votre iPhone supportera la charge. +Et c'est toute la magie des Table View ! Vous pouvez mettre 100 000 éléments dans la liste, ça ne posera pas de problème de performance. Votre iPhone supportera la charge. Ce petit miracle de performance s'appuie sur une idée très simple. @@ -265,8 +265,19 @@ Or, comme on l'a vu, une liste peut avoir des tonnes de données ! Et on ne va p Du coup, la vue va devoir demander régulièrement au contrôleur de lui donner de nouvelles données. À chaque fois que l'on fait défiler la vue, elle va réclamer de nouvelles données au contrôleur. -Et pour cela, elle utilise le delegate pattern. **Le delegate pattern est donc une nouvelle méthode de communication aveugle entre la vue et le contrôleur.** +Le problème, c'est que ma tableView ne sait pas avec quel contrôleur elle va travailler. Ici nous utilisons notre ListViewController qui présente une liste de jouets, mais ailleurs nous pourrions en utiliser un autre qui fournit des listes de réglages, ou des listes de contact... + + Pour faire fonctionner notre TableView on doit donc résoudre le problème suivant: + 1. Ma tableview doit pouvoir être informée de la composition de la liste par le controlleur + 2. N'importe quel objet doit pouvoir faire ce travail, ma tableview se moque de savoir avec qui elle travaille, et cela me permet de la réutiliser dans de multiples situations + +Pour résoudre ce double problème, on va utiliser le **delegate pattern**. On dit en effet que la tableView _délègue_ une partie de son fonctionnement à un autre objet. +Et au coeur du delegate pattern, on va voir ce que nous avons étudié dans la partie 1: Un protocol ! + **Le delegate pattern est une nouvelle méthode de communication aveugle entre la vue et le contrôleur.** + +> **:information_source:** Et oui, si on dit aveugle, c'est grâce au protocol: ma vue va pouvoir demander des informations sans se soucier de savoir qui lui fournit. +On retrouve l'aspect **modulaire** du code qu'on avait abordé en parlant des protocoles. Et voici comment cela fonctionne : @@ -284,7 +295,7 @@ Détaillons maintenant ces 4 étapes en rentrant dans le détail du protocole. La liste de questions est une liste d'exigences en fait. Donc ici on parle de **la création d'un protocole**. Pour `UITableView`, ce protocole se nomme `UITableViewDataSource,` car c'est la source de données. ```swift -protocol UITableViewDataSource { +protocol UITableViewDataSource: class { func numberOfSections(in tableView: UITableView) -> Int func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell @@ -292,25 +303,31 @@ protocol UITableViewDataSource { } ``` +> **:information_source:** Vous avez sans doute noté le petit mot réservé `class`. Il indique que notre protocol ne peut être adopté que par... des classes. Les struct et les enums ne pourront pas adopter ce protocol, et on verra bientôt pourquoi c'est important. + ##### 2. La vue nomme un objet son delegate, en l'occurrence notre contrôleur. `UITableView` a une propriété `dataSource` de type `UITableViewDataSource` : ```swift class UITableView: UIScrollView { - var dataSource: UITableViewDataSource? + weak var dataSource: UITableViewDataSource? } ``` - Cette propriété est utilisée à l'intérieur de la classe `UITableView` pour appeler les méthodes du protocole au moment ou la Table View en a besoin. +Comme promis, notre tableView se fiche bien de savoir que objet fera office de dataSource, elle a juste besoin de savoir qu'il répondra aux exigences de notre protocol. > **:warning:** J'attire votre attention sur le fait qu'à ce stade, **il n'y a pas encore d'implémentations aux méthodes,** mais rien n'empêche de les appeler. +> **:information_source:** Encore un petit mot reservé que nous n'avons pas vu: `weak`. C'est lié au mot `class` qu'on a mis tout à l'heure, et c'est promis, vous aurez bientôt des explications sur ces nouveaux concepts. + Ensuite, cette propriété prend pour valeur le contrôleur : ```swift class ViewController: UIViewController { + var tableView: UITableView + override func viewDidLoad() { super.viewDidLoad() // J'assigne le contrôleur comme valeur de la propriété dataSource. @@ -337,11 +354,11 @@ class ViewController: UIViewController, UITableViewDataSource { func numberOfSections(in tableView: UITableView) -> Int { return 1 } - + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 10 } - + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // (...) } @@ -354,7 +371,7 @@ Vous venez de découvrir un nouveau mode de communication aveugle entre la vue e #### Mise en place du dataSource ! -Mettons toute cette théorie en application dans notre code. +Mettons toute cette théorie en application dans notre code. > **:information_source:** Dans les 4 étapes présentées précédemment, la première est la création d'un protocole et bien sûr, cette étape est déjà faîte par Apple. Donc nous allons commencer directement par la deuxième ! @@ -386,7 +403,7 @@ Lorsque vous faites adopter un protocole à une classe, je vous suggère d'utili class ListViewController: UIViewController {} extension ListViewController: UITableViewDataSource {} -``` +``` > **:information_source:** Besoin d'un rappel, sur les extensions ? C'est [par ici](https://openclassrooms.com/courses/ajoutez-plusieurs-pages-a-votre-application-ios/allez-plus-loin-avec-les-extensions) ! @@ -395,13 +412,15 @@ extension ListViewController: UITableViewDataSource {} Ensuite, nous allons implémenter les méthodes du protocole pour nous y conformer correctement. Nous n'allons en implémenter que trois. Car les autres sont optionnels. > **:information_source:** Eh oui, au passage, sachez que vous pouvez signaler une exigence d'un protocole comme optionnel avec le mot clé optional : -> +> > ```swift -> protocol MonProtocole { +> @objc protocol MonProtocole { > optional func maMethodeOptionnelle() > func maMethodeRequise() > } -> ``` +> ``` + +> **:information_source:** Les exigences optionnelles ne fonctionnent que sur des protocoles objective-c, d'où la présence du `@objc` devant mon protocol. En swift pur, ça n'est tout simplement pas possible de déclarer une fonction d'un protocol comme `optional`. La première méthode que nous allons implémenter s'appelle `numbersOfSection` : @@ -420,7 +439,7 @@ La deuxième méthode se nomme `numbersOfRowsInSection` : ```swift extension ListViewController: UITableViewDataSource { // (...) - + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return ToyService.shared.toys.count } @@ -450,7 +469,7 @@ Nous allons remplir notre Table View en précisant le contenu de nos cellules ! - le nom du jouet - sa marque -Et pour y parvenir, nous devons commencer par rajouter une cellule. +Et pour y parvenir, nous devons commencer par rajouter une cellule. #### Ajouter une cellule dans le storyboard Pour ajouter une cellule, rien de plus simple ! Choisissez `UITableViewCell` dans la bibliothèque des objets : @@ -504,7 +523,7 @@ extension ListViewController: UITableViewDataSource { Cette méthode prend en paramètre un `IndexPath`. `IndexPath` est une structure très simple qui a deux propriétés : -- `section` : contient un numéro de section. +- `section` : contient un numéro de section. - `row` : contient un numéro de ligne. Cette méthode renvoie une `UITableViewCell`. Donc le rôle de cette méthode est de construire la cellule qui va être affichée à la position précisée par `IndexPath`. @@ -525,7 +544,7 @@ Ensuite, nous allons modifier le contenu de cette cellule. Pour cela, il nous fa let toy = ToyService.shared.toys[indexPath.row] ``` -`indexpath.row` donne la ligne à laquelle se trouve la cellule. Ainsi pour chaque ligne de la liste, on va afficher un jouet différent du tableau `toys`. +`indexpath.row` donne la ligne à laquelle se trouve la cellule. Ainsi pour chaque ligne de la liste, on va afficher un jouet différent du tableau `toys`. Il ne nous reste plus qu'à afficher ces données dans la cellule. Pour accéder aux deux labels contenus dans les styles par défaut, nous avons deux propriétés : `textLabel` et `detailTextLabel`. Nous allons modifier le texte de ces deux labels : @@ -576,21 +595,88 @@ override func viewWillAppear(_ animated: Bool) { } ``` -Et voilà ! Notre TableView va maintenant charger ses données à chaque fois que nous revenons sur la page. +Et voilà ! Notre TableView va maintenant charger ses données à chaque fois que nous revenons sur la page. Cette Table View est officiellement fonctionnelle ! Vous pouvez tester en lançant le simulateur et en ajoutant quelques données. ![Tadaa !](Images/P2/P2C4_6.png) +> **:question:** Hop hop hop, tu voulais pas nous parler d'un truc important encore ?! + +Ah si ! Quand je vous ai introduit le protocol `UITableViewDataSource`, on a d'une part limité ce protocol à des classes, en adossant `class` à la déclaration de notre protocol: + +```swift +protocol UITableViewDataSource: class { + // (...) +} +``` + +Et dans notre tableView, je vous ai dit qu'on avait notre objet dataSource, mais avec le mot réservé `weak`: + +```swift +class UITableView: UIScrollView { + weak var dataSource: UITableViewDataSource? +} +``` + +Alors, pourquoi est-ce qu'on a fait tout ça, et qu'est-ce que ça veut dire ? On va rapidement toucher au monde des **références** pour comprendre tout ça. + +Dans les languages de programmation un peu modernes (comme Swift!), les objets que vous crééez restent dans la mémoire tant qu'au moins une référence existe vers cet objet. +Quand mon objet n'a plus aucun autre objet qui n'a de référence sur lui, pouf ! Il disparaît ! Sous iOS, la technologie qui fait tout ça s'appelle Automatic Reference Counting (ARC). +Tout ça ne s'applique qu'aux class, les struct et les enums ne sont pas concernées. D'où le petit mot `class` dans la déclaration de notre protocol, qui permet de garantir que seule une classe pourra adopter ce protocol. + +Voilà un example d'une application simple avec une tableView: + +![ Les flèches en noir représentent des références](Images/P2/P2C4_7.png) + +Ici, ma tableView et mon bouton restent bien dans la mémoire puisque j'ai au moins un objet qui les référence, mon ViewController. Et celui-ci reste aussi dans la mémoire, puisqu'il a aussi une référence... Et ainsi de suite. + +> **:question:** Ok, mais tout ça ne me dit pas ce que c'est une référence ! + +Une référence, c'est très simple: Quand j'écris ça: + +```swift +class ListViewController: UIViewController { + var tableView: UITableView +} +``` + +Je créé une référence de mon `ListViewController` vers ma propriété `tableView`. Tant que mon controlleur est dans la mémoire (et généralement il y reste tant qu'il est présent dans ma navigation), ma tableView sera là aussi. C'est bien rassurant au final ! + +Si on reprend notre example de delegate de tout à l'heure, ma tableView s'écrit comme ça si j'enlève ce fameux mot `weak`: + +```swift +class UITableView: UIScrollView { + var dataSource: UITableViewDataSource? +} +``` + +Du coup en terme de réference, quand j'écris après dans mon viewController `tableView.dataSource = self`, ça donne ça: + +![Et là, c'est le drame. 😱😱😱 ](Images/P2/P2C4_8.png) + +Pourquoi c'est le drame ? Parce que sans faire attention, j'ai créé un **retain cycle**. En fait chaque objet a une référence vers l'autre. Même si mon view controller n'est plus dans la navigation, et qu'aucun objet n'a de référence vers lui, le couple viewController <> tableView ne disparaitrat jamais. C'est ce qu'on appelle aussi une _fuite mémoire_. + +> **:question:** Mon Dieu, mais qu'est-ce qu'on va faire ??! + +Pas de panique ! Vous l'aurez sans doute compris, c'est là que le mot `weak` entre en jeu ! Weak veut dire: cette propriété me permet d'accéder à mon objet, mais ne compte pas de référence dessus. Si on reprend notre schéma: + +![Voilà, plus de retain cycle ! ](Images/P2/P2C4_9.png) + +Et voilà le travail, le mot weak permet de briser ce fameux **retain cycle**, parce que par défaut une propriété est **strong**: ma propriété maintient un lien fort avec l'objet: elle compte comme une référence. + +Si tout ça vous paraît compliqué, pas de panique. Retenez simplement le concept de retain cycle, et que si deux objets s'auto-référencent, vous allez avoir des problèmes de mémoire. Lorsque vous créérez vos propres delegates, pensez à les indiquer en `weak` pour éviter ce problème, et tout ira bien ! + #### En résumé - On peut rajouter une cellule en la faisant glisser depuis la bibliothèque des objets vers la Table View. - Il faut configurer la cellule dans le storyboard en lui donnant un identifiant unique. - On peut choisir parmi 4 styles par défaut pour les cellules. - On précise le contenu de la cellule avec la méthode `cellForRowAt` du protocole `UITableViewDataSource`. - On lance le chargement des données avec la méthode reloadData de `UITableView`. +- Un delegate est déclaré avec l'indicateur `weak` pour éviter un retain cycle entre l'objet et son delegate. Dans la prochaine partie, nous allons ajouter plusieurs fonctionnalités à notre application : la gestion de plusieurs catégories, la possibilité de supprimer des messages, la création de cellules customisées et bien d'autres ! Et au passage, vous allez approfondir votre compréhension des Table View et des protocoles. -À tout de suite ! \ No newline at end of file +À tout de suite ! From 95f18e267c828f7f5e6bac68f66783b9fae0170d Mon Sep 17 00:00:00 2001 From: HHK Date: Sun, 13 May 2018 18:11:36 +0200 Subject: [PATCH 07/10] fix diagramm --- 9. Table View/Content/Images/P2/P2C4_8.png | Bin 16417 -> 16966 bytes 9. Table View/Content/Images/P2/P2C4_9.png | Bin 17476 -> 17728 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/9. Table View/Content/Images/P2/P2C4_8.png b/9. Table View/Content/Images/P2/P2C4_8.png index a639cdd2279e0bd0bc81ab0bd09b7b91dc7bfc0e..0cd6e9afe0f8105ae469d3c95a3aab6fe397d5e8 100644 GIT binary patch literal 16966 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 literal 16417 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 literal 17476 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 R{8*3|G7^g7<)YvH{|{+SOSS+2 From cc0977c795281f93f85f981c6acf1915f2ebebf9 Mon Sep 17 00:00:00 2001 From: HHK Date: Sun, 13 May 2018 18:14:40 +0200 Subject: [PATCH 08/10] add part title --- 9. Table View/Content/part2.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/9. Table View/Content/part2.md b/9. Table View/Content/part2.md index 92f9446..a9bafbd 100755 --- a/9. Table View/Content/part2.md +++ b/9. Table View/Content/part2.md @@ -621,6 +621,8 @@ class UITableView: UIScrollView { Alors, pourquoi est-ce qu'on a fait tout ça, et qu'est-ce que ça veut dire ? On va rapidement toucher au monde des **références** pour comprendre tout ça. +#### Le mot clef weak et les références + Dans les languages de programmation un peu modernes (comme Swift!), les objets que vous crééez restent dans la mémoire tant qu'au moins une référence existe vers cet objet. Quand mon objet n'a plus aucun autre objet qui n'a de référence sur lui, pouf ! Il disparaît ! Sous iOS, la technologie qui fait tout ça s'appelle Automatic Reference Counting (ARC). Tout ça ne s'applique qu'aux class, les struct et les enums ne sont pas concernées. D'où le petit mot `class` dans la déclaration de notre protocol, qui permet de garantir que seule une classe pourra adopter ce protocol. From c457a1146d5cd92d2f1a9394e66e123aa9eccc69 Mon Sep 17 00:00:00 2001 From: HHK Date: Sun, 13 May 2018 18:18:12 +0200 Subject: [PATCH 09/10] remove image titles --- 9. Table View/Content/part2.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/9. Table View/Content/part2.md b/9. Table View/Content/part2.md index a9bafbd..d3f5476 100755 --- a/9. Table View/Content/part2.md +++ b/9. Table View/Content/part2.md @@ -601,6 +601,8 @@ Cette Table View est officiellement fonctionnelle ! Vous pouvez tester en lança ![Tadaa !](Images/P2/P2C4_6.png) +**Tadaa !** C'est chouette non ? + > **:question:** Hop hop hop, tu voulais pas nous parler d'un truc important encore ?! Ah si ! Quand je vous ai introduit le protocol `UITableViewDataSource`, on a d'une part limité ce protocol à des classes, en adossant `class` à la déclaration de notre protocol: @@ -629,7 +631,9 @@ Tout ça ne s'applique qu'aux class, les struct et les enums ne sont pas concern Voilà un example d'une application simple avec une tableView: -![ Les flèches en noir représentent des références](Images/P2/P2C4_7.png) +![](Images/P2/P2C4_7.png) + +> **:information_source:** Les flèches en noir représentent des références Ici, ma tableView et mon bouton restent bien dans la mémoire puisque j'ai au moins un objet qui les référence, mon ViewController. Et celui-ci reste aussi dans la mémoire, puisqu'il a aussi une référence... Et ainsi de suite. @@ -655,7 +659,8 @@ class UITableView: UIScrollView { Du coup en terme de réference, quand j'écris après dans mon viewController `tableView.dataSource = self`, ça donne ça: -![Et là, c'est le drame. 😱😱😱 ](Images/P2/P2C4_8.png) +![](Images/P2/P2C4_8.png) +> **:information_source:** Et là, c'est le drame. 😱😱😱 Pourquoi c'est le drame ? Parce que sans faire attention, j'ai créé un **retain cycle**. En fait chaque objet a une référence vers l'autre. Même si mon view controller n'est plus dans la navigation, et qu'aucun objet n'a de référence vers lui, le couple viewController <> tableView ne disparaitrat jamais. C'est ce qu'on appelle aussi une _fuite mémoire_. @@ -663,7 +668,7 @@ Pourquoi c'est le drame ? Parce que sans faire attention, j'ai créé un **retai Pas de panique ! Vous l'aurez sans doute compris, c'est là que le mot `weak` entre en jeu ! Weak veut dire: cette propriété me permet d'accéder à mon objet, mais ne compte pas de référence dessus. Si on reprend notre schéma: -![Voilà, plus de retain cycle ! ](Images/P2/P2C4_9.png) +![](Images/P2/P2C4_9.png) Et voilà le travail, le mot weak permet de briser ce fameux **retain cycle**, parce que par défaut une propriété est **strong**: ma propriété maintient un lien fort avec l'objet: elle compte comme une référence. From e54a5d30439ddbc23b0c89b8c8257e31996f49af Mon Sep 17 00:00:00 2001 From: HHK Date: Tue, 15 May 2018 10:48:07 +0200 Subject: [PATCH 10/10] add more stuff on references --- 9. Table View/Content/Images/P2/P2C4_10.png | Bin 0 -> 27121 bytes 9. Table View/Content/Images/P2/P2C4_9.png | Bin 17728 -> 18152 bytes 9. Table View/Content/part2.md | 108 ++++++-------------- 3 files changed, 30 insertions(+), 78 deletions(-) create mode 100644 9. Table View/Content/Images/P2/P2C4_10.png diff --git a/9. Table View/Content/Images/P2/P2C4_10.png b/9. Table View/Content/Images/P2/P2C4_10.png new file mode 100644 index 0000000000000000000000000000000000000000..a4bddf1b06689dda6b798cdd0e664d2a4def9db3 GIT binary patch literal 27121 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 literal 0 HcmV?d00001 diff --git a/9. Table View/Content/Images/P2/P2C4_9.png b/9. Table View/Content/Images/P2/P2C4_9.png index 67e9b65ce94e4e710381c3ac316616fc7bbbdc38..090a8b6e2c466167b1fec179494e83c3eabba8d0 100644 GIT binary patch literal 18152 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 literal 17728 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 diff --git a/9. Table View/Content/part2.md b/9. Table View/Content/part2.md index 53fd7fd..73f442d 100755 --- a/9. Table View/Content/part2.md +++ b/9. Table View/Content/part2.md @@ -600,79 +600,6 @@ Cette Table View est officiellement fonctionnelle ! Vous pouvez tester en lança ![Tadaa !](Images/P2/P2C4_6.png) -**Tadaa !** C'est chouette non ? - -> **:question:** Hop hop hop, tu voulais pas nous parler d'un truc important encore ?! - -Ah si ! Quand je vous ai introduit le protocol `UITableViewDataSource`, on a d'une part limité ce protocol à des classes, en adossant `class` à la déclaration de notre protocol: - -```swift -protocol UITableViewDataSource: class { - // (...) -} -``` - -Et dans notre tableView, je vous ai dit qu'on avait notre objet dataSource, mais avec le mot réservé `weak`: - -```swift -class UITableView: UIScrollView { - weak var dataSource: UITableViewDataSource? -} -``` - -Alors, pourquoi est-ce qu'on a fait tout ça, et qu'est-ce que ça veut dire ? On va rapidement toucher au monde des **références** pour comprendre tout ça. - -#### Le mot clef weak et les références - -Dans les languages de programmation un peu modernes (comme Swift!), les objets que vous crééez restent dans la mémoire tant qu'au moins une référence existe vers cet objet. -Quand mon objet n'a plus aucun autre objet qui n'a de référence sur lui, pouf ! Il disparaît ! Sous iOS, la technologie qui fait tout ça s'appelle Automatic Reference Counting (ARC). -Tout ça ne s'applique qu'aux class, les struct et les enums ne sont pas concernées. D'où le petit mot `class` dans la déclaration de notre protocol, qui permet de garantir que seule une classe pourra adopter ce protocol. - -Voilà un example d'une application simple avec une tableView: - -![](Images/P2/P2C4_7.png) - -> **:information_source:** Les flèches en noir représentent des références - -Ici, ma tableView et mon bouton restent bien dans la mémoire puisque j'ai au moins un objet qui les référence, mon ViewController. Et celui-ci reste aussi dans la mémoire, puisqu'il a aussi une référence... Et ainsi de suite. - -> **:question:** Ok, mais tout ça ne me dit pas ce que c'est une référence ! - -Une référence, c'est très simple: Quand j'écris ça: - -```swift -class ListViewController: UIViewController { - var tableView: UITableView -} -``` - -Je créé une référence de mon `ListViewController` vers ma propriété `tableView`. Tant que mon controlleur est dans la mémoire (et généralement il y reste tant qu'il est présent dans ma navigation), ma tableView sera là aussi. C'est bien rassurant au final ! - -Si on reprend notre example de delegate de tout à l'heure, ma tableView s'écrit comme ça si j'enlève ce fameux mot `weak`: - -```swift -class UITableView: UIScrollView { - var dataSource: UITableViewDataSource? -} -``` - -Du coup en terme de réference, quand j'écris après dans mon viewController `tableView.dataSource = self`, ça donne ça: - -![](Images/P2/P2C4_8.png) -> **:information_source:** Et là, c'est le drame. 😱😱😱 - -Pourquoi c'est le drame ? Parce que sans faire attention, j'ai créé un **retain cycle**. En fait chaque objet a une référence vers l'autre. Même si mon view controller n'est plus dans la navigation, et qu'aucun objet n'a de référence vers lui, le couple viewController <> tableView ne disparaitrat jamais. C'est ce qu'on appelle aussi une _fuite mémoire_. - -> **:question:** Mon Dieu, mais qu'est-ce qu'on va faire ??! - -Pas de panique ! Vous l'aurez sans doute compris, c'est là que le mot `weak` entre en jeu ! Weak veut dire: cette propriété me permet d'accéder à mon objet, mais ne compte pas de référence dessus. Si on reprend notre schéma: - -![](Images/P2/P2C4_9.png) - -Et voilà le travail, le mot weak permet de briser ce fameux **retain cycle**, parce que par défaut une propriété est **strong**: ma propriété maintient un lien fort avec l'objet: elle compte comme une référence. - -Si tout ça vous paraît compliqué, pas de panique. Retenez simplement le concept de retain cycle, et que si deux objets s'auto-référencent, vous allez avoir des problèmes de mémoire. Lorsque vous créérez vos propres delegates, pensez à les indiquer en `weak` pour éviter ce problème, et tout ira bien ! - #### En résumé - On peut rajouter une cellule en la faisant glisser depuis la bibliothèque des objets vers la Table View. - Il faut configurer la cellule dans le storyboard en lui donnant un identifiant unique. @@ -689,9 +616,9 @@ Et au passage, vous allez approfondir votre compréhension des Table View et des ### Bonus : Découvrez le concept de références -> **:question:** Hop hop hop, tu voulais pas nous parler d'un truc important encore ?! +> **:question:** Hop hop hop, tu ne voulais pas nous parler d'un truc important encore ?! -Ah si ! Quand je vous ai introduit le protocole `UITableViewDataSource`, on a d'une part limité ce protocol à des classes, en adossant `class` à la déclaration de notre protocole : +Ah si ! Quand je vous ai introduit le protocole `UITableViewDataSource`, on a d'une part limité ce protocole à des classes, en adossant `class` à la déclaration de notre protocole : ```swift protocol UITableViewDataSource: class { @@ -714,6 +641,7 @@ Alors, pourquoi est-ce qu'on a fait tout ça, et qu'est-ce que ça veut dire ? O Dans les languages de programmation un peu modernes (comme Swift!), les objets que vous crééez restent dans la mémoire tant qu'au moins une référence existe vers cet objet. Quand mon objet n'a plus aucun autre objet qui n'a de référence sur lui, pouf ! Il disparaît ! Sous iOS, la technologie qui fait tout ça s'appelle Automatic Reference Counting (ARC). +Dans d'autres languages, on parle de _Garbage collector_ pour désigner cette technologie: le programme nettoie la mémoire en enlevant les objets qui ne servent plus à rien. Et comment sait-on qu'un objet ne sert plus à rien ? Quand il n'a plus de références! Dans ce cas, mon programme n'a plus aucun moyen d'accéder à cet objet, et il est considéré comme **perdu**. **Tout ça ne s'applique qu'aux classes, les structures et les enums ne sont pas concernées.** D'où le petit mot `class` dans la déclaration de notre protocole, qui permet de garantir que seule une classe pourra adopter ce protocole. @@ -755,14 +683,38 @@ Du coup en terme de réference, quand j'écris après dans mon viewController `t > **:question:** Pourquoi c'est le drame ? -Parce que sans faire attention, j'ai créé un **retain cycle**. En fait chaque objet a une référence vers l'autre. Même si mon View Controller n'est plus dans la navigation, et qu'aucun objet n'a de référence vers lui, le couple View Controller <> Table View ne disparaitrat jamais. C'est ce qu'on appelle aussi une _fuite mémoire_. +Parce que sans faire attention, j'ai créé un **retain cycle**. En fait chaque objet a une référence vers l'autre. Même si mon View Controller n'est plus dans la navigation, et qu'aucun objet n'a de référence vers lui, le couple View Controller <> Table View ne disparaitrat jamais. Ce qui créé au final une _fuite mémoire_. > **:question:** Mon Dieu, mais qu'est-ce qu'on va faire ??! -Pas de panique ! Vous l'aurez sans doute compris, c'est là que le mot `weak` entre en jeu ! Weak veut dire: cette propriété me permet d'accéder à mon objet, mais ne compte pas de référence dessus. Si on reprend notre schéma: +Pas de panique ! Vous l'aurez sans doute compris, c'est là que le mot `weak` entre en jeu ! +Pour comprendre `weak`, on va d'abord regarder ce que fait son contraire: `strong`. + +Par défaut, quand je déclare une propriété sur un objet de type `Objet`: `var monObjet: Objet`, c'est en fait équivalent à écrire: `strong var monObjet: Objet`. Ma référence vers mon instance de `Objet` doit être **forte** pour maintenir mon objet dans la mémoire. Quand le nombre de référence forte vers mon objet tombe à zéro, il n'y a plus rien pour le garder dans la mémoire et c'est là qu'il disparaît. + +Du coup, quand je prépose `weak` à la déclaration de ma variable, j'indique que je veux une référence faible. Et au contraire d'une référence forte, une référence faible ne retient pas mon objet dans la mémoire ! Je peux accéder à mon objet dans la mémoire, mais ce n'est pas moi qui le retiendrai je ne vais pas le retenir s'il doit disparaître. + +Si on reprend notre schéma de tout à l'heure, avec la déclaration en weak, ça donne ça: ![](Images/P2/P2C4_9.png) -Et voilà le travail, le mot weak permet de briser ce fameux **retain cycle**, parce que par défaut une propriété est **strong** : ma propriété maintient un lien fort avec l'objet: elle compte comme une référence. +Et voilà le travail, le mot weak permet de briser ce fameux **retain cycle** ! Quand mon contrôleur ne sera plus dans la navigation, et qu'il n'aura plus de référence vers lui, ma `tableView` ne l'empêchera pas d'être enlevé de la mémoire. + +> **:question:** Ouais, mais on me la fait pas, ton schéma est faux, nous on a déclaré notre tableView avec un IBOutlet et avec le mot clef `weak`. + +C'est vrai, quand on déclare un Outlet avec `weak`, en théorie notre objet ne devrait même pas pouvoir rester dans la mémoire puisqu'il n'y a aucune référence `strong` pour le retenir, non ? +Bien sûr, vous savez que c'est faux, puisque sinon nos apps ne fonctionneraient pas depuis le début héhé. +Alors, qu'est-ce qu'il se passe au juste en réalité ? Et bien pour ça, il suffit de se souvenir, quand tout bon `UIViewController` gère une vue. Et si on reprend notre schéma, dans la réalité, on a ça: + +![](Images/P2/P2C4_10.png) + +La vue maintient un lien fort sur l'ensemble de ses sous-vues. Et tant que mon contrôleur est présent, il maintient aussi un lien sur sa vue, donc ma `tableView` reste bien dans la mémoire. On déclare nos outlets en `weak` pour éviter une redondance, ou pour éviter des problèmes si on créé des liens entre objets qui n'ont rien à voir! Depuis le temps qu'on déclare des outlets, ça devait vous démanger de ne pas savoir non ? :) Si tout ça vous paraît compliqué, pas de panique. Retenez simplement le concept de retain cycle, et que si deux objets s'auto-référencent, vous allez avoir des problèmes de mémoire. Lorsque vous créérez vos propres delegates, pensez à les indiquer en `weak` pour éviter ce problème, et tout ira bien ! + +#### En résumé +- Un objet reste dans la mémoire tant qu'au moins une référence **forte** existe vers cet objet. +- Si deux objets s'auto-référencent avec des références fortes, cela créé un **retain cycle**: mes objets ne peuvent plus être nettoyés de la mémoire. +- le mot réservé `weak` permet de résoudre ce problème: les références dites **faibles** ne comptent pas lorsque le programme détermine si l'objet est encore utile ou pas. +- On déclare un `delegate` en `weak` pour éviter de créer un cycle de rétention et du coup une fuite mémoire +- Les propriétés avec des IBOutlets sont déclarées en `weak`: en général l'objet aura déjà une référence interne et en rajouter une autre ne servira pas.