summaryrefslogtreecommitdiffstats
path: root/README
blob: dc4dae83aa5866f156eecc35e8a5810e452f08a3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155

Ipsilon - Identity Provider
===========================

The Ipsilon project implements an Identity Provider[1] that is easy to use and
configure. And it aims at providing installation scripts for applications
that can use an Apache fronted to perform user authentication.

An IdP server allows users to authenticate against any identity provider
whether that is a corporate LDAP server or even just local files or custom
pluggable modules and allows applications to authenticate users while being
completely agnostic of what authentication infrastructure is being used.

Applications can currently use the SAML2[2] protocol to talk to the Ipsilon
identity provider, an application that uses SAML is called a Service Provider.

Ipsilon uses the LASSO[3] libraries and Python bindings to implement SAML
support.

Ipsilon Server Installation
===========================

The Ipsilon server can be easily installed by simply running the
'ipsilon-server-install' command.

Prerequisites:
- An Apache server with SSL configured
- A keytab if Kerberos authentication is desired
- An unprivileged user to run the Ipsilon code (defaults to 'ipsilon')

Currently there are only two available authentication modules, Kerberos and
PAM. The Kerberos module uses mod_auth_kerb (which it will configure for you at
install time), the Pam module simply uses the PAM stack with a default service
name set to 'remote'.

NOTE: The PAM module is invoked as an unprivileged user so if you are using the
pam_unix plugin to authenticate users you'll find out that authentication does
not work properly. Please use a different PAM module, like pam_sss, pam_ldap,
etc..

Before you run the install script make sure to create an administrative user
that can be authenticated either via PAM or Kerberos. The default name the
installation script expects is 'admin' but that can be changed with the command
line option named --admin-user

The hostname used is the system host name, if you can't set the system hostname
to a fully qualified name, used the --hostname option to pass the desired fully
qualified name for the IdP. It is important to use the correct name as this
name is referenced and resolved by remote clients.

Other options are available by running ipsilon-server-install --help

To install a server that allow both Kerberos and PAM authentication use:

 $ ipsilon-server-install --krb=yes --pam=yes

This command will generate a default instance called 'idp' (you can change the
default name using the --instance switch). Multiple instance can be installed
in parallel, each wit a different name.

Instances are configured to be available at https://hostname/instance

So for a server called ipsilon.example.com, using the default installation
options the IdP will be available at https://ipsilon.example.com/idp/

The install script expects to find the keytab in /etc/httpd/conf/http.keytab

NOTE: If you are installing Ipsilon in a FreeIPA[4] environment you can use the
--ipa switch to simplify the deployment. Using the --ipa switch will allow the
use of your IPA Kerberos administrative credentials to automatically provision
a keytab for the HTTP service if one is not available yet.  You will likely
want to use the --admin-user option to specify the full principal of the user
who will administer Ipsilon.  For example to use the FreeIPA admin user for
the EXAMPLE.COM realm, you would use:

 $ ipsilon-server-install --ipa --admin-user admin@EXAMPLE.COM

Once the script has successfully completed the installation, restart the Apache
HTTPD server to activate it.

Use your 'admin' user to connect to the Web UI and perform additional
administration tasks.


Ipsilon Clients configuration
=============================

Ipsilon clients can be quickly configured running the provided
'ipsilon-client-install' command.

Prerequisites:
- An Apache server with SSL configured
- The mod_mellon[5] authentication module for Apache
- A previously installed SAML IdP server (like Ipsilon itself)

The default configuration for the client will install a configuration in Apache
that will authenticate via the IdP any attempt to connect to the location named
'/saml2protected', a test file is returned at that location.

In order to successfully install a client 2 steps are necessary:

1. Prepare the client configuration and SAML metadata file.

To generate a valid metadata file and configuration it is necessary to provide
the IdP metadata file  to the installer, it is also useful to decide upfront
where the application to be protected is located.

Let's assume the IdP is a standard install of the Ipsilon server on the server
name ipsilon.example.com, and the client to be installed is called
media.exmple.com with a wiki application located under /wiki

The following command will configure the server and generate the metadata file:

 $ ipsilon-client-install \
     --saml-idp-metadata http://ipsilon.example.com/idp/saml2/metadata \
     --saml-auth /wiki

Use --help to explore all the possible options.

2. Upload the generated metadata file to the IdP.

Once the script has successfully completed installation it will create a
few files in /etc/httpd/saml2/`hostname`. There you will find a (self-signed)
certificate and a private key used to authenticate with the IdP and 2 metadata
files, one of which is called 'metadata.xml'

