From 81c5c3103c8046362017f216027eb56169ae3b33 Mon Sep 17 00:00:00 2001 From: pkanavos Date: Fri, 16 Mar 2012 14:33:41 +0200 Subject: [PATCH] Added fixes for v.0.7.20311 Changes to logo Renamed "Pithos" logo to "Pithos+" Fixes to login URL --- trunk/Pithos.Client.WPF/App.xaml.cs | 12 ++-- .../Configuration/PithosSettings.cs | 4 -- trunk/Pithos.Client.WPF/Images/logo.png | Bin 25485 -> 16617 bytes .../Preferences/AddAccountViewModel.cs | 3 +- .../Preferences/PreferencesViewModel.cs | 14 ++-- trunk/Pithos.Client.WPF/Properties/AssemblyInfo.cs | 4 +- .../Properties/Settings.Designer.cs | 9 --- .../Pithos.Client.WPF/Properties/Settings.settings | 3 - trunk/Pithos.Client.WPF/Shell/ShellView.xaml | 2 +- trunk/Pithos.Client.WPF/Shell/ShellViewModel.cs | 70 +++++++++++++++----- trunk/Pithos.Client.WPF/app.config | 11 ++- trunk/Pithos.Core/Agents/BlockUpdater.cs | 5 ++ trunk/Pithos.Core/Agents/FileAgent.cs | 2 + trunk/Pithos.Core/Agents/NetworkAgent.cs | 7 +- trunk/Pithos.Core/Agents/PollAgent.cs | 10 ++- trunk/Pithos.Core/Agents/StatusAgent.cs | 8 ++- trunk/Pithos.Installer/rnotes.0.7.20311.html | 14 ++++ trunk/Pithos.Installer/versioninfo.xml | 22 ++++++ trunk/Pithos.Interfaces/ObjectInfo.cs | 8 +++ 19 files changed, 154 insertions(+), 54 deletions(-) create mode 100644 trunk/Pithos.Installer/rnotes.0.7.20311.html diff --git a/trunk/Pithos.Client.WPF/App.xaml.cs b/trunk/Pithos.Client.WPF/App.xaml.cs index 9461263..6fb9e80 100644 --- a/trunk/Pithos.Client.WPF/App.xaml.cs +++ b/trunk/Pithos.Client.WPF/App.xaml.cs @@ -112,6 +112,7 @@ namespace Pithos.Client.WPF var appenders = loggerRepository.GetAppenders(); + var lossyAppender = appenders.OfType() .FirstOrDefault(appender => appender.Name == "LossyFileAppender"); if (lossyAppender!=null) @@ -183,8 +184,10 @@ namespace Pithos.Client.WPF } private void OnUnobservedException(object sender, UnobservedTaskExceptionEventArgs e) - { - var messages=new List(); + { + Log.Error("Unobserved Task Exception", e.Exception); + + var messages = new List(); e.Exception.Handle(exc=>{ messages.Add(new UserMessage { @@ -195,9 +198,8 @@ namespace Pithos.Client.WPF return true; }); - Log.Error("Unobserved Task Exception",e.Exception); - - var message = String.Format(@"{0}\r\n{1}\r\n\r\n{2}", + + var message = String.Format(@"{0}{1}{2}", WPF.Properties.Resources.Unexpected_Error, WPF.Properties.Resources.We_Apologize, WPF.Properties.Resources.Please_Submit_Error); diff --git a/trunk/Pithos.Client.WPF/Configuration/PithosSettings.cs b/trunk/Pithos.Client.WPF/Configuration/PithosSettings.cs index bcf1f25..01866a4 100644 --- a/trunk/Pithos.Client.WPF/Configuration/PithosSettings.cs +++ b/trunk/Pithos.Client.WPF/Configuration/PithosSettings.cs @@ -95,10 +95,6 @@ namespace Pithos.Client.WPF.Configuration get { return _settings.PithosSite; } }*/ - public string PithosLoginUrl - { - get { return _settings.PithosLoginUrl; } - } public string IconsPath { diff --git a/trunk/Pithos.Client.WPF/Images/logo.png b/trunk/Pithos.Client.WPF/Images/logo.png index 58ac3ea7813dfa270f07ddd8d1d3ac7e19a3da18..f340ad00f525bc9d5097112023e6f98630c81e23 100644 GIT binary patch literal 16617 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 KWNM|%BmNJxK9RWq literal 25485 zcmYIvV|b)Z&~BWGZB3GmZEtMbwryu8#>Td7+s?+$#!faHW22Mz`_6UFk5OIqbWe9z zb?L51B?U<&czk#;Ffb%(DKQl=FbJ)$??nKJulMy|PhMXiP?o~-!eC$xKM~%Hp}&5^ zIZ0`|e(|sT_X3Z1^v?bw!n#Szi^FchVyqd{Z)K1dCL0-an`?}uTdS>zJSB1^@h zGJwMIKydV6D5-A{V#q)E`wz2Skp*~8vPGXRwvr&*KUd#_#w=#t)O*$h*ig!lXPrvV zS89CJAN<`fRv3oTP{hxq|AP0x-V@LH3jGac*n|vY*mUXH^FcWk$bSmjhV((nhjjxk zaSi`Jif-o@VQV4Jkm|?(qw%7i3zh#b`>8;EiEsaP%8;^6iKw#Syy`CToOb$u1N}Fm z5cPe~UR8L}!{H{R%{;^dAUrkE-9q#-SSfv>6Zt1VX=2=p4~oHe{TDQ*4=61O1@GY5u?eCUN#RW^)4W$DP>QsJt53BHO6|YB?+? z;oh9eo;+NqPf_z(aO~G&b^`c>ZiyVe4!?&$mLdU;iTlitWymbV0;C*!zkFPw>13 zMt=5|rQ95xUGsy@^8M`=RXPc`Ol&!`zmIXZ$jwLmD2||v3d&|Qvwakr;|T}nEK!o$ z5lksA6Z&r$JhD#Xjxo+?Fn+BobSHo8hY3}0+~6ZS6M7b{i6NQY{*_m+>H!kuNh_QQ7n)V_1YKrYNjq@r zeMv<&qvR_w^V_psl*O5(W#R+o*P)Y@hQSLXh&Ao%3+XpxAK_7K9Ckde6>=aFCfndoXIkz&T2 zm4hhstcrIluFQxHe0zCeS7xOsYKQvTse%Wc=F8wYGc3|VETFbAFgd6~urJ<&x2=}? zpWQ@g&Ipbtj)6}L(9Ut-=-pe>V5-Lj_;gOdvxqA5YvUU+64f2s^zU zJ-t0Hk6N)Z^_5eXbW=Z3-RnT#XfKGi16bUtxUqOk0&EXwmyE4#CuZ&v?ukgldN`|3 zOK|_iDT&KBlaZKci$@%;q9Z(X0tAe_c13jN79%e=j?Pc{X5T+1TX%G~K6*!pNYZy+ zEM1uby*!=_XS)A6KlQ%qy$T-jKl6-b8P=10G`_E`+K=^_`@eRrEDAPfzvFrC312M? z9oLV^t>&`+_WI>^0j+w-sCvJB_6)fQ=a{Jym$9Ij$vT_i!kBSaml-`cQ<9)3PNjLL`bdix)d5gjRFX)` z3ORF0cdp)yHxavsgR?kH8LvIEIFLM9ao*gK_Pz1`?KQ3S^Jehwb7u>IB-{Ip$)3sa(gXdO$pvNNqRVIerKulupchrez^7 zZld)$0ZSO(%N}^W=-Tz2_ijOQtLt;);e3bhF;GPv=;o#g3HVJ6yv)qG%sUy~O0Bqw zj7$xlkC^0yvcr_c;nWDg4njHN?=tziNf7X$6foO@PLPQJOy&`ZG(2oRVdwPZ+Rwj3 zbXXAWy4y{r7(Th&xMj+1Tvl@% z_~IZy2DZgk2jT3TcPeu8n16^#M^o7ME=#=jLs;aX2bD^>&(A1vK16qwq(><2SX@k> z>*{0N7k{L&hU5mg^V~&NWy~5#uM=bUefn&roTgW|Up&B_z#RO{IC$hG^W-J-SR2f1 zG4PM+dbYhw8Jk|s<=pZ6<@YM?y5yjG`Cau5+;zd&b;H?p)Y|pYoAGaB3H6o^o@L!s zJ=aN=uIy_jt&L60`jL9uE#1#=Y2O3sJU3^uscKL7{V1Zh9)YUi`K~yX5Vqs78<%@2 z?J72Ne_&e{;9*nEfKar8n5h*=Z9=nPfQh!(mU&PIcI-1eUkM;5`+PoRhE$uC4FCWI zgRw#dejd(j={JnLnjrlAhDoS6&6k$!%R+G?0{@Za$w={8Q#@D{2`!lzp8>abf+Ncn$`d%aeg#2w+>xnG*=sE+UY*uw=(I{y`)9p5dstCBR$CVP!1`9I-&LVu0A35_fM@UnOjl5 zI<0X+lRZX zneM4meS=uxy0j+M%M-0(^pds-MMZ8=3j~+Pzwe#qlii zF^2$!geB`ijay`=3lL}k!YO4#xPW_|ILxDpF=f!2kUTTLkAS3DXX?8ZGdiObsN^t)irB#K zuBnO1Z@lHzRDr?+R6CHGapQ0az|m_BS^0R6JYv5pDP3&l!`SVXblj$p8ep{|BEYBJii*n|4znky34V2Rd)|Pr<|=XHd7{(poI5l7ME1DrjV*nflL3yH$U91mgWq+xcc91gc>nOn_%6GpEK zIv=O0mIcBq;w_dKx@r>N4gcCI(sz-FY0U1Tt3EuBZbtGgv|DFd61~BI28F!R`vk zatMRV^?fl`4>%(s9kK6BS@fo%2y_p_Ky4As<->xS;M`Gj+lloKNpc;&7ywx)QC?r$j?-A_hFG3(+-cmk} z$WA3X*(Tn$h3YFrDapd`&F1J@?2hWsFzUFzgW3?dS>tDC5@(^7H|yB0u`pOxUs&4Y zjWot)i(H~k>U1YTDzR{{mTI=E<**?gNq^_&mD`vCljy;`ECnsnNNEN(WK7jTM$v4!kjn`Pzi&9N zc}eWGb56+5lb-^lQS_(xY=-@S?#A4!L&v)i`11nS$y9&2nMcXvu4UiN!CyjEur|-N zmS=2haC&fIYyWoec5-3zyzr^-PB!;5M^`UXU(1Dwp2q@b)V?;X;B2@vcQuKw zV3MaTLN|q>=s4y$p!$c&MPjxgK`!Z%3wIB`>d+b&%P`Mn(_QV0_|x0|Wuc{xx9`v* zmfv8WQxnEIt?!sJlvG7SWx0Z|+ZM61Q$;yVm3h9i7d{ETyeOo=#l!-u2Fh%pKYAEc z=Lk<*5F>tD$3@Qt9CdrhKPe1zFt+6+LzMDKL@f}>O!eqmCoXVL(P_>y;UMcIL-&Q5 z-1PlCs}*jF%#nqBZN?8rX=gfpd-*-d@)ke0NB`Q*tCzD~s@&XHjI3c4&qZoju-1RiI}_w=Gvycm>clGkNPK)J@!2 zlN^0+sp)k+iTjHS`3+2X_Lz&`pYHF(HOC1n!I%Z)yI~w%B(q0zY{uWMfy3)hNlKF5 zKyhoOh4M<|X(fIUs=G@GR(B(Mz(c(eu~aSnC2s5MFo&6*#B*5P%od;h&>s#bdH_ms zq)*I1&<#;0+#|2xNd2x&YVLeJW1mF9`IR)CH@3K@d(A4=g)4qKO>Ii6QRxfvcjclL zMZBHHd@l<9BFnpTv;oG5m~$x~taQo_WhF&=-!%`uzGh!FJ45BOP_1B*&oa*YNP7r+ z7d0SA4g$LuSKqIqykm-wvO=Exr>8+6*tL})?Z=#CtWWQJ&%|%N9{&gh*zIy@RSeQ?)aQU3MPEEm7SHmQzimJMhImeg9*O|=Rn9}K*+I*$ug{AYAFopz?>c)B~n}>im z$M(QBul!vyBIA{iC+9|R`xn5~M7861}{L+f7HPGHeT!FeZ}aHi+g-z27y z!X3gyqgmB8=1>~f97b1HZ%bERpiOZivw;}{GiJ9Yqbsh?^IG8qfZiP_OE&EA2!>+j zeDroES(K?5zY!0pDj7r=K7h=%J=DF@ieyO`?1~e zsfx_69(XG2F|5h=k+-5MSfA}5)O8*Ia$9tKq3GI{dm>t$fw99}M#yHF&3a;R2w$fw zLq?zCypoBj>yI6nGPkaJfNzzFcb1-WnZ@;!aji6Mt2N~%gRhD%VwXOTL@Ft0b^r{N zW46a6hLiFTGl0!RFJyzLCrAgY0h^7gb|3dQiVh7r{Fdz?KNKEhYmd0(bHe}zN-U6F z59yCN{AW=4D*$hfZHaBr-F)!He0X21#Kj|c35hJv*!uyQQ)`WgRy+nX&9$Z(OU=>Q zd)cu^;}PRkTGv27r@q5cy*aW3FnJt4fK33I9d=C)P8V6ZH0RlEd|JvC*%~61j|{^c z7cbLWj+kZOXnlKo@x(wjc^daA@VXFgY4Bp(c0$|p<&zQvyLVi(K9*1zPKfLE{35#E z%1?;*YKV@h9joVux!RXZ33JP4d(3XYMSMjc@qw4HsK0c}z(8zlYz@mf+^+E0g8df* zU+QBXmT%zYO@Lh9lHCx1f!oX3u&l4+v6~QM6P?veK71MS-K1i|6)jXehrCk3_c0|I zR-{4xE3YD76d(ln!OZzouFypK?cT|IHeIV&lTYv}4>5ztPt%GY9dtfg%~)RGA-kIL zsbPV%mBUT|7qA%oH~1IaRIOHacexk4#Tv2pcw#*n6rHi`c4~nA+b{|t>~}8T-Nmb( z&)uz0={GyUd+|#E16lB#%FJH?!uD^pIFAlWSh<5C(SxK6d4DD`ELoch6F&$}vc9|S z7F&ufmX#8wd}J+|XXUDG?D%dEgeK4aOYU6tAIDZf5nujz7^w!vb%7G(*D``+iLn6w z=KG9LTc2xt+7;P@5l36DRE@UKDZ>zbAupa|Y1kfd&lv*AHcUl?hW9hpM1C}_!*#*u z1?2S9T$39igJ6Dq;f9LSwc2Z(OSbfMsEt7-mEO$Mj^@XfV*1owjddrJuBEa++Zo>% zoIfmAFm@Vp-+GUx6+7-w_VFn1TBv5Y+Oo(DSjR3|s0hD=nxia_{X}mUzE)et;me~m z#&>7O;pUwxUw%R9bI}$1nP-5Q(5#k8pN_#rE-v?GNBCLU~-s2!(*0d#XDPeK$kQdZgd47d{lp}bsKlWQmAaO) zP|AZl~L8^7SBc%)`*}9o1WihStHzupD@)@yN|CGav|Gh@&BqWi6^p zWSkwoPT2)xg-pOF3>+YU30`)a^oVCII*!787(-~VGxDOTBLj-ei zV!)5gg9%7hq92BTah~|+7f@ugRB&1|twW1CC~sH|QJ-YWW06sge>gxj!1297>qA2W z>F<%$8c3Kjmw~XATO6sNg;ii4S7XJQ3XMVoH|iN&LZ{(RN?zZ=wm7+U(eJv30Fgr{ zc|+xzA`2|7L48W_+i%7KXy3Ow-zBcFQ_qH?L#NOo?z`Lm$Q_2sL2pBXdh^Ra39E_w zTWaFq;89IJsmft7%^HlJ|6GH)GjkxiB0p2_R9cNms{q}`^1h7X-A1@ksxTVnJy8pN zG;|*9nom==JOy$vvx3@UITSv~k#vuk^ubkX)3UmDTiW&#V>9>^j}}#gQlv0`PiF0I z4>ksTe3)9^_OefF4P^UaiwC1Y2hyFgCK3T)ArcS+D+HQ6tWut0qDz<(?+*Mh;~FpP z|L{EvKRC7Y^Rl79PTiM&OpVOchg?R{g?@7WoOuR6;e%DB+Y8EE=bz&@5g{4G!iZV? znW&;1Jo|HV6yOXbd4B&Uq?ld*ynqG~iv9rwtI1BnAOgD|28T;<6`;ptJK~KLLIoro zPD!+QgK2#~50>U8+1tW@Nz>quj%02wM>=5}N+2NDSPvuc7{#ngu8%mSQ9?mg(!fL= zU45*lXB<=-s{R41W4^;3H}FKE9s&K@6N!bp)ea2)4S6cqXI4*t(G8)6bYR;xqA{8H z>BUI|m~Wsj^t}hE z35_-UEQWuY2|^AxuL^LQ+|RYt9)=o+a_*NWPyf_k@rQ;7MB&AaB-EGhMH`Jrikn-%D4MOJd4PzC4}R|nZ@R<9G9y!6 zI)E@l`#G&`u1n%9R*Kml_lm=vG5UYnmxm{j@;sYzS-uQv*fv5YzwcN=vfZ zl;2L^?N$VVXRGayYjNO4LNq>PU8WZo*2l-=C5KM$`BCvnAa~mgG@Gp;Lx3+r1ght4 zI0Z=cPXn7&`u1U-4;*4JRUuA>YT^yzXbK>V?c}+*(XOVFl$EaEtBBHhlMRqWqZ*50 zF`kX08Y%-r&=9=sZ%|10la~+wWb@LZh8Rm(fEB{;YawrMA5vhkz=};IXXBA-!3j~v zpbkPny<$C@`Jzu^7NF&m*9#3U{HpVbK_D^GO4wM%3Q>oiPtzK$&u2gk0=!41s8T}x z!wRRtQYE;V^fnN=BHXKsSg1(GAJNYZ3ZZ`(%mCnQCRgI@K+hImZ{IGF4g}JGOf)Jz z##!<&j=s@{CSt5fYB^6GRWD3sP^7WR4sFYu8*7WuqD-Zpoj3n705do4NYZ`xM4Oo2kEW+c-1~0ZY6YHnp8OYX{t5DJKjVPZn}}XAAJ(|| z!Oax{^7!sBuC``7qCZFWVD^^B&Zr9C{e^E!uCOs*apoj$fX??_h#D;e{@)+2k@&kDR9?B>6> zoF1lHT+$)1RmmcFY6xgzp2L(KvS;gI%bJ~h8)4_Qc_2K4Z8X0T#bax&_O(+q>CjTw zW)83?=4aE`5C|JzrI#bYCvy;3v9flrVSuhLgCITbcsth`2S=tq6T&r|B$ElqP3kBN zjyDXvK`Ha`IuXl8Hd%woy%0sEc&x#7h^Cb_7vcpcT{73~hk1tG8*DHm61$0%GNm%$ zFv*thm&@jkNbKXhTTayA{u{518W<`{b9FaSZQHZ&iNqyTiLMO{Yw7uon&(}7RYEI6xrK)aQVC|ClEd48& zmqnb-^^<;$5{Jmb5mDu7a)0Y9s_@GDJEKOvD^qeWqi2nS1_*VxVerJ5LlYzZ?rTD- z6cC`sdv?7gPEG*h4H)~O#N0knhly@f((p?u#Noh~Mg>P5@HlqZUv^3YhNvD#hNp0{ zOfH7~5DnOgo{jw6Z_M=D7D@s8srnHD@2xociIs|8DWr_I8#>jOFQ)%)JQSpf&>O+6 z1N^%S*PsTKT}m7I8hSmOTx4J|1=fP?hUrnYo1C}~CM&EaY)})NPCL*6H`FHRmcfUSpXR5Xh8ni1?;ipjctm_F9>#!hr$!&6700i3l7u^ zvvzaF4lsARDpY~Zz^fON0TT%xH_dwRkugV|K(fHZ#BK8CpRaI=K-AheWMjzQ*oVi- zSRIo5(Lg3Kj*^T-Y50{Dq_oXwVa66r+5y@~0t$cg+fc%31}k35Q~$tA4Sn0=v7$vY zo(LKc>Y*RFfOH(SrO3S?i;;Hbh9VcPs(`)bkL~|%kO=`e|LyrVRD6(s@I7PbY9@tt(Q(q5#wK{HxaMBzoTPh}jYpTlKmZNGFR+;-FxH^i>||-hAv~Mu z3jW0j2Qzv_r(0V>w(0@v`nm^j!{p)ywFqHT)qrB(a3ri_)*+1feZtTHFBC8m?jEE4 zQuJDl17X2yxl8h3SJ}Zajez^91K2;@%0&)B0@Us8ZbjX(39jXt@@uuqHEHcdWI9Rh zDqF^2fpBiJJoV z27jJ-1ln1gg#YgP9HqI4Q6fa;^}VZ1kBel_v2dSSiucF_(P>~NAa(5d$H1o5QWAg z-d&J5Pw}vUhiL>L$$=hGP8BlE2H%$MDFp}3R)kp+^zRgdMy!cHgw_>~Rt6}Nm|0)e z!(}@Go!^=mc}Cvr3HjWu#GS~FmWlVX(IX&`TlEbTxf->huSC#6vUCu#Om&D5&Oygy zh}fyzdMhEMMBoF?cqF6W^g2;v|6O#9;2QlvZhU@l7#<7u1xj9dK`$L!thPbMGh%-~1PbZp*81v_vFVvye`0x>Y& zN99#L4xyh~+{C&GsoCntE8d(kSti!D^b^fwdG>p6+TUwl?Y&YyY8-WTJ{Y$Tj!q4VF2G2;B|4&> zyka{$W15PH4u*b=*!wdtkl7@lPu4MkWcZXgt^iRRXd#n(%z3mt)Ofqlzq-D~e+Hix z?9D0R6Mkv5HC99NU@!#-#Ix;03Vq?>iSU2WkT)Yp@IX=5jgwWOYlZXiu@A8LdWYHi zcmgQjp`ha0XLA8l+*o>umgyfDhS}Qa?IG7REd6g-@{6CF9L6c4!XmBJ z;O{NU=z~6_D<%f!>Z-;vj>pRdhi&17k4XBP-vdlvhi8bA+6*#dwgj+xEO|ZpXg>PY z778j3O&6`H%2*0^Q`0nnX{w;$6}@Z1*FugiH2ZKah;Jkp!)kA#)c)R)Pcqcs zK*#~X-Co1l4J9B7EfO#l_a|S5HZsI@Z2}HPD8K-S|ARV1#KMjuG%Fe;PEwZA{+Fo+ zzD1TauH)|%^F=EJr30#xa%K?o&HRrEtq6t+>V{i3+aWf@x-wi*el#ciIY3>(RA}tp z%jkGW)M-c~=q+*hZ9n;KusEdfFeLGCKkB(q2FgY#ir)T9|3S;x28snS?^c-PsJBJf zW2*&Qgr{L(DR1Ow!E(HQqAr_Z-?*S&y&A2TAVG;{FW^m$+*c^N( zXHS5=nz(#_S~O^7lRX4c{kT1G8ky2~yn%w}^wi*wg7XwUPjs6u^?j(@k$p8pUr!O7 zo4`Q?4JRn`I^@gPz`0~Z&|(~(64XR0!ApC2A`~QL@o=&UC|E@C;xS0hVE_Pniy!gO zuyDu63>S!UQW;ki9JUv+lo|TMC5iO1PoT>*fRU!M!6i~)3ZtUZq85HS`wE9RaYW@? zqVgxz(+ua8=CGl2gL~`&0>mVQbG2nqYt7N7DI47}14GMDG+;bBgFKo0H7ZJ#LI2e( zjBp54c;K4*gN)nU6UD~Urm>2#FEdKBBwjLtc1L75W#laudG>go5yg03b`IhV@moZg zwJMup*e672JUX3v>mz+6o+a=VK3bSZ^=KW!)-$H>Z@vM13`)PlhmaXG6*8)YpfDkx&L+87}z z&E_x^#{WYW8VxU@MItia?mjL{?6Ish-`JuKoFG}UnPd&!fjz@3%NNP8!jO#&G!QPc z|FiH(;ry3xIW82z6yhZffB+^@Q)>|_t}@cs#P7j-53fXQYO6It<*p=21Da_9DEksR zeMRdD(ZF z(;yAkARXB-A>BYT(Lh7fKvThDZQWpf#&U+2o1B1`lz^3#L6nq2kdi`@qK}%QikqT} znW9RV60L@wqlusLQ;k?ZNDWP23s2uFhOzRt^!#)`^E7eeG_mt^;U8{sV_16QX!>pG zT9k!irCnr=U2KhAG)L=*M$4Fn`>=-l=(5|M^5k$Qu^5*|l!{Vtd>&-P*iXeGwUWt6 z?I}BC%cb}{?Y+ONc{7g5{ZWiKZA!sPAzIerPFSEXzo~cEgw#+cAUo>Ih_)9~$hXUs z>`wj^&+eWp<9doVM?ZwseLmk!rO~iMz4c|_@?T7r1zI8dB<3*UzEYM`kCRh$y9b3{ zCbmpZ#J%_OAbFK4{DAsQ?uEPKb7tD|{_wA2@^>;{HKhOZalKF#*wTLDi2eBS`|acP z*zmQi12Qke|G>2=yqDSaS@x>P(3$A9^Wr&>d*`F|Zpo9#GT@Z^731{<)((fHIb6W3 z>n-BXxoPW#qK>0OQ<$J-$9o9HErskoUFup-YWsVt*zm^p;S!>Qg`HNjoCdSJrbC0~ zL&FA4{Wi>SU0L#KtofD6=PnebCCe=&t__t#D>`Qn4eqY0YsAp1zIhCP-*$hCW?PTK zRg9ob_HH9Q$$UITM29qY>(M==A%Q?k^OqdHs zzLWV996`_ti;;?*PRMl}izE8e?vE6J8m{1a;Dr*T1j-g+8$qFL z{eu<3Jd5Mqun1*o*{Kw5M8@r!*vD7Z^xyy%$33|c%o4EGA_!7S28TI1^&(D}U2(GR zpw25l(W;yKX&v)&ufUS#FWl+07)XbR2hw1@xs#^c?^~0E1;bw&;`A*b3>Jq8U=X&k z9*W^kN%ZGnNvJXj@j=6nf?VW%2si{%Kmvcgg=!uOC^EOYhAHC;HM^ z_lNB%=vwx%OX!(lR=@{r?~Fuu_PbHXF0@FunAZ_Y_rUOPuT+G<+&hQ@8Vi(MLP3gCbxD-j@LpF;cztuz-I3tW>}%|KKXITf)i;aU5)Q}HDMr-AGMc_XMJb>`n?M66OwQ?pk+;!v(Y_Q89Z0-xsF$$@}Qtt=W0wosF9@_Y|9OJqWzV70T0TI82b9AJnQe|xN z4nBOw%`Tz=JIMZ6Od+QeQy6+N4je;ez>U2rHPb=UqgCUOK2)%^`A!sJ_U$9P&f1Oq z5^z$(O?jAVsh|B@dyWOd7ouh2iM8GZx%)(tIKpBzJM~_CptF8cG=g5_;=1fM*Lfru zHA$mdZsJ8aru+*J-1#4XI)v=YPmG`?lPQJCFs^`wv{E3=OdM= z!kwT>s#j6>;naoKcr{Vv8X-wtAoSLQ=h_SmkanqSJ^KGr)>M!%+7(tJn^=5p_9I;P zfrhlGrTT}{JDk&Is64=-savuVOuLC5^ z0vZC0zgHH=n2jUWSy6?TkNmgj?GRdtO!0H1A5^qGp9=O$oi`}_38!9>0j_LVR3 zi+CTC#rNn0nY{%OyyJQ)p|IRJsJlg|1kF}cv@sLT)*_gM)cM)#j>(NCyg=r`IRmq^ z@Uz?GQ4}(bZM^8J6qd!HMY7Lr6%CUs8xlNp*o+#7{^+W?b4{Im#TC zY@UZrJK4I+Wu5^YB_iEwN5+vY)FwA4nid$J1S7$k>PO5v4e6-e%)%1#|x7fKA2 zJz==9hS%Scz55|krx$tdgm0R!S)XC6Y25}z=e$!|1b3GVp~Q9b3Uy6#fkm$6%dBfG z97~&mteLBv5wg`b&HgoV5U95r2zC-J^I|tTLcr@(TyOo+DS2*iEOCzdE!A0oI9zfP z-lpnT4X3cz0BbVKa?n~R!jUw})hY=OG6)gGoW1{?lpxn%0Sesn{~ZX1?#I*|t*j$u zPIpG>jaAUYtYEZfVumQfDM!6sIpC!wB_XzxL*}BeW*NmNsSM4pplH@a!Z1-_l59!? zX6!FjqMJg*qyB)!12@y)h_dA~;&-RLx*Se)5@^Hs1uva{W#}LLDmP}o1%H(r+wc0~ zk2#_)Fpdj#y<#R*h)r2Wbt@BVTC7|DeF4^37|~pQyBF!p=MdF!)ck>#&$;2qsqc?C zf@i%$Nr%iuGm+Y>7A<{i8Nq_(4-w+`kjXWwFYnK%lA+LAxLy!gm-r@=pFRCmUET5I zQLj%E{~z4_!paOyI6D+=w5e?S5bAeo#Iijsq8RmqS~TyH+-CCBW*H0Oqls81oM26~ zJr?+%n)8F`mlWuy2-L|zp;7$>f2&WR$>141nj>0&D&y<<7z^2^c*G;u*C}2ya=a5vGjP7j-oJ)d2^+fX+gcCMN$ckb9|^u-sx$u!Q*}*YHYuaA zX`}I|qq*Wx-6uFc96DZVn?9qO(YBoC!D;XQ!gRHe{W8egv-)+SBRjegLsS!s70Ym@ zF0WjIv_~PY8J)#~0!dRk@E0x^iY18t>Lq@k(IkZ@V^auBgdO!NBtcyt(PW3iV%LQQ z51?GMe@PlIl+W!h34l!4_;;Nz4kHpEkO&8|!GwJshF5?Y1ej8pF1Nc$8BE?>^A?pW zO@+O#A9_OFY%wah4p+`BLg41TJafp{BZZ=zzw%tOwf{|DR$u1|4%Ot45Fz6YQ}sr= zpsdy?NWBh0U&z?%Wb0_LbiMhfBI;(Yo7zy2zo2DOU0z9FQ9YHm{ik~Riut&e z;7+G9nxIOSz-F?_rn1t;cJczh(MET_iqA2*HG9^P8`9eQfjf>jXA^7-Ytg`c9TE?4 z1CVv$6?Jen zDS;vQEQBv{j9|qFP6l3ljoAQPr>T{Unf5mBD@z?6C5QBNN1}~bcrQbS(~^=6-_D1< z(AL9jb9(gKOA;I#_w!V4oVghkc@ghCFE9{uAPgWfUhny!Vj%R(-6YZgb}! z%InQ%bI-f}W(A4XEO7XAmY-CDNnkisU|Qchx$CPh1M)lTY^LLYB#g3zA?H}PNm!N~ z|CSl5)xEsyWP+!FdE+ekN;#fz8$zwC_}+0Mpq73^g?LPz(q)+@HPcPjKedH)bwkg{ zmZr5OWu1@ikN$Gpwh!!;GGc3c*rr~Q{?*NP#>B_^*`D^@X|}t`wu6q7Q?$eDezmQ2 zfQ7lUvAH$e5JVGZGIq70&LEK%#O9!Twvb86AWzGY($6`SFEuy|y5Ld+Vp1q6SgcuB zp!GN8k5`2B(EEgSk{^~#3=OFBf!Q0(>+IRl0iy{Cu+kwB^V8>^kUY-Bs z%RkE;*iYzHSfcPgJHcCy*ZEg_NB>2i{ms;*ownS62@n6_b_Cn>yyjfaG*jy(+pDf| z{1dx+V-a?K{oWW5?;RHZ!#Q?2aDkyW2+nvW&-emJ^U0p#o-ohdbK%#rqG`9e;TJ-S zBfwl?olTNUt^8&yPrIF8f9I&wjJfebmC+gFl{m4!vx{$+dn2}UHOz(yVEI9nfofv0 z&D&wbwMP+kg!e%awZ2>eJzFLBw_9~t@NAW!aBURzmrH5Pfp0@$D9L^y?poWMBhfbjVGVoyNP(J56WF|>hWbTWoL_Pv zEs+^2I-_4DK;mAEGg^9Sf#u#5rbDIre%URK|2gZ+<}cMr?oeCW*A1m!!b!oaO;HnV zrVidP8y$exwg)46Qa=niX0)lC-*5y~(Yn zyT^LT?iY`s>)S`@>gU7(ebXJ2MRy&OJ*Fkzlh^E5gWA^p96wjw7&Rg16!nQvyPy*Z zG{%EeQMIKW4RFZ-`6@O3>?M81zo%P2*`(bL)Dja@_dos*AH#!(pa;K8B{1zF)NhL= zAEE#%D&GUGyIJx#8YR~~OC|V~`1jOYZM~?} zE?bJtp#%`g>!#9tDMl&5HF^pHwb6IwnrF|OF|Qhcj_9Sd#$+5-nYk+kfxW1b$cyD^ zw0FyN^7xzUYaze8J|@5V-NGAJ%YDn;Es9Mox?w*G9j5O4pUu>FyhQx#@Yzk)M4VlQ zBAf9aXn|jmq7g(q7qx&YXG3)eG+<;hIh({|V;7=;Np8?f2wLO;sNHBr=&$@0Lk<}w z|Mc!W{2c*RDC5*UTsTb4K)ntj{QcM7I12JmTU-L8RUXo)z1@m)hj_g=>mX@gnV2@u zmvO{~0NNpFh!`CuH=dt2zMX~G-YIWdBKr@#OpfLFe&1Vrq8S^Qg?;}A`f8e)w;uMD z`_=2Cm)BndN5wVI!JDwNfg(ycXjOBBD)SD*ElG@8+aa#(UNLDW2G^%O56;Eua#3%N zNr92!3@@^cW&(})O%?n(uudC#MT!>HWP!%uZzn`BxEiq7YEa1GTT+-1v~XGl-=La> z>~u;Zwh)o`5(lEZtd+Quka9Vu8#uRQX$s&Mx*kPE%K;%vlR4^qAV^e90tG+2AcBJk zT4mI!rCNSOZNnplre&MncE$nk)VkIg+c2x=z54D{^N-_O)%#r9H;!Cs?o;jGTIN z+lFDJB1~N@SO|pSt-{|{LHG?E2tf|W^GB3GIhnBuqu%bv5+oyX z_^Tj{`$A-f(OUw2SzE+_2^ne$WDrqeYnz*T%aX=3&rU_XIu-Wl^u>qFmws)z^lNL_ z!`91>Sdeg=9_h+s=BrPduRmiBf6jbs2i{;ZNA5C5zlsa>=J?k=!DW&WT;{kr{cUsR z8M8OI42R${h1V@5x2@$dxJ}PhC7Wx~O?6pQ^?8%crIXzaLw#M1J$;4kgE%%&ktGDC zAh23|5Ta7CGNt7QgvZzQQUjk}D}zNr z3u6p=W@gb7=bnk#0N#NH$_;50b9$^Pw+m-Z0aqnYp$%Rs;w++EKY6B zkL}31(UW$uKkfWr+PRVRv*YP!CNj=UW}cnQI5UxTej?}6WX|QuysH!WHztZA#!6#H z%MykwQU)s1dyIIbDZjO*q^Y*DwxO=Fp}DxJBe$tHxuO5Iu?s6y&=WNf21WqFCnBch zdsPiNPUFY1Fv|I-J_-L2hExJGgWm)>B9{jURW*M22!}P23WS(++USGu<+zSQ2103& zuWBhgx(l_*K$zY%z^(%vG=zhwKw=9!M%ERmAyE*)jjorq<20SHe?oiVTdThEA}lv7 z>;Z2uAtniRU&s$>SVs}aiA5|qkKsl|hul=&4m*bS2~!0Dg>m65uBI!Yx;?47HMy$A zlZ;LGQggBqsU^9(EvcqGvAQF^rYp9l3ulwK^RAh~5_kp`2r&q7i#DTWP=fFv7Rm1z zhT7ysxn-1-Ktw=d$UulWBSEaRA~0A{f$&Co2b*xYb&iXzs@k z3~*l9nn^DF%O?PI1v46Tp8-cFQ8FcE zmP>AU7J?Tu$i`kwC>)`wO<9zcFAxjd5F^}=^lf-{+mL)ZVhFG72&uF+QQ5E6V+=ru zQI3;v%-fC9W7wLI=dH)k;hvM$oYW=?5Td&@qdu@kQUjlcS9WTnPioTu6$lli2ug{9 zy^CrZg{z^c>R=tEjzAb2m8AvhNu!=Jz$;Cu+9lz=tTU$YicYKs)Xe}gAeNha^$fR+ zolL2+6C6$P1n!(wT9I8=kyTomS;i+LQbt)-Mme9V@1>gb@|yIDT5qcJq{{lVs;0E6 zW^Zaqt8Tgb-|E&>Z%VGZm#W*6tJ*vU((3kPj}f&!siq^Twrfr5PO9~$x*q>j--|0R z_fnt7xa!jziZcn^D5vfS`I|KGJyE=N#Rc-%Hehm)&ol5>9R8~ZgwiBSCgUEm|+|n#JzAV9j=sQ77h;=)E@|*JqJ~jL1=VuOo!F}XQ?qgqb9>3pl z;+yu9-?p9lzV-Bv@CG4w&hzdPyhhDozcF2T+;sJ+=^M{Zhwqq-+&vMsXCh|bWZZ#? zghLZaM<$Zrnn*o4k#>44w|+Wh$AyQ-ZM8f;0Y^gnOJm~mt3}$IXB$&1^w0e zp_35^d18wx5kxA(ST(;X2{do{hSUvBvq)PP_2D-`2STa5L@dvMotApLACpe3Sf>1I z$PIdiytTqd5k(QS$&4#B)E!|?>yRjAfa3TxWPHU?#1lfr-J=r7fo4VOho}9*b^5YQ zexjLOb8xm7r4kE=Xu_Uom|u_Tk%VM&;KcQ^Hz|kFH?=!nPqMa`0XP zgwaTKM+A!C^j(5*Rf@cq+`vha9BP1HH);o`MX`iHnQ=!;5jhfs;65%PRJyP{4ss4r zc)xCDLsWHla1#dHWMjeVYoEZ&y$je8`T^k{0O3EZ3xrlYSRW7w@lHJtga_9Gp{3|1 zS904@5o0kDfpE0byCWQ&HH~<8gxsv#g)j~8p$@(@Lb;#E?W{n^j|SWpD(V_rUop*@ zjUSPM_ZKKO8Ps`0zZ?bzc0vWhweqRxE-eGBkyIeWq?0CGY$@~%6$k^#6w3e<%pX(J zL*Eg$4NIsIM+vxkK_;5~fTRfz!l4r0d`1KuDn*8M1on9e>;&==7YX}jm{m)=$KYoR zQjS;z5=6=81S~*^F9p-6{JIQaUMeMad_{v>YfG1|J+$=f9|8;K_#NRcyh`ygw=^J( zR0arV#<~$=bj~yayXYimK?ET7M#;%33J7_6>zG@Ff1sR7)hLUbj=aT^yzXGhOK(OT zpSzq)0@Z-;02v6Og9NeCilny;I=!t9^bfreUDG2?xTlmDa+B3Eh#3Fm!z57xwaE;A zjED3HeF!i^m~3g}2KRKSep@iKz;#P3?NB>^dGFmz1q3%4SYP1#DvI2|2wB)UT0dm! zH#?@CvpfY6_RYXT9NyDtf$|x!pt0--87K=~Hv^bgC?q@|npM{}TA8|Z>YMY=zHfHN z2T4Hq)_=e>y8e#v=CdBtCpB{2r&6Pc)aF9`nF{~Afs4w0xHXq&sbJ0>c`gglGXMAVaJGAv3&mcdf41Z0dM(Xi7N6tB~~F?F$Qvj zy)6Hj6nSw#+yJZtjC=)NY`BI2k*K#sco#Y0r` z`G)~r7E&p_sc*C@ZT{r9_%lM6=ZtWTX;c~zW}Wk%5mJEA(S7fXaI6da!0NtnEa)0@ z1wt(7Sn>_r|PwTy9OAmmle?;Mq{i2(yna*D0(RVgLZ_cb@yPo%xgo%yNb z$k$wl{>^#tbB=@X8vUZ}@K>#CfiUdhyUsF%9pM@vMW6zq%qr9$LPV(m~TFd>l3_b z)N_3z;ea{musQXZ>F)K33tZl1JUzh`-?EfPTaAhKhHOi7(L`J2Kzm(#ds}r!Z*JQl zyLu|+#M4}&c7%Qg4Mb$XK0umova!Dxwm57|$tWna4n|S=H9|se+X#6_h#D2Ch=pOm z(SQnsI2UITB|lGY`|#Wn<&02%ExZH;5s?K53pz&S)QBTSKKdwit^q1=geIphIb|`S z0Bl~=v@{-V8n~&+b?<^V~X9& zB_Fn=pRnYdx8`5Al||T$@uu3$(T2jlrpor_`s(Jk!iKio#;(l99&BRB3TXLPG7$0@ zvo6vIQyQ10U^p*4;zV}#^Tlk09>qfqa;g)`=C+TJ?}wpYMJi$ug2jjmgqU+PB_{8HkpY)s;9nxSBB7umv7wKgLIft) zssZm6Zy+>8M7tX-Ev>#AkcJoJi`oZ@+Xsr;2lHC{b6ff|8hepa>b-%}>U&Ypn?i*F ztZmvP?GaHfuvJGe^}rhdj>TGjzJ8NKKxlFlD~w>o0l-`f^6&~!RF1Y-1jPok^Pin?s(6o*T3xW0enhlW+ z=PB`ZebSf#9y4M&eZ(PU&ET}ODnykk>zUyDoDBci0ax`;1&}Q6SPDSczey7X;HeBC zh#AO0h{4e`Y96vU$)kk-D|Q3ry%Wie_{#5gh_dL2H49bn{GEljA{+QMT>cbP1BMhb z5JE8pt0RkoHIlj`#EFYG`k-g1J3>*KPcNwF#>;7Qy1KQTcU&kq9?@SSA!) zc*=Xm@%h%RT0SuI62PT!%FaHaF!*6Xm0Wvq_ZUlE{GmP~K%woD>!KDc>>9nxJZR2A zAk(;FK^4f7!GI-F%Y;Q!Pl0+sU?h`{S@N8$8#3YM94@PoZ6*S%!n;nD{gY|UgUXVg z)aF5m9ri*pqxA-JX>obAyl+C1CIQJ!K_?vuHDfk;9mCYy{W#cAR-Zs%rZ^CaLQTn; zQyK^8K-fJdS-x*U*amI0cTcqm^G=A4ggj$bS4H0hLI^3MfUgkPd)p^0@K&Yzi3sOp zaQnpOSdJzDHjA5buFsoK`Tl{aDW`2nJ`3@a0D93lV&WUlLQ1-)Y)a{1z<@(a))T1* zH0285B~vsY#Bf12T=>O1x8yazZDiAP7*0mO8@l<0sJJ%hs_xIB|T$Gk%^r4 zVZ=#CS5Qs*0=dKwm{2&DgQ|+Cfo&PgJOcc)Pbl2ClY@eMS~MSP${)YVb>TH2;VD2MRJ4fDfMDD}3!J0+Woidi_da42;^`{I-w08TH*6BYL83#zU{O z+lGAvim-OT5Q>c*dR_=|z{mgqoQm)dUWftaGQ|_@whAUVi)PlfXV!HfWz-{e`lPOm z`mT%yK6T$qJsAx>8I64MxXIj2O??@6Q-4O2H#H*-_@qHxNkObH1(jbbiiLJeIVq-5 zxNiw^s=QZ&+5ZXS3_l<+8)zMj{@6Eo+RmqDZ}R?(UxM@@fG-BC@DQjd{1d91UtTHe zouD*dDzibTRq7d`W}FGzQ};Z{;}Ly=g$gb@g}38NZ72$u?F z$qg`RL$zP@n! zTXSc=KYQ*cGhx4UU-`A``s2>`#M*!01xUh z449RuK&W2re(3H2LSmdu4-htMWQjq~P=SzzoJr3kiQHfTWdTA7WP)4-_3~aSqVQnd z%-G#wD&Zg>=m@t=+sp!-JFv~g?^ytE-8{nVgJfg>lmuc#E&>eW)e|+%g;m10l;6*O z0tNOUp(0%C1VLwK04zBT=`BMcoiHvtt5=@*Z%a@AHeM^7-|>ODoqyp*=(RofIbZ*@ z{f#ep0?i!%mK8Va&pv=__2w&&<4(OP;w5v;UUT9bo|gzS&v-7;6)_f@yytnrSGs8xTEi8(JzCXNeWABQTLd1YC=2?1IZRF zv=Wq5uL$3nGYiXwonwjviq> zM<-q=JoH7|(XV>~aG(B><@_%!mmW4>eUb~`?!8UFk4t)!OFM4PI_r6Zus9s=E_r~k zAE<_D{iiJLqJ}mIYo`(lQ!Z-D9Pc=ei_KILhqwNUq z;8>1bpxB&n3WZTb)G2@>6DN=m0aLpsZCJ4bHAfL!`x{=Hnz077od6 zBv1#5Kqvt_&xj~pZDiBuoscXE+Y#AE!K9MbiR$(0f3T6|gFn+*MMfKp6SVWhW zAN*Cg!V#=x#IGA+5hXAHY0VT$8M4}jgP&T5v0_qFUvri7!q4Xpe9HaG-?;YvgX6$I z+a>J??X5-j_Paa6*@<44X>7`D#!5<6K(h>TfDmH^hJHAq30p&L#<9RyaR81Xi;1Kl zGoXrs8x9o+sX~;>P}(z2J+Oqkgi_TJOlOm{59DWvbAnc!%Sv3m-0F%Hq z2|f~=VDnTE>d2e*dpn_(o@qOawhHDk_Du@UY6@&Xn}++H$iO)k&NZr9bPPG|BY_gm zbwVv+iRmg$8IRfLzVLwa$d~MI{HyKIS8zsXIsHSbX_VtlqxG4dGs4aa_h2hG(l;Z9Ay_inCM>xfBbt#0z9J#C4Z*UcnM%N( z5CKA9BzlGlgc?Ay*edu~;e;Uyt2>VK#fp`dAFKt35%A>}0+XsuE(Q582I6ud?6iXB zGO=G&anKQXmGdTIo(CwkXprUjRtMiDc&)RmEsYA0fRKQZ!Tl31ja4)@H&hi57e?9> z4>)cN{Iddjq3 zS#NuNYgc!5&qz_{DBfNH*;H5!+3oT}HKl-15DR0e@6$*!;m~(V;4%}YD^A5&fLXmf zxK_+N8TuN8{fxuv)$S)50px_ptLy3mJ+Wz4N*^-7!=prC^y{uf(2#{9Xq<=o3J+q9 z;zk;aR;)13d`N_sU^^#q8^Uw?;Ag~RS?kx$;|nb?J_xyfl8>6ozk z#;ujPjQIA0?Jn;)&S*8bHDWHJ z)z+B>Gzzv51m*AqO!E?Lfm`#i$A@@C=YUBgKaO38EiPOL!Kn&hNP-SZ6)_ZajVYNr z#|rcmpa<9q2O<@b*(Gcg?9#|NL92m_FrXO+rr?}iGc=8eYjwjW{7^kO4bBUSTG~5~ zY)aJ_NKSA8Qm=jE_CQE6mHf`JV()~i8kolVUOQyMY^wKcVa>v{!dYW!?*tZJjWk!E z-0#_=9j5(Fj3-ktw1w)n6iVM#%rvYv6|*PhC(t&xXP0~WX~o|NPP z3b6`MMKTa}PFl57TW2Y-S00aB&f4cNttPTk{hyU^3RJ)j7y;2+5(c%UH` zq9PS(EM&_v8|H>@b@L2?-)PMhHXOy#$&CzhV<_pF*a}HB*h}CC$`!GALxz%pP~jHo z%qDOTXiOJ2R&~r6zeTM(y5(j=kQ)QeY=fA#0tQQHBNYg{r|c5MZn7c@Qvv08OsFWP zlN+7fNILo2g5<_f);GCM>YXgpQ{Wy@n>tW|5H8DV>mXVFCWBkOIa>BWsBnmoWkou< zQHR_Z5P@mar1e34U8E1~U*d)h*)$3u6x~>z*${g`GVpJOf?8ssUe_k;fek@!3>E!T zYNztPDLn=5fpv%o6$o(`e$&twazjMpeP~l0g`1<38=c%pJ=@x3a4WMphRS~2nAX!e zJ)kx}Ajr4QQg(#BCPxs}L)AL7A@;!Lv9hSaw-jarn~eJCbxzWjuWZtvU$&H~3F>jPe8w*WCTw5v-B0gb=H$jwoiUXc5 zaO?Cyh|`PUs;841Msj1Q9yD#)qzD60LkJ5Hs!^|>Oi^H_XV!bbw+FTk66-Bhya%*r z4~Ci{gjWu&v}J)=Xt;fLk?b`(V0P-gv~CY*zz;Tb6*^k$Js`OU6bHP}5oo9#HnXQt zgUrpU51w(M03qkxSZ&u~TkiqMJ+PsfhX%?^1~$E*&;#OtkR3AhoN{`A3WS3emmK-N zWj7X}>e_}*4@d?!y`bI$8t?;ART%0=xS*su&+A-zTE7Rh1VW_%RhJVwJrFuzscW*a zdSJ^Uw4q^?^G!hkMZHqL9>A0FWYg%7#T9~`rZXFI4}=a<>Y8l09@toby5Y115Lz}x zdJmlYq5FpWUn&p|TV3pp3PH%!RoW;$ppzS&+-x|~AVFb6)0joQ)HrI<6QKtJQ4j_o zbZ-j!LMCCGirlah7nYnG1xIx~L$C*QaA#>}fWN03@ZkRM?ZQdHmIln|cBOJB5{kkGpxTx2=33@;$H#)hI zLEtt6xiPd(*kq=bajTvJ^?)>zK?g#cTbksME44M4jWhzc2_RN)La=&3CpV(VjRHU@ z6G!#pYkR;&+Yyf0XH@Mso!Jn2AmqqIs2O#1auc`*f`yBEz2qJ+v`yMVD^1wiwtNaY z5UPr@y6~X%fKG07awDC?ZFX{F=$Nvzr1nX>o&xoN;!MJ|Ksh5Ex6deEsfq%(JhLHi zyP$xgUg_rO0iE0^MQ&JukOeIDJWBO|ZFX^Cd1Y~BHBcJ0&B(7yXEuZ$P>~jdnhi#p zK03Jx+yk2fWw%r-44u;st<#jFQ%`|=Kt96h61Hp)=;THxH_|!W7A7}_Zj)0;UDFOd z1?mB<>4NqIMNW-6vmy4tmIY?L;qrSxCpQ|9oA&^rFDU9iZ;l?&nGK-_baF%L0iE3F z{2m diff --git a/trunk/Pithos.Client.WPF/Preferences/AddAccountViewModel.cs b/trunk/Pithos.Client.WPF/Preferences/AddAccountViewModel.cs index ddbf4b5..4ae2a98 100644 --- a/trunk/Pithos.Client.WPF/Preferences/AddAccountViewModel.cs +++ b/trunk/Pithos.Client.WPF/Preferences/AddAccountViewModel.cs @@ -206,7 +206,8 @@ namespace Pithos.Client.WPF.Preferences try { - var credentials = PithosAccount.RetrieveCredentials(Settings.Default.PithosLoginUrl); + var loginUri=new Uri(new Uri(CurrentServer) , "login"); + var credentials = PithosAccount.RetrieveCredentials(loginUri.ToString()); if (credentials == null) return; AccountName = credentials.UserName; diff --git a/trunk/Pithos.Client.WPF/Preferences/PreferencesViewModel.cs b/trunk/Pithos.Client.WPF/Preferences/PreferencesViewModel.cs index ae41433..a6a3790 100644 --- a/trunk/Pithos.Client.WPF/Preferences/PreferencesViewModel.cs +++ b/trunk/Pithos.Client.WPF/Preferences/PreferencesViewModel.cs @@ -230,12 +230,15 @@ namespace Pithos.Client.WPF.Preferences public void RefreshApiKey() { //_events.Publish(new Notification { Title = "Authorization failed", Message = "Your API Key has probably expired. You will be directed to a page where you can renew it", Level = TraceLevel.Error }); - + if (CurrentAccount == null) + return; try { - var name = CurrentAccount != null ? CurrentAccount.AccountName : null; - var credentials = PithosAccount.RetrieveCredentials(Settings.PithosLoginUrl,name); + var name = CurrentAccount.AccountName; + + var loginUri = new Uri(new Uri(CurrentAccount.ServerUrl), "login"); + var credentials = PithosAccount.RetrieveCredentials(loginUri.ToString(),name); if (credentials==null) return; //The server will return credentials for a different account, not just the current account @@ -397,9 +400,10 @@ namespace Pithos.Client.WPF.Preferences } +/* public void AddPithosAccount() { - var credentials=PithosAccount.RetrieveCredentials(Settings.PithosLoginUrl); + var credentials=PithosAccount.RetrieveCredentials(null); if (credentials == null) return; var account = Settings.Accounts.FirstOrDefault(act => act.AccountName == credentials.UserName); @@ -423,6 +427,7 @@ namespace Pithos.Client.WPF.Preferences NotifyOfPropertyChange(() => Accounts); NotifyOfPropertyChange(()=>Settings); } +*/ readonly List _accountsToRemove = new List(); @@ -572,6 +577,7 @@ namespace Pithos.Client.WPF.Preferences SearchOption.AllDirectories)) File.Copy(newFilePath, newFilePath.Replace(oldPath, newPath)); + Log.InfoFormat("Deleting account folder {0}",oldPath); Directory.Delete(oldPath, true); //We also need to change the path of the existing file states diff --git a/trunk/Pithos.Client.WPF/Properties/AssemblyInfo.cs b/trunk/Pithos.Client.WPF/Properties/AssemblyInfo.cs index db3175d..a61db5a 100644 --- a/trunk/Pithos.Client.WPF/Properties/AssemblyInfo.cs +++ b/trunk/Pithos.Client.WPF/Properties/AssemblyInfo.cs @@ -93,5 +93,5 @@ using System.Windows; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.7.20310.0")] -[assembly: AssemblyFileVersionAttribute("0.7.20310.0")] +[assembly: AssemblyVersion("0.7.20311.0")] +[assembly: AssemblyFileVersionAttribute("0.7.20311.0")] diff --git a/trunk/Pithos.Client.WPF/Properties/Settings.Designer.cs b/trunk/Pithos.Client.WPF/Properties/Settings.Designer.cs index 9e37a00..e4fc7b8 100644 --- a/trunk/Pithos.Client.WPF/Properties/Settings.Designer.cs +++ b/trunk/Pithos.Client.WPF/Properties/Settings.Designer.cs @@ -214,15 +214,6 @@ namespace Pithos.Client.WPF.Properties { [global::System.Configuration.ApplicationScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("https://pithos.dev.grnet.gr/login")] - public string PithosLoginUrl { - get { - return ((string)(this["PithosLoginUrl"])); - } - } - - [global::System.Configuration.ApplicationScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("https://pithos.dev.grnet.gr/im/feedback")] public string FeedbackUri { get { diff --git a/trunk/Pithos.Client.WPF/Properties/Settings.settings b/trunk/Pithos.Client.WPF/Properties/Settings.settings index 62ecfbf..2f011dc 100644 --- a/trunk/Pithos.Client.WPF/Properties/Settings.settings +++ b/trunk/Pithos.Client.WPF/Properties/Settings.settings @@ -50,9 +50,6 @@ https://auth.api.rackspacecloud.com - - https://pithos.dev.grnet.gr/login - https://pithos.dev.grnet.gr/im/feedback diff --git a/trunk/Pithos.Client.WPF/Shell/ShellView.xaml b/trunk/Pithos.Client.WPF/Shell/ShellView.xaml index 2efd24d..4fab0c5 100644 --- a/trunk/Pithos.Client.WPF/Shell/ShellView.xaml +++ b/trunk/Pithos.Client.WPF/Shell/ShellView.xaml @@ -83,7 +83,7 @@ - + diff --git a/trunk/Pithos.Client.WPF/Shell/ShellViewModel.cs b/trunk/Pithos.Client.WPF/Shell/ShellViewModel.cs index f44b57d..ce2eb94 100644 --- a/trunk/Pithos.Client.WPF/Shell/ShellViewModel.cs +++ b/trunk/Pithos.Client.WPF/Shell/ShellViewModel.cs @@ -169,7 +169,7 @@ namespace Pithos.Client.WPF { Proxy.SetFromSettings(settings); StatusMessage = Settings.Accounts.Count==0 - ? "No Accounts added. Please add an account" + ? "No Accounts added\r\nPlease add an account" : "Starting"; _accounts.CollectionChanged += (sender, e) => @@ -178,10 +178,7 @@ namespace Pithos.Client.WPF { NotifyOfPropertyChange(() => HasAccounts); }; - Assembly assembly = Assembly.GetExecutingAssembly(); - var fileVersion = FileVersionInfo.GetVersionInfo(assembly.Location); - VersionMessage = String.Format("Pithos+ {0}", fileVersion.FileVersion); - + SetVersionMessage(); } catch (Exception exc) { @@ -191,16 +188,27 @@ namespace Pithos.Client.WPF { } + private void SetVersionMessage() + { + Assembly assembly = Assembly.GetExecutingAssembly(); + var fileVersion = FileVersionInfo.GetVersionInfo(assembly.Location); + VersionMessage = String.Format("Pithos+ {0}", fileVersion.FileVersion); + } - protected override void OnActivate() + public void OnStatusAction() + { + if (Accounts.Count==0) + { + ShowPreferences("AccountTab"); + } + } + protected override void OnActivate() { base.OnActivate(); - _sparkle = new Sparkle(Settings.UpdateUrl); - _sparkle.updateDetected += OnUpgradeDetected; - _sparkle.ShowDiagnosticWindow = Settings.UpdateDiagnostics; + InitializeSparkle(); - //Must delay opening the upgrade window + //Must delay opening the upgrade window //to avoid Windows Messages sent by the TaskbarIcon TaskEx.Delay(5000).ContinueWith(_=> Execute.OnUIThread(()=> _sparkle.StartLoop(true,Settings.UpdateForceCheck,Settings.UpdateCheckInterval))); @@ -209,20 +217,48 @@ namespace Pithos.Client.WPF { StartMonitoring(); } - private void OnUpgradeDetected(object sender, UpdateDetectedEventArgs e) + + private void OnCheckFinished(object sender, bool updaterequired) { + + Log.InfoFormat("Upgrade check finished. Need Upgrade: {0}", updaterequired); + if (_manualUpgradeCheck) + { + _manualUpgradeCheck = false; + if (!updaterequired) + //Sparkle raises events on a background thread + Execute.OnUIThread(()=> + ShowBalloonFor(new Notification{Title="Pithos+ is up to date",Message="You have the latest Pitsos+ version. No update is required"})); + } + } + + private void OnUpgradeDetected(object sender, UpdateDetectedEventArgs e) + { Log.InfoFormat("Update detected {0}",e.LatestVersion); } public void CheckForUpgrade() { + ShowBalloonFor(new Notification{Title="Checking for upgrades",Message="Contacting the server to retrieve the latest Pithos+ version."}); Log.Error("Test Error message"); _sparkle.StopLoop(); + _sparkle.updateDetected -= OnUpgradeDetected; + _sparkle.checkLoopFinished -= OnCheckFinished; _sparkle.Dispose(); - _sparkle=new Sparkle(Settings.UpdateUrl); + + _manualUpgradeCheck = true; + InitializeSparkle(); _sparkle.StartLoop(true,true,Settings.UpdateCheckInterval); } + private void InitializeSparkle() + { + _sparkle = new Sparkle(Settings.UpdateUrl); + _sparkle.updateDetected += OnUpgradeDetected; + _sparkle.checkLoopFinished += OnCheckFinished; + _sparkle.ShowDiagnosticWindow = Settings.UpdateDiagnostics; + } + private async void StartMonitoring() { try @@ -905,6 +941,7 @@ namespace Pithos.Client.WPF { private bool _pollStarted; private Sparkle _sparkle; + private bool _manualUpgradeCheck; //SMELL: Doing so much work for notifications in the shell is wrong //The notifications should be moved to their own view/viewmodel pair @@ -961,7 +998,8 @@ namespace Pithos.Client.WPF { if (String.IsNullOrWhiteSpace(notification.Message) && String.IsNullOrWhiteSpace(notification.Title)) return; - ShowBalloonFor(notification); + if (notification.Level <= TraceLevel.Warning) + ShowBalloonFor(notification); } private void ShowBalloonFor(Notification notification) @@ -974,9 +1012,11 @@ namespace Pithos.Client.WPF { BalloonIcon icon; switch (notification.Level) { - case TraceLevel.Info: - case TraceLevel.Verbose: + case TraceLevel.Verbose: return; + case TraceLevel.Info: + icon = BalloonIcon.Info; + break; case TraceLevel.Error: icon = BalloonIcon.Error; break; diff --git a/trunk/Pithos.Client.WPF/app.config b/trunk/Pithos.Client.WPF/app.config index 4ef8b54..d47391e 100644 --- a/trunk/Pithos.Client.WPF/app.config +++ b/trunk/Pithos.Client.WPF/app.config @@ -128,9 +128,6 @@ https://auth.api.rackspacecloud.com - - https://pithos.dev.grnet.gr/login - https://pithos.dev.grnet.gr/im/feedback @@ -167,7 +164,7 @@ - + @@ -205,10 +202,12 @@ + - + @@ -240,7 +239,7 @@ - + diff --git a/trunk/Pithos.Core/Agents/BlockUpdater.cs b/trunk/Pithos.Core/Agents/BlockUpdater.cs index 3edc216..3aac381 100644 --- a/trunk/Pithos.Core/Agents/BlockUpdater.cs +++ b/trunk/Pithos.Core/Agents/BlockUpdater.cs @@ -45,6 +45,7 @@ using System.Collections.Generic; using System.Diagnostics.Contracts; using System.IO; using System.Linq; +using System.Reflection; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; @@ -54,6 +55,8 @@ namespace Pithos.Core.Agents { class BlockUpdater { + private static readonly log4net.ILog Log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + public string FilePath { get; private set; } public string RelativePath { get; private set; } @@ -217,6 +220,8 @@ namespace Pithos.Core.Agents private void ClearBlocks() { + if (Log.IsDebugEnabled) + Log.DebugFormat("Clearing blocks for {0}",this.FilePath); //Get all the the block paths, orphan or not var paths= _blocks.Select(pair => pair.Value) .Union(_orphanBlocks.Select(pair => pair.Value)); diff --git a/trunk/Pithos.Core/Agents/FileAgent.cs b/trunk/Pithos.Core/Agents/FileAgent.cs index 0ffe721..a79ccdf 100644 --- a/trunk/Pithos.Core/Agents/FileAgent.cs +++ b/trunk/Pithos.Core/Agents/FileAgent.cs @@ -555,6 +555,8 @@ namespace Pithos.Core.Agents public void Delete(string relativePath) { var absolutePath = Path.Combine(RootPath, relativePath).ToLower(); + if (Log.IsDebugEnabled) + Log.DebugFormat("Deleting {0}", absolutePath); if (File.Exists(absolutePath)) { try diff --git a/trunk/Pithos.Core/Agents/NetworkAgent.cs b/trunk/Pithos.Core/Agents/NetworkAgent.cs index 9596516..e6be6f9 100644 --- a/trunk/Pithos.Core/Agents/NetworkAgent.cs +++ b/trunk/Pithos.Core/Agents/NetworkAgent.cs @@ -509,7 +509,7 @@ namespace Pithos.Core.Agents var account = cloudFile.Account; var container = cloudFile.Container; - if (cloudFile.Content_Type == @"application/directory") + if (cloudFile.IsDirectory) { if (!Directory.Exists(localPath)) try @@ -600,6 +600,8 @@ namespace Pithos.Core.Agents throw new ArgumentNullException("filePath"); if (!Path.IsPathRooted(filePath)) throw new ArgumentException("The localPath must be rooted", "filePath"); + if (cloudFile.IsDirectory) + throw new ArgumentException("cloudFile is a directory, not a file","cloudFile"); Contract.EndContractBlock(); var localPath = Pithos.Interfaces.FileInfoExtensions.GetProperFilePathCapitalization(filePath); @@ -633,6 +635,7 @@ namespace Pithos.Core.Agents var fileInfo = new FileInfo(localFolder); if (fileInfo.Exists && fileInfo.Length == 0) { + Log.WarnFormat("Malformed directory object detected for [{0}]", localFolder); fileInfo.Delete(); Directory.CreateDirectory(localFolder); } @@ -665,6 +668,8 @@ namespace Pithos.Core.Agents throw new ArgumentException("The filePath must be rooted", "filePath"); if (serverHash == null) throw new ArgumentNullException("serverHash"); + if (cloudFile.IsDirectory) + throw new ArgumentException("cloudFile is a directory, not a file", "cloudFile"); Contract.EndContractBlock(); var fileAgent = GetFileAgent(accountInfo); diff --git a/trunk/Pithos.Core/Agents/PollAgent.cs b/trunk/Pithos.Core/Agents/PollAgent.cs index 06d5663..25474b1 100644 --- a/trunk/Pithos.Core/Agents/PollAgent.cs +++ b/trunk/Pithos.Core/Agents/PollAgent.cs @@ -404,10 +404,12 @@ namespace Pithos.Core.Agents var deletedFiles = new List(); foreach (var objectInfo in cloudFiles) { - Log.DebugFormat("Handle deleted [{0}]",objectInfo.Uri); + if (Log.IsDebugEnabled) + Log.DebugFormat("Handle deleted [{0}]",objectInfo.Uri); var relativePath = objectInfo.RelativeUrlToFilePath(accountInfo.UserName); var item = FileAgent.GetFileAgent(accountInfo).GetFileSystemInfo(relativePath); - Log.DebugFormat("Will delete [{0}] for [{1}]", item.FullName,objectInfo.Uri); + if (Log.IsDebugEnabled) + Log.DebugFormat("Will delete [{0}] for [{1}]", item.FullName,objectInfo.Uri); if (item.Exists) { if ((item.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) @@ -415,6 +417,10 @@ namespace Pithos.Core.Agents item.Attributes = item.Attributes & ~FileAttributes.ReadOnly; } + + + Log.DebugFormat("Deleting {0}", item.FullName); + var directory = item as DirectoryInfo; if (directory!=null) directory.Delete(true); diff --git a/trunk/Pithos.Core/Agents/StatusAgent.cs b/trunk/Pithos.Core/Agents/StatusAgent.cs index 1e98a36..299b41f 100644 --- a/trunk/Pithos.Core/Agents/StatusAgent.cs +++ b/trunk/Pithos.Core/Agents/StatusAgent.cs @@ -110,12 +110,18 @@ namespace Pithos.Core.Agents Contract.Requires(!String.IsNullOrWhiteSpace(dbPath)); Contract.Requires(!String.IsNullOrWhiteSpace(appDataPath)); + var oldDbPath = Path.Combine(appDataPath, "Pithos", "pithos.db"); var oldDbInfo = new FileInfo(oldDbPath); if (oldDbInfo.Exists && !File.Exists(dbPath)) { + Log.InfoFormat("Moving database from {0} to {1}",oldDbInfo.FullName,dbPath); var oldDirectory = oldDbInfo.Directory; - oldDbInfo.MoveTo(dbPath); + oldDbInfo.MoveTo(dbPath); + + if (Log.IsDebugEnabled) + Log.DebugFormat("Deleting {0}",oldDirectory.FullName); + oldDirectory.Delete(true); } } diff --git a/trunk/Pithos.Installer/rnotes.0.7.20311.html b/trunk/Pithos.Installer/rnotes.0.7.20311.html new file mode 100644 index 0000000..28c2db8 --- /dev/null +++ b/trunk/Pithos.Installer/rnotes.0.7.20311.html @@ -0,0 +1,14 @@ + + +

Pithos MS Client v. 0.7.20311

+Release Date: March 16, 2012, 15:00 +
+Includes: +
+
    +
  • Fixed the production login URL
  • +
  • When the user clics on "Check for upgrades", a notification is shown if no upgrades are available
  • +
  • Fix in black-box logging
  • +
+ + \ No newline at end of file diff --git a/trunk/Pithos.Installer/versioninfo.xml b/trunk/Pithos.Installer/versioninfo.xml index 211b20e..f4261a1 100644 --- a/trunk/Pithos.Installer/versioninfo.xml +++ b/trunk/Pithos.Installer/versioninfo.xml @@ -7,6 +7,28 @@ en + Version 0.7.20311 + https://code.grnet.gr/projects/pithos-ms-client/repository/revisions/master/raw/trunk/Pithos.Installer/rnotes.0.7.20311.html + Tue, 16 Mar 2012 15:00:00 +0200 + + + + Version 0.7.20310 + https://code.grnet.gr/projects/pithos-ms-client/repository/revisions/master/raw/trunk/Pithos.Installer/rnotes.0.7.20310.html + Tue, 15 Mar 2012 21:00:00 +0200 + + + Version 0.7.20310 https://code.grnet.gr/projects/pithos-ms-client/repository/revisions/master/raw/trunk/Pithos.Installer/rnotes.0.7.20310.html Tue, 15 Mar 2012 21:00:00 +0200 diff --git a/trunk/Pithos.Interfaces/ObjectInfo.cs b/trunk/Pithos.Interfaces/ObjectInfo.cs index fb11d4c..fa97feb 100644 --- a/trunk/Pithos.Interfaces/ObjectInfo.cs +++ b/trunk/Pithos.Interfaces/ObjectInfo.cs @@ -341,6 +341,14 @@ namespace Pithos.Interfaces public ObjectInfo Previous { get; private set; } + public bool IsDirectory + { + get + { + return String.Equals(Content_Type, @"application/directory",StringComparison.InvariantCultureIgnoreCase); + } + } + public ObjectInfo SetPrevious(ObjectInfo previous) { Previous = previous; -- 1.7.10.4