Aller au contenu

Chapitre 5.4 - Fusions⚓︎

On considère dans ce sujet les trois fichiers csv décrits ci-dessous :

countries.csv contient des informations décrivant les pays :

  • CountryCode : le code du pays (texte, clé primaire)

  • Name : le nom du pays (texte)

  • Continent : le continent du pays (texte)

  • SurfaceArea : la surface du pays (nombre décimal)

  • Population : la population du pays (entier)

  • Capital : la capitale du pays (nombre entier correspondant à un ID dans le fichier cities.csv)

  • d'autres descripteurs qui ne nous intéressent pas ici...

languages.csv contient les informations sur les langues parlées dans chaque pays :

  • CountryCode : le code du pays (texte)

  • Language : la langue concernée par cette entrée (texte)

  • IsOfficial : cette langue est-elle officielle dans ce pays ? (texte, T pour True, F pour False)

  • Percentage : le pourcentage de locuteurs dans le pays (nombre décimal)

cities.csv contient des informations décrivant des villes :

  • ID : l'identifiant de la ville (entier)

  • Name : le nom de la ville (texte)

  • code : le code du pays dans lequel est situé la ville (texte)

  • District : la région d'appartenance de la ville (texte)

  • Population : la population de la ville (entier)

Import réalisés !

Dans toute la suite du TP, les listes pays, langues et villes contiennent les dictionnaires correspondant aux imports de ces différents fichiers.

Les données sont correctement typées (en particulier les valeurs isOfficial de la liste langues qui sont des booléens).

Python
pays = [
    {"CountryCode": "ABW", "Name": "Aruba", "Continent": "North America", ...},
    {"CountryCode": "AFG", "Name": "Afghanistan", "Continent": "Asia", ...},
    ...
]

langues = [
    {"CountryCode" : "ABW", "Language": "Dutch", "IsOfficial": True, "Percentage": 5.3},
    {"CountryCode" : "ABW", "Language": "English", "IsOfficial": False, "Percentage": 9.5},
    ...
]

villes = [
    {"ID": 1, "Name": "Kabul", "code": "AFG",, "District": "Kabol", "Population": 1780000},
    {"ID": 2, "Name": "Qandahar", "code": "AFG",, "District": "Qandahar", "Population": 237500},
    ...
]

Langues parlées dans chaque pays⚓︎

Quelles sont les langues parlées en Haïti ? Pour le savoir il faut :

  • parcourir la liste pays jusqu'à trouver le code de Haïti (orthographié Haiti dans la liste pays),

  • parcourir la liste langues et en extraire les valeurs correspondant à ce code.

Langues parlées en Haïti

Compléter le code ci-dessous permettant de déterminer les langues parlées en Haïti.

###(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 : 5/5