Log in with the 'admin' account to the Ipsilon server and go to:
 Administration -> Identity Providers -> saml2 -> Administer
Click the 'Add New' button and add a new entry uploading the metadata.xml file
just generated.

Once this is done, test that the authentication is working by going to the
application server url: https://media.example.com/wiki
The SP should redirect you to the IdP server, perform authentication, and then
redirect you automatically back to the application server where you should find
yourself authenticated.

NOTE: read modmellon's documentation to find out how to pass additional
authorization data to the application. For simple authentication the application
should expect a user have been authenticate if it finds a non empty 'REMOTE_USER'
environment variable in the incoming requests.

ALSO NOTE: If your application is already SAML aware you can simply run the
install script with the --saml-no-httpd option. This will generate the
certificates and the metadata.xml file you need to provide to the application
and the IdP in the current directory.

Links
=====

[1] http://en.wikipedia.org/wiki/Identity_provider
[2] http://en.wikipedia.org/wiki/Security_Assertion_Markup_Language
[3] http://lasso.entrouvert.org
[4] http://www.freeipa.org
[5] https://code.google.com/p/modmellon/
2ٱĀ]V@Ci5$#xeo@0 A}R%AWN~6'(muည N/i-}u0 }㧩"2o~-`(mreqy]18Ҥ\ r릮LnZx_CPOb 5O~^#se Tq0M1RKn)@?-FjC&ސ czLG e*Ed㻚[n p؅+dJCL#p@ dc޴4 SO3d)Վz<:F+T}cl ,$Cp9`cќoL=Ȕ27j;|=eG_y,Z? <2jb=_N02|<ՐzGKE؛F}:@nm; C&ƵA&_ ݱbwA槐w풻-ڣ+F٭M&qχd(:THV;S4,ijQP}tO&phc~^%!hފ}QK]*sPVٕU&O Y/lccd%s`fʘb6\ʓVsⵯ'gEueOmR"OUEO+w*lr 􉸕a>OSΞԆ[ {6!vZ 3SoBM $XjH.a*,,L̍^$ |DXibch4 VvoV50,Փ,",Xf=&| ƗL8U~{ox%A͞X sGS>yzV2x s{ Z+-lc|EjZ6mgԫn z[s\~4~}㚗þ-N_+W's!YO{6it<9 &nmʽ}$9J`v|RL RelCI7ndKoHm56ːp Ŀhh/f-IZxw4drDH\cߋ kKwBq6 VRzHxS-]lj(,gp8Ni#Ȫ"#,52L[+QJ#CI7ܱWtp@xXɵEZ%m 5!`.l9ʹ1ݷ3xu3Y6w gVdm*PvxMcw"Vc]4i `E(|/e d\u&_Vp.܄hVvQzxf)F`\Y=1Egוuz!?5HeϪy4 &9aB5<:d TSZpYs T2?ژEGD IMlP]5eiL!b֍N6 'k>ܪ.1P3~uj% fClۻe*O\Q`l͹YFYN'+B '[+ 닷_]]a/֕g$uG"uE3pv P fnhMdiy2,\/?:b-ϋX!N=M{ Hd>~U9ۑMZQrƞxG+`ݹ*eWP+E9G鲠O_"yTnrKi c@!iHv(Tؼ8U{>oqZDtmp+"RmHX!~Z7s3\G,kE#*1 Ul'5эsUw4K{vr^Ei-NUpL/m}M;4`JWP 'E+n*~gDʶ8:tY9(hM,NSNi8&c\_V#Q0G2Ɓk{Pgc7A !(SnP3ai2#hk0DjnP7st1a{MK/'@>KiL^ʫв;!Yo+3zz6R N|˖k/0ː)SӒ>P̥֍I?g\ȏs:xE5./եCh/!kDn,И1O9o{HFy6Mf,+܁mzF Wnǰdg_grbه,,%$Y{?KE\ʵʋ=6, ~WWeL_,s0'Su?X)e8]j6O8;ቨ~0|1ַJfJ)G&8 ;cbPY#e;ByxDyƼ; YoDᖇUbbn>2f#[Ȫ'h"v:k0dU9ҩ-nW$K{!y&qSCIѽ'2V8o9IZ/D?t'ּ|{UX۶bk!=։\qe[  [TB>hda>X{g+A-p%AtsQd;ti|ЍI-ZoP=OJi2b,GwMޠQ,f"ږM7-7bl>U3LIoAI<#'Sw'S߶gGb8'm4d 5]Աsdx6eVޅKHNQ<%$c|#A͊mv/0t>R΋D%ZYdPNC/}F=YU1-Ј1Yp5Zߏ}uPكti(ld݇sȻ2= r!̰Eّw?LϺG8XEe ڴW:']4bWesja_bVՁ2ys(݇/iKZ׋nb&Sn(m:4F?Ƣ秽 Og)[q"9l^PejGcRtChyxצFMq] ]BEVKe$4,GLpcH-Ru0f=+Sŵ%1kg:xE0'R8Ҁb}M-a2>vcw[\rk}@hNMso:ӮΧ{=7|SXx@HZcM0i=SF!>.gHv9{$(KEvK N_ogSWΰR`U]H@ $^%Zqͧ$cy=]Aӫ+F:U$/~|(dMB(}: alx dݢpHt<зnR_l|[tje&7${I+lܐ/eYwxA8}m.u ) ʜeSP0a֔`T:\%: :#@_`4Ģ:Dn[ɛ8'V$BDauD5E '&O"~!k|ɝw'/0ptPDMXjйd,Z"yUr˽6XH "h¬oh Jl])e?PtXiKǖ«B SO&Ob=hC =gcN:!(82O2W)3vW5](gigBtg3fWւJvD^v@ iBmTvq4V:LЊL<> ҘeDP+|qcBRU|TVNbd6ӓNamT\9ix)?\3eb6lV 8Ͱ[AF'hwrL<Ð%n^g?1ùF5<n_4BW{ #dÊ*Jpn)oR`氹VQmC oWpu p!֒A7_-VdrlibKK֍>s&6]*zoR!OUY*}ڎ]z%ijkS/;4BQfޥ|vp0K BOb7ARJKoS?E>x4Rn0>d M)K׷%A,_h8?H8{4ױFuX:j3{mXDSRd1E ӊIA(-Qq8b/T1m$ɥ&Щ6;P`X_a~MG/p"3I Cx?{DǗzʱBu+7Ox6tF.qCO9: b˗-ϱaZ:nO?7p+P)}U1'XI=w`Z3쬝6 w)MAXI?8ƻ6~JiKk:{Gtt/vsH4S "Gl,paq`:|έ$ OTzcJ:@QJ)N0|B^wB|dp8ɥVH=ߠTj(fs=dQQa:79g>ٜ_|:B:lm^dIMkq<%3wY(o&ПiP 0("?G }(v5q!ɋ xˤ!0)(v`ڞ0H'M CN?w8Hfʾ5hAP^x/C^8 U|mwq3Yv> ?MNrkK{I[W܆ל#׹J f;Nljg@F}߼Lí`Vv:b )rq2pjv{tRȘp) FYR)ݞPYMY8<2jnHxi&?~䥚HZ1b8Tg pҴC vm13Vh^,iϟ#mQ+8Cl S {yт K5Fp*[||65;0[ ؚ͐A fMI dr}TPӧ}ްʯ1ﻃE(DeU_iwwgTjlT`|ޮqa0Q,vxn3 GBfHcv|orU`mZ1Hi?T/AY,~dWwW/—[TB 0޽ѵDMDr8 Ms:`P#SIB Nc FRɵp_}šf&+26JC\.sΔUyog[`1c߅)_ }v|y O8~Zy2 S',GY~k@)A4j~Ň*?Ԅ-R-#x tΠ3j(Pr=L{wZtgcD}Sa^\`Ue2`.N8"8ˏ?Na$XJ7әk` xh H_4 6[8^!wAWנFj]dXwI=ni\_-P-q|zNIn<6SAp=`e,,h*wh/{= }%p\6aS ҶA"ƺik3мNMC$M DJIzwj-t)cټ= NG..w|L)Y=ie]iҡz[펔/K\4eDv]6ɋްk+k12j&,:g:/T'{BS2 nː-urCGt$\M/L CK=I 3҅l/bi $Ⴣ䖙V}vSie]urY1|I]>'[nl1E؊_j @rK ߒa0yWVra .1q G7,GJX4f!XF |01!dpʭ Ez繶j$Mba"!2IUp@M^,7c2zx!Axoyݵؐ~` BhZ9^ppoEZ j<ʗ'WcVfsa٢/2d2(#EjbY m[bl;F>-wd`ØL6dns UekŲE[k1$=Kو W}O[rYL`[B2Ku*8X- S쥂 ՛j&oǨ1k&qIKMBuQ1͠٩·| )fQE9soU+ DvNO; yC 9Jo*} -Rr@GJ'M`R"[bPׄK"$HTKn^i315AZQO&-f z볒F;o "$pohv# q}D9K& ر)\A"Ϲl۱fokS-#M*2(%*ǰPCyјd2dUll#S"僳'6sfN7(QW=_[n oQӶbN^j&*jxVigZܲ0P] j}\'NJ?BbC--/hG9ۡŞⵡ1S#M-CʭQVP?`F8g9| R6ުuGP/ \ȚW<5 .;~}e"QJНVANw$6Ca9$|q/8x#w-4=Ei:}yC:ġg/ œ) zt|As$&Zj; Ṿvw>|j`Y& 5lxO+XJacCea'3$E4K=hsIw1Z:}(0ԧi~g$~KPP7ܳzqU%MǾ"8üP~oRE%hgHm gYkH\ExQ} 8KC>`x.cdꁡGbhHTV3)J}`n0e99;4E[ -3FzF* S04qB:{}Iz$#ݺ@&[53ז :c ް.qpnR8b; #Qi_q2YO 1ak 6١mk=L`h;"%M[>I{$Oz8ԿYi ;9?gU}2aF"]žG+6fkEkN?6+$ٻ׻MjsuCLTҍ";d>Lů! P.VjJ!æϥ¦yvceBQ`y>r&)I*KX8{ד]I>|盬%r (OuJ2PeFwۭeʪfV6qLFELqŗbJ6D ,q*!3f&Ģ^ȸd+VX ?8Ww)lNH v(4$~&J ֨w'|/POI(04da2((آk6  g^m00ę]q;K^J@lP~dSAWR m. ^f w;6ةuJj̢懢AGSi2vD>C9jsƂOu$Ӯ䶏tY5jZ<Ɍ+´E\m3YՆw)]\þؒ׉ӅTCpnFj}7z(2F@4en>+ωm2{zYQ,AlƢa6B9EP2w=U͵;@|+;<jΔbOOT/Ma;#?pjŧ7Xkr+.\YB Zj :޵}k.F/t Ն0PozC|y Ԗ)}{)ccVD19i{ٔ!ӈ!>pt6=קvAigj~ziD+hڃb/7sw;;|蹐eBՈ GMJ9CB!'Ӽ~%).<^f4"\wbQ#!u)PV)j~&>.%# ˼v^Fh[z_Ę Wlh+^;. wE_v4 +8luInJ3L(2Fd?jml1ݴ9[71M/àex +4 ;^m* ~,v5:itޕ+:=߿"~$!¼]W/'ʒ;*J)Id=n:.YAEj#2ěť< 4"6L(åD4A`XK31w unI$6Y]Ҝ#{ Z ƺ(2P7*K؏B5ΈT\cr Y qxƚ }#{[A2W\K*3hf@cw;kl|1CyG|zͩZ%]ntt_&ɪi}iD? '/Smҁ rfj]i v|/.Ӈ&nET{:EDVYO&PcŧʫmR5Iއa VhdHXN~zˬF*X1CV OqXi U0__ ekg?9Kཀྵ'k:tc|N͠_Ԝ&'LStDZ&,{\*q^ګvZ81{F(;#n ή I?@+%RA5Gm#4*wUM:-v DNIEw j;?7oqǼ?o6C_hL >@7[)y˵gw(cKJC9 $@,⠎;y3[\#)eBU> i [hĨoGg/pѕZ%<+8йySA"\cbV~A)o>.+>kֳ1" 2Th?aj8)JcS) YrФ|pIQ⫙Đ.{4EpϰxR5!%"a2Bک]"Z[E pܾI@nt1n XW?v}%NK^ +YE5AO Fb"OfǎJNuL^OoޕݲC\=aa{r4èk8¦m,AaĶϺ{Ɲ3/m w2C"]ð e=_AO%€AK[h] -N4mYKYqYdAb+m3+5)Uwac6ck { vWmޚUdL\Z4ODPȾL5RQ6 w ש1rs1Yhs W}tvDr BA<%alI~G>pf rIߦW82mI!^!J _fs\V"OL١)61YITa_)@|a4؁n"s9MbB­? l0IU؞FEZ45*: W`VvZ+M^irϖ?ߦ/0G\ghռXG)mg+i5 p#]c\ja+ BdY me.)j%kp2^JXZ{ 7 U %@yevK\,qPu1r*@w?pK@_. Y^j n&Rh@,(ֱg~nືm[S͇F]:Gf{u?\D"y:F0ÁWsjCp)˃j]<eY_S ,eJL88 P2lٻ\ZJz/Y ❵,I cqf4L,SK]y754=~5 rC ލG$޳.PJO3r~IF]Z -2Y>7vX`@ 2^9Zs drA[l;ڲR/(z$FIfoSUKeE!oMpgR*D)ȓ{WxԶ4^Ҝ3}9+N Ɍ5~g`Ͼ6! Z(m)!~&w<ՆwH7g L]n1&iCCG3Tw!Ox[V=+M[wX@揚X'Ayqf\Ɯ5rۆ:%ןDj2)6d׵ub$\֘a= Pg(@aՂ8xa=x2~/ jyIN|X:e@ݘS]4s;ԧ}bgF Ż(YkHI$^5?|F!V.OuO ظwy\"r&J_UX;6y|h6{Ntιuk*]GUJrԾ緄G^ PerZ]4qVO~"jwLM3n=wN576''WO?= l ߽ԋPdZ0Oj!+k<H$6y^kҠ)XM=u+]kxS}X,j.53<rr*Hp2Cwh0 (a/Z u} =]K=_>FФ ͘Tu&>{a*b"LOCyde= !\וrZwgL'U0}!9ӧly)h

