Liste d'adjacence, matrice d'adjacence

Un graphe fini peut être représenté par une matrice d'adjacence ou par une liste d'adjacence.

Une matrice d'adjacence est une matrice \(n\) lignes, \(n\) colonnes, si le graphe contient \(n\) sommets. Les sommets sont numérotés de \(0\) à \(n-1\). À l'intersection de la ligne \(i\) et de la colonne \(j\), on écrit un \(1\) si \(j\) est un successeur de \(i\) et un \(0\) sinon.

Une liste d'adjacence est constituée de listes regroupées dans un tableau ou un dictionnaire. Chacune des listes contient les successeurs (ou les prédécesseurs) d'un sommet.

Un exemple de graphe

graphe orienté

La matrice d'adjacence est :

\[ \left( \begin{array}{cccccc} 0 & 1 & 1 & 0 & 0 & 0 \\ 1 & 0 & 1 & 1 & 0 & 0 \\ 1 & 1 & 0 & 1 & 0 & 0 \\ 0 & 1 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 & 1 & 0 \\ \end{array} \right) \]

Cette matrice est implémentée par la liste de listes :

[[0, 1, 1, 0, 0, 0], [1, 0, 1, 1, 0, 0], [1, 1, 0, 1, 0, 0], [0, 1, 1, 0, 0, 0], [0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1, 0]]

Liste d'adjacence sous forme de dictionnaire : les clés du dictionnaire sont les numéros des sommets. Pour chaque clé, la valeur associée est la liste des successeurs du sommet représenté par la clé.

{0: [1, 2], 1: [0, 2, 3], 2: [0, 1, 3], 3: [1, 2], 4: [5], 5: [4]}

Liste d'adjacence sous forme de liste : les indices de la liste sont les numéros des sommets. Pour chaque indice, la valeur associée est la liste des successeurs du sommet représenté par l'indice.

[[1, 2], [0, 2, 3], [0, 1, 3], [1, 2], [5], [4]]

I) Passage matrice vers dictionnaire

Compléter la fonction matrice_vers_dict qui prend en paramètre une matrice d'adjacence et renvoie une liste d'adjacence sous forme de dictionnaire.

Exemples
🐍 Console Python
>>> m = [[0, 1, 1, 0], [1, 0, 1, 1], [1, 1, 0, 1], [0, 1, 1, 0]]
>>> matrice_vers_dict(m)
{0: [1, 2], 1: [0, 2, 3], 2: [0, 1, 3], 3: [1, 2]}

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:pbv(4i2edm3;s7= 1j}o5w_lSnatf)Oh]{R6qcrg.[éyPku8/050k0j0D0C0h0z0o0r0N0z0C0o0o0q010D0h0c010406050o0W0l0l0C0O0T040A0v0z0W0?0v0B0r020C0l0c0n0r0K0j100O0M0W0j0o050Y0}0 11130{0c041r1y051B0Y1B1D1y0{0k0h0e0+0-0/0;0H0h0P0H0z1R0H0D0_050$0d0z0j1M0.0:011Q1S1U1S0D1!1$1Y0D0d0v0k131Z0O1z0D0H0+160o0c0C0B0;0i011(1O010E0(0j0B1e0j1Y23252a1*2d1$2g0l2i040a0r0U0O0v0c0v0o0h191b0!210O0O0j0N2D1r2k0B1z0Y1 2P0D1}1|1~0k2m0;1U0B2f2A1Y1J1L0,1)2Z0h2#0B1_1K1Y0c2I1z2N2P2`0|241b2+2b2:0O100z0_0s2M2~0`2}2l301*32340_0i38253a2N2Y013f0C35040m3j2O0{3m3d0;3p3r0g3u3l2~3n3A0_0w3D3w3F3y3o0v333q0_0L3K3b2 1N3e3P3g040p3U3x3X3z3Z3R040X3D1A2^1r2)2S0k2W3n0N1_2s0Z1K1z2@0j2_393/3{0!433c3)010V0_0!0E3/3(2,010x0_0r4g3M4a0B0E0_102T0h0N0j0y0e0j0O0o0y1J2K4n494i0^040f4G3W4i0B4s0C4u4w4M3n4J0F0b3K0r4!4m4h314d3D4$4o4i0v0_0q4*3V4V0_0J0u4Z4#4=3N4c040E3P4;4%3e0_0h524,2b0v4k042.574H310d0_0O250P0j4U3N4J4L1s44533z5h042p5n4a5p5y4O4Q4S5m5r3k4|5z0_0F4X4`4#4{5t3o4)5G2O5I4I0_0R5B4(5c5Z1*4J0I5e4N594/5*4?040R5)5T0`5O5O5V2b4~500O5.3N4P040t5 4a5a550B644O5v5j0B5l5$0;5A5?5`3e5v5x6i5Q6h2|5Q614t0O4v5F6q585%5X6f5R5#6n6y6g0_0I5L4Y5?065^6N4+5f1*4~0h4f5?6P5+54046t6v6B4J5Y6E6Q3z556$6H6(6x6*6C636)6X6G045=2`6W3n4.040q4:6V6j0;0l0h366-046K2`6M6O7e746C0k796/5s6F6C566@5/6{7l6;6 0Q6B610C0c0c2f7i7p5o0_5q6:6^6=790F5N6}4}5i0#0W0O68736r5S7c1r46423:7!0Y3?1r0D3^7)2U2Q1^1`2S0C1#7$3?1x487I2I0l0y0E0C0V4x0H0m0_1j1l1n1p0r7b441E3a1y0G1b7A180r0C0W0/0h0r180(0h0o4A0r1$0*0k0S2d0B2C0h1a0*2f211f0O0S0H2f2B1a0r0!0*1U0o0D890#8P4v2D2g0h2I0o7v8d1I1K3n1,1T1V1X7`3n2o2f2h0_2u0A0N6u0c0D2v0T1 1a3/417`2{447Z8;7O044e6B5b4m7D4p4r6Z4R6u4w4y4A4C4E0D797G7s7I6s7K8b3k7d4!7g4~2I0D7R7T6|7g4J0J7w6,9h5W7a692b6%9N040V9S6R0_5}9Y6+9W9$01665c9I397N4p6b5k6w9v5/9u5H6r6l2f9t9V0l7j9V7o7H7q5L9)6S6U9J7V6Za19P5!a39@7E6`7k9`7m619Xae6z6`9)6 719)7678ap6_7r3k9/4i5|517Uam9Oaa7m9+5daG6;0B9;6d9?al6;6pah9:0_6ma4ai9_5Uaba0ay014W0F4_6L7Y3|2P953=3 0{7%0#0%0)04.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:pbv(4i2edm3;s7= 1j}o5w_lSnatf)Oh]{R6qcrg.[éyPku8/050k0j0D0C0h0z0o0r0N0z0C0o0o0q010D0h0c010406050o0W0l0l0C0O0T040A0v0z0W0?0v0B0r020C0l0c0n0r0K0j100O0M0W0j0o050Y0}0 11130{0c041r1y051B0Y1B1D1y0{0k0h0e0+0-0/0;0H0h0P0H0z1R0H0D0_050$0d0z0j1M0.0:011Q1S1U1S0D1!1$1Y0D0d0v0k131Z0O1z0D0H0+160o0c0C0B0;0i011(1O010E0(0j0B1e0j1Y23252a1*2d1$2g0l2i040a0r0U0O0v0c0v0o0h191b0!210O0O0j0N2D1r2k0B1z0Y1 2P0D1}1|1~0k2m0;1U0B2f2A1Y1J1L0,1)2Z0h2#0B1_1K1Y0c2I1z2N2P2`0|241b2+2b2:0O100z0_0s2M2~0`2}2l301*32340_0i38253a2N2Y013f0C35040m3j2O0{3m3d0;3p3r0g3u3l2~3n3A0_0w3D3w3F3y3o0v333q0_0L3K3b2 1N3e3P3g040p3U3x3X3z3Z3R040X3D1A2^1r2)2S0k2W3n0N1_2s0Z1K1z2@0j2_393/3{0!433c3)010V0_0!0E3/3(2,010x0_0r4g3M4a0B0E0_102T0h0N0j0y0e0j0O0o0y1J2K4n494i0^040f4G3W4i0B4s0C4u4w4M3n4J0F0b3K0r4!4m4h314d3D4$4o4i0v0_0q4*3V4V0_0J0u4Z4#4=3N4c040E3P4;4%3e0_0h524,2b0v4k042.574H310d0_0O250P0j4U3N4J4L1s44533z5h042p5n4a5p5y4O4Q4S5m5r3k4|5z0_0F4X4`4#4{5t3o4)5G2O5I4I0_0R5B4(5c5Z1*4J0I5e4N594/5*4?040R5)5T0`5O5O5V2b4~500O5.3N4P040t5 4a5a550B644O5v5j0B5l5$0;5A5?5`3e5v5x6i5Q6h2|5Q614t0O4v5F6q585%5X6f5R5#6n6y6g0_0I5L4Y5?065^6N4+5f1*4~0h4f5?6P5+54046t6v6B4J5Y6E6Q3z556$6H6(6x6*6C636)6X6G045=2`6W3n4.040q4:6V6j0;0l0h366-046K2`6M6O7e746C0k796/5s6F6C566@5/6{7l6;6 0Q6B610C0c0c2f7i7p5o0_5q6:6^6=790F5N6}4}5i0#0W0O68736r5S7c1r46423:7!0Y3?1r0D3^7)2U2Q1^1`2S0C1#7$3?1x487I2I0l0y0E0C0V4x0H0m0_1j1l1n1p0r7b441E3a1y0G1b7A180r0C0W0/0h0r180(0h0o4A0r1$0*0k0S2d0B2C0h1a0*2f211f0O0S0H2f2B1a0r0!0*1U0o0D890#8P4v2D2g0h2I0o7v8d1I1K3n1,1T1V1X7`3n2o2f2h0_2u0A0N6u0c0D2v0T1 1a3/417`2{447Z8;7O044e6B5b4m7D4p4r6Z4R6u4w4y4A4C4E0D797G7s7I6s7K8b3k7d4!7g4~2I0D7R7T6|7g4J0J7w6,9h5W7a692b6%9N040V9S6R0_5}9Y6+9W9$01665c9I397N4p6b5k6w9v5/9u5H6r6l2f9t9V0l7j9V7o7H7q5L9)6S6U9J7V6Za19P5!a39@7E6`7k9`7m619Xae6z6`9)6 719)7678ap6_7r3k9/4i5|517Uam9Oaa7m9+5daG6;0B9;6d9?al6;6pah9:0_6ma4ai9_5Uaba0ay014W0F4_6L7Y3|2P953=3 0{7%0#0%0)04.
II) Passage matrice vers liste

En s'inspirant de la question précédente, compléter la fonction matrice_vers_liste qui prend en paramètre une matrice d'adjacence et renvoie une liste d'adjacence sous forme de liste.

Exemples
🐍 Console Python
>>> m = [[0, 1, 1, 0], [1, 0, 1, 1], [1, 1, 0, 1], [0, 1, 1, 0]]
>>> matrice_vers_liste(m)
[[1, 2], [0, 2, 3], [0, 1, 3], [1, 2]]

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:pbv(4i2edm3;s7= 1jo5w_lSnatf)Oh]R6qcrg.[éyPku8/050k0j0C0B0h0y0o0r0L0y0B0o0o0q010C0h0c010406050o0U0l0l0B0M0R040z0u0y0U0;0u0A0r020B0l0c0n0r0I0j0~0M0K0U0j0o050W0{0}0 110_0c041p1w051z0W1z1B1w0_0k0h0e0)0+0-0/0G0h0N0G0y1P0G0C0@050!0d0y0j1K0,0.011O1Q1S1Q0C1Y1!1W0C0d0u0k111X0M1x0C0G0)140o0c0B0A0/0i011$1M010D0$0j0A1c0j1W2123281(2b1!2e0l2g040a0r0S0M0u0c0u0o0h17190Y1 0M0M0j0L2B1p2i0A1x0W1}2N0C1{1`1|0k2k0/1S0A2d2y1W1H1J0*1%2X0h2Z0A1@1I1W0c2G1x2L2N2^0`22192)292.0M0~0y0@0s2K2|0^2{2j2~1(30320@0i3623382L2W013d0B33040m3h2M0_3k3b0/3n3p0g3s3j2|3l3y0@0v3B3u3D3w3m0u313o0@0J3I392}1L3c3N3e040p3S3v3V3x3X3P040V3B1y2?1p2%2Q0k2U3l0L1@2q0X1I1x2=0j2@373-3_0Y413a3%010T0@0Y0D3-3$2*010w0@0r4e3K480A0D0@0~2R0h0L0j0x0e0j0M0o0x1S0o0C0j4l474g0?040f4G3U4g0A4q0B4s4u4M3l4J0E0b3I0r4!4k4f2 0@4C4E3B4$4m4g0u0@0q4,3T4V0@0P0H4Z4#4@3L4a040D3N4?4%3c0@0h544.290u4i042,594H2 0d0@0M230N4F1q42550/4J4L5p3i4~4n5j042n4U3L5t5C4n4Q4S5o2`5r014W4X4|4#4}5L4P5A0h4D5J5q5a1(4:040O5F4O0@0B0c0c2d0k5(295t4`0E5P5Q4-5h1(50520M5g4N4(040t603l5c570A653L0A5z5l0A5n5:1(5E5v2M5x4O5z5B6k46616i0@5u5K5Z3x5H0M4t5X5w5L4J0P6h6y5e6H5M0@0H0E5O6q065_6S5`6s0/500h4d6q6U3E6z6B6K6F6K5T586q6m5;6M6G6.5S0@646?6x6L044{6!6/5!4;4=6 5L0l0h346)0@4Y6Q6T7d6#6b4)5V4+6`5{5s4_6+57796}6K5#5%7k6V3m5*5,5.7q6v5Y7l7x637q5@7c5R6{502G0C0U0M69746{5T4*6C3t1p44403.7!0W3;1p0C3?7)2S2O1?1^2Q0B1Z7$3;1v6r3l2G0l0x0D0B0T4v0G0m0@1h1j1l1n0r7b2`1C381w0F195-160r0B0U0-0h0r160$5V4y0r1!0(0k0Q2b0A2A0h180(2d1 1d0M0Q0G2d2z180r0Y0(7V0o7u1F3|2(481*1R1T1V7`3L2m2d2f0@2s0z0L6A0c0C2t0R1}183-3 6r2_427Z8$48504c6K5d4k7v3E4p044r6A4u4w4y4A7V7B7o997H8b376R7K7E7M0Z7P7R2^7f486F6=6w7E5T0T6a900@5~9D5)049C7S7E675e9t379v6n5k5m7W8 4I6u6+6o2d9h967g9j9%9w7n9*9I6-9z7w4J6N7I9u706W576Z9^6@9)9:4^049y7D7w6,7q0Ha36D7T0@9Ka05D6M9H5b72ah1(76789-6:7r9L7w5}53ar6$6Jav3L9N5fay5y9T6f9V9_6|7Caa9A9!9PaK9;9Yao569 a4a16O6~2^0_0W8~7#2N7^3:0Z0#0%04.
III) Passage dictionnaire vers matrice

Compléter la fonction dict_vers_matrice qui prend en paramètre une liste d'adjacence sous forme de dictionnaire et renvoie la matrice d'adjacence.

Exemples
🐍 Console Python
>>> dico = {0: [1, 2], 1: [0, 2, 3], 2: [0, 1, 3], 3: [1, 2]}
>>> dict_vers_matrice(dico)
[[0, 1, 1, 0], [1, 0, 1, 1], [1, 1, 0, 1], [0, 1, 1, 0]]
Aide

La deuxième ligne du corps de la fonction, matrice = ..., sert à initialiser une matrice remplie de 0.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:pbv(40i2edm3s7= 1o5w_lSnatf)h]6crg*[yPku/050l0k0B0A0i0x0o0r0H0x0A0o0o0q010B0i0c010406050o0P0m0m0A0I0M040y0t0x0P0+0t0z050Q0=0@0_0{0:0c04141b051e0Q1e1g1b0:0l0i0e0Z0#0%0)0E0i0J0E0x1u0E0B0.050U0d0x0k1p0$0(011t1v1x1v0B1D1F1B0B0d0t0l0{1C0I1c0B0E0Z0~0o0c0A0z0)0j011H1r010C0W0k0z0A0m0k1B1)1+1:1J1?1F1_1{0.0a0r0N0I0t0c0t0o0i110z0r0S1%0I0I0k0H2g141~0z1c0Q1#2t0B1Z1Y1!0l200)1x0z1^2d1B1m1o0!1I2D0i2F0z1V1n1B0c2m1c2r2t2X0;1*2h2L1;2Q0I0^0x0.0s2q2#0/2!1 2%1J2)2+0.0j2/1+2;2r2C012_0A2,040n2}2s0:302@0)33350g382 2#313e0.0u3h3a3j3c320t2*340.0G3o2=2$1q2^3t2`040p3h1d2V142J2w0l2A310H1V1|1c3L1f3J2Z152:053Q0S2W3q3B0)0O0.0S0C3H3b3)010v0.0r3/3(2M320C3,0i2o0w0e0k0I0o0w0^2x3 0k3_2?3;0-040f4b3A3{0z3~2o0i121_0i2m4h314e0D0b3o0r4y3^3:4j0.133Y2~4A3`1;0t0.0q3h4H4c4j0d0.234s3r4e4g4F2s3z3k4l2g4p4r4Y3%4P1;4u4x4z4!3r4k04470I494N4;3;4K044M4*4O4i4-0.0L4U3;4?4E2X52314~0K4{4B5404564*4|3{0m0i0.0h573{4e0F5g4I1J3+040C3t5w4,2^0.0i5D531J0t3?042O5I3k4R040I1+0J4a5l5h1J4W5s2(4D5#5Z0.0D5v4*064z5c3r5z5B0I5P4=0.0o0t0@0T5^4}5M5O515m5$041m4m4o0V4)2Z5Y0)4e4w5-5/5/645y0.5?5 4C040=0H0H0k0%0k0P5@636d015L5G5a2:5:584$4n0z4(5W6c5x6e555(3d5`5|1{0B6R015u6g2X5.6i6%6k6S4@0A486t6X4e5k6N5E6*5{5}6W5X6O6Y0.0F6;3Z6A4?6r6t6v6x6/6~6o4J4L7a1J5o2-4/4y6)015z2m0B6x6E4G7j4?4^4`5-143#0k2t2U7y3K1n3M2w2y2u1U1W2w0A1E7B0Q3L0:7O0T0V0X04.
IV) Passage liste vers matrice

En s'inspirant de la question précédente, compléter la fonction liste_vers_matrice qui prend en paramètre une liste d'adjacence sous forme de liste et renvoie la matrice d'adjacence.

Exemples
🐍 Console Python
>>> liste = [[1, 2], [0, 2, 3], [0, 1, 3], [1, 2]]
>>> liste_vers_matrice(liste)
[[0, 1, 1, 0], [1, 0, 1, 1], [1, 1, 0, 1], [0, 1, 1, 0]]

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013:p(40ed3; 1}o5_An)Bh]6,qcG[yCuvi2+DxmÀs7=wlSatfO{Rrg.*éPkbè/050h0g0U0T0G0R0N0k0z0R0T0N0N0P010U0G0c010406050N0E0L0L0T0Z0C040S0n0R0E100n0r0k020T0L0c0j0k0Y0g1a0Z0y0E0g0N050,17191b1d150c041B1I051L0,1L1N1I150h0G0F0^0`0|0~0u0G0!0u0R1#0u0U13050:0*0R0g1W0{0}011!1$1(1$0U1.1:1,0U0*0n0h1d1-0Z1J0U0u0^1g0N0c0T0r0~0H011=1Y010V0=0g0r1o0g1,2d2f2k1@2n1:2q0L2s040a0k0(0Z0n0c0n0N0G1j1l0.2b0Z0Z0g0z2N1B2u0r1J0,292Z0U2726280h2w0~1(0r2p2K1,1T1V0_1?2-0G2/0r231U1,0c2S1J2X2Z34162e1l2^2l2}0Z1a0R130l2W3814372v3a1@3c3e130H3i2f3k2X2,013p0T3f040i3t2Y153w3n0~3z3B0e3E3v383x3K130o3N3G3P3I3y0n3d3A130w3U3l391X3o3Z3q040O3N1K321B2?2$0h2*3x0z232C0-1U1J310g333j3;3}0.453m3+0~0)130.0V3;3H4c010Q130k4i3W4k0r0V131(0N0U0g0p0F0g0Z0N0p1a2%0G0z0g4p4b2_0112040d4K3*4M0r4u0G4w4J1C464j4M4O0s0b3U0k4+4o4#3b130r3N4-4q4M0n130P4=3)3Q0*4u2p4R3x4O4Q4Z3u4}3X4U044v4x523X4%4*4,584r134F0Z4H4Y344?4L2l4_044{562Y5r4S2l4O0B5e5k044;5x045z3x5u0$4|4.1@5C5E4M0L0G130f5S5B130v5O4@2l4e040V3Z5$5s3o130G5-5A1@0n4m042{5=4~130Z2f0!5p4!5%5Q1355365P3J4:5Y65040s5#5I064,5K3X5)5+0Z5|59130N0n190/6p4k5^5:5H5q5j4T4 045 0r616c0~546J3y6b5I6C5Z6e4)6h6j6j6Q1@6m5,5I6k5F170z4I0|0g0E6o6#6X0~6y5`6A3j6$4T4V4X6M5R6P696N046s6u0U6}5!6T346i6V7b6:715m5o76045D6 646a726t2B757k5.6K5!7j687l716(6*0N6,6.7w7s4N5!6w4^4`7I2l5U3g5h4+7d5)2S0U6-6@3u6_4/047f4I3(0,48443=7*0,3^1B0U3`7/2(2!22242$0T1/7,3^1H4a5?0~2S0L0p0V0T0)4y0u0i131t1v1x1z0k78461O3k1I0J2f0@1:0^0{0k0h000E1l0!5 0c0u1;2S310%7B0r0U0%0k2e0Z0k8w8t4H2N2q0G2S8t1k0U0k1:0@737p0@2/0k6s8H8K8s0r180%2H8I0N0x0k1k2b6u0r4I8,8M8.0L8:0n4x8M8Z8)7o0/0@0T0F2f8X2P2J0E0F0n8T8N104v4B8Y8g5+8|2N0@2P0R000g0K4B0z5o0#1K8l040(1b0k9y1u0c1:6T1R402@4k1_1%1)1+803x2y2p2r132E0S0z5n0c8X0(0C291k3;438035467)9X6q040A7L5@7K6/704O0X6M0N2i04010q019~7t048i7X7d6~7E8101a613010tab7rak4O0xacala7010Jaqaj535!aua17xama8apav4Oaf5yah137v637FaHa9aAaRas13aE6B70aT0DaV57a2aYavaTaz7h0vaZ6^7da$a(aNa*aeaKaPa5axaJaraC04a:a,axa.aF7FaLa|7ia~anaa7ha;aga#a a^9`4k4O0v0m3U3V7F5)4g6M5_4ob1594t5G184B9362a)7x6Lbz5F0!7h4(7P7Y5/bC2B2H1Ab8ak5u5wa!bI130Xbq6U5i705a7Wa_7xbYav7N045Xb)7Q706Z7Da=b+6r987qb!7F6=5{bW3Q13bMbK4$13aM147bb_7xb,bDbU7haQbH7F5a8#6vca6R6gc2bXa0cvc75GbP6Wb~cAc63Xb:cF5Fb-5J7d5u0Ib;5V043hb^bQ4d5~0/7VavcibT2K7%9_7+2Z7~1M040W1l0n0*102p8X8q1T2U0G1k8S8U059_0XaU0b0k0f8@ao01d30ld6a%d30Hd6azd30ib(c(8k7 0M8~108M0h0E8Pc`c|0;8U0.8%8/bU8t1;cq0U8?4o9_90bEbV9_8@8_0Z0%0z0E0c0+8U962}0L9u8gdE9a4A0z8hby9P2?3x9T1{1*303?366Pc(cDd#avcHcy5fb$6M5a9c1:6-7hcdcU710_bGb.bt136nbb67aWcze9bgcZ13e27CbNd{5_c5d}cJcjc$cs9 049Dex7m2M1ubVaBd~4P0sb(791Bdk9=3@41157-0/0;0?04.