.128013og)rh!6avck4p9Rqb1+]_tP7(L5w3 [;8lS/em=niN:y-2éêuHd.Cfs0050Z0L0w0i0P0I0%0E0k0I0i0%0%0N010w0P0n010406050%0X0M0M0i0e0S040J0b0I0X0|0b0O0E020i0M0n0G0E0p0L160e0q0X0L0%050K13151719110n04051E1x1H0K1E110Z0P0j0;0?0^0`0?0O0c0X0i0c0L0T0n0S0w0f1g0E0f0P0c0f0I1-0f0w0 050,0r0I0L1Q0@0_011,1.1:1.0w1_1{1@0w0e1F1(0;1c0%0n0i0O0`0U011}1S010$0.0L0O1k0L1@2f2h2m1 2p1{2s0M2u040a0E0x0e0b0n0b0%0P1f1h0*2d0e0e0L0k2P1x2w0O1F0K1(2#292b2a1^0Z2y1T0P0O2r2M1@1N1P0=1~2/2;0O0b2^1@0n2U1F2Z2#35122g1h2`2n2~0e160I1@0i1+2U0$0`030v0v0k2 0L1:2}0b0T0s3w0 0E0s1x0i363910382x3b1 3d3f3h3j0L3l013n3p3r3t2=3w0T2k040E0U3C3E2h3G2Z2.013L0i3g1F3i0f3k3m3o3q0*3V2~3X0D3z0D3%2Y3F113+3J0`3.3:053=3@3R3_3U2:3W3x0m3z0m421y443H3a1R3K0b3e3/3N3?3P3^3T3{4h3}3x0B3z0B4n3545393,494x4d3S3`3s4D3v3x0h3z0h4J4p464s484u3M3;3O3Q4R4g3u3X0y3z0y4!3)4L3I4%3-4)4w4+4y4-4f4C4:3x0H3z0H4^2!4`4r2{4}4v4a4c4z4e4B4T550T0o3z0o5a3*4M475f4*4b4,4A4S3|4V3w0(0 0s0(5s1I331x2^2(0Z2b2-5v4S2@1O1F320L343F433)054S5Z2x0P0Z0`3o2Z3X0s3N5+5-5l5C5:2l2C0L5@5B4U5`2#3D4q4N0 0P0v0f0-0|5#2!0E645v0b0 0N6c3!6f4|0M0P0 5I4o4_6k645?015.393X3Z5y6w535m4i3Y5{2t5~4/6G6B0K634$5e0l0 0C1,1{6k6e6Q3c0 2g0S1w6s2!6m5e0~040F6u6Z3K66686a0P6:5u4|6-0u6/6)5)5d2n0%3Z021t0b0w0G0Q2t760X780G6`4{6,0 0u6X6+2n6h040g6j706Y6{5e740 7d7f0Y6^7z797h721 6-0R6k11706v5,6x0v5/3x3 4+6D5^607S6I2D6K546G7T3%0E7*7u7i6!0467692O6_7t7n1 7p0t7s357,7G0`6o5G7K7F0E7V7R0T4k7U7O6E5_4j7Z5}7P5 5n893%7L373+866z4F5=8b7W5n4G0E5|7#6F4E0T4G627165044S7m6;0`7p7|3F7~8G6$6(8n7v2n6-6 8T7-6=7/6@7=845v6}8X5!8K017x047D0G0#0b0X0O290S8?0*8;8(6|7k837M8o8t874X8a8z8d0T4X8x6J8h6L8B978l848p2h4;8s997X0T4=9d7!9f7$8B4=8E7^480 1U1W1v8$6b7@8-8M8J8U7H0 0F7l708m8,4M9l0O3X57989v8A5D579t8g8c9q9Y428-6S040$4u9L8Z9B042r290L0L9?7 010b0C660O9~8G9D1u8S9T9@017I928Y1h9V3X5p9Z9*5n5p9(9pam1@6O3!7+9A019/0P0$a55v0O0 9`2U9}939M0`8W8 7w7577798?8^8`8|0L8~aHab6}aA4|8M8N3)8PaB0 8IaW9 ad9R9k958q5E9o9!9a5H8fap6Ga`8E7+b0a(4|aC04a79F7;9Haf3,7p0!aL7.0i0n0n2r0Zbe9N040zbl9^aE9|bpac0 0dae5!0K5(5K5Y5M5V1x0w5PbF2+2$0i1`bC0K5N1D8F5v2U0M0v0$0i0l0L687T1p1r1t1v0E7J7M1K3G1E0A3i0r8@0=1|5%3r3,a71Y1!1$1+1;231=2vaIaw6T6VaG37bz3r3!0Z2h0:0?0E2U0k0f0L0eck1|0Z0X2d2R0Z007B7=0E2L0X2T6a0E0i0X0^0P0E0W9{ci1q0n0?0k0V1|2g0e0E8^6e4Sb{2h1Wb}1#0Sc0221;1?bR4|9/9;0e6ucb0*3!0i0k3q1l1Y0O0V0E2R0I002:0%290X2W0P1*b_2R5vb|1Zc$c(1/c*c4ab9/0r2UbXc;5(0E1tcH2:0wcm2J1l0w0Echb=d61{b*1I3G2^cY1V1Xde1$1(1*21dh24dj9 2A2r2t0 0x1%1)a47M5X713(6*bA945@5/0U3yak8u3Wd:5;aoa^60d^2l515A9g3vd}9z9.0 c/aZ5eb4brc98Oava1a3e87.8Rbta.4Ka:d.6zd:6B3i7V8id@6Hd`alev2k5z5keu3}eqar3Db0avaxaz9Ic5ea8_aFek9Obt8/8;7b2DaVba8)91eMaba#eh1 eUaO0Gcw0|eYaaa-0 b+ema,85a;9md:7(es8teDe20T3 exd?eEf3d~4Qeyf77(asb1au8-b4a+7}ee6ie)bqePbse_e!6.eTaN7eaP8@eP8{3re:5$8-aYa/e_ahd:8ke a|f74kf5f13Y88f95j4.9wf28kfeffb26R0 dm0LdofGcabA1K5LbO5V7L0*0,0.0%04.

Le descripteur CountryCode permet donc de faire le lien entre les deux listes pays et langues.

Utilisons cette relation afin de déterminer les langues parlées dans un pays quelconque.

Langues parlées dans un pays

On demande d'écrire deux fonctions :

  • code_pays prend en argument la liste des pays ainsi que le nom d'un pays et renvoie son code ;

  • langues_parlees prend en argument les listes des données des pays et celle des langues (arguments pays et langues) ainsi que le nom d'un pays (nom) et renvoie la liste des noms des langues parlées dans ce pays.

Exemples

Python Console Session
>>> code_pays(pays, "Haiti")
"HTI"
>>> langues_parlees(pays, langues, "Haiti")
['French', 'Haiti Creole']

###(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 : 5/5

.128013àog)rh6ajvôù,ck4Ep9Rqb1]_tîPïV7(L5w3 [;O8lS/em=niN:y-2éuxHd.Cfs0050+0T0A0i0X0Q0/0L0o0Q0i0/0/0V010A0X0s010406050/0(0U0U0i0f0!040R0c0Q0(140c0W0L020i0U0s0N0L0u0T1e0f0v0(0T0/050S1b1d1f1h190s04051M1F1P0S1M190+0X0k0|0~10120~0W0d0(0i0d0T0#0s0!0A0g1o0L0g0X0d0g0Q1^0g0A17050@0w0Q0T1Y0 11011@1_1{1_0A21231 0A0f1N1:0|1k0/0s0i0W120$01251!010.0_0T0W1s0T1 2n2p2u272x232A0U2C040a0L0C0f0c0s0c0/0X1n1p0=2l0f0f0T0o2X1F2E0W1N0S1:2-2h2j2i200+2G1#0X0W2z2U1 1V1X0}262`2|0W0c301 0s2$1N2+2-3d1a2o1p322v360f1e0Q1 0i1?2$0.12030z0z0o370T1{350c0#0q0#0x170L0x1F0i3e3h183g2F3j273l3n3p3r0T3t013v3x3z3B2}3E0#2s040L0$3L3N2p3P2+2_013U0i3o1N3q0g3s3u3w3y0=3(363*0K3I0K3:2*3O193@3S123`3|053~403!423%2{3)3F0q3I0q4b1G4d3Q3i1Z3T0c3m3{3W3 3Y413$444q463F0I3I0I4w3d4e3h3^4i4G4m3#433A4M3D3F0h3I0h4S4y4f4B4h4D3V3}3X3Z4!4p3C3*0F3I0F4-3=4U3R4:3_4=4F4@4H4_4o4L4|3F0P3I0P512,534A33564E4j4l4I4n4K4$5e0#0t3I0t5j3?4V4g5o4?4k4^4J4#454(3G0:170x0:5B5l4W575q5I5t5K4%3*0x3H045$5S4z5U5p4Y5s4`5d4r3G3,0x3/0S3M4c525+5E4X594Z5c5v5=0x485(4a5`3;5k5~55605H5a5J4{654t5(4v6a5|6c4/5n6f5r5b5u5L5#4P5(4R6o4x5}6r3k5V5.6v5Z5w0x4*5(4,6C4T6d6s6H615/636x3F0x4~5(506Q4.5D6e6U6g626w5!6Z5g5(5i6(6E6*6T5-6V6J6j4N3G5y5(5A6^2,1Q3b1F302:0+2j2^5E4#2 1W1N3a0T3c3O6p1N4#7m2F0X0+123w2+5#3W7t7v6/6L2t2K0T7B6K651 6o6F270p170=0.7o0L6S3k0.174#0z2o0!1E6D767M1216040G7o7U3T177!7$3f7)017+0n7S7/4h17360U7.7^7+0e0Z7o197%7r1p7A017w3h3*3,5H8c6X6:3+7E2B7H6 5M8h7L6`2v0J3I0L8y828u270/0+17021B0c0A0N8G0(8I8K8H8J1x0W0k0c0X24232l2Z0+02030K0t0N0(1p7=8L8N8-8J8/0N878A7s7u8d0z7x3F678i8_8k5w480L7F8p5;708~6a8y8z7^7O040.4D7|7^0W172z2h0T0T9i8B120c8w042{9q546s7;0i7#8@5m2v7+8689887@4V8j8{8f4s7z907C5=4t948o8`7I706l3:9b9$7T9d170X7R899(9r3_9l0W9n9p897}7_170M9D3^0/3,8;0Y2B8;9}5E7+0y9x9E270c170V0Va94W7 0c819^83179H6Ral9L9R8|0#6z8 9664704P9V2Lax6Yau7K3M9%aI9.9y2v9e2$0A0(0f0Wag5 9;9?a5557+9|aqaL8Ca08P0N0-0c8*2h0!a+0=a4a#aa7*17a89I9}9Mat6Naw9X8q3*4*aB7Gb1975Ma 6a9J7n3@a}9O0#6#b0915=4~b5aD8lbi9a9b9_aN0^0/9@3daKa@3_2M0E3{1C0r2#9ha?3^7+7-bJ5E9 8Fa)0H2480948#8%0N0i0s2o0f0i0B0A0L2o0{0+2p0{0~0L1{0/0A0Ta=9Ka$a^040e8?bJbf2p3*6=bj9S705gbnb7ay5Mc4bba|asbg72c59Y5M5yc9bk70cicec0cgc26Z5O4@9Mck5#5Ocnc65M5QaG8a3^9e7QaT6e7W041$1(1D7Z1f231DaX5nbLcW3k9A9CbNaY177{9-9_9kcO2pcQ7?bd9/7`cL9z0480cZ2784ao4ycs7Bat5$9Qbo6L3HcCcz6Z5%4b7^9u9$c|128DbQ8M8:a)8;8R8T8Vb;3qb=b@0L0=0{80b,1Dds1%1C0{b#0Q0%dBb-0Wb/247=0L2{1V1B0%b*1f0L0/1=808;d!a)b b`8bct0W5#8h3qcyb26Z2sd9d:5?cGdg9j7X3zc^2vac04afc+d{047Y7=dh9`7,e8c-e7c%cXc)d~7:c`aje884d%c=8^d2bg66d5caaEesd?b85#993Mbc3=5+c1d+6Z9!d.9Rda3G9U95eu8l0x9!br9c9/c-2$1b0Q0@0Aeh9sade$e90Ma`apd(dPd*6yetcocEaAeOe?e;2-aHbs9)9fbIbyc,aV2$bx3Obz3^9t9*aSe3eV17cPdEelaneneDbee:6Za eJd665b4e_cD5#bae}aIbt9*9,f2e49mf5fi04a!e.bOa(dla*a,9=1ga:b^d$ee9Fa_e)e0aee)c-4#fHc 5}d18`d3bifqeP6LbmfueL6!d_aJd`fe04eX0(eZ0ie#fVab170,eb17bZ0s2z0+fHbMfK6ef49ofHfJeobAbP048;0Hc/1)1+b_glbKa_b~a{f+8ecu3Gc4f/e`6;8naCf:65cdeBcfeqgC0xcigFfv6Zcmf?d@gRf_eUb{01aN0?aQfcfDf|f~g0g2e-7n0S7q777l797i1F0A7cg|2?2.0i22g_0S7a1LcH5E2$0U0z0.0i0p0T0z0g671x1z1BdBf)761S3P1Ma+fQ0^ha9m0L0bb;000T0)1y0s8X2Z0*0i0D14b*0f0%0o0%0=9=0n0L1=ga1mdP0o0X0L1m0_0Xbw0fh#2|0L0wa,0}24054#3^fg1*1,1.1?1|2b1}2D9/9e9g0f7.g?3z3-0/b.0L0idqh*2$3yaQ0{hz0Q002{b?0f0(2(0X1=h=3zh@grh_1-0!h|2a1|1~h8559e0w2$hei57q0,0L0r1p3Y0.0?hT8Xit0=f}g)aR1F7q0L0ja,240o240f0l23g6hqh70O1p3q2ZhF0(0{0ii%1mdTb:2bh,iVi)55h^1+iyiA1`iCi0g$buh(f63=f85 bCbE0TbG2Ri4g3b|gegvfLdk8NbS94ajbV8$8(g91fb%b)b+dwiaj0h(b@guflc?17gy3fi6iWib2x2Y240d0%2$h*230{0o0 hU0mb;bTjzb+0/dT2zib0f1(2L9=94i)4DeX2T0W2^hz0iip8*dU7#iMi=0L1Db)dKj(i)j*2Z2x1(2$dWh!ik1=3qiQ2%aPi 3q0A8I3{2WdT0+0(dU0fig0f0{0G2Zb:h.ipiUh?5Ej6h`iz29ja2cjcbAi2f1g=7q0edWiaic8Uie2z8T0!kAi+0%eYe!i/1T790?0^0`04.

Capitales⚓︎

Quelle est la capitale d'Haïti ? Là encore, il faut :

  • parcourir la liste des pays jusqu'à trouver l'entrée correspondant à Haïti,

  • repérer le code de la capitale correspondante,

  • parcourir la liste des villes jusqu'à trouver le code cherché.

Nous allons effectuer ces actions pour chacun des pays présents dans la liste. La capitale étant trouvée, nous ajouterons une nouvelle clé CapitalName au dictionnaire du pays. La valeur associée sera le nom de la capitale obtenu.

Pas de capitale ?

Certains des « pays » listés n'en sont pas vraiment et n'ont donc pas de capitale. C'est par exemple le cas de l'Antarctique.

Lors de l'import des données, on leur a associé la valeur -1 à la clé Capital.

Liens

Quels sont les descripteurs permettant de faire le lien entre les listes pays et villes ?

  • Le descripteur "Capital" de pays et "Name" de villes
  • Le descripteur "Name" de pays et "Name" de villes
  • Le descripteur "Capital" de pays et "ID" de villes
  • Le descripteur "ID" de pays et "Capital" de villes
  • ❌ Le descripteur "Capital" de pays et "Name" de villes
  • ❌ Le descripteur "Name" de pays et "Name" de villes
  • ✅ Le descripteur "Capital" de pays et "ID" de villes
  • ❌ Le descripteur "ID" de pays et "Capital" de villes
Associer les capitales aux pays

Compléter le code ci-dessous afin d'ajouter à chaque dictionnaire correspondant à un pays une nouvelle entrée CapitalName contenant le nom de sa capitale.

On utilisera la chaîne vide "" comme valeur pour les « pays » sans capitale.

Ainsi :

  • le dictionnaire correspondant à la France contiendra un nouveau couple "CapitalName": "Paris",

  • celui de l'Antarctique "CapitalName": "".

###(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 : 5/5

.128013oDg5wrh36a [I;vc8lS/ekm=4p9qniNb1:y-F2+]ut_dTPf7Cs0050S0v0Q0k0E0s0Y0l0q0s0k0Y0Y0y010Q0E0A010406050Y0P0x0x0k0g0J040t0b0s0P0@0b0D050u0~1012140|0A04051k1d1n0u1k0|0S0E0p0,0.0:0=0.0D0d0P0k0d0v0K0A0J0Q0h1b0l0h0E0d0h0s1P0h0Q0`050%0G0s0v1w0/0;011O1Q1S1Q0Q1Y1!1W0Q0g1l1K0,170Y0A0k0D0=0M011$1y010V0)0v0D0k0x0v1W1{1}221(251!282a0`0a0l0U0g0b0A0b0Y0E1a0D0l0#1_0g0g0v0q2v1d2d0D1l0u1K2I1=1@1?1X0S2f1z0E0D272s1W1t1v0-1%2S2U0D0b2Y1W0A2B1l2G2I2/0}1|2w2!232(0g110s1W0k1N2B0V0=030R0R0q2)0v1S2%0b0K0e0K0H0`0l0H1d0k2:2?0{2=2e2^1(2`2|2~300v32013436383a2V3d0K20040l0M3k3m1}3o2G2R013t0k2}1l2 0h313335370#3D2(3F0i3h0i3L2F3n0|3P3r0=3S3U053W3Y3z3!3C2T3E3e0z3h0z3-1e3/3p2@1x3s0b2{3T3v3X3x3Z3B3$3 3(3e0e3h0e452/3:2?3Q3@4f3{3A3#394l3c3e0j3h0j4r473;4a3?4c3u3V3w3y4z3~3b3F0W3h0W4I3N4t3q4L3R4N4e4P4g4R3}4k4U3e0r3h0r4Z2H4#492#4(4d3^3`4h3|4j4B4:0K0B3h0B4^3O4u3=4}4O3_4Q4i4A3%4D3f0Z0`0H0Z5a4`4v4)4 5h525j4C3F0H3g045B5r485t4~4x514S4/403f3H0H3K0u3l3.4!5G5d4w4+4y4.545N0H3*5D3,5S3M4_5W4%5Y5g4,5i4T5%425D445,5U2H1o2-1d2Y2L0S1@2Q5d4A2X1u1l2,0v2.3n5~1l4A6f2e0E0S0=352G5A3v6m6o535k6r0l2j0v6u5y555C3-4K4|0w0`0V4c6h0l5/4|0D0`271=0v0v6M6O230b0f0`2T6W6G2_0`1|0J0Y6h6X1(0_040I6h0|463N5G6t016p2?3F3H5g6|5#6w3e206y296A6}6v5z761W5,0l7h6N6(3s0`0q0k0A2u3T6V6_2H7j5c4%0b0`0y6%7w6P6R0D6T7s2;7k0=6;0m6.7J010Y3H020C0P0b0Q0o0X7o7q0s7S7U7W7N7C236;0O6@7)6l6n7b6q3e5)727;747d0K3*782a6B5^4m7}7f3l7i7v4$6H6#0V7B896)047n7p0%1!8d4{6Y7z7A7t3I6/0=7y040K7/8m1(0x0E5o8x3Q6;6?8q6^7I4u730R7?0K5`7_815M83427 7a7{558P7g877i8s3R7E7G8D5d7L8+4%7Q0`7$7V7X7Z8j0F798=7(8q8%7,8l3Q8u8p2/888y0=8:048|0o9b7.8~3P8L8N4o4P8L6C5N4o8V8R5$839j3L878%6I04390Y7H6g7O8F9e8J7:6u8N4F9k7`7c554F9p7b9m839K9u8#7h8%6Q040V0(0Q915d939(4%0w0q0`0L3T9A9F9C8K9M8N4W9L9q750K4W9Q8X5N9{9V9W9Y6#9+4|9*8q963Q8A0`5q8H8D9h6 4;6s9M9S5l4=a19N5N4=2I869Wad5d9x0f1O8kac8%6Z0`2(9%aF7O9Z9#2u8.4|9Eai9f9^9Ial56an9}7|57asap3F57aw3Iay9vaM0`0p0)aE95aG7za98fa;0s1!6-aU8e6:0`7Mb0978(040EaQ7+0`7-aT9G2wak1}5A5n9|9R825l5p216za!6Dbka5a-az9,8ba`7l04a|a?9@b17Kb3ba1(999b0n0c9db58EbcbA8t8obTb78h7!9B6`9D0`8G4saj9_aX5BaZbm8Sbo3ga%bn5A6E8!bw8#a79y7F2Bb!5 b$04b4bf3QbL7T8?7Y8i3T8`2abPc68,bSaL7*1(aba@a/bCa=c16kb68-bQ5dc87%0oce0vcgbFcucjb)bQbh0D5A712 9lb@3e5Qbq79bs5%71b`b{8$cpaOaKcoclbU04943nbx6H9.040T0g0Pcs8IcE0lcJ5A7^cNaocP3f7~brb/9rbo7^cXa-9w6R0*cs8 b%9?b#aV7=b,8Pc~cU830H8Ud3a2do8ZaxcYcZc(b7b9ckbG018u0Nc+3Nc-23af5Ddg5 0u6j606e626b1d0Q65dU2O2J0k1ZdR0u636^0#0%0)0Y04.