lBBRH- oght$`eo$ؗtצ_dUgzK}% }AA(יִ#2-}iYmG]t"W^ǽx}iCBأATZYfdV9ȸ8l1 .@@f<o7D~ 뻋s"ۡz!F=K^I_&X5j@a kx>~Mrt&Z#qI,`qr&h)HU "O/R*!bՓG6^:f@t IrkDp _qk5_2r5[ 젅-&FЬ +'j-X޹Ŵj$̶!!8/= ~ iݨw~nú2zvasb ّiWZL|<N3<8ɿ8|B'=J|SI>5RO0)w7 C|&,V͡Z۬Dy*\N0_e.NX~`H;i&yl4<dD#tP$ pUim1/(#o^ߖf}>$JX@3Pt u{æ PSkRcZ:c,p1NYI\=z|F9+'&cfbC@ߕVM r Mf}CKoOpQBu~= Ⱦ$ll輶7Zn]ӝ+'A`w3Ma 졺~\B."vs!fY-LZ& gadvpѝ]ҟL;=F|x{' 5B f+Dz?=3+K\ dwu[ i9Q:g9KtG4SU7<=P+ lz K_LohNfX&J Mcۯm (mje\'0]f`:z˸iYs-pNߨxoa.u)rbF:+ع#L- oV$ 2p=qw3qRa{@rD=>S:Ev f!I^Cͅ{Q/=xxvk&\t燗aL22dƋtn Q}yJAui\G`Yc^#t_֚CH5vk{ߺ|v$[?r{9~-xp ~ JeEX2Lt9L&1Ӟ%gSHҏpL%cȃxZԈYCP w t^,LpJOY h%Ģ 6Y|je5P~M+Mҕٸ$uʮ{x^QnSCEkq%2lM/zV$koG6.p_tŒسr"gvThG\kB#+ Usuڙ[U ׍+Fo?Փ`MKm36G6 jI184ЕTHt#R[m;N-}& NxCi&UG+c4@x5qcjYU$?*Ncfg , խXeQ˼ y0.i^ahzu3hqJLn|eap&BGoDH;^D|tL|!0bW#ef \ v%;85\;aԴAD-@Ep{1뤒@I'!M#Rb[ W"4:_\vIc`sz$B /i 0V׼ S:ry\!u; Zr+PExێiOT^PNP0z@V ґag%oj+uQ%qG*W ->g2 m?IN% idn?Wm&3F?N,w/`%&`Kq~c ,{qAB~/\z ޗP?(M+h@2p*3bYV2Y</d=<ϿS"s.];;`h9'ի `!|q_p/ qYڝ:#8Yxk37!Zȑ[lopO7tqo'b9s)HoNMs?!'Ui$:s=yQX "IAhI5A@tF\c%!CoTA[DѓG;@e5c{!1]ݽ5+]tVm뻔1 Eh߅=ܤŁ`{5u? 8ɌmƉj('h|.ℾޝC,o-}M冫CRʚ T*qG,PA`L@)_sV*Xsh>1.B`nƿݏ^(G?L* ._"\(,_nﴎ.Jnvͯ0_A}e"E+&[;Pӵb6Ǭ*GȼZ2[=P)I2?,ogM5-t\q-]:?!+)`a$ yer4/ M&FJ{x&kjU(wzӅAeݥE/$Wx*bA c"Q;TI8'C); !Xkbʣp\Re3@HjBƣD1 ɣ {̽ܮ❻E"wV6(sC 6X5PVf}2RG㦍R?7ͮrmQ LJƥ03RfCpM;j0k?wtE *$N*eUB p- 3?w CZ/0R::Cb98 :4P̻e(P˺&#t%Լ#fnvm8Է5is30pZsU_F_m>:llJC۶Y˸vn/ۧ!KP4h@/{o_']4pzI`J _ iR&ee|`h1zg%h+5:< Ɋؘf-ؘlCjq0吃ہ/AmQ<:B^SrqNK\Cx#[QT26GTJfَ*V&P[wHS/a3"a6(gl| e(VUkQ I{&In+šȰǯ!'fhx` u>|^|y~ -Ao$?` yX (㜰_f]<гPd[Ap79fID/aT^7}8 U |t!3Aq}gG޷>=/kL2p5PL+Onێqj(!"VQO>}`0+oυ1pȉINNoF2N#p=_;}7rO)tft%HAk )ߢc@fB{z#2R7@!)M{+ j5yI.S,=jKEUzQA- tL_|\ %N=vtvN; ,.@2ܯB&1^ {=HA|n_$P\o$,%?`iʙ񹁬k(G9 =V8ɴť!j.Ábgxgt>]^P6PEɕ&#Ջ!qE@o;03C90&uM ѮD܎%þ v ܨhZ+/Unz+6sοśXQTґ,~:Zؤ B,v t{:aQAEӲL' g"~jmp hx[Y!M3l5ڋÄn JXRm@le]y"HE-.Ȑ"BDt#>FVlZYgw])w`õ\.ٌAb@m2شƪ,y`:؆$' P{3@UKy*fm0X 5)"˂8l0I yidG2WuuEV~fǷG΋Xf08R5:_V%K:YDž;7-mC0NfE9ti$f%hh@cv1pPI?hbVH:-,X0O%fZZiX0E3'8AuP֠onGs '9s*\ȴDi9+6g챼ZF, 엎E%U >x#gሡtzY`xj/|$.-ѳbio=/F-&\s:ڴyHMٔӋȮbPXn%xwn>iІ|I-0ɰv޶p0k&88cc/\^=o?R[g+*wW֛ !!gR4XxHAS n)&Z dzqc ߖnd'|+g$4]LiwW3.aZG c26 ؠ %+<]Ѭ+y| j-B6r Mؒ[36`~ID9Zf;TJŖ560ҩqSUNKPxwU6A}Us^Y8 % ʨ ^v;HH$rp ;r֋i }_<[=.&D+󩬗Ɩ!M'̏KfB nWpӄ'|&H6 4 |S}~G%JUG,WHipip,Jy~$ /A9+b(L 8w׻X"6ܓxkI :^ gmI#a& @KZ*?~]1l+6ib7[zB."^W ʭ9\ژ!1o4v(4rrp":\ Zd;dnX[r27S;'{"-7B}\ok2S^7Q`ut3݌Gu!P@\"@@MsoMwA@?y4(^qBL4dZ.ƇכNJ8EAoiwV ' us7[?CM>wyq]iWD; WfmJa]$b,yQ%#[֌5[4,dm P$ut+m& Sexp5)tZ||aWkTU:p(ʫoI޷9;2-a* %OX˫#U#pX쟆^4Lq AH "#W!00J/`e&l2? *ёYÖt܉Y=Ԇo7p.Lj3ӻ!>SÚBN9ZNe$8.0svC9 7w͚u3vl )|ٮЙEr}K^-Da #E,7}˜RF:EXy3hC~BCM\2~_!0_؛:4㶖n=iKcH!D Zb/y}Ξ''? M$uD##mJⰙFOh:hts˃vOw+Q'@1i m۽|ܘV@\)K}P"z @:Jq4 %<Ωj*DO&R6[:t O v5V?Tn)0YI9D%-V:gL hh|Ǟ fuͼWNHF4',́KIDաϽ7CrΧTqI@~N_j*11񁾵RqLg! %NYG@ޏc~x61(W|2*Y;)gO]L5Bѡr5#'kKh ))[k87 ۍ)@oRGՕKgS _ǰ*J6VJP>ޒcnsGIz&_⨭s`'UWhվmx|)Ūym"gxs>qѤasϠ4GI{ׇ ^0P 'ŞA>J'.v†q~LJ?}3:j2XAl\Wu>Aͦ@[u1h Vr*e=sS^qMoExku?>q /wGSZ00VR RX');l\_ӻLs j-K@tgWYg*'$HvWlܲz }FL-vTz.mNCo ؎&J`iKb4G&zP4RI3G_`iN]c#'-cAgMw Tf_i3oJ4h "wd<U~N$kkF8]ͣެ B)Ct>Y,૽?-&SESZxx鿊㰝"JN_4a/Е͚cl+< ;|ۛ)*9D{#eReDZp2M}+.D!ݶSLQ'׵Ԥ~''!.HV_bϴ@(:&:⁑DBBվKc`+^dx[ F'$:erjY\Bj^Z% . 'ѕT; [(Z >nI'ݳ=4fz7) 19f;{XP1巅 PъP`HPgI|I䡗U:Bs12LDdP- Z5 _)Ni df%Sާ]- tqܦTKECs- [яY@OoPX.43b"sgdE!/6E-Ф3-\I37ՈhF1 q`/:{C0߹mVr%%ڒ+v8H<DRte6gWZG 3>r5R_ ZZGQ) Ȫ!C#m׌NoXy3Vjx @O !V"\nX@Q2Kš L)w rYUnJ2Gšl6Ŏf؊s3Ĵu9.!$?uTrێ[*j% #NSL-;H j,wiX3ҹC/][dm,1k}P@~Ȳx8Ar Y8Lt' 9⃷2RdEU{ Rcz90ח޴/ Y" ㎬ ozzRjngQ=SqvvU!_Yī! &lC6O|$tˣ̹#G5R2YTwF|c&e x%1XA{~#Q˙U-j]oS4,KɎnPš r }|+~C/bL8wܵcNkV]QoE]S 3q.P,wd꼅|4YNBJs+:?;iL@Z}h)fƇbu ϑji&*Xa )HpEtx)jislG?X8]=o"Oh0ހ-$@ZjL$hpT1?ը 4'yQo*zMn6FO{W8"执\O;KW#$u>߈G 8j#4%+qkP5; B-wщ\t`7N:zF+t}0K Tt| 0.?4utOX+&V36Rq\kc1x؟g  m!6dg~ lT4Mpatۦװ^eP져oqKķi5"w^ftang|h D"ǭQM(5=fEܗ"bs;yYY65s)OJYUnk7E77%b"J"ڻ^&"Hzd[QS_S+6ntBKqBuScZ#Ap 7Fnέh+Ry&0 -6ϑ3GgvD#E!O(Qf<z%ob9a6Dl@S'ǴTJ$U3nfktH JƊ)b=ϰc%$A1LCB| ޅ4Ơb+V/dΥY=;* ?˜8e2AIZIo.ஞxY|5ZqIKܺ4eBe%1_ZLڝ8 hѧ@Stuqnth=o 4IƋB`i,ҸBl;T|x4ŗSR1F`OC'OXY9B[Oi (s&Y<[65t gipƢGm[^pTlDĆW$BorHbꃂ.:Ÿ؎߀J۔Q4ziq 1Ųpɕv;GpIaHԂ-ddI, ?j!\lZ໋g?~Y2'!qdBxYj.bii imd~tD.]M/ι<**FS򙸄U?Ĵbw4Xir)O)5 ۺ+(ѥِ}X ٭16Zd2ä76%J"d1I حIoK\Ua+1 <(x9+">>1U<"D1mn<&WOx4^=? .+_aX(#gKIV '$+~N(a`]yΒTIM,-/ ȆIRUx{C΁,@m0jY+xZÉɵ&ޛؿUXjAşԀ !3eljbJ-M\Eͥh-7=wwH'ZEy]ݶUH0U#h$uw_fq_ Gzjx%+ǜI.=N$[7qLIU9wr=מp~J5o-kzdۦ!_S1e9rA0Gو?u]EQǙes'P)AVL6v}lNT{콊b#6.4H[;\udsѻ-waf8 LHO"JP= eT^kecWyE5TpҠA`̱E\"T=D%Mr~lZذHsd,hoY\lviW$U+;U{0E: Fj_S;WssL}ͅt))֬"62OVt ,,m,^'IDx\'pe8Hmz!ޖNq6q9v$ܯdYIC҄8MYĠAu(1/iczmˁ5ఎ۪pz8HSԑɸWgФSeSgK\|5w}Su][A,Q6HNS;Q?~ޞm-="ZqPr -yg&jtg3HZrMn'(2&/*rb/kM4MetW&'߫&xV7p]Pz W@y2u L] <=AR!ϵ@f_9~Q6} pHl:$ YƮ;OLgV|ǶBqvHx8\d\\);WJJIM.}\q8P[g9!L8gsHt |]{kD\çѱ^WVn u5;2jfUWyzr%B;Xg΃5HԄw1Ď,dK;av芘31=`~򇉬ylR݊:.[ FW<H3LȻZ9~I|-r`Ns(Kfz%e5H_H,eI~pIOӫ.!X!#ǭYBDI3ݺ0lDZ_Jbr%Φ`Yv?3XJ?_5rPmd:HS AhYFoD3z=z׋dIPiJb#YǾKNeUQI$1Aһ$A8rPa(<(pهGq zsN,NN%qY/^TM۹E<=2/G%k7N腭@KXuܤF&{5jM\L\(I>wYx5 Y{!SoPMQbaEꗖ M+z2KYsW膇 4CWd'`9IЊDt&jz:xuhؓFVrOSOBXGvB{=΍!ɼ<+%_K>#ڪlhՙۡUY6E#Wcj}LX0w@hLE?;mwQ5:W Zoy3dZ(@IؒbuCΆh fd$Uvf'۲\펨v^^>}bRs*9IXܳ80vGԜ1&CХk^A}R( ,:o!a+U?|og͸?^D~\s4mA]n:<r_HJguj:}ki-m w ,Q^8P.g[l`{` >YAZ5`Li>^eyț'Gq GZV︭y>+SGY!Mv0'Rg@PR ̜vo ~97xu.C/{I#of3V.kfC{\ ?{̢{ȋ7*Oo]=hŔc^iX9aSs.kԫSˍSHMTvXpR?7)81Vz^b C)wBr.MǰǪջrJQwa Xm.= |514E}(m_gC˄iI*',3GNFg@/NP2 yݍᛶZ ۠ |iOT<]o0m0Q)\emMGF~'q\ Gf}I3g3u\AǪ/f_e 6MS *9qzP3e5qi8aF: Tҥ9$԰VF0"o#0[~HwylQ* A,Ok<(t&lȬ,rD l / D=Aݢ^7aXN ֗3u0M'чtP:rS3gX:VBtx0>aNӬ"`/0/λWQl}]v|Qm0qzi&k#|㳄oCv }C|HcK̑Ք|mrM} HzW-@T@G࿋!pcL-흩.SmM3Y,NGD2@ڙU'rw[S,5C-*y0ƚ_9G$ \F\;Տa!N% ߚ[@kws^g,nE!!kNgwAǼa;7/kPz"DcJӪn]:D>gj1׉ē&mg6׬](XuH)e^`]vɻ"k|^JbreW-We}1 W+}c BO FBjW/F8Kfv` Ս;ػăhv*=M+B䖐e$k-Jb_jڤeH"bU#uqc cW=6rvoi=9CHm/S!X[_82+B\!De]3Qɧ9^PfFE#:xJ[nߞXIZҿ B3ߚv|C|"p% }2\9α-hL֣|:";iH/gf0䀎ՊMvP餍qљ;㖜T(_GBAI[%wQ{v!S֝]Q͊<-`T&⌖i"]/:űxx'Jޒ f$ܦqT0%(e<0 m+?"4!g7+IځScMsēyU0"%"0h؍XX_}*-j\B |]%nòⷩ1QrŠrB¢t9IZ1߆rjOv dO޲1y, I ߓ(I4P"Z3knуtOZނKhy~BzX,«LNJmy|V֬k'm0?RTqtG(GiQqs_#IqoC BWFv9+DT]͡!TeAg=V,{Mپ0>g4#dq1h gbod:lT^kt_}oc ,ΈQ =!r(f<{|v@+$78Icƭ&Lb1ejad:&!`?@FRڮ2 KYUG1->!EZ!;\ R2PwNFN>=GPIdkJi-vb=[z Dmb. lkI`~yA;@8 m*ܸ2̱}FJ${ 3f}zu$rhQhS3-KfԉБ|pat=^ERP[$rՃEfm$>(6Y2&L?sU3i!.]$1Ꙇjɽ,IԨx S9Wa-"(*;;?t(.{'3Cˎ[WdfR>t- cJ}D)$KgOQ_r%7x钬R&eǞfȀ\8?Fb6jda)3vW7(/5+`e;Q$/BR^M? tKzF~e*hh?V{_{ޛHDH|& g+Ͳy?a`nXUգ3ZGkso;_5vCʩL: