From d4c1ad024075515ebff8545a73bfa65897ca9fd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michel=20Ka=CC=88ser?= Date: Tue, 11 Aug 2015 13:47:26 +0200 Subject: [PATCH] password encryption is handled in UserGroupBackend; Linux login now working --- docs/images/_img/django_add_ipython_image.png | Bin 37030 -> 0 bytes docs/images/images.md | 91 ------------------ ipynbsrv/core/auth/authentication_backends.py | 3 +- ipynbsrv/core/signals/backend_users.py | 2 - lib/scripts/create_postgresql_container.sh | 2 +- lib/scripts/create_wui_container.sh | 7 +- lib/scripts/setup_docker_host.sh | 6 -- 7 files changed, 5 insertions(+), 106 deletions(-) delete mode 100644 docs/images/_img/django_add_ipython_image.png delete mode 100644 docs/images/images.md diff --git a/docs/images/_img/django_add_ipython_image.png b/docs/images/_img/django_add_ipython_image.png deleted file mode 100644 index f2df713b6696bb45f323dd61fe6ad0ba1d6bd93d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37030 zcmeFZWl&sQ^S6rx2p-%e2?Td{2=49H&x_jBiY>zq1u zs@_j;ovJ_Im_5B#ch8=+*VVsX6QUp|j*Nhh009AkEGZ$P1OWjh2mt}P^B(r?mHF3b zWe5o93kzXk1xaCHQUymlQwwVo2nf!I2-Q_PpbDlyh@DOzwm?=@Bnnnog{rc469Il% zKdfY2{^3{rrm;opydf7`eB}l9`WYM5%v&fsqk;khPM^LRfQT zd3?^xg646zKT7P&E0kMw`x|2_e7W{r`Ol}=1P9bpx05CD4A!o6*)n6IGLsW|)IP#b z2vOV!78ZEQHS5qr(f0?4&-dtm>{{c1TRwhua#1TTgeJ@QYOT)aO?+wL7hlX%j!L>F z_HaS9F0^vVyG2C*C0N7IEpeN+hlP*?l~ehM(kL-3Z=sHQi@f)lh3UZ>>6-9I-Di2a zBmCx355@1NsfN=U&GHJb6KrFVeXM*=x)#!Cc^^=$&~82!|E1B!(S4l1Brx5onIn|% zCl1Z3S)n5U~z+2IcnY0K&tJXtP)LvJ#2=|T#dn8m~<+SxC{G-r%}lYxCws#xJ~$>Dx7Yh-pY zJ!E0iXpZ(X^@L#)MypFV*Zi!LG}}Z!N1HOl^fAv%J*Outd~fcstsZ02Eod^`;5vIy zYLlTa!4>q+l{8mXU+G&tYmSf5Wq6A_ih;$TS%fn{ab0i>n6ECdLsi1q)--yGmtQP8 z2xo*;ugAp8YtsG|+WmWY1G&){_X3862E_qfeh@h)kVGVletKxnG0V2-DKqAW*J^u64ofje zR7ms~kcN5op*ctpnl&b5Hp01lZrrbz`TdfNU>=TD;Y6Cu%?=p#_&Dh< z=)XZ?M9KW#3>QhprQ+dDC-_O|JD=B}yJw)9O0to_gvjwXbI8+zSlAOwUUgrta&iW}s~D!d@3 z$t&Ci19_1kLV{bOpSm8Ec}j|Tew$tjT!wqR>sqL|R*1O!?r$x;RCTE}cM}V2^HBWQ z5IDUem@h@8WPl&f`>$y!t0rAAhBM}uJm(|KJQGY4*Y2jSKG&lLa-p;vUm+0`{Gc$i zAYh0;`HK_hv{wWE{6i`D_PQX30Yopf|36nL1^t8M{2(WVId)DM|8v<73dzq6>0fKg zi%ED!2#Yf4OaD&o}lR1b*2E%I&EAjruA=@C+(T8*Z}gE4fNZ z{AHmb(6wrJ0q}~u8}*EM(TBrQ`O>iCtCLiQfI{zqRi@1`u*0`tO)k9tO2IzU81pwd zPoJY(Al?@@9_6{V&t<{m3VeA_q)+cJJw?Ej(-W55`Z(cBw!O8LpTMwl6;(1+ZC^Jp z&15nxgn9m>P$YsBJf@Bh^vxUju+eow5P9vrgZr`M?46~fVrdBa{o>rqN&3&{^ScyTs4&P zvQy`!#{6LQg|l8m3ww25vs5Z2v*31~IDUX}Ya>C|YMQ2LEdH%l%u4d$(vNYj%f{UgyL~uUw0p(rrP?G#nnaCBQN}9pb$5)`CL+A{QHVfulxyDsrumuGqHXIteh?7>Gsd* zzSR$mMgx3M(PT1I$50j1`HIc8I4kM+1r1af7Q;p`)a~(W)SHoBC8OVV;Ol!jRnNdna4Cttqh8nEy+=GM_32^dBkXo7Lb4# zWwBTGE)y-&9sUAK))I$YcEYUz7-{Cm)&Hoy4T+(e9* z_&3fod848zYhQ;{FRMZZMMQ1MwdFAD!%J56g{K1pSeqno#^|r{y?eEJ1j_ z}TfO zAk`@YA&)nFhxaSf5B}xwPf-a!$~5!h8-+QYZpG7|l#wBj?sK%IX~XU@M30=igVkUA zBcBWKN^1d&u3(0A6uuNxs4OR3?JAbmeWG7ElF*m&j6MX9-&(E{ zt@?%vht`TKz6jbcF@|fpFPfg(o)K5KMPs82w-Z7i-}C^aqpTj4l<1A`E~q`41URyk z9$}I@)=4drm`04LsgWPYmG;XJ1%aZTXgHqeOiWC;ms=PfTHj$4r`2eN&=xiKTxO~4 zv4P`!Klej5^Phjt6>))aJnF5NX7$_j$v(lV&N$`~DayY`cIebek^Z=(_uh6Xej#=x z<5xwv`{7p9TEfg~E`k@rG8fzN7L@P9`m;{yqo=^}vzbfNS3a$gN4Mu1OX~!BojD(0 zZP2a}5P8UxX3iNVPggzA@GuY~5g$pQqIc!`Y936DO>w#8XZOvR4BOj%Fjl?2w8|ox zgjDa8iN<4i|G!TGSU_gVC`Yz z6MfKRvItpU-{u8sW{<@hqY8ibslh~qOY z(3ck!FK%tie<#uIx<=3!XPv2#tJRa85YxK{QaKdN zE}q6=>MQfvn4Q$eOX@e3zDo*F@?EP)lx0d}-i`OunhvB^P9T$vfVU{lx_@WGcNq1K zoP176gp2nP21aitF995Tbu3~b?zCH3znRMXU_qJNUCqyaqcjhD=wf9R=smonm>aLS zYH1FN^k|59D$l>c;Dy^&( zIWc#2v}R;AZdGEp9gUN~P699{9mxkt`OP*Q6!H61S;10*ezvRT2y-90pFQP7p)A^tj{lr%5DBz-WbS8r3cTwdP)!YJRbXqV}c z9%#i*HC(P)z%P-izrQ3Eez=H0qOW?1_fn%avZ-lD2{u#m_LNOo&kM{sU*EayLNM`J zH><0EaMmj#Ic5%A9{HP?_RCr`Dbp0@cv3 zJEUe)Z3mERy@JkbWC9-8^%1`D-|gnb-Ht&FQBd_5Jz=QNYC7dJ60_+{o8rXN5HHU~ zr%sHCwm879B&HCvX(a6i=E$)u>iK9r6V1XeP-A(Y4cl8RnDgo%x`!{t*sG^*VFcf@ z*$Ax1aXD#iWlF@b)0|Co4zRXtD)sV?ZH89w0F@-+mzd8v!cIE%`rBX#4qA_V zwqn|cEJp@wLM^H3piTP~pBsSctV+@gKBKnTNfVD_V#qQ~xh zMF7BfSzWnqsr@<)ZrF{&(6|(m3T`hqCX*}oCOe2B@D+@n6E_|0Y{^F-X&zcWGAJJ(vgP-V8?;^t~c*V`*@G#EEBRb&Z``MiN^bmtS!cRe8Z1$MVb z?*lT}7nw``lkJ_S#_NlUND)umcC8ZN4y{p$Z|~Ny6VW0#R3iS}H}4hw6|x%K^^Z3? z__HYzZJFfpQvI6Jb;F3Bnmh7gL#PJ`6!sg*A-q9Stv!94W{831t4>qFhWApgK-4S}&o zVV#1fDZ5qME%CrFcZ!1bh8<(}Z=2uli4pt1fIhT7f9|)t=)2nBC^P*Qu7Sae$bT-| zUwarwHp5KIzUs(Mh@7z=Zo4doozP(tbSB9UE`aw=_m% z>lm>S@1@C8RYXy^F0Wg)!;ByCaL~o8{*4e?nxhUYcZJ!4zmTv#ptX42GPaCZJ|PyO zo-*TxF2pFKGowP-D$I*+Mbam&HkdczIm+9BF)bV zQ*(HIC9VE~59JHp?H%%#7MxY^(2uu$KV;E5{ll)j;%KC>lVtSBH(NQd*D{iB<_X1~=Ru1^ zT^BT(@NAZpKt>wQi>!SQKfYQ>3KK6Ycp zb9IH1WDjGi>)17YU02*&9}o(4;*B_PLF%iiG-I|4mfJ!J1;@G!q$DH>>#b9NB1}!? z0gv(qt-kQUciY%u3Ih=Oj;`V`kbrpHV!7SxhiR5-evUo;6OtGmKBBdrcNB0)P{^gcr?tq|k;kJi z%Y#xiA6}1vX258Xy0%0Mz3zywaCcgqtYP3+`%j>xpu?*mQU$74^X&&Yo0KRgqMwr@ zZQl7QlI>yZ1{=g#u01)7)cjhc%-&$FneBH+J}h)sqX$<*%9X26);VPA9`q0uY}Uc* z`riCAFk%JOn(YbO@+btZQ77#W)wH9(f<#CcASY$9_NG3+Poej%=JyTcjn{!TW*<&y zQo>XoaQ$(t%#c&}_&Ve|P2Ku<$xgWRO3wfE)Y!k2uZ%ovy{f9+QTrVN>{X2xOdYa(w53<5 zs6=Q=o~U+6R&c_6`cfuVW5k|n8_HL!?*h!0?jSyxwqox7JijH%_FnDh63?`81S4l$lk$g;;5CEc-obSSRE4iP+}!1wfgk%tKCOFrHe2>x_Ud zTC(YrP*KvTMl!Y&4XA;6K7k;b(iEC51n@qCvcaSa;G>iSyH^M~R|OVIEtRMgb~H&yH+mf(!ul;Z7pgg)#xRl!u8Q|8)Q+vfx6qMNX6R0bEQ2g05)CgXzcsyq zaWVp^Cei1q$Zp3e-V1n@6h;cK1}-sv)HES?CEpO~sND(t>PW^R=&%mrP)@t?GSCY4gDZ#GKvLm()7T02CtqAvgc* z-NCMrJ|f&ln#r4dDXzg$T2z1_Jv1rKb491faiPgI<8~aw#mu3&0{;eG>5~J=vWh~c z8hu37I)f14>WuRPGvVoaYUp}=C@$-rwllRp?s&WI#d8j15ozXn<-_@Khy$Z3ZPfUN zukJX^1k9ND-IcGEzltxHBB#I{%DNX9{sgvSrSLGwt%an37L2bxC*L}1cYtwY%!3j;9T$_Ei^lu;F%JUS$BC}15SxuVwfFTl zz`!PN%VYr4Grhm1?Cy79T5i?h2JtT>D?fM~vSfuk*C_t5TlClSB^Q*87Z6*Vl*vtH z?=uzGEjm)c(x8lLH=-SqO*m*~r$P_5R-}*OC|mWpCz*fOEF4kEj@(3NWo6fzo=ul+ zZ3<&{VsJOyz1nv_^axV*18540P@)yS=Mov0dykVBVI)WmJgErgxa?5{j{-r@8l)Do zk8OcU2?T>xu;H)fTwA;8fS0&;mj&8v9N(}_JGWLB*})~ezw~uqj^z1)OK#uR+hvMV zz=huA--dJABc921^jeG$ItwmZFI%2|=h9A(ha#t1G^oLiEr;{1kBdL=Q=~;Ul}0_* z_Tq}@dJz%@j`fsKF+fO1ni29m%)DYL|3E{h|Cwn~yxdx2tr>_HhGHQU_mN-i#T`MO z^=u8jie$VG@~0LlJfL8RX{89L3t66u-*SvYwkFwq3qNLZCe<=jY};-niQ3LWZo)hg zpLz<^M#sXonnH%;qzQbU9C}sEOUVUvd}ea#_6c8hhcO#3VyQE;zdd2+q8~R}-hvj4 z@xZ0d^mn(>ChdKifRQi+DI2t(D0X~*eY$qd8=`IPBFzjTe2!=(JP$n9O1bU`{8U+r zyYM?yui(7Nny0rnNS%}d6=5ljqK`C+W+duCs3#nhM;+KJA}K%giO=}##&yq8b1p4| zMck^GN-C%J^R-hc7xg2_=(l5`%6MaaEn*Qh5^N+si`rTp@5bqQ;Q~Ao9o3o<;i|5^ zpsYE#j|3XT+~FG0FB=73vGL%aYRSZ;32;dqZ54VYT0Z^7sGrtX%s>!Dsq=D6-^W)9 zMuu^`Z{RrR9LJXDMlbAlH=~IYn`eW>IkZ6J9s#OaAj3mciZtR<)`p&DZ_9~lRt1c* z#7TNk`~$@~Wzf%K>Yoios9|PRxIW5X(umQ|xZVAkd$qkGfbsg?g3CvcPS?Pk7e6?5yj^$gQ!}K!DQBOeOLNjye?Z?fAB{ktEDKK-1P#os zpmiOh&T5^1?rG+|vGEDk;4@7f>N!XZ%3{eIy3GiqL!~NA*UFdRG{pPt-8u)S|BUtg z@c?u8ID3w~t*KhtyP69zD*Sn9lKC{krMc`ybGamV|wahHn& zHQouqBOVUNF9n3JqgU>?$9#H+N5(!9n*HoO4p{P&P%)sK7M9hJqU3ZdZA zKZpoEqjoPnMP-+~x@GB%wP44Yc{0o6?c|(W^poWc&gG`97)&TcSVwWJ#GB!S4zUR1 zDeX{em+$QO8{lv>$r{SV+JwM@uv11OF=-O3=$B06eaYzN`etsB!V<@>a$cYWoK8)%L0uS+en=+Rq~LwuNaMkZnlrmhPNn zIVh|xyy0oIk}6k~X7)c_n@Iu}PJblcF49`BqNd@!JQ9p$s_sLLUtA2|cwepC@oV3c zU<_WZB+2sNL74p94wk$nd>6Sm@#>fsMdt%O=V4RNI#swYMVJUT3QE&W9MgHIc>m;$ z=?}A0K}vTTW7hV`SJ3X&^NB5qydwgu*lD=MbMpIFUw7O!F>Ve;Kd8Gm>B%V*Jc)vX zps>M@pppP*6sPs&)5pWW(I0MIEv&+skAt4C0FPR3wGn~-B+A!=HRKfc%PY`}cuk%b zbpALK2>|ubDH{Uj1@I=My#PMaDlDCPo(iZ z?0>xl7sAA*2lKxoSTO{2mKS&B3HD!QPZN<5Vt6@_>aSS0qx>e{JvbXI(fzfl#x{V6 zuR~V;XO1@wZ?Nz!imSuUYVE%^-{?9aD6I$z{wjpg@-Vm%yEFbK4ga;#$`Uj(GMX>` zud{wo4+?&-RN-EnMJMQgomoPB3*eSt=5O4jBnWTb1^pbRfBPK%nJv2QEr1j6WT}5u zKtX=YH}6p45_EI^X2J63t^Ou&5qnS zK7EP)PK8v%zl6N)eU{Ah5$*Ewk}+>(KlHSO9@(=!IqH;&%O+r~~@GD7I zsI#@(xRi3&LPUX;lRztN7+lLC=QrM$BIm6~#(YE!C za+H%>v~3hXqS|NwY<@w%GQqjqd2eY?a~3e2|EAon!sn`IHVH)3wImWOE}MO5e|&xk za7XPPJ3Ff){U@bw&=+m0mWLTSD785IvWO1X*sLMB_Jm>B!TaNE+stTh@wPMbktzSq zs~4a-{nA}ElXL;RyJp<$VdT}`WZI~hNnXmu^YC)}fF&hacIESuN?F#;qJJlxG-Tzl z{m{VZ^G#YOR4?NDs`}uGFoKcq3-XZfSr0Nm*J&uoIe_))l zFd^dr6n#LR%Ev{`-(!4gM>R0;R0x=&UFDamOx}ysWXq!us2nduA+YF3a!bC)8CY2K zG;Pl9QEjYETrUgbs0-#OJs z>(~fgF?cj}Pgb)#Cf5D1_(E43+nk=$KziiCbhC6p$8M`1#;w*e&wNdu+gavxZ@od7 zu6!=H7An$!fBK=?v6`J`hpbC5Q{E@hy`D21^`a|!@+KvzD4=XZz#N5pj*uLt=i)~i z#_~94-h%GcmwI|UTK||hY(lyycG;fQkiHXJkSy@`q{|-4Oj$JrfVWkwbTH?TI;Pmm%dz490ZL5Zm^G+gq(4 zZZkxBK+y3ce}^Zmr3JlGxv8slRGkCCsT3|0`NV+@4(O}bKg*53ukN4QYq^^S9_CV~ z;_zUD9&+fR>44wS!K3Gu+iwb)rn6#=#;wdj-MTsNyxSvI;?gD*!j9_Go#L#Y1l7Wa z7y04P8lH@JKM4n#qJAk#N`a&5QvJ^=p5+mG3!l|@B*`|0s&^Ihy)=`@)3o^87ttI2 z^&`c$149!%pmBV(gVts$3@oe(Q7YiOaenG|PajZRSUPcx9@qA=UOQrvAm77AtRI99 zts_PM*sY{xCJuXCh<8bWY-YtGn&FR5*g`>_W-y<0#@N!C>O(s92HkUc&>yK@kvL-ALi#?fzA% zy5!YvW6Scsl^Z>Rolv;M5gDkJDdx29YA*#))XShnNa~Q!(XI;Q#JQm>VDnv0?_U3B z?Yv+>T*QJHN>NGG#3%6rmCvv2G=7t=L8ZelgrR;VXhUIQf@3UdO~;)j?^$_0l>y3} zgUS*YfCZ1*s{+Vz%{gdq#ni&@+a@U>NokgDbJq2wD$Gr(?@;IgYtaU#>i4v>cl0nF z-=C+%uQHnwe}GphhL+Uy zI${$P+O$;fG2=sbd)rN67%k`DtAHpWq7ZBt`5LL&y_%&nVVWVFHC-Svv=)B3g3LBi z0mUudyOZws5=gHGXw6{p9M4yB@JaNjMuhD$lE1${SiZ&7{0j?{){3+A%U0#KmUZSV z`kIMVZgnquKpvij*;{!Le1GXlmp?aNwD^tli?r6k-ITp|3FffGv2@~Y01d%Zxtz(#X%!xvDQk?4&VTkE74KfAI^LZ=$;i_l)?o2r6E)Nd zs76G5W76RcEc-ZeIg}#4tF~k!BB~?Oh672!@ou)pv0rqpa0tFyae-Uo=8{2!-H|a= z_8^M-OdYNMls8rWBtTcz(r_xj@N(%RAL+0L-kr5VZW=E&zHU&~At2I`~3RP(eY3a(@AtVHdk+m-Ui z@<&ZZJ9HJN&S6d|Iv?d5XLW)H1NbgVf*6`%;I;!zNMhHU8oztWtX9YuD-|HT_4VoN zPEXGoEccW|!6+U$aP`_s!|lAz2Wh1qCaQ(edrzLg!xZZ_cecs6P*s?N+<6mGKqAGl z!EJHg&s4sWg7lX;34Y6DWPlmFs1l)Qo(y|9Bh=HLVxEfJBLVP@h3fTx_H`$igS$x4 zVc$oF%d)^5k?pgHsS%M!PW;u4gF_P)!gi-k8PFp?(P|mdh|&_{AP%_qkafu?KnJ^^ zShb3?y)@kd8$B>xC4O6bCx!RXi01Ko({~`zsCMHj>u1H&Us?)sWcM8u`C{};O)WTkwQ3U=< zG+S&8+CKMI_cPQjwAxLY!j4I<*6`IEvL_R<9f2fDl`z=8<@6$}*<`RmfiF)WFlR9k z5L@%}eFhilzrw^{PDW9J@UrLt^M?)Zc2j#*`MR z)`+xlY0W1FJ*sk4KzQBGkl=zAR8(kq2n(&9G+cv@|Fdvpz1v~1BkqjNA^U@b^2VqOX`_a&osw>5(yZ6TOSb^4CRWzdFR`dLyjQ}X%H<@V(% ztGGbL1bBc0@@``kKNcP?21#iHT7Aw>6Iwkyy`iCKPp^)frl+pt@xF{;Cj3%5_)H)UR5s~R@aWWz_g z`cO&0%j*=YO_vBOoFkM*;&@958Qa&`uhfs^ShmDR$`b!sSvG_azj>aG80~u@ zd_+w4YFaw1Um0yi0ddip$;10FyD(cC`aZB+!fPZ^-7D5KNnOOv^r^}{aZQxXA0b5< z^*L&Jqg+e=o<`9Q16b|NFAV}<1&+3kEFLhty?;K;iQ!4d0#10Y`A0*ZWd8w#SC}_| zcnwgzZ&+5iU?Y?T!;IH&L#Yt7;z$Z*xWb6Ns$Dmd{09s=JIFgB4%TB|qE5tr{~oe* zNL-36Rj#4#JN?04CxcXoAv3he|6Ug{qMD(J5W1mbE+7{8j z>@)v|ed-Mn{(~rQ6sGcreg1cu5mQ1&W|TYOztpJkMrs!V0Wtp%5PJ(?EvWc!h&#f6 z(9&LEiTrOas&U=|XhT*0FC7K_p`*>LYU#f=-x%Hk@FXcv`pbW)f6%f=$Rz2%XsP!W z!2d2YQbwab-YB?I@$x=pp9%2D|C1fm2En(#NQk!yf`_V@cbzYY0P5Cs|H%}or~ir! z)E_)e{QtyL!82R`RsJ7LzbQ6r<5cru!g9x7xwGvWk`#I^uYYQ_;XT7NN1_T(#wHY{ z9TR=oo?*A!?jP*K)m+#XVv7O&jq`#8=j}P5fFGML?BWqI&>i5!=(5atW2uG?$37tx zHI-Id3%9DjKaI?^^Lw*s$K#xDm8${4-{!{!kj_a@ot2pD9UV2F>00M{6Ivri*e;8( z{cv*H*Sm2m83_?DFJ2_7yYWX-r#xMRo>KYm+b=E*e-V-7TMdcMD)XA>C;CNI-&7_c zf*H4;343E2B7Hgy0DkO0_nLhN%%9%S29w)?wq%ah*5NF#CbOxXu{);gQ!~FBn#-|E zpw^?D_3xkb{{HXdGdH548;xy2W!D;9FGMyisqCiiwOlY}K01+*x;M<0%c1MG8+%J* zxRb`bUpeS!hrRGE1ef&-s~mP+?}Y)Zc-h8a_*R}7!W!E5b z=Vu(oHg(c9!a8`4-Pv1UWCW)p*Yhvuy@3xm%yn#)1Mg1SFOo3X=UOPBXa=0;k50M3 z(mIS-(vg~h9FOH-btrzs=r)>$?#a#}c;!!I&IzEs>a%Yzmlpmon@Ns(HJ3=uQ3nz0 z%1(MadR(aC6|fCkdX&1&th}qg8Q)~TG*P6WFBYd6ScWc8vTGrJB^WX0H6mvm1?j-> ztgaUO*R9HbVRn`J{h)WvRnafBk96LbYkJT~LHu$8raOz5cHBswTeO)+Ez4${H^e$C zp;pFP%QMK3Kj)8x@@GVEJod1j>^opj%K4n2-|j~Lbi^HQh-tw1{jPewB25uTyibQS zmZakKW!H4uz5XQYs86fa0|6I$Q&?27pI1@G!2Hn`MD}g9 z-FaLNE9(B+^T;bv1k%$z6CJt8{^o?Bsgg$sR$Arv7DM~?Ob@h5G8CIU3$MMmFo+Jt zdZxht;j5oC*9hB6uPP!$N!(L;sDrGdpy3HW*&x^zUqnXU!1Nl`ttof9P%l zjKGzuOR%g$ES^kHWYN-Ze&&_J3ZSR}vT=?%;Ty^yn z9^!I6duVKVt=s`xDA`OQ!C_hfu{?XE2E(YD^T%r00!9pl=EnF9o}9O%`hK}bOe#f? zi3~o35%{A4FOtL62w(n`z1%jSzQYQ-HUP4qbV8(iC)NjXa-DQ%-I_ljc&Z9xaaEm0 zaN1ETe6R;&Fqy?}sPaL`>d}$|&ksz_X8U^Y)_QB?lY(ApDssykJea4G#+7lhMvfVB z9UWZKW%>O{$aSvrVM;#Q7 z%DdVHSyvWS-`S$89}AcpK0xQiCZ6VZkxVEq&tX9B*-|`Je66E5-^5 z!*G2v4J^9$SQod=;t?NO3&i;DM9_7MSyrO^cfcP)PuMs(mmqj%G}&$HRk(e63&1rl#gKp7LSCycJI9O)02q@zXWBcC?lT4P;NgpkZ2tt zr$6KtuaW(#EsL586aGN?c!Rv0RK+CGxpkY3`=ly=+ASu3BUsEVpQAD+cd#m6Pq-2a zMkn+ovWgUot0b-b5@_A}-YjaGIUJnTY)PWx+L*>)sp>iU6^J2xsam_+?p)w~{pX3| z?<>CX@=lOL*0Zki0(U%9y z^*CxLQAuS(_que-Tkwls%;Hr3)$)fzQEHL}IG_UHc0M1SHe%y&+*H(4q)1a#Oo6aismC0=xCuZbdo?H zijF7881etL?y&N=?l8-(0~Iv&7(s-KO%xT}XJ-Hg($qTcoAhT*UFcU`=0O(sW0<>p z;ZnPR5sp6OeHk!%&MRMhE1y^G_e{F1tI$To8;I-L68GJg+f23AV?gyMiQPx~R6e+= zmxMd-as}VtdiRdog-{tfLb)Vu4-c_IJ3Fv>=@Es9F}Ea?==9Xj7f!9*5v6<7&g(ua z0GGXF;6)0lB)AuGgd#jYO7TQV`wa2txD_1tqhbBAaqUj;1DY5KsX+rT1=@A+@9~sav?{J*-?$`G;e;oD9M9nzNU+uc8 z(xcVCEja8q8(a?f_|Z0*s*)EsUEI!4#SRRgZ#Swc_5VyvlB9Y>B6dy@PAA(LlF$@L%wVimKz@N@*<6)XM98o*4BoPqBTtu!Z_w4>^ z%c{i|`_G9UM_L1Yh#l((_L=XPXw6z*h7hxr@EF|L4_H6dhiW0edk+xnZj=|$hZ;U*W{bJ~@ZeZPG$eF0};Y@z;e%O(k zS4HowRqB{}npmEdfKSwRo~}oZYt!r`XiaV7!yfWM*wi(Lbkkc~oLq!OgGax?T`O_X zeIDvED$!@)_)xYx#qrBC)=xGXKgAlctP*iZHx=`rhh3^wn=`u0v%-9HeQ9&AUQVZf4p-$NpdySa#Z9Kwa$R;@ck@18$@LJ34l zi`b}VW2_STkTbj8**f_9oNj%%tN#y02ofVKg4xIGxsH$|rvqk!J+~ZI9v-=GD;_Y9 zKb3DBemUR7s`w#ciRG71V%K*v$HrJW$8!IuMLWLgg%e!c?0-CELh!@+G4v;CSkM?3ms9Thg}n^7iJO zoOQ%ydB3|%`{Je#F^HbYa(RbMqgF@!E%eJllUNKnCJkYfT4aLKQV-JOmCOh8bP5=; zc6pybiZg>L;OxM@A|Q$`m@WQGL5{SqtBR{K$MC1FAaXr5g7QFPxuu&4DpkZR#3qf? zrf4sTSUYX66-2wl7cS3G{!)y|MX|@$1gSo5<^CS-@X9& z7q`(BQ};WqN$0G+eT}JlX6$SpBdvJBWh0lwe6D5CfxlAm^u&1Xg$gLA`jo*2i8r$r zsl>WQi>v}t?hr*wiS9%SOy1Mj$nHyEqeyUVI?+EQ+WC|lL6;C;a)1gd^y%5Uuj&kY z|7`N*2})*Qg)M8%NiVTg=Z_v4jRVz$ZPf`IoJ zsi%=cnduS`HEGN4TZh2DTCtzi5ZBTsEjVMl0bhy4jJpG z6U|~5Frgu>S}u6e)XI)a=FAGytJE+aC0tR^X4rT{&{EY2kj;z~yAQ?IsIHB;eHY_F ztdcZc5h3`>`4IP#(sLP6pZ_5hIT0g-_DGh)iQndDD<)l$6W;c%!5q37tMeqpAoHWq zS@OG&{^xB$YgeN)&a9o~b~oC-wr7^OR1N&ILH#D*ds@GJk4Z~2Uuh$Uy-f{+76K^@ ze1-??WJ(C;_FW`7S^sLvidYY+y0pKh%I{N0d;CN$4!-`xUVWT~FxNM|dfs)M5amY= zsWquw=0G~xLDC+25CzG=8}e4a+A-C2qOH(qtn_3)w@{`Xei;r5R%GW!H`EPCG8qe!q>1(ZJcC{^iYAQNe;=OE^{{%`Akg2RJQrGW-aKb=Kt1?^DB{pNZB?WOPqlT3>gg4hfe+2!0*4)3_0@_>K<6YIyZOw5$eieJt< z$|>iM@tlTQYKA`y1reu}DUDNiK`ys_$bZTES#b3-Tu#O(J>6A>5Gt>5)9`jU2+Rw} z&;@0hJyN43fxOU^ODOq!eA(yTj(a?@#w!}C?>w`asL3k(C^rphkEdOkJS8~jTWXb5 zJD5|6%C#0e(@2R7cHTVaCRUsK<`l=uJS!;0+jNzcUa>25=VM61Q4H5RhW1_+)M^b^ z=fWxzY2L{*ohS$1r;G?*9ye)7PD)AY=lgo-W09MVL6ofx@i3$uu|799$y=Cyk6V{r ze^v7+q^}1SM;U`TlPwkB4&q2YBgfl-$Lq$J($+XYqITbUF<}TNJ^hG}LXOgMR*WuG27lThalJn#S67jz4lGDHWLc2aw@C;ScOG>Z|3lt?I zaG*xDET=V*Xld`VC%Nc>y4=n7S<7VU`$F^AA6QOVT3+ywuOJ$?zIZoOU}(AHP-Px! zvTC1>MsAd|#)Z697@1YQ)#q=JC6l-AIDPOu@Q+)}QmdpU-t|nJkNh0(*s@<%yU&+L z@20G=q_SY<(e4z^U}AP(S&q^QXxaKHFrKAq0g!6^(^jy-55KcVc(4IEN!0s0rX&5b zB$!#0xJ}+GQdia%cD=b!Q5n$fD+5PHxvenD?SG6~(K!~k=u^p<%0`(M;Ez`GymB!F z5ZGD?57gYLTBZdNaVn#`)b2-@);s-aO6c@P9~|SF?1IjEBujidAw0IB?W&z-Vt@Oz z&%!vL;K;X*SX84n&Tb04@*Y?cdUHsCDmu+6Yc3DuTg_lS+d;N*LftjdQOj`l<@J4| z)J4yq2esd41an`r-C$(1w7=D~EWft5a@t9PG1uRE8=;yXWONS-5rN#l<-q@W$N%|! z+9Y?<*jkD z4EI|3U)^lu0t$w(9q!~$)8Bu@t};P@TG`1FkD1?zk@3g>e&00Tb_k!Nh=Kp^5Znge zF$-MBJ$TD;y~$!Kp%4F+-8i7UU@6y;$a(&iBL`ohQZgTgp7;x)(jkY7F|YqCTiU&Q zGfm6>CjPJOgFNXq3;&%*=ATwmt^_0gzms1@Kx9G=a|jPb{@Y1o8xzUT zk$P9~p}VJtsHo2R-`35IbsT%8Zx45_BYb~_vp0so*kBQKH=E%58+)|)A64;vM$3QO zO3(jz^!xuR?kl6}T(&K72oAv^IKkarf&_PW2=4Cg5L^QUx8UxwAxMDW?(Xgmy*Vf3 z-uFiT?a}+0Sq|63RCYh4?|ZExcc^G_%h zIkV+Wq=)dIX^7;$`AeO}eQY@YrI=0z26u!C(=;^5%p zAKe{>)u!W!Ccy=rt=X9c>WHg!e)mWPWffPG+)5!(n)ci1Lsh3)1sHB&4Re|sS7C= zdPyW_$L@-2AD0x^gI^24uw%B!?$fXmg)~%- z&jD4Vt0}9u^mxQc1|!;mx1C6ZT@AwzNd!`y^wNE&V6nOLQ_5}gy2z3jVZD{}=+Vov z?O!srw(8#k9h_^baAjMaT>0<$scRfLwbp$!B8x<=Rx_6n9n@4+=8A73guAoM)yXvL zHFqLX6)|O$tKlGMd!EMz0uFtGs~jmwk7zEVP4rIoE!T=qDR<-SE~a=>Y_mUT+#mFH zf^+M@@`X6*hn%ICeHv>P!9K@ke!=AW8L0i~aHljvJ5(Xzg68Qp|}x`dOU)vsM#^Hx))iKE~c0PJ-?@ zZ2Wr%6XfTHJU!09UQ*&~fI`BZHP!MR4{Z4eBoPr2=(`yO3lVu;o zWgDrkdOkqXsRJN)MDOvu!Z+}U;|7FYE)PYE;xrTemomtunB!MR;iu{$ck#9(h>D~Q z#u6WgNgEBM9`r2pzP*&uE2CD_Sq%Kfpxm9!>f>va(v{3$SQ`Y9c#}-gt>hM>qPzE> zeZZO-boSU$0@Ch{+n5VBg;q(EXwF4$W(E(8%Eb&E9c(7h4dD(MwaqXu6R3YPQ;!X) zb}%8xRq)geDv&r2rTSX!Ou7aC7xh@NUC<)-%zzhxpXLQs+nr@x_ICsE*wNgvT9q?~ zxtVI)R+ZjJg&K2h#&WQ`p{-PVs1Mc)@guYqqt_UCFUiHKrWgFM$=F0AfwA6wk{T_m zxxNWR)IUK^_5H6*kPF+Mz3(qp`Dws77}2a{wiu~}zW2K#OKv}(h^;Cf(G2&J5d3_p zYx-D2TBQ28O?^#?(ytLv`wT(fo8WAqWsozK=w49ud-4$&4o&%*uQhZ$i*M1MZ`O?j z2W`PjJ>UL?ZItlBFHN-YWTE4VC4Hulh-s?0gZJvlKFd&5i8X)w&=s^A7q_kWx6aP# z9DtLfu#PNk<4DE5-7tb%{}z9426`mI=)uw$-- zkGA~wJ63@!-{g=Gv$T6(A+RnC&AsLXuPYqAuu0 z7_C|~qH7O}Te7R`y8;`V@D!z{E-AIZee3&Y*nV4@{W?@oNm(K~b99Bxfts1*easiD z$0`$Oy2AZ{%=AXg_uP&GW7+bdyc|d#+tGq~P7s$jHZa;J(G975Wvb~w@^%!RSi^OP zzPlw}JN|ySAE>w5{j6#C0J=2*$eV6Ip)zN+4lcU;Sxc?o6xe&u_{sO>32E7#)}>A7 zVM9zia#O7|a}phQQHsY*hLSuYOw=6+D*j=_Riv#W=#{9ww%B_@FIH=-m6XbX}Y%;+erUJwgD9OX>^m( z4%lxqQbRl7k`&VkFIFj^YE2P5k5u$PkDb9}E@4e@mrePP0@X`^iZG;>Us(ya0G=%8 zHMU>0C^z4AjFZtU@JOl(Vh?hA_2@N%{=CBajgL=(+nkGmNT{U)t}9MoxP4hPg}2Xt z=6vho0KgB{y(Z``;0$0CtVe?X%>if5H#}Lr7r{-%k_aGI&pfyD&?@kFA7#>PD?T#B z3cKmzr^RdYI2+&7vw@*vbBliEG4*@=BP*?9V8UISih@7MRRe^$7JjS1W~$L?+GYM0 z>As3k8!VoG0WF-q{V9c`tDw!#GC08M345-p0Lq*kXl{#hZ%g6kG&z$u(Wi5#e>mQf zz77Xmk6RKm?u^2g-PZ$4mD4|Km2;MHnXEb(^(l1{nVX0z85zitOFq^m94L{berAR0 z-;l4Usoe+vt?LCfw9Msay#kg^giuy8TuWCIyuCH8%fwCOBTnHou!usHwm%s^bf+a> z-AL-1=qvlfz-0w7;al-o89zXseZr_J9;G*Dd^jd*mZ=s_=*6}BJSFw4SMk>Lr{(Qj zqkntJ%Qjo8Pm9_RmMd>WeRbOgbr~|d5#GHMi#9{i(_R&JgnNepUH;QBPttT4kQu&p z1o1UyVQ8P#r)ErXmA{?H89yzISXXi$H-fQ99+GybC9Y7VcK9Wu^Lpx{>i+PA$&g6W z93!(|Go;d07TohbXHFrQudq+D-jKvF^Uifl!}!WRdP92f&eSd;abqa=i+DoZH>8CK z6pw0K-}&AK7d@clghDN>PV#Nm*txQ)avjXq-ksY0bTSJ5#$(A_h^J7M<$Xq7%nu8y zo%6zlQZ15QXdMG7xa?3H`IJy@e0_yas9#~ztojR~qO0Ii0S=(6GsY}kBaj>4sF^Pv zFO+l0ZkDKP?j5_D9Ck*x1}Ctd{rNN=QLFN1kHL@Inrqt>-K0#pOg+Ke%$!*Fo4HL{oj%LCV?LMhGl&g+n zPQg;$u1z2dCmlg0?DHX1Qk3q20ytIo-i{whf(K2VNiz>VCy5v(0^*1uax?cC%*Jr&;A*ykY<6 z>FNA|TD=}qGwbzFowLl{b0mphB+eN<%+EKpYpSq&xyO6?J+3jgFUu9RTQ5vLx-B?X z&`-vwdahZGm*q58=gsIxrA9fj{oDCJUVS_1*safCV--n= z=@sbNRv^eOF1bBhs5n!1@qu`%fA@pBMc_EvM6@z{DE&^ye8hr)U>UPxDPl!YDlNY? zv$!p_caB5a4f%*iWA(XEvQkfuyIbZPiFXfUM-RblVA0G2PGsrln$B5(~0UY!VW0JyT&C-uIq{f?0xe@pA>uPSQmrbSCzgV7H_o6U+ z32xt`WW?KQEXEllkP|X(@__lE55j=eb|zdhC4l`X(XIPMp+zk4$i#@U&|_*^!_Iu% zw%?`C$ON<@=r7xwpv~JbZT28Yy;DMfke_GrAxEahcbU26-mFn4U%LPVbYZJ~ANB`3 zBINa}WOfMyGQZ*i+PX;frqEI@QOabPlXJv!nK)XU_<}EwBbNyfI|J|Z8&8hNI_CDC zC1a(WAmc@9-+)K+7$O zke$P5yrag@Lk4D*t979JFrqf_;OKYH@ay$j05X_g;!BdJ9UrTSlvZNF~k!# ziXirt6DZ5Hz!*ap;c%RWilyGAi4Ofj4jiWS_mfvD#1d3ryq_T+K4Ij}oT`X|COB1K z{;+pQ!=`tbbLG+}7#G7HrbDvMxfG1DBt`jF8nKBiUOt zhHt2a`V3!4wjpzmLs&TJ`bfW(t#5Sd$mj;z#NIg@?Z;_jRJs(`zO6TEVc2auDdG4- zMOgJ26g5s*kJX|C>*t)GZ~gt%7tyISJks^w+nN;0%VK;l4A(h4sQZTF5b;7hc>;du zmF5tiOI9Ofa<@0Mjlc{P$5)Hw0d0ZFx1U?t>Q;g);c0fb)bKFOZ5IK%vrmaGRkwW& zF>mpvxLiQqS>v2cO~3?*<+zAjwbVKJ44R~y0~7; z5jvm*A{u zsqL^jh+16ff~k@r_k4c1Wgy&W(DTyyX+mxlNSn#Dm@I=eZI+^PHPmjvD`KK#n-Ye7 zuH*~T>R`*f;BzyNwcG-K&q5bQ$kLZW`2poQ_c~{PVL?vTJz&D>{ZH?NLaGX!OX*DG zV;!MXnF)0&Dxa^0L?)x3wM>e%iujTUmLgU2eKNIG*LN7dkIH|&MMxMo|1GrsLkCOI zg{wJC;)^g_>5KuluMy2q%&1^s#-X zS8-DZv?Q4@)=-dPW_(pe9(LS;iE5Q;zo#-f9RPn``R?s z44$+)ALo5e4?cfei&aZTZE)Okaw<86H0I-G5$N^hR5GNqgWhV1&-4+6;p7xj%4`xj zqk;vc1I9A|u9)$3q*1BB`V;~Zw%9k|HYJ}&R8fvwZT6n*NswcMKbWe$p{ElQ=S-Ae z1l|MJ${alozaXbbjXw5SGOPBZBvF)7Sf~%FcP>UIMU^u*%P^AHhlaKNWQ0=M;z0uP zY1vx?)sA?Wm)airHX z@yB_c$@kV!+G9zogPEIlOlbujLKrs+nIbQi$IJWUlk3ZTXgAZ$Ps`>NN0b$5C=X%g z0W4P8c_f0T`SWVaVJ-Iz$5iXxttwD;u2vSUa@nbwo^&+< z;=Jnku!Xmz9B$!GU$8M5=!pD#oud$JUm~<;xyulSLo0NP*mDAJNw+Xs71#DUJc_$9 ziTIQvI7Rz%=I&ig7qQNQA|KiXYgB%YZZ))|ED446Jf#}$R)8bl+;m^o`4t$sO8Gq! z$K17@?9uw%cXSobbmCpp#9SjA70?R_c*U=Znb&k7WMq54r8&(`#|O5!0>xlZJOs&wj%~-@3UaG=&9(O zlaJaB&9HEgz#&ZQ>1kT`sGup>qf3}-W3h^8@+cY1MZTGCJPDq`c+mN_G8T`o{4*!f z1{a!N!OQv7o$-iESnlAXC`~egb!03i`d$S#bVx~~f*l{K4?@C2>>QDzw0b(S%sR=A zy0yr@;lvgAt#z72Mr#STCw*6&>RM(9F*36nhTacEcG*n4@6XcGcD=VpCS$4^nwK2- z!%iR9e|I5aJ*qW>^60KYa)2oTtnHk0^jb(_MCtKUd`RkB>Z=9+aZSeTfX%s`Y{1B6 ztgx{W#{06kXFmlx7m#NBQ5xS2^i9kJ8w``IMtt*aQp7ZX;eiflzGyWyv!MO@o9sRa zrUm|G?mxl=XmX%3e(0mP|H+5Zd-YWt{YQ2{P5_u2^8e)*07gE(WqYc>5(!xXplGX^ zT@=3T|D{V{0c^j~(SI}rV6%WeTrgL~|4N7XM`__d=`a+p!t1cB(*Kq0q5*USPya_C zAqxcP!=?IP)c{j~{!9J<4Cuox0$Khqaf8xVafAQS5MM*kL&fZ41)wDRf6`%s6oHED zfZ`}-km_)1pD*>-A~F2#Jt}|vx4+@O>?Hfh_nAi(J%*tE1CZ+P!5{)BCR=PDSEEQA-PfA2BW&Y>kcoBMm`<3~&`$Lo-i?{$$w zZ;BRxYp`iZ0l80<^Sk_dO!t$QLIWEt0voUd+=$+!3Nr@yz7fo&howrB#k5EJP>#6h zeqp%&@(Vr1IZYXyl+SER=75P2Bx_MsMUrP{o=F_`+r(=Yi8auF9m`o+uxcOP^PuMP zlSwH1*byF z`Sab;1*6xMeqLy<>O$x})b2qn3J&FfYr-e=kQQRtxQH+ApWEY_tZ+Yl%ABY3 zYBGMg7Tmq}GG%pUu^yg>4;Am>1aB7Dn1Lg5nBRCD=}c*O4qOyXI1W{Ya~BH7OvIdC zjdz2k(VqSUy!lq9bDeR3dEw#eX}fz3Rc&9Ypa9$joV>Bar?C<;{6B6W-z`W@vPQ)) zjW_)f;-?@4Q>g&8p9V>O<_R_ILtGne_u_DRYImKe@XPSh{WvP^o^*?1xY z=ukCDcrW;sixZ=2fO)oZpF#s3KL}}=CZJ|v+rX|7Z8A@P<@d9i*D0v`*US*e_2vO^; zsQyH`FT{nCN)It>+b87fw;h%lj(gTCw;CA-j?w4|$yoLYaxH}_%864c-M*7xns+Y4 z`ICkm4_6o&@vU3a#f};(4@v;{Ot6rPQBW=>l`0yEVpE%0>zLI8BdIydsHs6!(UIWg z_vbWEbO>Z!+P6`BiGNTo0D`fqcMIzC-!*(2n3`h>l%CF#KFn5WT z;$8E7MhiwR<*}$>GIkocM^EUfG!`K*GuXqiO#AXi&6(K4D>@B{u`FwcvP-&xuTunD z>otautrO+`$6$P}`OcK9$<*f*=_WsVUB&PQ79tSFlvsQwrZm^(4sHJt5dnoo(*rF5 zCp3dCoeE66&5P_mfa-oOQ20$rbGQ@K zD1VKT<1^9wR!QT@b^xRUYKKzn)PBq=W2*M)}IS!%x6s|e}6Oj*4TxZ@JpZ`##EEk@&uU}2Y zD_=GZMWcWRdYiMbiJ;c-g-Rn)5->f-PbgZNdUoaphGr4%WY8v4bZoNh+f3Y{fqR@M zMq*DU>&9TcP*W#atgt!Brl8pYTyS@v?Y>)=EL+nE`DjG}qF8MmR)_;LJR}$j=u>`< zh?6I0k4Kcrd#@3wEibtSlA9a(D7o4&Vtk0~dq6LZ3Ug@8FOB*)7#8yYrUET6PAIt^ zDH+;i2cAr?o8*Hk%<$fU5Q`|*99|7Coa_@0;qmE=8kRSAF0=v8LC6$z3?UzoZpTk3onLtnpI(W3`9Zus){Ny9et}k zQlC%!foRt?v_a<9eEchx`uv{E4D{w$J2q7MN??eq0t;O{;^BQ-gUH-wOITbEW>?8E zAv_AG%xob-%vFyM4e=*9!@ro2H{D=_u=EwLo}c}<3~!fH`jfT*?X^f zDbc3^)-eYI-Sj(8T4N{?5ZQswjwtRZ-3evAwf;)r887y$soFgG(g|eVjm}NX+qQHT z^+T~WASvGvrM;Y2g|;L@_meTXyln^$LB2RqB7%*CU~~+Q0s!m>i)Cju4TO>ZLbz;qSgl)w%x~%1ps=$# zzKVMF>^taxV)2?(b(` z$*opxZme&!a3}yQ_^=4U_V%z5=mIRq{Iz|nhBaJZNXX7L*MMTfhJX7Q}fv7>kKO{fb8AenD_Rs{FF%X!%2U$O4gD1Lv&3JbUG z9kuxDmT?tpSo ziAa0~TnBB8=1XGUnQW$KqFktPWqw`K4fD)|*r@iTk?A4m{v`umdACSnm(}%SiJydv z&5-!u@%nBzzr;l0mt6pW1OwM3v^lT#Sx~Lzg^mW{iBxwknCR)F;YCy;R#t_Dm8iBE zV~62!OoshK^6|Z-c~R@PYpWFk3r6b+Wx{O_$AfXW5*c3PyM$Suc4*O3-dt)Ue%WFN z{;Z}?@(JZY0UNIfV!cW0BBvql7Be)w@cSGg5j)ukF1_)nv^|6oYYlhE#Xnbz*&n`B zpfQU`VnL6NhA*ItXrS^|FU6lF6^YsQO#(AY{5t*oincR?y_g>iuR5W38NKl_r1p{U zbfW*`t%Cf_!a3D>%PYHS|+&`wLTi<5MM2VE1!?Trgg<}MW ztp%_Tt{&Dmso~+%6Sp{|Fj(S8@go9E+KTl~2Iv`7x#-y@+Na9i`ywi5f`s2=F_@ET zB*uPRKs%*T#YUHC?l(HzTiXrChk3DOXTd>0m8An@uZnPxL|<$5gug%-&eFSV*8WO7 zF);6l933!bAIfkauK%+xe#5DK0O5>4$!uGJj}?>i$2bXbxYD_;3{xwNrxLXu$1&_2 zmmOou!e}M<-W?oDTr}=Q!!<=8F=*y0UM5)I)=+Zbeg0UNFmssIJAVy@!p z^;z!xy(*0pWw}JX9?@H*I1O3O$14A+HI{(SSsQ|O42HW{G!ZE{SNf>B=(&Oq##~h> zys&y!i@{YK#=Xum@H*gQPGUTikFZX_`66FceLtk21D|MHl;H0Ag>bh;N57&sFuT^C zF8W?s0!&sS+b!3fVn|p(TKM;4lipmpVy;gE; zXDgUYiwCr}0`aG^>YQ{u_2z4$J@8Bb$Us)tDHT|jHHGon{%A%yN+H(aZzx3_O8_~0AN%)O;e3Dz?UGY`m*S3YBO!%n8g%~R?o7~oqpE+a0CO)?aHx51x+dv&kN(N;>?lx83*%p z;yE)Shd_P>v+zKmay26x^%5)6? z8J+_rZczILF3Udo5pit#EJ8p{im% z2Nq3ygszQ_Q{_<}h_5>SB8Dp%W-A7_5KH%2hXr%WD|1-?9^<}luUCtv)LNRIlv-6P zmH&-EEyujGTotSMK7VmLC2vouA)t3j4H&)JSWUwrs(>EQsv%k4C4BDg3^=;I522ul zkB`N2KtxI2=nhpBnM5NI>`M+NTo;9xIZ276B!@v;X%%-4;%}VU8AZ!H_7ETRxvdct-RDC{zQ?oRcolledseV)2fof2^%lFe zLZaELEle292;b^7t zjZ`Qs{uA)C?}GiaJYG-+x`%<3yj0-=1%7HslcG9EmsfO0V*4VlvF&bmuK*PR1)J@| zllx6C01&3;CIBIjQ;_lgVW4y3cb0&ZIyUr+2Jx5J5XbQdlli7v9~3_K4qSf>0>MNV zv0T|B0|RM=_rH+P`otoXF^tzx}#j{Ve3zo9)!|H}az+iZ3K8Dm)J5FZ*=2u%@mC4T zsp@GeOK;K9nIwIZm#guCS56FF5bu|3OcEBSKbpbXT_}_Y{}gvS0NN1eeaa#uvhslwfKRPAO!o6$;xJb^x|Gg?rU`J~ycQ}!`sVUfpc z)%bSKB|vIUnz_jT4P>;ur%(b#4o?=m+IMzAnk9S#JeD+iTg0Zg4N=K|5I*ogZz2Su zLrgjKKboYzVAr&AjRkuOU#j2K}wIz#pK#dRUbj(!Rg(W(81J(Xe#? zT>F4diPwiHgN~E_$3v7BfB4V>|BoAQOXJ8(xB3AQ35kA{_xHjvB#<0y1@7wfPhWqb z09(e{WvZKaDm{Px^jTWEEBa&E zbH_?xW|FiJNi?bDw;PmYoVvnMq3Vq{q`OG~S^`FRrE9@>k%G11rUkunk`XO~V38{m zfvh&5c%$#>WMsoF_#qCHb_)mfsOH$l_^{=XZl|e_F z+Flaj65V|$aGJ4U+9&b8Q}ZXuF3M0)`Dbf3Ui69L#S>=*u2em)qEl2@_hv^B%MO^8 zaw5YekL&o}^9}1X2Ml%$_wTSX4oGW71!{!t&Oy*sMUg7~P6k|~27jnP9- zc>6QjR`{MFs{D{rp3U^0tr7DkU=S|s_G#QpYyK7!oUngn@p@NP$=(()OzIFe;&ME2 zjl^K<^7}$LZbWj%qXs{Z!1|xj)>{EnffV>bId7MkgWn_Nu8g*25wv`` zbYr`EquJ=if+t}Gi-^|}*dqU6r&)@3kz-?YmVtTiWaiq zaM(%GVD9JqJ+d2+2E>!A_tfMAJ0Y}qLE+K``vo#0&F6&6 zcBavvniw?5*d=&M)vCbg+iwjD2=*RqO@ zL_;F*q+hDib_ydC2<|PRIJ5tU`gZ%ux_M@%Snx2-=26Xpg6aZ^#2If|;tg*rT zk?Z8sp{E@>zBx-M+!3f7h=k8m{~1h&ErR083wvvnOjqw`D*-3xr{r1XC)&w#7E^D; z6GS`?;G<5%EXB%PNyGdH1)105vR?TGMeG;QjKR+*>oa+^V2|LMwmyyWg>Lp6qn8=-_o??RPH)^q~V4A>Nnyz3(W&dafbPV^DS{cc2qXpFCnOxKZt!R9g z7X<{UI4!_vZ{yMYJ6c`z3GMUkJZ{TtFj`_gAP4sVa>}JabZ_H}O3`X)w6Fv_7vIv(-rq~-e z>reNEPM1nP`h2oLU)Kp+m0+>0dSQ35ZcwZ3in`Tf=EgSApyVzWw;v;4*m@G@XLEb4 z>vD>rWl@Q8QTX*!?l?*1b_L5NC3#|5$U4+PtOoQDO6&4DaV!7)tC`3NUnw%JP( zzIzi3I_xHLCf*j7^Y|S1z!&Z2MDHl>e-B9?Fcl~P1!$fzv&WlVG_2@_v+>Pfj*aBI zv@Bkn=$;@rLuPjx|8Gy2&Bl0=z_|vUQs2bYe;_6s_g?KCY}JVP8H5V&7MQZ^YeI{YcL|RYtxrqfuaBW<^S$7Kr$qtq zSo$)`oNApu%gdDB?Wd^||2sS*OV*O+V%pDP+k^4|n1e zWR`iQ@`u5_og8CwtpGXqgW-vD0a_-<`<=1^GgK7He{LiC+|3b zA+O??+qq%{x`gqTE3zUZcvp5q1Slmt2y4ejK8aI*_hP1__<&L22sS) zy8hC%ci!u)S#vafmf;V4*<>E|vC4mGw9SiB3`OBWU*Awz+uQhoTXxYEYKstDjCyt& z%goc}s7svBU@9q^=vwyzWqOaB{!6T-ik%iddMlT&@*m+z*Z?5R?6OU!y&7AKRhw{- z^{kfsP3I0|)sgB>#&yEf$r5myJe-HYp>CKT1p2Oj1<$sk{o7XHeSrvA zz;_I;Dfq{s?Thf*eB`v`H`P%99}wuz^?B)0|NSg5J&h38;6mXIE6#=h3mzJgEFs@M z%ZB#qO>S7*a;1E$nj+@r)tl_*gER~FR%S^9pk%-e0Lq{L@dR(aJ^<0$0d4swi0=!= z24qcqF|^hB6Y2sc0KTe<-rV@o{`nUBL$*QT9s`W?n(<2nod*GhZ9^)8y8Z z1!G>aY4Rl7S4fs_+Y_>H#ABcE$W#)|i0(jK4EW?GZ! znnuS@GU`S2G*0g;&N8|Y4SYvlJ|zn76*HS~a__2qz}ku12i%XcKYySJlzE3HU|O$b z9~+oYtu!XP!-+SW(Q<^z<2ymrr~lTPuJtk#Pu`-e>@E_)YH-C>D0b=YcB?s^TWv1_ zstEdiGrQt>%asHmLX>)oB^R{i$rDV_(n?1nr4{HOE|l-0oFmIOgojdA7xt zcJc9IgHOvm{AvqQ?%iY)l7^GZEK`CW-ezah(63O8;^X&tQ76R{tUI^#B!BGh z-#2}C;*HqX6c!~jkA94ld)pWo&x+FAw&L<^M6Z`Pk<%ull%z}qq;*t~s6=&N62+?R zxwct3f6|w}RBIhRpu9sbNzE>cI%jy8AlD4G;0QiDf;U ztWU8jl3lvGGp)m~n2qG}Lis4%aFS6&y6QJPEtxz^W(4cVam>>Dx;}!XK7>@Uu74cI zC)ayOjRb7myB2ygT6u?b*c~5AYw_Xv14PKB_D2(W&9h6ztr=&6Q-=;h3&C&g`$4;@ z5*zLAi%fSmq&VID-}cud`DtlvxcrC?@`PqcPQ2}-g#1@)Z9Gadob=`^WD6v-Rh@IQ zcv09!Tq*4yJoO+*{?h5`69wFjmKmmIm0mx!nGIXaY-TZHC9WT5!qI!5h$?W3&oIDv zoDEApFBH4IE7O<(EbAh)Uy0EW_(w2bLzvK&e79r9qa8nfXk~=WEg$Mq)x^;M#b-sm z{H+mZ%F78f`5Nub3x@V91Pl?UN`2zE+ORGnEB{A@mWAh8elsU!XqI9`QOvszl33ihjG#7bYU4zc6 zKl}27KvWd0X=`!TR(Ax&+OhBKBol@CDWe^u z|JILv3!3+MDSO*6E;TzMe4Mwj=iFVM>J!cIQQF!f3mM}a0f&okz8t_aWT_4~sn^d7 z5=M;+H3*KV;bGU#5}fr(`iRv&#p5!TbCP^q_RuB%p zxvpaVNf~d^?1g$OIc){nkPOwBzcJNcF0V#qiPkXSEz0Vu1GKIq)c>h#^ED&p6iqo^Og5DNzA4(zAraP>p+@?{)~ZTAUFSbSN{=3WCQwZ+~Cl zQT}5lE1OA19ORS!4v{V}_{F~1>;zY)QRiP#L63*`Ta1a1k1s~l@A`P@K?x6N98)-% zA(G>SwPgqNANTbp*|Ay1RpNY?fG;8b%5a$fIsT!_TyR9{N_UySUp>NwL|nqIBB(Q7 zG{*?|NL2d;zYKsq**se^F+#0+FApYtAiEFq{pgQoXVQIOv^1sto`I?kJMta)Bes&! z_}06Bmw`Yhkcxy5qfs`@bQ`Od2lxydlh>+l(?46|3Q5QLjN2*c&uH$dnqbGQN{rBA z0v{Vd@N%4s!ec=UQ_5>f5QeY)Zz zqZ##XK_-7XS*m$~m=UW}asSK2>rGs8s3I0Z%$6z#e0p1yu>QdK=_njMk4LOYe_ARr zmZ8mR!T5(rFr3br#gxf__**g|glP6&Jx3Ftgc2=WT5$8usa?dpwObX&b)`Js-Ye_y z@%)n9nY@wJy;F9?%rR)@Xy3j%23kkdc^0dHD4TYe#n2#yKmoD5>hOPpg{&+%czn)F zMb2;Z5DGb4hz#D;v8y|Ee;nSCiHqj-HhQSs0l2~{y+r}XJ5sD2r(D*1u1%95-1Huq zZ>kd5-`V)&*5`XLSG6iUMfFIbveH=rKZ*{TONr<0sY1p@YD3JBL1TN>rJTZIvo-yN zywDWE!BHq9^~52Y-oT?AA>{AKhS^$RjtyDJvBD zd#JvkMAPFI<`XpK3QdvEdOWkm^>Dg5{*vYvzm_N)2kJzgH2&<{3B&r}j&z{n6N4h~ zZRB^&-)-UWiqP!qJ0$R67oskz`cKPrpr+A40mY*vs=^kMdZVXYH zYzVAB$I9GqhiXXggCen!T<%Ke@nSets0XP*V@_76F!3heeGqFM6ZF(L>U8#e`hAnnwZ3m^ z)4!mk%rc`Z&dBxw7yyMsUnVOKbLoGX{9R8mz5$|^)0ZX((`Ba9rQaSIZ%PNmb>m!j zM~PZ*mOa#s;wQ#m&Ds^0^}6KyOpI8v2zmo0YGLFp^HzxYQ{wx3v>d*{CU{A#!$PtM zN*2{dzA_>xk;cEBdq%C~0*Py1l$#$&qJ^WUr>|*~mXhioN@L%uozY=dA2F-}b&^38IP z$=l&h0RY+-*wZ1SnYSwz!z&G_6>j9M#d5wti-o?LHu#rvtp~ip#JFK*yd7;>AaIWa Y9iGeVE%%3OAizIy5gFlfAwB>91O8oVng9R* diff --git a/docs/images/images.md b/docs/images/images.md deleted file mode 100644 index e2feeda..0000000 --- a/docs/images/images.md +++ /dev/null @@ -1,91 +0,0 @@ -# ipynbsrv - -> IPython Notebook Multi-User Server -> - https://git.rackster.ch/groups/ipynbsrv - -## Images - -### Building the images - -The following chapters will tell you how to build Docker images to be used in ipynbsrv. Through the currently available images aren't very generic, one should be able to create others as well by extracting some of the information found here. - -#### Base LDAP - -This is the base image for all images that will be made available to end users. It performs operations such as: - -- Initializing the LDAP client/configuration -- Disable root login -- Prevent non-authorized (in the sense of not owner) users from accessing the container -- etc. - -Other images should inherit from it by declaring: - - FROM ipynbsrv/base-ldap:latest - -at the very top of the corresponding `Dockerfile`. - -To build the image, execute the following commands on the Docker host: - -```bash -$ IMG_NAME=base-ldap -$ BRANCH=master -$ mkdir $IMG_NAME -$ cd $IMG_NAME -$ wget https://git.rackster.ch/ipynbsrv/dockerfiles/raw/$BRANCH/$IMG_NAME/Dockerfile -$ docker build -t ipynbsrv/$IMG_NAME . -``` - -#### IPython Notebook (Py2) - -The **ipynbsrv** stack was documented and developed as part of a school project. The main goal was the creation of a multi-user IPython notebook server, so it's not a surprise the only available image right now is an IPython one. - -Within the `Dockerfile` and startup script, those actions are performed: - -- Install the latest IPython version -- Create a working directory `/data` which contains the user's home directory, the shares and public dirs -- Initialize an IPython profile, set the `base_url` and start a new notebook instance -- some more... - -To build the image, issue the commands below: - -> Make sure you have already built the `base-ldap` image. It is the base image in use! - -```bash -$ IMG_NAME=ipython2-notebook -$ BRANCH=master -$ mkdir $IMG_NAME -$ cd $IMG_NAME -$ wget https://git.rackster.ch/ipynbsrv/dockerfiles/raw/$BRANCH/$IMG_NAME/Dockerfile -$ wget https://git.rackster.ch/ipynbsrv/dockerfiles/raw/$BRANCH/$IMG_NAME/$IMG_NAME.bin -$ docker build -t ipynbsrv/$IMG_NAME . -``` - -During the build process, some errors might show up. That is because some commands try to open an interactive dialog - and that is not possible. Just ignore them for now. - -#### IPython Notebook (Py3) - -To build the image, issue the commands below: - -> Make sure you have already built the `base-ldap` image. It is the base image in use! - -```bash -$ IMG_NAME=ipython3-notebook -$ BRANCH=master -$ mkdir $IMG_NAME -$ cd $IMG_NAME -$ wget https://git.rackster.ch/ipynbsrv/dockerfiles/raw/$BRANCH/$IMG_NAME/Dockerfile -$ wget https://git.rackster.ch/ipynbsrv/dockerfiles/raw/$BRANCH/$IMG_NAME/$IMG_NAME.bin -$ docker build -t ipynbsrv/$IMG_NAME . -``` - -During the build process, some errors might show up. That is because some commands try to open an interactive dialog - and that is not possible. Just ignore them for now. - -### Registering the images - -To make an image available to end users, you have to add the image to the application. - -Open the administration interface (`http://"dedicated node"/admin`) and login with the superuser account. Click on `Images` in the `IPython Notebook Server Web Interface` box and create a new entry like on the screen below: - -![Django Admin Interface: Adding the IPython Notebook image](https://git.rackster.ch/ipynbsrv/ipynbsrv/raw/master/docs/images/_img/django_add_ipython_image.png) - -> Make sure to adjust fields that are different for a given image! \ No newline at end of file diff --git a/ipynbsrv/core/auth/authentication_backends.py b/ipynbsrv/core/auth/authentication_backends.py index ac06b63..68a78d0 100644 --- a/ipynbsrv/core/auth/authentication_backends.py +++ b/ipynbsrv/core/auth/authentication_backends.py @@ -1,6 +1,5 @@ from django.contrib.auth.models import User from django.core.exceptions import PermissionDenied -from hashlib import md5 from ipynbsrv.contract.errors import AuthenticationError, ConnectionError, \ UserNotFoundError from ipynbsrv.core.helpers import get_internal_ldap_connected, get_user_backend_connected @@ -42,7 +41,7 @@ def authenticate(self, username=None, password=None): if user is not None: # existing user if not user.check_password(password): user.set_password(password) # XXX: not needed. should we leave it empty? - internal_ldap.set_user_password(username, md5(password).hexdigest()) + internal_ldap.set_user_password(username, password) user.save() else: # new user uid = BackendUser.generate_internal_uid() diff --git a/ipynbsrv/core/signals/backend_users.py b/ipynbsrv/core/signals/backend_users.py index 516f7d0..f50f4f1 100644 --- a/ipynbsrv/core/signals/backend_users.py +++ b/ipynbsrv/core/signals/backend_users.py @@ -78,8 +78,6 @@ def create_public_directory(sender, user, **kwargs): storage_backend.set_dir_mode(public_dir, 0755) except StorageBackendError as ex: raise ex - else: - logger.warn("Public directory for user %s already exists." % user.django_user.get_username()) @receiver(backend_user_deleted) diff --git a/lib/scripts/create_postgresql_container.sh b/lib/scripts/create_postgresql_container.sh index dacccdc..ab6a9fb 100755 --- a/lib/scripts/create_postgresql_container.sh +++ b/lib/scripts/create_postgresql_container.sh @@ -12,7 +12,7 @@ if [ "$EUID" -ne 0 ]; then exit 1 fi -CT_NAME="ipynbsrv.postgresql" +CT_NAME="ipynbsrv_postgresql" echo "------------------------------------------------------------" echo "Pulling the PostgreSQL server image..." diff --git a/lib/scripts/create_wui_container.sh b/lib/scripts/create_wui_container.sh index 8b60f93..d489ac4 100755 --- a/lib/scripts/create_wui_container.sh +++ b/lib/scripts/create_wui_container.sh @@ -25,14 +25,14 @@ docker run \ -t -i \ --name="${CT_NAME}" \ --link ipynbsrv_ldap:ipynbsrv_ldap --link ipynbsrv_postgresql:ipynbsrv_postgresql \ - phusion/baseimage:0.9.16 /bin/bash + phusion/baseimage:0.9.17 /bin/bash echo "------------------------------------------------------------" echo "Committing the WUI container so we can create a new one from it..." echo "------------------------------------------------------------" sleep 2 -docker commit $CT_NAME ipynbsrv/wui:init +docker commit $CT_NAME ipynbsrv/wui:install docker rm $CT_NAME echo "------------------------------------------------------------" @@ -46,6 +46,5 @@ docker run \ --name="${CT_NAME}" \ -p 80:80 \ --link ipynbsrv_ldap:ipynbsrv_ldap --link ipynbsrv_postgresql:ipynbsrv_postgresql \ - -v /srv/ipynbsrv/homes:/srv/ipynbsrv/data/homes -v /srv/ipynbsrv/public:/srv/ipynbsrv/data/public \ - -v /srv/ipynbsrv/shares:/srv/ipynbsrv/data/shares \ + -v /srv/ipynbsrv/data:/srv/ipynbsrv/data \ ipynbsrv/wui:init $CMD diff --git a/lib/scripts/setup_docker_host.sh b/lib/scripts/setup_docker_host.sh index 2f8a839..8a370d6 100755 --- a/lib/scripts/setup_docker_host.sh +++ b/lib/scripts/setup_docker_host.sh @@ -45,9 +45,6 @@ if [ $PS == "deb" ]; then # autostart on boot update-rc.d docker defaults update-rc.d docker enable - # enable memory and swap accounting (not used yet, --memory=limit) - sed -i 's/GRUB_CMDLINE_LINUX="find_preseed=\/preseed.cfg noprompt"/GRUB_CMDLINE_LINUX="find_preseed=\/preseed.cfg noprompt cgroup_enable=memory swapaccount=1"/' /etc/default/grub - update-grub else $INSTALL docker systemctl start docker.service @@ -60,9 +57,6 @@ curl --fail -L -O https://github.com/phusion/baseimage-docker/archive/master.tar tar xzf master.tar.gz ./baseimage-docker-master/install-tools.sh rm -rf master.tar.gz baseimage-docker-master -# pull the base image for our templates -docker pull phusion/baseimage:0.9.15 -docker pull phusion/baseimage:0.9.16 # create the data directories DATA="/srv/ipynbsrv"