|
|
Rather than getting lost in a lot of technical definition and supposition, I'll begin with a description of my repro, what to do with it, and the visible difference between OL2007 and previous versions. (I think it will be easier to demonstrate first, than to try to explain.)
This repro is an AddIn written in VB6, with a modeless form that uses a timer object to perform [contrived] background processing on an interval, set by the user, in milliseconds. Each time the timer event fires, it executes a loop, the number of iterations for which is also set by the user. (Note 1)
The repro AddIn is flagged to load on next startup only. OL must not be running when you register the DLL. The repro's form will be displayed when OL is started one time only. The form can also be shown by disconnecting and then connecting the AddIn, using the builtin facility. (Note 2)
When the repro's form is first displayed, its background process launch timer is disabled. Clicking the start button enables this timer; as it runs, the status of background processing is displayed in the form, cycling between "running" and "idle". While status is "running" the processing loop is performing it's [useless and contrived] "work"; when the loop ends, status changes to "idle", and it waits for the next timer event to fire. (Note 3) Click the cancel button to disable the timer, to make background processing stop. (Addiional detail about status transitions and event firings is sent to the debugging port.)
If the "Call DoEvents in loop" checkbox is checked, the repro [intuitively] calls DoEvents once each iteration of the loop; if the checkbox is clear it [also intuitively] skips that call. ***This is key to proving-out the cause of the problem in OL2007. When the checkbox is clear, OL2007 will not hang; when it is checked, and you are typing in an email while the background processing is running, OL2007 will hang.
Steps to reproduce OL2007 hanging:
1. With OL not running, register the repro DLL using regsvr32.exe. 2. Start OL -- the repro's form should display for one Outlook session only. (Use the COM AddIns management dialog to disconnect and then connect the AddIn, to show the form again in the same OL session.) 2a. After closing the COM AddIns dialog [and all of its modal parents] the repro's [modeless] form will be displayed -- because it is modeless, it may get buried behind OL, but it has a task bar icon, that will be in Outlook's group, if grouping is active. 3. Create a new email, click the Start button in the repro's form, and then start typing in the new email. 3a. Holding down a key and letting it repreat will not cause OL2007 to hang, because OL2007 suspends the AddIn's execution until the key is released. 3b. In fact, typing very rapidly (e.g., bouncing the same key as fast as you can) will not cause OL to hang straight away -- UI activity in OL2007 suspends AddIn processing (as can be seen using a debugging port reader, the duration of each processing loop is output there -- notice that it takes longer to complete if you hold a key for several seconds while status is "running".) 3c. Position the repro's form so it is visible while you are typing; if you can see its status transitioning between "idle" and "running" as you are typing, it should not take very long for OL 2007 to hang.
The "Call DoEvents in loop" checkbox is checked by default when the form loads. If the test above is performed with the checkbox cleared, the email composition window (in fact, all of OL) will seem frozen while background processing is running; when it completes, all user input that occurred in the [apparently] frozen UI plays out almost instantaneously. This behavior tends to be unsettling to users -- thus the reason for calling DoEvents in the first place. However, hanging OL in mid-composition is more than unsettling, so avoiding calls to DoEvents under OL2007 seems the lesser of two evils.
The repro DLL was built on an OL2003 system, so it will work in either 2003 or 2007 -- though it will not hang OL2003. Under OL2003, native OL code and AddIns seem to run without preference for one or the other, i.e., UI activity does NOT suspend AddIn processing. (Logically it must slow the AddIn down infantessimally, but with whole-second accuracy of duration timing, it's imperceptible using this repro.) In OL2003, an AddIn can yield the processor to permit OL's UI to be updated, and then continue safely on its merry way. (This is EXACTLY as it should be.)
Conversely, under OL2007, preference is apparently given to OL UI processing. As is stated multiple times above, OL2007 suspends AddIn processing while the user interacts with its UI. Clearly the mechanism that does this is fatally flawed, and causes OL2007 to hang.
Note that it is NOT the AddIn that causes OL2007 to hang! It merely gives OL2007 enough [proverbial] rope to hang itself. The tragedy to me is that this new OL2007 behavior is unnecessary when using well-written AddIns (which will often be callers of DoEvents.) It's crappy AddIns that block OL's UI for inordinate lengths of time that no-doubt prompted this change -- how appropriate that well-behaved AddIns get the shaft... NOT! It's a travesty as well, because even this ill-considered mechanism does not overcome a tight loop, OL2007 is just as unresponsive as earlier versions. So basically the only thing it accomplishes is breaking countless VB6 AddIns.
The culprit seems to be an Office-specific function within the VB6 runtime -- which obviously predates OL2007, but still... Perhaps they should've provided an Office object model method to do the equivilent of DoEvents, rather than build Office-specific behavior into the VB6 runtime -- this would've allowed them to update that method along with Office.
As is, as of Office 2007, the VB6 runtime is left with a very dangerous and detrimental call. Perhaps it's intended to force developers to quit using VB6, but in reality it will force us to release updated VB6-based versions of existing AddIns, because this problem is too severe to force users to deal with it long enough to port code to a supported language/compiler.
All sources are attached. Any comments are welcome.
From what I have found, mine is the first repro of this widely reported problem, as well as the first to identify the problem. If you republish or otherwise distribute any part of this, please give appropriate credit.
-Mark McGinty
(Note 1) The code inside the loop concatenates a short string to itself until the length of the string exceeds an arbitrary length, then it truncates the string back to a short one and does it again. (In other words, it exercises string object memory allocation. It is unremarkable, but it is such that it cannot be optimized away as an invariant loop. Also it does not touch OOM in any way, eliminating that as source of the problem.)
(Note 2) When you connect the AddIn it loads a form, and then tries to make that [modeless] form visible -- which initially fails because the built-in COM AddIn dialog is modal. It eats the error, and retries every 3/4 seconds (using another timer) until it succeeds. (I agree it's quick and dirty, not suggested for use in useful AddIns.)
(Note 3) If the timer fires while the loop is still running, the timer's event handler is coded to exit. However, in testing, the timer never fired while the loop was running (even though the duration of the loop exceeded the timer's interval.)
begin 666 HangOL2007Repro.zip M4$L#!!0````(`'<)D#E5=HQ#PRX```"P```3````2&%N9T],,C P-U)E<')O M+F1L;.Q;>WA4198_G70>A":D"2 H2[ at ]/!) HAH6,,B))'[ at ]XDD).8!BAE)I_O> MI*4?L6\WA!7'^/[ at ]PCNZ (\/:#CMF9O$Q#HZH* _S8589'TN[[ at ]ZN+?"J[*'X? MBBBOC 1EO/NKJMO/!)#]=&?_R(FGJLZI4^?\ZG'KUJW&ZB5K*9&(]&!5)=I& M[ at ]DKH_-0+3I^X(YVV#'MGTC9=U3N3&MH<BJG=ZVGU6ETFF]7M]OA,+9+)ZW>; M'&Z3I:;>Y/+8I;P1(]*R-!^-#VS[R/CYWJX0_ZIO7U<&\HY3_]TU"GG_J8^X M?/K4?_"\SF%K8W8A#+7SB*IT>MK3?GUE2'> TB<-UR43-5.X(UO&(,D`MW/1 MR,L9HM\Z$CFGS4)??I^.$K[ at ]B0[0+YR+;(Q-M0KZKF2B'*3N)UF720.HF>BAY M$/U9Z"8$-;%"!OJF.[M=GD_J\"%?M5C8\KYFQ-J8H,VS6WU6E N'D^A[!H7& M($PEF,H\K^*UD=:'3M&8Y[%V)7E>R>F!X3'6IVX2_KH'V)4U=927943IJNL7 ME2VJ+LK/LU15T1 -T1 -T1 -T1 -T1 -T1 -T1#]G]-_/693DKMD9>7WDI*W MK%6I.BPKG]GLRM*EDO)[;ZLR^Y2DG('--8_9E;R1DO*O?Y.4)Z^3E-FH7_*: M33FRP:XT3K$K7W\C*2N?MRFOOFQ71LR5E+5ULM(".P?:G?RS75D-/YTHK^Z7 ME)]_;%/>KI<5]P.RLO,EN_*INU6Y;;&LK$.<\=V+E>7 (CW8JMP-?[NWVI7J M;^W*4ZC+_(6LE/S*KCP1L"GK[Y"5C7,DY=J=-F78=\ #OQGEDE+O;U7>TDG* M']&GYX!M!^+N8'5)DO+G9DGY&G+N"4F9\9E=29K3K#P_JUGI*Y.4.Z]I5G)F M-RO7%C<K_LOL2A$PO?"[Q4H6_"V&GWZ,3<G]LM(''ZZ#DK(+6!X99U<>?E=2 MLM&OS="S\9Q*H^F],C*R\H=:WF8D8PIRJ92,3O =X$_!-:CO`0<U.T9)E$HT M3\[ at ]IR)E\UWPAKYXOY%NO%[*$? P^P']V[ at ]Y#MR/<915FG\?9*(3-</=6B_+J6 MTR[ at ]RLFN!,0O(. %\)?[ at ]?P8559.P"'P7?"-MZ\$L:AW!FP]^BQ61<"[YUL=#7 MPE\V\L:%9&P"+P.OJB'C&O!Q\#?[ at ]?G!:K> :\(?[ at ]YAM1#QY71\:;P;>#7P9_ MHK&NGHP7[ at ]7/ OP"OT?[ at ]WX#[P70T8ET;8[ at ])\`/Z/QM$5DW J^%OAJ- [ASP+^ M$#UWD]!G9)*176M\#[LDZ$:#?P-^6F-F<S7:G;D%/IO(F CN0)L*\##4%=T, M_. V\![PX2480XT/H<TWMT3BA^:'U3&9S>-?;A7EO<B[,V/G\6VM+EF[J0HT MD]$/5J=V9;"TAZ=[>-K&TPJ>'N"IB:=]/&WGZ3&>?L;3MWBZCJ>[>)K/TU2> M3C.R5,_+);R\CY=7\7033XNYOI"G:[G&QU,+3_5<7\S+<W[ at ]Z[ at ]6O&\7(&3]\7 MM5P?Y.6-`[ at ]G7&'BY0;3E:3]/[3S-$?WEEI_S<BU/.WEZG[#AM=T"%2^7\'(S M3YMX^BA/LWCM9EXNY.G'/'7R=#1/>WEJ$KW[ at ]Z3:N.2)LN&8:+V_AZ4,\?9JG M&WA:Q5,2$7EZ$T\[>'J&IP;N)Y6GQ-,,_G0O:9MV!U99/I*Z+PZI[-J6'[ at ]7G M[ at ]]>2N/+\_I_N>?&X^639YC%IW\WX]9571U9=?G[^]/+\"JN[M:9J9G[^U752 MN]=#-JM?D113C=_G]'B6F5B%R><QM<',M*)-<IM\*]L=*#O<)LEE=3A-=K^7 MR2W+6MUV=N5KDQ0%"K+D%Y9/OZJ,2J<7Y!>436=1']6)Z D:`JF)GMSYMPTW M_&':^*H-FW/N9;INS29,,&ZJUM$!%&6?J?[4Z)1-^FO?-?[I3NI^>^3E??\" M?2&X8L&\FY>6-];5S5O8L+2Q?EY=4[U']JVP>J6F:H?-ZU$[ at ]-=7(LL,F-6F= M(W;%R?IOJJD2'15#P-SQ$NNX77)YW(K/:_5)L8.R0K(N<Z.O,YQ6E\0*\;>N M,60I][C=DLU']Z]O'O5QZ_:*G4=?_.N:]E=.LWVF-U^\%_;E8H]#A]LN%\^X MJA$K3\C&WMS.ZF%_463_($U>3/54B_*[NQ\]6#UK1\V:[ at ]O97/_DZ;24-0IU) M[ at ]VF)3[ at ]P7N6\F&=GE;"VXH#E_P>U_VE)QS]:Q\R_^SYJ?Q[=A>)*U&_+XN=FJ MV?04D'$#\D5E5TTZ-O&*F/:Q#M-HF#XBU5Y,QJ+^?#X0H?TO`7]?(-^%/C\T M[ at ]8QOC<'>"YG]$,#6?H &4OP:CY<'*E[ at ]L77[ at ]>VN;BF=/FX0ATT]J%OF+OK)[ at ]X M7>/)R$8B:YJH9S+#O&Z\D-=&R0E:FQZ4]RBB?O/[UU##%7C?S"!C%CB5TOEB M+)PAXB=[ at ]S]\%^_?!]I-%9-'T<S!.E1<+WT2)S>+Y2FPF+58&^%:,DQU\&[[ at ]= MO!R\"GP/N!!M2R^.75,_A.YV9NG-R+]8<UV4,+.,U?4!3&C\"&><WF:,&]97 M*L;N#?9.0WX%-:&JGF8CKR4O>>[ at ]VDLA&/E*[ at ]641E2"O(2FYJI1JJHIG8V?+Q MYJV#53NW/U]]'BVGEOB?.8;H_REU7"2>BWRLG>*SV.PAL2^&RFFPG:2],^+W MG[.X"--?]ZYZ<?'^[64;A[WQS.F=>0F]OW7NGKOX'Q9LI^N/-1QY_K%X^X>/ M3;FZI;EX_O9=+^1\LRWSQ"66*__YD&MMR9ID^;<K]^!Q!34/ZPW]I!FF\ME- MM=IOH?,=3KQ=<SJ*BW*;RCTNO%N$JLDRK[[R^H5X;577EUHL"RUU_ <R"':[ MV^+-0U;IKL2+R.JV210KS1[ at ]:KPL:KZ6L^Z&]*2=J;^^!+C6TM]][ at ]CL%DGRCV MURW9HCXD.R=J[PCD!DU.HZVZ-G)2U234^41]QVLS:1?:O[ at ]\N[ at ]6H.=)]EL^^, MQ' ,'^S[3Q11GZ9G=B6:74J4W1[-;E6.T)?0.+) WP4Y,<INVF3T!^^)1S4] MLZO0[/11=ALUNVY-S^RJ-+ND*+L)4X3=)DU?[ at ]K=,+?0].>RYC=BM[ at ]]TXV 4U M?0D^,!N[ at ]WY?#OC,C=IMAEP.[SS4]L[L)^F,Y;&PC=AE99"R&'>4*?0E-Q,X/ M?6YD[ABUPZX"=B9-S_PU:W'3HOSIIXJX.;E"S^SLFMVP*#N[9I>?*_2LOVTD M^IL:9;=KJNAO<:[0'X!\%)R,]90)-H&G[ at ]V>#KP<W[ at ]*W:^F/KY<AEL>_G[Z=> M^+MX,%HWB.^9E_\XOGL&\7V^-C\&??9WBFLP_7WB%[ at ]X2=ZXVATT_,:;[?F+_ MFR[ _W"MSU.1C_N1UO![ at ]]/X%8/K?T)F?V'_6I('^JS!>=UNR].Q;8GL7%.HG M8?&70L3A_1J(7R1=(D[RMS"A?T*4<,G$*.&7)B',98)UDA!JF.#+$D(K$Y[* M%[ at ]+;HK]84A#"6(MW;'_4>[<$\K_;:/+^<2T+MGSI6K?U<(4]'?LH>Q?UQ,UU M!]Z%[!LQ])W(SHNLOWR_Q_Z[:GK$OBN;^"&C"KD3^;V=XN##OH>8_8$9L;[7 M98OSIS.;U>-+JDM\4G5=).P-5PC[+.V,L"$[\AW'['6:__/11L3MU6+'?WI6 M6QWN^1ZOB]6%[[ at ]RJ/7:_4RJ[ at ]YM<?L?Z^ZLW25XNV!1,_*#EV[,YO3B]1#U3O MN,VV:GM2R^GX;_]GQUZD7U^4MO"Q]^X>\^UKZIH3"Y\U!^2_&+<:Z!EJ?N^1 M<G8<<I;Y?3Z/F\7+N_:[,]]VMV4\59Q*5YIO?^DLY[#P?8IID4/Q6YVF>I_? M[O T+2J;58RD**^FJ[ at ]S?^GC/YH[ at ]^LCL.=B\Z&G(M>(,2&?><`T54LR""X=,X MC/4^J\^O$%7Z)*_5Y_"X46YPN"1OI1N:Y58VKU?4Q+5I\ZS[ at ]-JC[,,Y?E;5% M<N)H]VV<WM:VK-SJ=%H\\Y9+;I]"L^-\AN:$MR_0\ID:%L[ at ]&\H7G-S>N[2=Q ML?"U3//Q=>HE%RW%2<N#;U[ at ][32,3OGO;(*U R4<.U$JP,2%UPZ(%)TH)=K.A M$>.Y3/*ZT9F9+":[RZKQ^]K]/HO4XF^M][%;N5*<5_%,[,IEXZVG[JAQ_]W3 M$(;W^A+4`VWLWFE;[6[ at ]L\CWJ`6)]20WW!:>NJ/[ at ]._JU]-IPRK!P:2H9QL.\+ M4TS?;R0_;[N2&N'9J8T$H[$Q=K&UV^1=&Q^OO"3CE0Z,9_&<5YC/>[ at ]U10Q0> MALU&RS[ at ]>XOXB/DVH4Y NY[E#&]T\: ;S9.=6D3D0_]8SWM="JD&K[ at ]3X9L>^S M:(\2K-BX^OBX.:"3M#7[ at ]X%IFM1P1G9AO1[ at ]O!3&)V;!16PE+<<=B[ at ]47[ at ]\-C?3 MXGRW\?L1.T<BXG; DMVP$*6#ZS #;OR)UD1+ERYOL586+K+BX>F+F[_X^]K0 MF"KP9P7[^2C8M)BMB,76JC<F[ at ]NBAZ)^5SY '>H7WDNVE;+38MTPY]\'ZYN0C MY(3<&AYI!7J?UE?1G]#*C!X3TGRR$EO1E=HX,+H5S%:4!RT89[ at ]]FIIW7^L(S M<>Y^.31OT_CZ\,?T1SRCH^+Z$5H[I^/V`P.%WB+LCK2T*/1O8_E<X$DNM_JT MLN2K7ZGX)-<\K]?C#=<W>$K=BD.SKY+<98K/&VX_WRM)?#8UV6+UQ<AUQ7 F M%"%_=<61<K5GN12VA5F,/*_#X<,;PA87J\JA^&+BU[3<-D!7'X6QLI!+O%SJ M76F1T &_+6(_SVM5I B&)9*XHPW)Y9[VE9'^2':'*S9VN*["*RE^IZ^\3;(M MB]:CC*'5RFXQN#3P[CO^[EZW;\G+S_UQC_&5!]GSD6TIM=L=D6L&/+.77M=^ M>_V]9;\>_L[)_7W5E_)K"'3.T>J6O(B)=SM?I W:64!'$;)#MRGN/1GC?VF- M6SL?.-B;,[[.XE!L4=78TTO"OMG!KQ0KT<Z?FDK^_/G"ZW0I=C$WUJV'/[7B M/E:L:D93XLX(D^-DMI)S\O&]GB^PM_R 6!;^5-L&B<B>+;9[A/;^T%->S=\T M[O .+&)NQGB)9P!KO-+.WN=5['GCND;W,K;*0_-=J837B^)W2:*\4%HQDV+6 M!(;5*\DA76F[KT:6%2P58G<]D7MFL4>S<XZ)IO-G/X'$NXX=4T=0&J^//*^- M;H?-8Y?"?KTK[ at ]0W_M8;7M,7?'O.LQ#P_D,5#*U:^&BP8N%AW_&SN`Q]]=+3Z M87OCYL(O+57QEW'T`XAMDC>S0DKX+*J./=LE6X)B"[4+_7!553:"RRE!#$WJ M,"3#MH\G2AL_!39ZCGMX_*$U_I ;?Q ;'&DL!883S6(GI-3(>7J$[C+QJY[= M;Y-,[-C-?K:,_DF/QNNHC";KI[R!EX43H[V3'X/8+T$FDW#\=*HXF;"W/U.5 M\'IQ6NJ,^N4JECK%_T'1V2DR]H=";V\O]7[<2\?^[4G2Z_64FII*!H.!C$8C MC1T[EB9,F$"3)T^FW-Q<:FQLI.KJ:BHK*Z-9LV91YRJ5:FM5>H3VDGHD2&_L M/4I[#QVBM7]X%A'8S25;L^RWL* 0S4C,T)FA,S.=*DQDZ&449.AEZ&55- M M'X ^`"$`?4#EKB[ at ](?1#Z(/1!*(+0JY#5`%N&(A3_D\$!,-.I(CP2,S"8[ at ]<$, M#&9[ at ]X)" P0P,9F P`X,9A,8,#,[ at ]Z$'!C,P<.C 8 8&,S"8[ at ]<$,#&85.N P M`X>9X<#G&.\>1\+^`N [ at ]6!5=!A89P64$DN%4!A8^#*B449"!1086/BS (0.' M#!QR[ at ].E4,53 (0.## PR,+"ADX%#![ at ]89&(*(I2+E0X[ at ]XXB^H#:^9(PJ8F:R* MH4;L`# %$#2 ``%[ at ]"B!V`)4!. D$F"]53 >/#3WB!Q _[ at ]/ALB[ at ]*('V!Z8 [ at ]` M0T!5^;2)F9!Y=(:,36\0&(*(%P2V(' $$8]/+<.!,0[ at ]"1Y#A0,?X=*-1$%B" MP!($B" "\B4`+$$T#,(H"$406-BR"#(LF),[ at ]L 39>' L;#6P60CPI:0"[ at ]PH, M*C"HP* "`U].P! $!A485& (`[ at ]-?8L"[ at ]`H,*#"HPJ, `UV#H[ at ]4$%!A485 !0 M$3\(9RH:JC"2939'F$>5Q6"^F8U,D^[ at ])[*I+:<6*%;1Z]6I:OWX][=Z]FUYX MX07ZX(,/:/_^_73PX$$Z?/[ at ]P'3]^G/K[^^G8=RIM[.[&<\R>:)7_QZX`>,;^ M5+X)4MJ%4-_1(U^EJ&>K/3'&<-CE&F7(/#%H=4K:*)Z?=*7W#U+=8S[ at ]2*JK& M00P,4;ICA[ at ]$[ at ]CJ9'2^D]\?5'#D=+QH'UKFC)<#R^_JO,*$%-'S[ at ](AJ.1<BP8 M04?*(^7,40/KTPRG0B75, `>*"4<U!6-)4)?:08G#8-/0)IK)#<8-5AT3E^. M[#M'<U _ZEQG;9[&/!S-.'MS4&9ZQED7$*.>D<9S5:<9RS-&GZL^(V.TX5SU M:8;SU*>/,0RV/,.4:1QY^%SUKHPQ(\]9?QX`1PRC!UD]472^^O3R<X][ at ]+/%3 M4/]$53V0HJJOOZZJ:XZKZN/]JCKW3!1#GG[ at ]:^M.B_LV3JGKPH*H>/X2V;ZKJ MF1I5_7XD',7S&O#][ at ]_";&JMJ5A*QPT\!74[9=-5=.*BTI! ]B.-1([ at ]ZP)>R# M8ZW.4J:CE$62UVYU6^<GJ+H2:'4C*?Y&+$DWAIC"%-*P?P.&PU,[)6W2523> ME;I"-RJ%,G5JXF0X2!A&D6NXX8E?XSR<POZ=3FIO(K;&Q%P4$Y-)N]U+2!C) MSD_+$[J3'D]6:50R9>)XE94P7166^K3H^[\$?7_*`5U/PJ6ZX4E4D ^B44GP M>24LDT;$W0XRXP[BQGHJN(K9)L)V'FR3#11S`ZK7)6L*TG^;U)GRJGZ%SJBC M2R.C-**ZWE1O=2NF>LGKD-5$-E(IJ9'[2[TNB77)ZR/]_[#WM,%Q%-GUKCZ\ M&($DHP4%A!&<2<39Y_/.#$0^&Y!MC9$<+<RN/KE(V,(K>;765V3)&&)=B<[ at ]Z M/#?:BZ!L2D4X4.Z<E*_*J5)=J7*"$Y<%%"1R"E&!#G18I 317:UCU9W#N0XE MY?+DO>Z>W9G52A8Y)Y4?T]+;F>[I[O?Z??1T]_3'^X1G0%;+X&[D2+HQB'BC MDZ3\%S$8->] 1D&WGMR83OBPI</Q`,$V?T?3H6!G_[ at ]^QV5J8[ZWO.)R_;VN^ M]^ C3:V=3^>WM!P\A#=%G<&FUL/06]EZL*V%I'V3S-XPN?XWC[ at ]TNDN.\-TY3 MVJZ.IOIF/64+A-R0;[ at ]QL.AP6GJ?5.*\Z_C[ at ]-9)-*<D#$]T/D]>G&:*C#<0LK M0[[!]_R"EB/WD;1+Y$5")>K$5$YH(;_\$._3/DRR9^'^<A')7[ at ]3 [_ XSTIZ M=3N9!/\,P#Q_-E)D'J=/*7*2I73LP\:_P*[L7*!(^?P>YT0=>\B<%R$;770H M[ at ]621//[ at ]S7,J!_L1X=[CN:./WQO<&O#=&;D9Y_"!<#3"GQ\Z;T4$POC^8G[=? M(WT1I[ at ]>AU00#N? T-O%3N?#ASW5]>>[ at ][24/_/A:J7!C^N4$!SH4PZ.GA>/,Y MSXWPZS8O%%Q%`<G&.0TCT%_'>YQG,,KO\=OZ&+_'[_$1?H]S`L;Y/7[WGX1[ M;JSD^-=!;P"F(&Q7>WMSTT&JM4:?U8L][5A?%<O2=:03+ *Z[ at ]RUM1QOH8W(! MW)3)56J+O8NY09RJ%OAK)%H)J/?B=13M)!I^7]?+JZK5ANB$O*ADDVQ-=O7. M.U3YDN9U]7YZ5?6Z)F0ZX*U5NC0G!/IT)75"OH)V!Q=4FY"NNW'",7A3+!$' M<L&OA"OG_+H;YR6K\FR(:/*LYM(J9_VZK_;\9ZH\T]L]0[IO#]4&R^Y#]+.* MYIWQZ>XBFF#LXKH)>0SQA[USNAMG.[ at ].:5"L:UW(T>AS-\_T0.X[ISB#Z[ at ][5) MD(TBLM%$9&E69!G7"=D((AM)1);.D#5.[);[ at ]W2=?PN?!7^XFV1?7QZ*]_38( M"?&Y[ at ](<N#44U'U#I",7^)_Y4^V7=6ZG$*O^,)/+O72RB[ at ]K\\(2\-H."[7-H[ M5/17>G]UM4H%[\VZ+U4\'ZY<* \Y0HYR?R[ at ]KV .O7K4NJM8MJ'4S:MVX6A?1 MW3[ at ]+79,7)N2Y]ONP%#,XD- [GJ>5Y(0K9][\-%7[3ZTD8_._Z&Z<M:[=6J6_ M0"[ at ]7Y:C"N*[ at ]MA2LC_FHM4_?5['C[_&?=F:$:J[ at ]_5"N-7HR9')N1QG-C;J,I3 M[ at ]"U<.0[YQS/O?3-+=^/<>*#7'W7?`7R5%Y1RW8VSYL/>*..==G.5_CPB#U=& M%;^!/*17:^MTI9:CKK6[ at ]UA[$A)C#1TE37PI[([XJ+5U7K*17\?3B^XW;ZR*0 M/O/46U]\K'VN?]2XX[>=%>7 5*"P7.%<-;,Q[ZO)V?[ at ]?6-+W&!MI,;?>;BFF M6G<EN%$&9;DU5N"P=\$7[ at ]LQQ!0%5'$7+TOV[ at ]-5<T[^+^)[C><*T9&!A815\* M8OHRM(J^Z$!8=77(41U3E^ZHVKV[ at ]=L^82]B\0[ at ]E_[ at ]27\F:F$97_ 2EC-2D[ at ]E M[ at ]-6*=N<!*FN4PP<[ at ]0<(DV!=)(L&5I/\ETH5T2(G622-N".)M$.? &5(&VZ6V M^KV]5O9#&1+8[Z)&NYS]&<C^U?B?%^/_,*NHM<G>3QVJ]\JFJXH*/I!KJO[ at ][ M,*JJJI"CRM KM2NJ=LT:O(=J?OX4Y?VLF?>SB48*#/)'IV]#WD>5*JY=75>" M1QZ!XMT$Q5NK4KEHJ>*.EB\G2?F>73P#O[2(BU#Q12PJ=AE4##1,U-7N)12B M+U7MGE>[Y]3N6;5[4NT>5;O/JMV#(0=[$S6JWY)H-</>#/*<PM0%):YEABOG M_=7Z\T,$:^J^"$[ at ]3;VDE';-Y>1[N<.V-NK<P[)W7W274EN9,>L1?;E#I?Z#V MU4+S0DNO,EX/WCD?Q75;*JUE]8%5>8)MZN`5D,IZ)-:&][ at ]8+6N!&BRS% [ at ] M03-C),WZ\&44<H+<X$'O> 8EPV4E`]1<?Z$_3D1_(A'QHB4IQ%I2LUH2JDA, MGVM*?TF[%8W'7\L+4FNI'!'O1Q=>[ at ]0Q?2R7.'M4[-(K?&%1Y4/4.J_)9U1N! M][+NQN515)!&I:O=C&($3=C"\]T2//?5>+X[ at ]0-!T0K.:GI G4=G#\B 0=1;X M-0HV&98G(6[ 7/:P=Q >GO6'Y5&(..D+I>KN/,K4'-V-B[6"+^T#];\_SGV0 M/A)E<'_E#/+92SM+H69R6?,N)+ZQS?:1M+U6`3_13R9-[;7H=6FOA?#/`0R! MPEC>15 Y3,C3$5I;, 963D(K1GQW,WOO0J.G*"-EDE<8H(C15V\A+!O":[ at ]S> M5)N0(RA<:%NMI[YIYIM$WV[ at ]6%BL=BJ6-:]Y1%9HU8ZJ2JH'<2^!^7%4R6)1_ MFV!1)C'*%(TR3:/,0)1X[ at ]^CY82=K[ at ] WW=[ at ]]C`PS]P3-_1#D%#;#A6 /L%#; M3A'&ES1:O!&_*:-1AS4C]"?-: `S&L",&GN[1_3,OI^Q/-,M4A[ at ][ at ]B0W'86P, M#R.Z8:,Q?*ZW^YRY,3P,B,[%$/4C(C0^2Y-QW;5E&/T2,CR?;97AQ2<!QPUF M'-"038)#VFS!X9T5(YMWY;PY#W*:U4KC."#KZ%.(`[.)Z<DE+%7P8R][><;L M<=;\FHDK]"J-WI7MYRQJT??^T60_A1NND_TX&.^'DO!^,$#Y,L#X,J#)0W'> M#YEX#Y[ at ]TJEGZ"[SV'/=Q1>D[!J^"\.GC\.O7J =TYC1>06T.[ at ]-KT=<)][QOX M2[J_$CK E(?&5+0P!ALJU%<!GHOK)^B5EI)FJU:>G)![4BB)/4#7:UC:1"HS M: 4WY(N^EDE888G1N!ZW]LS ADJ:&WNWZUU-W+3B^IF41V?6QB.*?4<"][ at ]N/ M[ at ]P%<W "(7''<$P[L/5U93YA5ZVY<B!N61Z#&Q\6XO8NN3_(VZ6Y<DJM-[ at ]YKI M[FTT_Q$?1L?JG%7;&9#)C3Q;7BVDLB;%N&*63G!I,[[(J6P,SNLO8(,F43Q_ M&,10UB.D\7W:Z4XJ2BXAA4M(X1(R<S=C#:0LHR+/F8P*#%V%BC).15D2*FXR M*[T\E*0R&-RYQ2)0[U"\,A[ at ]R5090C-ZW"KGV%:VJ?2<,[=MQDU7^0!#._V+" MW<FEJ+MQ_?4G=2#;$=V=Q:)E<JO>7:CV-4.Y)OK:=;8[ at ]$SHD6,B+&9IW+B6, MH2JT:"KG=IS&>)E_N=M!C3^+LG\6\.!*[P>+=F>2X^T0GDT9A%[ at ]I?JIPJZD9 MD(K1K6J&DZR")[=[ at ]^DE(CRO*E>C&CP"_>R<M^R1K<T#4'$X'U*R L]":.SQW M$\N+)V\=I?Y6%MK8^XRD=QV"[ at ]-O,AIE<C[ at ]-KDR/*(_K]&PG+QC#,.YP4+W11 MR84?7*4&>4<"IZ;5RD'(?QW('O6)<6; %YRC?#[ at ]#?, 5]V'Y#/ <5]U#US_L M/9/$2//68!G!A2W7RTA+N'F4)#&/.]= RO4QTF).17$2*C824V5(Y7 7N>:[ MZK)5W"O7PU.J]\O8[',W)-39?\-(NL?*JMQDK()&4[ at ]*SL"N1^,[C#::D;"KB M;"I*PJ:OK$%8P9JO72^]V<E)V9F$E$UK(.7ZZ$TAIZ(P"17W)NK-)8SQ5\&7 MJJ%I)L1JH5[ at ]2M%(T6Y,YHLACS39:+V&*W[O]1L>K/_F)J?VVM"'6=.2-ME4; M:B;FXF-3=U*59["M"7T)I' &ZLQY)EUYNK=[&AO_Z \VHQY4SD G85I9/HPK MO[ at ]O-_UE'YJDWO_A%H^J=BC5C,_^A<JKO_<Z;>/-(=^->(L'7:Q(&=<5(,I:L MS \<J([^\^LF?FR[98WMV2#]4N+.B>DDYYM6F>$/TQ<<;[ at ]ZB>7-\K+_2S)A( M>>I(WGF4^Y.\/TY<^CK$[,,F)JU3:&-3\_;'WR+]EK=(OS]:FT989O'7.VU3 MAI',WM=P:B3IVJR=1N^S;Z'7'RS9AJ7!74TT6IHT#%;[)%3S#2SELV_2L#"& M::?IKU/MJZ$FQ7+.:K?DC%Y_D'XA,^>,P6K?-DO.-"R\C>9,?YWP$IOV,;8I MVFF*Q:F%\0K<ST![K:#V2EOA4'ME!'&:*8L)3?P*:MO<6+=P8]T2,]9IIC$7 MUK%*=!U5^$'6IQY[ at ]/>RSS#?$?*/,-[R>:A\;2J$$LHH%L891K1D_7)P..K22 M2"D;96$QH6]1H9OZ%[ at ]6<T[ at ]).*7;-3V,=,R'/4#^M<%1Y<D*.4'6 -SV^%<+0 MS04-\D9\QGC,M%&W#/BQ11&&SC9^'S"-QTRPYCY:.-W3A[ at ]W/*+5[ at ]4]\(>V>, M2LK(2!Y0L%8*0T\[+$<44T9A;[^YLHKW/+E97JO6RHE_:HE_;TDVOMF[6!L; MW#S)#)6/WU[>=%657>)YM6Z)#A"EJG7S:MVT6C>EUHV93%5;4KO[#?M3Z\8G MY#&TR/"/4;6W;^S*J#);P[ at ]-:>M[ at ][[ZO2E8+SG^UXNSLS5$"US![ at ]A*^]=S-)F M-'E,=>)[ at ]RSYX;X^KNUTXP+(O(^0HQ^'(,*WH!BFG\N%N$S9*=?=P%GZ0N?3% MAW0[ at ]K-C[ at ]-#:S&W?\-O/$+E!,_+Q1#[ at ]T%W_):8;QV&]KU&&MFC&GR%/^08_V\ M,>6//N; RF J]A7GQVAJK*0FRTS7H-=L#,?.QS[J:.O*JW6EEA<^<62?$[XL MLX>TS)!>S<;Z:5+36']LQ+:R/_PZ9?I=71G59J8_O"R_V[1T!>4`G1Q>(51K M<.O/XG1E4:$LH^LBX2K]NR? <]=R1B-;+$/PR 1?TK'%#/,0/-5/URK?`Y? MM(;AJ1A1Y455CJKR`KP>55 .>20LSP"A.92.F:#D(=E[ at ]LENPF/=CUP-[(5'] M0^U![)(H^D?H7] _5((E'CHT#-Y%>'SG(M)?N1"6HWYL-WP`F4']XS,UZ7.A MA0]-#%"2"[ at ]_JRHB+5EVX-94F+X)-PD-%V^"CII[/M!)WK.(4F''7FG&'Y06( MH/[ at ]HULIQ*(\_UG+1O(L4<=07ZWZ]^J[.NU^:'(4,%"ANA(HIRFJ8X \.[ at ]'[ at ]V MF0KCIH7SCB<6Z&W$SQM"WDM)/KQQ]PJXQ0/QJ><[<>%!%DGJ]L&S1H!V[ at ]&\! M?!?[ at ]%8!A[ at ] C #, "P!) QD%"[[ at ]'8!O 00!G DP`O.DG/,W#]#L 0P C %[ at ]?I M&8?K#$ Y//\,KI<!7 %"JL OP//;X7X3[ at ] "P.X!J1$[ at ]`X"C "8!![ at ]!\!1 #> M`U[ at ]`^#7 %8!W((_<!D*V`NP&4 ">!.[ at ]`^#; BP!#`.<`?[ at ]HP#?"O`)\#I#82 M\G>0'FY[X+9G`_P<[ at ]FL0H D[ at ]`,_R(6PK0!& '^ `0#O ,P#?`3[ at ]%< _$>P6N M9QMQ'1[C9^*>_G(5;L)57OKHG^Q_I*&SM/C(8XV/UK>P?1'W[RD]V,;NZ[ at ].A M_8WMG?5T84G2]46):Y=,ZR]XR JKG6*K)2B.0-/1_2T/2%;*2EN/MAUN,*=+ M7*64L,HB1G%'0XO'B,-7C\13X%HMPV==K4567H,4IY(NYOQF6\N330W(NXJG MVQM*6QO;XAQ(MCHJ8166:063>763!8_G[ at ]::$Y_&5+D:L#B,:R.Q(4UQ*?#56 M7&:6]5A[[ at ]H>/=!ZV\AKR]M.\BYN;]W:UTC5).)4PSM-ZI[ at ];)5N\LY\:>MJ[6 M&)?Y>J^X!'#UF[ at ]6[OZ&YP: 82O)G';&T?!V0);:OJZ'C:3J-K;'^8$RR\K M#>V=)?6M[ at ]>:&.&<3U_+$](,D\)$J'Z<W8;W=7H7ES99IL3#S&KT]I<UMAV)/ MC!5*9HUI2L3&[ at ]FA\OK+.P)6PELB2QA*ROR.>[ at ]]D"^<HD<_G9VD,2TT]C)1,/ MX>NNXNECUK2GU"QU\UI#$'U+5S.+8]0/>TH;CK5;2F)>P6=:41AWQEDP^8?B M9[L[ at ]+($JNB L%^#?'X:Z$F &X"R !&'%`%4`0<IWW)$O)7&=_M8`:"]H\Y[Z MULK6YK;ZP*-M3Z$?M'1/<_V1(VQU'X;X&PX!NQLZRALZCH+J0$AE:X<US':V MLYWM;&<[V]G.=K:SG>UL9SO;V<YVMK.=[6QG.]O9[G_3X?<1_-YQS$%Z"[ at ]GI M.0E7!:XX:0V_%>.<\1[XSR+TO)T><SJV5QHAPRN$3ZX0/I\0CF'?60IC9 %]H ,/T?H"7*&?_PY MMDN<X6\>L#[O07]*W+^.5)#'B4)D4D9*R6Z20?;#M904PW4/>8P\"G\RW%60 M]1#*0O;3G68?(^7PQ%N^M\()].62^)[8NTA\+TDGL3J4XT9^K_,)9_F$,=IA M2A<`*'-0F=%XN A 2F'['AK^(O#GF?R;4MB4"\.?XV3Y&OY33G8NF>&O16*< M)G\:V_O5\ ^!O\SD-^A=JW\QS4KOM>)+=S/9&BZ%K.R.`4QGL_(CSXR\"+]W MP!-#EYUD72S\WKL=:\:QC3#YX34YCOB>(N;P7'X]P-/J_T-7LH:TQTQQ#/SD MS[^M-/UD.ONL3H;>S2:/&\\3SZ*[RL,3]Q4.\'RVI3+MC;"B[74:^2>$&[Q) MW)\U1[ at ]^)\X_Y'93M!P!*6!Z4SU\C1SH#;<T-PM;.YB>KJZOU!&?D9[B\!+_M M?C^W[?\I/S-)ZDT)W_^K#5UP%;J&]O.-9[ at ]R]75=8^RX/JBZY;COG5%.<%^XB M_8[ at ]C"^X3];V L+J\B-B[DMJ[DMJ[DMJ[DN+%WI64.7M7TJ3.WI74WI7T_WA7 M4KZG>A%KI6!OV0%]8[ at ]EJJ2KHT^Z'7YGXX:Z4]W9+X7<OW*-[(_4W5XV>:A8- M<5BF^6-S)['/6TQ_JT[ at ]]Z8!\V DU>!)!(VFC3S;15!7T! \\GZ#9=)('NAM2 MAU,[G8BI',([^"D$RW-2:)QM1 +83J^[:?\K`+U8!SU1H86>_]+*SU_IB)T? M[ at ]&?5X&\`0EKXB2B=_$21![ at ]C'TVWS8^?;YI.G")X"<YB>EG"$YB61#3$<[;0< M3P/7ZBD^0DL7I'0?YF>G$$I7$:0I`_\A>K;,'GH:RM.TA(<[ at ]/L9:'I9/?ABC MI9"PLQ[ at ]Z(-]\LH_Z#I)'^!DV.,VW",(<_'1?/"4%SW8PT[7Z^;U&N0Q>5Q$\ M-^:(238>LA72,/#0TXKPK)T-RW FIDR6CM%:2HSS=UHI5^+47HM6A11 ^L<X MKYIX>H/VUC7FLY6>*X.SGY5=Q<6ECSY24\-O;+_MM_VVW_;;?MMO^VV_[;?] MMO]Z^+$3G0_]UPI/K2?[ at ]:?:T>SH]QSS'/3V>$YY3GI<]9SSG/".>,<^X9\HS M[9GW+'HN>ZYX4[ at ]67D"%D"3E"KI GY N;A )AB[!3*!**A3*A0J[ at ]1:H4#0D ( M"LU"N] I'!.."SW"">&DT"\,"*>$0>%E84[ at ]X(YP5S[ at ]G#PH[ at ]P*HP)$6%<F!2F MA&EA1I[ at ]5YH1Y84&("HM"JI[ at ]AYHBY8IZ8+VX2"T1)+!1WBD5BL5[ at ]F*F*%6"/6 MB[ at ]?$[ at ]![ at ]4F\4>L5\\)0Z*9\51<4Q\2YP4WQ-GQ(_%>?%7XJ+XN;[ at ]D7A53I?52 MEG2KE"?=(Q5(6R5)^H94).V5RB2_5",](06DD-0N'96.2W\AG92^*YV27I*& MI+^5SDD_DD:EGTKCTC])T]*'TISTF125?BU=EOZ[7?/_J:H.XS[ at ]L+%:VH:.4 M(F=&28GS<[X\GV_GG,]C9H/FC>&\+7*4.,G0KA/U-C'O'&U7I;PKW+!8NYHE M)293,\H65&QA4+I&Q90E?IE#1XG.C"W\6H_7M?Z"?KOO7\Z/9WN]7\_SPWG. M%3<#;H>Q,!XFPB0H[ at ],> `0<?9D$)E$(8YD,E+(8(K(1:6 =Q> ,:X&U(P[ at ]?0 M`GO[ at ]<VB'F(B+A-[ at ]NFD6KZ!!C985LE/MDF_Q"YJI\5:B*U&P54F%5H:I41-6J MF*I7"=6[ at ]DJI%M:HVU:$Z5;\:4*?4H!I2P^JB&E&CZIK*T&%=H2MUM8[H&AWW M+YI1DX79.!D+D:'$F5B"82S'*JS&*,8Q[ at ]4ELQ3;LPCX<P&&\AC</2_F9&1E9 M+)<5L"+FLQ +LRH693&68$G6S-I8%SO,!M[ at ]P&V%95JZ5;Q59OC7;"EEE5M[ at ]J M)Z\JR:SJE%O_FE5O):P^J]\:(*,&K2&+V:XM4_[\9\2MMHL<1GTFG>U.,[7: MZK2EFNUTNIQ<=R)U.-DM<*-N+;55Y\:IIQ;J*9NZR(%<:J.:J-= E+CWP&'H MA3[HAP'X#48APFMXC#?Q%M[!NW[ at ]/[^,#?)B/\"PQ5N2+`E$D7!$1-2(LJV2U MC,B;= ?5'\0T4\>P`1LQ(W5D+Z='B)6Q3J)0;6I,U-2:F*DS<9,P#:;1-)FD M&3(Y6)1B'<(RC& =UA/I!OP8]Q+K3CR(/^ 1/(:G;A%/'?(JB'DVRV$15D.L M:XEV'8NS>F+>P!I9$Y'?3NQ;6"O;QSI2;Y] U%=;35:[];UUPOK;*K2Y/8?F M;XN][ at ]VCVV2?M"0XX46>=L\W9[QQR?J%9&._>[\X[ at ]]TO=L+O,W4"VM[L'W3/N M93>3&$Z$8G[ at ]1ML).Z(9C\#MD\QR>QV?R$CZ71WB4U_%-_!W>S<_P//&0>$(\ M*Q:(96*GZ!&9,D]J.4N&9+E<*#^2>V2G_%6>EN?D53E-.<I72]0*]:K:H7:K MH^JTNJINTS.TU&7Z.?V"7J+7Z,VZ6P_KJ5ZQ-]>+>J][]_H%_[ at ])_F?^AW^,? M\<_Y=P7W!#)X.E[ at ]>K F2P2?!5T%/T!?<88K,2V:CV6S:S(]F#.;A?%R.M;[ at ]; M/\-^/(^ICS49=<1V`GN036>2E1#AU6PG:V='V%]LNO4X^1JS-EB[R,[SU[ at ]TK MFW;<8GL=;:Y&^SU[K_TU[:[ at ]^^[A]R;YNSW9*G17.!O+R.Z>7MLQY9QP9&7(K MW;5NTOW9/4L4'0AH^A/P/C&\#'?S0OX4#_,XF?<I.7>GF"24*!>+R+68V"2V MB&XQ+'*D11M[ at ]J7Q+-LM=M 6.RFOR$=H!Q>H9FO^X>E,=4(?5276!IOR*&J/S MM-(ENI1F?8%>I1/Z[ at ]#ZDS^HIWG1OH?>*]XW7XYWR+GFCWG4OVQ_G/^I+?Y8_ MQ]](+'_RC_J#_HA_P\\*'[ at ][ at ]>#N8%SP=5P<I[ at ];?!NT!QT!?W!B6 HN!!DF?O, M%#/-[ at ]/%,N:DT2\PJL\:L-YO,5K/??&F^-8=,KSEF!LU%,Q6?Q$7X,JXD[NMQ M"S:3X;UX'/_$*S?Y5][Z=V8<XZR8S6,+V5*VG+W&-K-M+".==-)))YUTTDDG MG?\]_P!02P,$% ````[ at ]`+42#.>XLT-&A`P``, D``!,```!(86YG3TPR,# W M4F5P<F\N4D53E98]:%M)$(#'Q&!%+/JQ;%>&)*[B[F"O<95[ at ]<\45C[ at ].':W?; MJ79SA2JG3.# L-6EN(2D2./:A2 00[RUW<004&%09&3%[ at ]5-(N,FW^_SS(LDR M-ZMY;W=F=^=[,ZO'$Q&YBZIF.BBO"A?^6^A$LOU2N3UYX;]_OOXA.B&%9&M< M>[ at ]>ED7[2:&2WV.[ at ]TFTUI?FC*Z?N7,CDY*85"08PQ4JU696YN3N;GYV5A84$6 M%Q=E?7U=5E=797EY69:6EJ3QI\KCQRI_R8%H)\B[[ at ]ZX<'!_+L]=OB&!1AWHT M9$/+Q6*SV&RT:3;%87=T'':'W6FVS&/WV#T#C]UKVDH"]H ]8 \80DP[ at ]8V6L M(0N5FD,]&FV:A>=B8; P6![ at ]L# D)![ at ]N#A<'"8&%(F#!8&"P,%[ at ]8+0T*'P<)[ at ] M8; P6!BL8H/#PF$C!T5-CY=(8O-H0#5[9%[ at ]<P1V!')LZ6%(:<#HZ#A8'2TH+ M' X.!X?ST:99JN!P,#[ at ]8' PQ=0X.!X.#(1!+N:84$B=KX3R]-A%Y&\>:I9K8 M'B9/4$\`#Y,GML?IV<3[N)=FY4BQL1/?$]\3/Y;($]]'.PP>!J^:RI95PJ7H MD2R6-\ 0B!=[ at ]"W $XJ721[ at ]YR$. (D8,'2^5F48 EP!* " 1,1P"6P,+ I( A MP!*/18[ at ]LU"3 $F(^$DL\#;$*/ATEA4%A4![ at ]4!H4A'2<8`[ at ]P*[ at ]\(08$A'# :% M06%0&!0&MD:QPZ P* P*[ at ]!(_L)FR4)GD7*P1==08(^X=YSBY)R]D8V-#-C<W M96MK2[:WMV5_?U]V=G;D\/!0CHZ.I-5J2;O=EEZO)_U^7TZ_J?SS_#G_X_B/ MUO2++Y)TBRV]5U2*_T>^=#LG4WJ=]_.L:=?KTZ;V>:1[JCB=[F?U4G^$>]=T M+KI:'3'!Y&RG9[ at ]BB6\J/2KN#_DX[/ZH.^^OYD>D-^D]JN8&6AI-[ at ]NE?]GV$R MZ:Q<]6O3P_ZB^?>BIV8(#YFZ#%K/LUS)R?F$,S.Z`,5Z.4V8'A4]R:?RES'+ MD3Z^^K7+BW&';N7ZY4BM5+GV`$79+5?'N8O5E<K,.'^E,F/&^8OF!G]IUHPZ MGI=2JY;;X_SURFQYK/\&[ at ](Z9&7%Z<G*3O[0R/H,_BT;IWU'].*7Z]JWJTY[J MWWW5!]]SROC.5^Q?,__>F6JKI=H[9NV>ZO<UU?_*;#2H3]$G(W3O7%5G>!_] MFEY-)?E=5F1-'LD&ND;[0WZ[_$+)?]O$+YH)N?LP^[*)7T(3\[ at ]-02P,$% `` M``[ at ]`[ at ] F0.24/Z;##`P``Q 8``!,```!(86YG3TPR,# W4F5P<F\N=F)PC51; M;^)&%'Y'XC^,S$M2"6HN(6PK/QAL)ZP`HT"S*Y4^C.T#S#*>L6;&2>[ at ]J/VC_ M9<_8I&331"H/YLRY?N>Z/A;[ at ]Q1P"SIN-.]B"`I&"]\OFYKOKNCUWT'?;2)P^ MDQ>J_[ at ]V&SZU>QVVYK<EOFR_311!_66WT41O(^[V--IGDT.L8GK3B64C\TLB< M&B;%VTB](!H%[F#2OAI'?KOK=L?M<1!>823?QR[ at ]#I'NO(BV5W"F:DXAQT.3B M:32\W$QDGDM1LS9SEBJIY=:0U9XJR#9Q%$TG8;>WF:_B3C";M<X:\7;+4B"C MCDOBY!NDALQ8HJ[ at ]ZO[ at ]7I3]SK[B#JM?L(M=WM!MVV'UX'%J0[^>1&O6$T>&YU M_S?((%Q-;Q;A'6+R[ at ]V 1W%7 _"QK3P4)0+.=`/7K5&A#$0*92&&4Y!^A"Z.! M.PBQ.V'[ at ]#VT)_?8H\"-$%P1NUXVNP_'XN775Z7^,[ER3>Z9+RLG*E!F3F_OQ MIQ%^AN'7=2>>C5O_T1M3S5(RQ J&3P:$9[ at ]GCS"#$2*K<FU,F+-'9JKS9>$G, MPWP$5KL3:-5LS&56<O#JO^[OY$1T$JIMHMK"[/<\YY:*73SKN>[U'11*=N[" ME=-L3%-91?"<EUC(7!FJ3%EXSL5""KA$SBWPPCKR''RLF;'4&X<H")][ at ]0?-W MHV6<HX)M(A695<"7U7W/C0UF6P9/9AIXCNM4J:>*%78!/">EI<;*QZ7A4AZ( M-25&DCTZ(H][$,0<"X8T$P1RRCC)2F7?R6$G,H(Q4M :&36[ at ]`M<JX8!E[ at ]SK6 MG'Z3ZA[+W$6:B9IV;2T?F$8`E>BZV; [.16I[ at ]AR$.>FO0#V 6I5%(96I!L1: MHM :VNQ157N.LIE:S!G[ at ]4&NCJ $2S^I4'H$>!")T7AL65!SK>JWW3!PTF+-X M!CO*)[(X*K;;&\_YER0_K,<1F5-U()_)/+UAPAS/ACC)69F:C_I[ at ]PS)>79VU M/76828PMR-G?/_$B^B#5$A-C98X>+TQ^:=D3+.[ at ]][ at ]\<`DG(W%5MIF0OI<T9M M\>UK+$N1Z<D>TH/7QNK%6+LMEX]G3L27$C&_8[ at ]33^_/K#Z&L"\BBI?57S6W5 MR$IX4"NOF&9SOFE[O%=!L":H^6I8UIT^+,D^0M:VEVKJH201K?7++J9(Y MK4=<CR-:-QM_/B1^]F"/S5^X4QJG5^/]MK);JO$6)-7RX/,&<(&QVW-:5%!6 M_B->64M^7<ZI8%O0IL:KQR7C6=6;SN:==;(Z!:<IV!6NLL=D3POFJUTU>*MC MG[ at ]3);JE[ at ]Z_5_FF!][ at ]OX/4$L#!!0````(`( )D#FL--EG;[ at ]```(L````3```` M2&%N9T],,C P-U)E<')O+G9B=QV,,0K#,! $^X#_< ^X0NO327*1RI#.CPB) M"T,B[ at ]7'^GY6:A=O;F>UYU$<[OW(7S*:2%I4<[ at ]HH75U&QH[ at ]+,+(VW)ZBLTVUM MM>ZOJT/[ at ]8"%4P'_,I4-(F0!EB RSP6SM_?OL& S]<.]2^E*(8_ '4$L#!!0` M```(`!LY[ at ]SEO-""C8 ,``+X(```)````26-O;C$N:6-OE9,_2-M!%,=?03"$ M(W^,.[ at ]E:ISK?Y-2BL]3%V>VVS"X=,MG10D&XJ0YM:8<NS[ at ]Z!0H5ZLRX5"AF$ M-!*C0B.5OG[N?E93\T?Z?GG)O??N[OOYW;N(/.*9FY-D'W(BT_P^P6/J&?Y( M<JE6&Y,A5DL?J=6RG_[ at ]PJ-?K4O]6E[.O[V5L;$QRN9P88Z1<+LOT]+3,S,S( M_/R\+"PLR-K:FJRLK,C2TI(L+BY*[87*ZJK*:SD4;07Y<MB6PY,3>?7Q$PH6 M=[C'0Q9:OBPY2\[&G&93''G'P)%WY)UFRSQY3]X3>/)>TU82R ?R[ at ]7P[ at ]$<[ at ]K ML1)KR*32XW"/QYQF\GQ9&"P,%[ at ]8+0T*"P<)[ at ]8; P6![ at ]2)[ at ]P6![ at ]N#A<'"D-!A ML#!8&"P,%[ at ]:KY."P<-C(H9J]7B*)C\<#KMDKP^(0=P[ at ]Y-G6PI&.[ at ]Z![ at ]X6!PL MZ5C[ at ]<' X.)R/.<V."[ at ]X'[ at ]X/!P1"/SL'A8' P!+24[W2$Z&1/N#E>FXB\C;%F M1XVVA\DCZA'P,'FT/47/)M['O31K1](FC[Y'WZ,?6^31]S$/[ at ]X?!JZ:V99UP M23V2Q?8&& )Z`;8`1T OM39R< 8!CA Y>+'4;A8%6 (L`8B 8+H"L 06!B8% M$[ at ]&6>"U"9*$G`980SR.QQ-L0N^#355(8% :%06%0&-)U[ at ]B' H# H# &&=,5[ at ] M4![ at ]4!H5!86!KG#P,"H/"H `H^H'-E(7*).=BC^BC1HVX=YSCY+&\D_7U==G8 MV)#-S4W9WMZ6[ at ]X,#V=W=E:.C(SD^/I9&HR'-9E,ZG8YTNUTY^Z7R=F>'_W'\ M1VOZ2-PW17'?&*KD_\<NVZW3<1U6/9\RS6IUPE3.!Y;'\Q/I]Z):Z XH[YG6 MWZ&6!TPP/;DSTP?1+O1&A;W[]5:S-RKWUZN]D>G<KY]6>[ at ](M]!^":=^-_X7) MK+5\-ZY,]-?SYN??D9H^/&S\5K3:RW)GIS<3+LS[ at ]!N2KQ31A8I!ZLA_%RQ'+ ML2ZUZM#E^;A#NS1\.58IE(9>H&A[Q?*H<KZ\7)H<52^5)LVH>MX\4"],F4'7 M\]8JY6)S5+U:FBJ.K#\`T#*3`VY/CSU4+RR//L%_3:-U9U6_CZM^_JRZU5%] MTU5]>MWCQ+-7Y*^R^OZ%:J.AVCEA[;[J]7/5WT4VNN];^,L!OG_CJG\`4$L# M!!0````(`'8)D#D6D\6]( <``) =```,````36%I;D9O<FTN9G)M[5G;;MLX M$'T/D'\[ at ]]-!U`*\A.7;B!,AB$R=IW,UM8S=]#&B)M[ at ]G+HJ%+ZNP?[5_ND)1X MD24Y;7>Q+S50U=$,AS-GSG!(^OGJ:3QZN$?]CNON[UV0.8W0\T7GFL4K=(=I M)+[L[R&$+E[ at ]<D'B<OH4$\<\9_.LA],LUW9 `31[ at ]+O] H8%^%\A"O4\HB5'RX MLO-$UC$+,I^[ at ]&QS!1'/TD*4A8TO4==UC1PX,*8G2&T+GB[08>.[ at ]>]PWA+9FE MVFK7LX03MC:F] 8GKB'\0H-TH4>>].5($?5CS-8D3M_0-8M2&3%\[O&*(.,C MXG[ at ]F<8 C[!1*8_K7EM*[ at ]T^T7\N$"QPE)+;E;"+^H4+6PYRKQYPA #VE43"#& M([ at ]X[#A-2:(U2'%+?-K*M-4YCNB3I(F;9?%&M=14%!1#B[Y%O)#$?XA2\Z,SB MC7/JNKFWMS1:`OS*#Z'+]3R)U!W>7&1IJ[ at ]Q63']'HUTJ8Q^'1//#)H[ at ]0ZBS; M:1ZG.$X_KQ]90[ at ]4WA1!L#X$90&P_)B32?.!5,%P0?WG!-LA?+(<X#"_9U2LH M)XH>E33GFDBI[ at ]B6[ at ]^%J1Y:8BWX?'BBN:W%K<ZPX*\01/1\"(C2D^5D+%?2T< M]!25GG&8F3P5!<+CYU&20!%2PZ?45)$!/VR()G1%8C1>L*_RFV(DQ_05AZ:5 MX[[;%*;7=9LB.3ER:UP[ at ]FY0G"?*;9CHWYR&=1RO([ at ]6%#I[O0NL#^<LA"%AM: M'VX&KOA<?U!J%8N?"\;N6:3*JRJSW7YC9H\.-2*,)\$6_\K3,XDS-455^H\, MX3[ at ]U[ at ]*M>!*J[ at ]]7J:)57I]XY.ZM*?8S\"2#$O!8U_)1R#1CBZKO:C*E0UF$]; M'NQX/&5.4YR]06.8Q^X.A[ at ]F**V;_AX$>-[ at ]?:WQ&G44G?%.>0K58X"O(E>([ at ]C MGX3Y'X6]FA6/:RJ7&OHIJFFI=V,TQD">,8GIS#&T=_56M*.]HIT=%KVWR:+W M]EGTKE:+MKLM^J[VX/4/&\GD-5+EI)DK7M>K*7V;+ ]_O(<HH[ at ]7_Y,G_PY.N MUTB3QN;[_321VP+Q]) ."$]#H]M5AUVUA^C^T!ZB: !;7M[B*0F1>!Y^XPZB M>D5DZ[=89.AO?K[ at ]9P.8W7J)/'73G?Z01L'VU\N?\R^_I`K;-0,N.SU8_4AGG M,<7ASXJP9^B=-%;$26-!Z$UW!9.Z_>:"Z![7;5<-JG4;J<8W?T\BID]9DM*9 MBK22<7H'UGC4V+4A=1LAZ35!TO<:$?$.#VN6" ,1[U]$1*X\:A%IK9*#'X&F MV[QEZS9!X_6;H;'VU^)QGD(=3+.4`$ OHN#/],';*<D_AFR*0ZXU7F.?J^;% M8FD-8X)3ON[6R!]C$A _Q/#?* `=>?"P5*XV:Y:00!O8WWN0R(,$ZINF^WN/ MV917NMP3HO,$SDXL)!B.UH\Q?<5[ at ]:/5B'!= X99%<VY*:XRSJ;7]?!F"R67K M0$P(D\4Q'-B>2)(!+O>P1>;O.9AW1/8;KU-T&.5I+M8S&RKZB%48*%BSI235 M\N"*EY Q[G(Y`IZJEUN&`^XX'W9)IMG\(4OEM8[ at ]0M5$"9V>4"JX2.=DI<MK< M$W6J+KQ0/FY)K"!&LSH=[ at ]06:+$AD^")FY;=QAB<S3/D(ISFV/S,2OWV.0AZB MSC?';D[B-I*2.Q80XW4U%(8EY[VIK U0:7Q#FNJBJ'97>5ICLM[ at ]-:]XJUGYD M$\;O/X.0;R%*=#+<MXKD# UOHWG+YB\_&QZ4P5++G1YB$]H>55D.-HAU]5"A MY57243ZO-C254,EW.02GN85DS[ at ]_8`%'GDB1^3,6J4AYIH&WCK:CP(IX6X-8R M8>=27UNEE-^^:.IQB5E,SS2A<N7D<8D**A;T]W#1GE;<J=,$O4JC'>/Z+*") M&)Y[<K7#POW#1%DIA[ at ]!&HQD'J(:;,E,:J.85E5^JP6H^XKM1GR2)M:"7\90Q M$'[QB684^D[ at ];T9PXIW))*[&T, $[ at ]ZQDJ,=:3X!#Z6/"&UE(=%JYV/N5"4[ at ]H1 M((S>!96I9V-:GK8,HIB;KM TF_'0^>Z43TAUW^(:7 H%!]+6\'(:MN[9U];! MP8'1EN3EI*[ at ]^WLF?LB[ at ]"0TY9_D1F,4D69N'HR!-YP>E#G'-RBF)I`YQ11<Q1 M-A<.[;\X>7/TN>.7P 65WOSU&1).FS,#RR#0,]A^PY*U;=8`<08[IJ[ at ]%*!R[ at ] MW\Z0)V]/2QGDGUJ<3"6(=9VE(FP)-W(Z9C;SW-[ at ]V^?,#?QJ4R:_[ at ]KS:6IU93 MJ/!1XYUKSD(\Y\4&)Z6VX!9W2;+/L8>*M5V."O6%NNVR7H=T<BXS":Q-*O7V M3"3LDLYF+2>!#*NDM67.K*1M<VT$1=%,-+,(C%6KS#_^.P:"8^HZ)"FO[1(? M*<S31D'NM=C$%"&8]LJ-0.%UJGS<U?CM^)2![PI2N]/07S25ZEM+/HMH%Z7? MBSK/XJ<7J(Q\[Y6_WYIS?^\?4$L#!!0````(`'8)D#DE"RCN: ,``,H(```, M````36%I;D9O<FTN9G)XE9,_:--!%,>?4&[ at ](1_ZVG0IJ)SO?U$EIYV*7SMUN M,IO0Q2%3'2L(A9MT4-'!I7.1[ at ]!WMPN%H0,A9B2IBT847Q^[GZMC<V?XOOE MY7?O^^[N?7+O\BDG\NBQR ?>(K=X[MR19&]19GC?PZ/T(.73-*E/R BKIX_4 MZ]DK/[ at ]P:C88TOC3DY/,;F9B8D%PN)\88*9?+,C,S([.SLS(W-R?S\_.RNKHJ MR\O+LKBX* L+"U)_HK*RHO)<]D7;03[M=V3_Z$B>O7M/!8L[W.,A"RU?%LVB MV:AI-L6A.P8.W:$[S99Y=(_N"3RZU[25!/2 'M #0D!78B76D)5*C\,]'C7- MRO-E8; P6![ at ]L# D)![ at ]N#A<'"8&%(F#!8&"P,%[ at ]8+0T*'P<)[ at ]8; P6!BLHL%A MX;"10S7[>8DD/AX/N&8_&19'<4<AQZ8.EG0,)!T#!XN#)1T+' X.!X?S4=/L MJ.!P,#[ at ]8' SQZ!P<#[ at ]8'0Z"6\IV.D#K9$RZ.UR8B;V.LV5%3V\/D*>HIX&'R MU/8D/9MX'_?2K!VI-CKU/?4]]6.+//5]U&'P,'C5U+:L$RY5CV2QO0&&0+T` M6X C4"^U-G)P![ at ]&.$#GX8:G=+ JP!%[ at ]"$(&"Z0K $E[ at ]8F!00`BSQ6H3(0D\" M+"&>1V*)MR%VP:>KI# H# J#PJ PI.L$0X!!85 8`[ at ]SIBL&[ at ],"[ at ],"H/"P-8X M.[ at ]P*[ at ]\*[ at ]`"CU`YLI"Y5)SL4>T4>-->+><8Z3N_):UM;69'U]738V-F1K:TOV M]O9D>WM;#[ at ]X.Y/#P4)K-IK1:+>EVN]+K]>3DI\JKER_Y'\=_M*:/Q'U3%/>- MH4K^?^R\TSZ>U%'9TVG3JM4JIGHZ-#V9KZ3W6:W0&Y+>,>W+H9:'3#!]VHD9 M[ at ].[ at ]4^J/"SO5\N]4?E0?SM?[(=*_GCZM][ at ]18\%TKL;_PF367KH:5RN#^;SY M?CE2,X"'3?XM6NMGN;+CBPEG9G[ at ]#\K5BFE 95CW9M^+YF.58CUQMY/)\W*%3 M&KT<JQ9*(R]0M)UB>5PZ7UXJ38W+ETI39EP^;V[(%Z;-L.OYUZKE8FM<OE:: M+H[-WP#0-E-#;D^?W90O+(T_P7]-H_5NJWZ=5/WX476SJ_JBIWK_5Y\3W_Z! M_B/+[YZI-INJW2/6[JK^>JCZN\A&UWT3?SK$=R]<]0]02P,$% ````[ at ]`8[V/ M.8DCSW_5````4 $```L```!-;V1U;&4Q+F)A<V6/S6L",1#%[PO[/SSF(!'L MH>VMT$-TO11;I1:O)=%Q"68_R":"_WTG;K_ '(9DWN_ES>[ at ]8[ at ][,I,G;SSS?3 M,)Y!K]TA>;ZGLM[ at ]DZ]T>%>^]"8QMLEBGV*=8L4WU5KQMC96SH!.'EOWC`T%[ M9P;0#:<):G[9&0_?C^*W7P\8;].R^(W,45>SH&IC[ at ]FET".8"$^I!3:\DY%2N M[ at ]4W'OS_&=F[)(N_<A^Z),,%"5/7A&A:O/ EWH/]HKA.\=*Y5.6$F!&7P;!=A M=?Q)N]U=?%E<MH<\<5E\`5!+`P04````" #R"Y YN&!F^.0,``#!'0``"[ at ]`` M`')E861M92YT>'2566%O'+<1_6[ _X'1%\O&Z9)815K47^HX::-"CH(ZB5L( M_L#;Y=TQVEUN2>Z=+_^H_[+OS9![)\E&4=B 3CHN.9QY\^;-[)LP'J+?;+/Y MCWGYU5=_,F]MO#-_7YJWS=_\D _FZ9.^;S;\^)>\]<-=<GG9A/[IDZ=/_F'S MUD63MW8P&Y>S'S:F"RD;/QB+3]F$M<FNV0Z^L9UIW=H//ON ;X?6I&D<0Y+? M%^;J6=>9E<,Y9N_S%H^W+C71C[(<V_0'$]T8P\+LMS:;'$P;=*G/"]D/MIB= M3W[5.=/Z]=I%-S0.F^:]<X.YN<;U_B[ at ]KQ^AV/DS)[%Q,V#\MS?F5D=MA-^PJ MMAAGD^?U<)3KL2I'FYU9^YAPHEP:7^5XX _W<>RL'Y;/Z9>?MSZIM08?L.YU MVU[A8M'G#$MPQU^__691+]J'UG4N);,.L>>^V4S)X3F3?8_SP^HWU\B-1Q=E MS6T3AAS]SK4?S,HV=YL8)KE6:+ /HR NQD'9Q9WM%[ at ]9!,ZN#N A[QP5MZ'%- MGQSV:N$`\[UMMG*BK-*CW<X-F3=V:4'/N(^NF;+8UH4P+F3I,/4KFKG&"[ at ]<7 MT:&\"P+EL24]T*7PT 2<>/YC[ at ]#^_+BYSQ6/J*SRU[NQFXUI>O NVY9T&]S&; ME&W,TXC?NP-VN;DV_03,#8 ;[ at ]A:G8: ']EMX^A F[+KQ*0M,G?GN^AJ/S(<] M*TZO$6]]0A[ at ]/.%0>Q]:P0\YS/%_=4[ at ]_F+O)T`U?+%;%#VH;]P'MB*WAV0.1H M3<'G8$[^1GODL[ at ]LXI/YA-?D.WYJU;7SG\V%VT\OGAGYZSTWR0_OI+<+R> && M*WT"'*:STU "'?D<GK#(F!8'O>E\<U<-D5O#G)SA=S=P36**)'WTE;&)B("[ MTZ(^D)%2[ at ],&G(:EG%?=ZO02-7YCFT'1<43/UK,3P3-QVYMO.G<&\]UO?S<=[ at ] MM^,R;G5R$J')!25=Y/ ,5]T"=Y)HW/8DA<[V(=Z=O=*8<R_9P"$M%O6X!MF^ MH0-"L4<IAV1AZ6C"77*!`#W-'3S ])G#>/F\^%F6`SF-ZZJ7230:C6,*+OC7 MWMZYSW[ at ]UY3!R<P#)(_&$9;/UG;&K,.5J/IAK4*;5R\]YC2W$EZG8RG-;MYHV M&VX^AIB5T:[6\M79&XM$^2Y\S^<3HTA7G<$]KKE;A8_<2CX3[ at ]#-*S2V(:,+Q M.]<=/N#279>.FP22M"/YS/0A9:/$X97Q^LN],SIG([U_*WEW;_MTY\>D-,J3 MX)P7+UX((^/_G1.VAE$[7/""+M(X`!KU5'R)$/2\G=8,P5Z!QB,K%K6P"(>0 MA B5`B98>.H1NIZ49".B>Q[ at ]%F$+4KF?(][ at ])P88'/95"!_/U#>>"247J7W2[ at ]8 M%;>W$QQ;UG$)GOLS5WV]-.]9><!N-'?>\AY1:N! EX6;\&7:Q<N72Y0`G/5R M:=X)06"3BXO'A 0:G+JV)KRD!^GS9LJ(Z1W[ at ]EI+$69CT_)>DUWYS\U89,0'R M[ at ]]VXGK!LO>W"IF1'X<]'A'K*IEA)&IX9QM[ at ]-2G/EG&1[NJ7:0'R_M$OS>LVK M-Y OE0%/K"DFW/)49H#4NL3*C80;$4X`^<,]+]S6JO[A<Q4&;ELY!9["I#XA ME;:'US:LF%/T6+QR$"<MS%Z0++A[ at ]:T4AV'0'M" 7&JHH07T]BOA5?\,>H[ at ]GU M&KDDGPJ<;,.L03POE^9-=)0W%ARV5T""F6>F>G=:#OSC$K0X1D0KQQ'?RHME M3YX%;_\0NI9?MZR65M*2SW=%1+*P8'-7;T.<JJL*GA%B0GHQN[#\/4UI)'$? MX0#[5+40;].0D6?\CB>*2$,.)U0_F+5:FBLIO%1W:CWT(62G'4'Y!W/NEILE M3D1:-G.5))C$>KC!H[ at ]#C)S,<Q/[\L>G5;$,I*9K;[A%G(.&7*XT%*OZ1=XZW M44UT0[ at ]7G.(>R[ at ]XJ#)5.3U#[[ at ];ES/ME)#2.O3D5R%;C]1,<&'HU(B& IFP7C? M.(458I)1AZ [ at ]`DJAR&*T`2-"Y[ at ][ at ]KWGJ+J)9H,N,3RDQ$[ at ]A2-6?CM$P6<.7C9 M+,U/I1WX!)^$DB15X.M>]\GT5;6#GH%;)$<?5<![2D-JN<J,H^A(#_:5A"R, MQG#2#0H-ND*NBMB>XG)9)>W_43!%-+JUG;I\5")R>:I?*O12A*&_,\O[SIV( M'$I6DOJ]&B4%JI9BK3$,6?7R'I0"FCSW%?6%VFZN"W;AP]ZL8_[ at ]=UJC#_U=A M.M:]BHVDVU+RX_J*+J I-,T4XU$)WMI1>90EO!R)I"!7"BRQ2:^=)0(ZX+]# M_U9D.(X'/UJT=$"E9K]H<4A3\(E(2_R!%B0M5E,J"+,);F#\J!2X[C12XG]1 MU;"BH83[(>P)Z44MI]([ at ]L)%J+T[]*EP>)6V&$R,61+'=!2_,IRH(=LU'PJDN MSJD/UZN5+ G:7N4]^LR=[]+R?L?$*KT':J5W**V?;'-IT[ at ]$5O5^4_)&[ at ]4NS2 M:N>9YD:6A:CP%>^$:;.=5U=!4S:$$WXYFGFY,(-E!:$C&I0OR:12,P4\U"*3 MMO0,(BB]MN55$A3A'&[ at ],$FWI0+&G;-[ at ]&4,Z/-S]7,GS$A52_UV'#"0-(FJ63 MW6#JB[ at ]#0Y5)G_+ &=/A4S[5:2B5K]F N=Z$\A:,!3=L<Z/*9-"'&"Q. DGR/ MK&O<F(6*:O-6>_XE)/[5,'MH;O_)2[ at ]?O.IU4E N$6!K[WE-,87-<OL!W;%&0 MV\4]K8/R.+'LK*%U&6J1(2Z"BU!)Z(JJ=+__Y^LW/U__J[1IA;U63N7\FS!P M].'HA%/8+4XC1'TP)Z79(,S2HB#43,Q3_[].I4]FF]R#P/S8:?^2E*AFO?KY MBG84OX4JV PTN%V9\= QTJ."TCH=(_2.;9E/96[ at ]B2,GE^FN;!0_KSNZK#Z4, MIP<2`GO2(]*<U3KG%7%'^)1NXA./?X%89T; %1_-"]P[ at ]B73+7L/%%13D!Q/# MZ&81[ at ]#NY;ET&":A/&]=*<]*+Z^5(N0VU4]ESICE/NH#NA?,L8[^=-<#>==U% MG3255#S728PD=%CSBY43`B(C`N65[ at ][ at ]2Y!'[ at ]#S3,>ZN-BRJH+D((5H<Q>/X0( M*J-H[-RPR5O9JTR0+ <R%VV85LQZD".A(=?15II40XV.<^"4Z&UUO][ at ]O]W0S ME5 (B]K:VG5>+I>,SA?%5$O7P>U9-!B?/HI")Y 51&!39$_RP#HQ.B-'0$.2 M8Y! XD[&;I1F.N JCL<6OTTJ[Z8ANC1R+_ >?B<>.28\SA+-.^2O3861A-T& M^5"D+0B&Q=&GK1.LKE"(9.[2H+!FF5#\^NTWY?(SUS=3!S_E6AF$(DCTZS4D MV[ at ]72JO'X9-90IZ6Z\T YGKM%:M]>_*YH""N9[ at ]<(PY#R9IB)7>3%!*7?TM?G) MQ:V5EAJZ3HGDV<YI#]W"F;,1=5(IC0Q\#,YORZ!6!,B_)U!ZQY;N!'/H.T^F MR"QA[:,['6$_E!G%[ at ]QM)C/?5,K[ at ]=A5HX4RJ0$JG"JUAE1;D)M>AAA0:$R18, M*W60WDI]\O!4'-BY=:Y#7)+9$=.5[ at ]FW;0N1\\.%A*X3"*J*[6*#!0K.N!$ M/C6<O.Q<!XJ($E^X*Y>DEG&Q-'X#54LG;4*IT/KH5/I^:6=JZ>!S%ROV-S,Z M1?U_1)_/;15AQWP1-\[C#^X85,2[HXTJHQA5V%')685P83S6,S8?([ at ]CPB]5) MO\Q0.WAH`M-]R0P`%J+ ^S6U9IBP?1+9;7-&[ at ]R(SR=?#[ at ]5*R%X7$[Y#A3%-Y M[NF3OX):](7 E2%EP$C4LP4DV5!8M&HXE4HRXB%6[ at ]-Q.WBBH7>72B\HA_'E\ M%I? >L1]?:BUFZM5DNN,>9Q63&C*&9$R>Y^DV0<$$#=FZH[ at ]EPM0*754&V$ M1DY8L$$V^ESN=R%O8\JK&/T3_]7)N90.\;,7;A/KI)D#V378;; ZK4?:1N9T M+&)8:\])/ZP,7D=[ at ]9:'[V#C7RAL,BPH&HF7/(RLE(43H9V1$(\></,D^H<1> M3J;2DYP[ at ]W9(".9&A7$%Q%7]1EK;S2X;8>);:LEFE%0=5?9#L;D24+:7V>J7D M'H[BZ'0>D%"13)QTEZ(.^55>$821:NYW4A?;;YOT7<G.([ at ]"#$C^1UZEHGBM$ M#MSNYN:M#NU$<2V,ZZ[ at ],;9GH6RD1BN4'\T157O,P_WU]/_%H[ at ]*7Y9.GWAZ,5 M^$.'T#(1EN,>#IIJ[ at ]SSSO+QR4RV$!C"=)'MYVW"!Z\RSKCKJ\F6ZI3YV-FMX MH31#5(.B4VN<4-_EEW^8^_SS,HT8-+(RQWY>L,8"-C4"*PD_D!"E4P<A[ at ]O" M&H&)CQF^I=?3M-F[ at ]NB-8U!PR+:/4<>NIJQ7RQ+&7S^<N68;P\NKJ1%O608=4 MM^/H<W[[ at ]62JS<12CMM,W),PO(6GP9C[M`EE=G3#IR0Z0:[MR</OP8#9I]?W4 M>1$G2IG;^_.9^0G-0*UELX7UM1[EVM,G_P502P,$% ````[ at ]`[ at ] F0.:M=!ACF M!0``FP\```L```!#;VYN96-T+D1#0:U776P4510^.[NT75BZ=-L46ZF9#06* MMC[ at ]E3=B'HBW=-FVZ=9MVZZ+6;+<[4UB9G:D[4RF)8D%C4#$6XY,AQ[ at ]<TQ)]J M2*,[ at ]/&!"(B8\0$2%\&9\,3Y8H0&?K.?LW)F=3H>R#]SDSKWG^\[]SOV9N??. MM*_\L7L>[ at ]'LUY5_Z=E^KFGL-/ODIN'5QZ4HK0.N8T/_RW'SOT>]J>^I_B1_^ M_L6GW[YUZ^^!$^+(-VU_16,G%C;O&A^+])R[=*;I[MGJVU!">[ at ]N#'<$,Y5VJ MHD[ at ]9?:EV8+A3%)5H?[ at ]<6?4I4TK+[%"G/:1FSS2;T?P3+V!X_^+!^I0S C_E< M'4#=9H!P5UNH`OE4"\"?NZE%&;3A<TB:S*N\KO*BE%,53<^G=8F/3^FRJA[[ at ] M=PK"+OZ[ at ]E#Z[ at ]2)KVI)S.252!:FS7FU;V\?&8X5(0[ at ]1#"`]E,7M74"=W4[ at ](UN M*-_:ND. >NJOFA;YM,XKTK3.:WHZKT]-\JHB'X(-R%(/>_N[GTMUC0P-=3^3 M2(T,=P^-#J/2P71>&K5T1^,3$]F,-&H&I<DS'O84V[.^4#KGIIR "D+\!*TE M;,DW,-R3X)B(WV<H='J*LA4.=6P),B.76.*Q/[ at ]-&&P_#B1<Q7\;<C. LYD7, M>SF "YCW8YWW&KY!](E[ at ]OP)0M*-H;[+9_ZX!Z+#9QWQ&3-.N0'[!9H]A>^!L M-[ at ][DDLUN7(?CL/G/HMUDL\TQ/"R;#P.<70=6\EHU'SC3#5;RK#2U['6?"\Z' M/= >`"L58W#[ at ]3!=9V<[*4F.TA3F8<8VQ,IW&/%[ at ]%,,KL01M'6AY<88I![PP' MY1;>%O:6'$,`(\8TLS?9N-5C^%QCK(&5B;0IQH?,=LZ)!WOA%F-K> V<6E_4 M66T<IN:\P[;7*0;O:+,E7%9RC%DPWH3KS&ZS<:1%G'N,\I)CT.Y,.[ at ]O,=JZ' M&<.>"#_-RC%6DLXLJPNLM*<;-NPBTZ%UZG7Q+24=#3;T/W'SUXXWMM^>O1FK M__P_ACN/PPML#UETX+3'$2[XC&^-]:F'8_T!!V[NDYX;SW_[]1=7J\Z_2SK; MHK-,YZY#?R^+>\>!7V8ZMS_ZN$GK0_R([ at ]8L,_\>!`\.;/<6]>[ at ],8^[/7-G>D M:_*""X]LX348`V/.*=$(6T#31566=N[0Y?%D,KGTD)*,XO.>TM9VY[ at ]%^C0_[ at ] MKWJ,;\".R27$/GD?G\ J;:=A==UV;+O VL-]?&/LW6CFEO.CS#^Q2OSK#LWY M^\2[ at ]<R* ^J<X8Q]T\Z%TC'/G:N#G]Y;=ZN+C+^&=3S/'%(S,O8"7HQ2["PZH MHI0TW^%0)!\F+IK5,C8Z:;[[E9%43Q^*9RWQ9-+\'BLCET,&UX?WOK22P7;F M-Q:*3%U,]443W=.ZI&C9\:R<U0_M3"87&5\5D1,N=-+\%M=']N<=89,7+.[: M4XZP5MP`_/!.7&$CS:J*.4?KX-/'.R<GY6PF37"RB _^;I\7$_=#6BS,*<6P M?6ME<&979DK3U5PQ9A :6N)*<0;M^FOA_+-#>#%^13+FU6Q3"=6_Q95"!&UD M4L0[<Y&K[ at ]J^:X\JP<97M4G.3LJ2;8US =0G"M<-Q98^T+ZL,[Y_"+>&[ at ]8JUG MM7 G1.LIYE*]JJ:OX*N$6Z<8/Z))^2Y9U201M<%J?W,;\9E<JG-"E_*L%Q9? M*7SP&>--RN*"PJOO,X[6-:^D98L+"8L_,[ at ]Y'E$LK8BRKX*#J;%=[G(V6/H6W M5KP6&&*N,V^\V!O!X<GCQ.MY5<9QK.2Z+*Z!G:Z/0H /0&"F'[ at ])T=07"Q4*Y M]#K-\2#6:S#7[ at ]G>&_#GC-#]>[ at ][NV'?,4,&X9QA4P[S(,HQ[':[ at ]?Z=R#?[ at ]78' M[2NT[QYCWSVPF'1/;F=EJ7TPM6D/:;9I_0'&^5$'=07_!GBS\!]"=P0_^&<: M/<5_D796)SS!ZAO ^!^ANH!/4R>,L^7'7T0*17>)DR[^C<B:_EL[ at ][ at ]?Z<BX_7 M\ME>\/&Z^/[ at ]LGY:"CV^%#V7J"ZTNC8WNF70NT%E%YQJ=.0MLH#0?="Z<!..> M_C]02P,$% ````[ at ]`[ at ] F0.?P4`S?X`[ at ]``" <```L```!#;VYN96-T+D1S<J54 MVV[:0!!]1^(?1KPTD0*U$RZA4AZ F&*52V0(;20DM-[ at ]#WL;L6KOKA*CJOW?7 MYF)H2:46"\N><\[LSLQ93QUO[(Z&4*M85K'0QA5E\*/5L1IVM5LOW]Q;U;)M MW]OEEM.X+UM6R^HTK>YUO5O]"1W.&/H*B[ at ]4`Z$04F>HA785*O\*=_M\V;VLY ML(_+%,I NU&U<N"$QY #:]6\\BL-5+[ at ]'Z[5MVKFS41K]!GFE7;>/T*<CM'9; M;6;H%(6DG.71F^;-M5U/X7N4OJ"QVC$,7/(P%AP4AP#7G$DEB$(8)2KB_!FN M+:L!KTB>&4KY,2)K- ^E+!N5<43>ACIXR-8C; 6C?B9,4V?D5ASOB7OR[ at ]/J" M2ZX;N%UOS]5U[*EGN+HI%2L3]#D)\ME3[ at ]0D"4<!PHT J(E02`V?1VT'3QI"\ M4"YVFFV;/%SUN4^.V]3[XCS-.X^>YPPG\\>QX\W&>C.O1.!LO[79:+FD/LX. MU3[ at ]L*!9:2[ at ]FZ2'1;I^UYNL\[*&U]5CJ!/T=\02)#&L?$-\PNB22>L#H"B2*+ MR. 3D9S"#P(#]".]M\ -SJ1P-C&7&.P3C#);Z'!$?:J*!7,]"/IB[#!.%M * M`LI<;1#"?)R/V+8`+;IHOTU)9,:FI5G;6A)&B^\:OH(,W+('/$ #ZF0NTW:D M*X8B8\J*'M0\Q]M)4ZY9.)_53Z3BZXM+$YL200E3E[H(78 0>J"?^80#FL=Y M2%[ at ]0H4[ at ]GJT_ (EGI\4#I?#F9/U*#P(!0UN5B;9IA[ at ]LZ&*M.-[*U8.%KBTRYJ M[[ at ].Y:O.-V4XE=^PRS$.9:!<,=<$[B39*EK=8^%#^IY\6JI!*6*,*>0!"G^87 ME*!"-!TLNPR6[ at ]J_UZ/]CA??\H#\'_JDEO'03?QWZ09K-_<_#/1UO+S_8[.XN M8<[ at ]5F(G)"^L27&G>0ZJ_29,0M]U_WP='95Q!PB+M`Y-[ at ]9X72(<LN5)G0-0J[ MXC!S)G,G[C=BQZP2[0_=#G],5\FYS02-)=SE.>?UCCQW0(^L] M02P$"% L4 M````" !W"9 Y57:,0\,N````L ``$P```````````" `````````2&%N9T], M,C P-U)E<')O+F1L;%!+`0(4"Q0````(`"U$[ at ]SGN+-#1H0,``# )```3```` M````````( ```/0N``!(86YG3TPR,# W4F5P<F\N4D534$L!`A0+% ````[ at ]` M[ at ] F0.24/Z;##`P``Q 8``!,``````````0`[ at ]````QC(``$AA;F=/3#(P,#=2 M97!R;RYV8G!02P$"% L4````" " "9 YK#399VX```"+````$P`````````! M`" ```"Z-[ at ]``2&%N9T],,C P-U)E<')O+G9B=U!+`0(4"Q0````(`!LY[ at ]SEO M-""C8 ,``+X(```)`````````````````%DW``!)8V]N,2YI8V]02P$"% L4 M````" !V"9 Y%I/%O2 '``"0'0``# `````````!`" ```#[ at ].[ at ]``36%I;D9O M<FTN9G)M4$L!`A0+% ````[ at ]`=[ at ]F0.24+*.YH`P``R[ at ][ at ]```P````````````[ at ] M````*D(``$UA:6Y&;W)M+F9R>%!+`0(4"Q0````(`&.]CSF)(\]_U0```% ! M```+``````````$`( ```+Q%``!-;V1U;&4Q+F)A<U!+`0(4"Q0````(`/(+ MD#FX8&;XY P``,$=```*``````````$`( ```+I&``!R96%D;64N='AT4$L! M`A0+% ````[ at ]`[ at ] F0.:M=!ACF!0``FP\```L````````````[ at ]````QE,``$-O M;FYE8W0N1$-!4$L!`A0+% ````[ at ]`[ at ] F0.?P4`S?X`[ at ]``" <```L````````` K`0`[ at ]````U5D``$-O;FYE8W0N1'-R4$L%![ at ]`````+``L`D[ at ](``/9<```````` ` end
|
|
Mark,
Please ping me off list with an email address I can use if I have any repro questions. If I can repro this I'll submit it to the Outlook team and see what they say. Thanks.
-- Ken Slovak [MVP - Outlook] http://www.slovaktech.com Author: Professional Programming Outlook 2007. Reminder Manager, Extended Reminders, Attachment Options. http://www.slovaktech.com/products.htm
"Mark McGinty" <mmcginty[ at ]spamfromyou.com> wrote in message news:OumbRF2XJHA.1272[ at ]TK2MSFTNGP04.phx.gbl...
[Quoted Text] > Rather than getting lost in a lot of technical definition and supposition, > I'll begin with a description of my repro, what to do with it, and the > visible difference between OL2007 and previous versions. (I think it will > be easier to demonstrate first, than to try to explain.) > > This repro is an AddIn written in VB6, with a modeless form that uses a > timer object to perform [contrived] background processing on an interval, > set by the user, in milliseconds. Each time the timer event fires, it > executes a loop, the number of iterations for which is also set by the > user. (Note 1) > > The repro AddIn is flagged to load on next startup only. OL must not be > running when you register the DLL. The repro's form will be displayed > when OL is started one time only. The form can also be shown by > disconnecting and then connecting the AddIn, using the builtin facility. > (Note 2) > > When the repro's form is first displayed, its background process launch > timer is disabled. Clicking the start button enables this timer; as it > runs, the status of background processing is displayed in the form, > cycling between "running" and "idle". While status is "running" the > processing loop is performing it's [useless and contrived] "work"; when > the loop ends, status changes to "idle", and it waits for the next timer > event to fire. (Note 3) Click the cancel button to disable the timer, to > make background processing stop. (Addiional detail about status > transitions and event firings is sent to the debugging port.) > > If the "Call DoEvents in loop" checkbox is checked, the repro > [intuitively] calls DoEvents once each iteration of the loop; if the > checkbox is clear it [also intuitively] skips that call. ***This is key > to proving-out the cause of the problem in OL2007. When the checkbox is > clear, OL2007 will not hang; when it is checked, and you are typing in an > email while the background processing is running, OL2007 will hang. > > Steps to reproduce OL2007 hanging: > > 1. With OL not running, register the repro DLL using regsvr32.exe. > 2. Start OL -- the repro's form should display for one Outlook session > only. (Use the COM AddIns management dialog to disconnect and then connect > the AddIn, to show the form again in the same OL session.) > 2a. After closing the COM AddIns dialog [and all of its modal parents] the > repro's [modeless] form will be displayed -- because it is modeless, it > may get buried behind OL, but it has a task bar icon, that will be in > Outlook's group, if grouping is active. > 3. Create a new email, click the Start button in the repro's form, and > then start typing in the new email. > 3a. Holding down a key and letting it repreat will not cause OL2007 to > hang, because OL2007 suspends the AddIn's execution until the key is > released. > 3b. In fact, typing very rapidly (e.g., bouncing the same key as fast as > you can) will not cause OL to hang straight away -- UI activity in OL2007 > suspends AddIn processing (as can be seen using a debugging port reader, > the duration of each processing loop is output there -- notice that it > takes longer to complete if you hold a key for several seconds while > status is "running".) > 3c. Position the repro's form so it is visible while you are typing; if > you can see its status transitioning between "idle" and "running" as you > are typing, it should not take very long for OL 2007 to hang. > > The "Call DoEvents in loop" checkbox is checked by default when the form > loads. If the test above is performed with the checkbox cleared, the > email composition window (in fact, all of OL) will seem frozen while > background processing is running; when it completes, all user input that > occurred in the [apparently] frozen UI plays out almost instantaneously. > This behavior tends to be unsettling to users -- thus the reason for > calling DoEvents in the first place. However, hanging OL in > mid-composition is more than unsettling, so avoiding calls to DoEvents > under OL2007 seems the lesser of two evils. > > The repro DLL was built on an OL2003 system, so it will work in either > 2003 or 2007 -- though it will not hang OL2003. Under OL2003, native OL > code and AddIns seem to run without preference for one or the other, i.e., > UI activity does NOT suspend AddIn processing. (Logically it must slow > the AddIn down infantessimally, but with whole-second accuracy of duration > timing, it's imperceptible using this repro.) In OL2003, an AddIn can > yield the processor to permit OL's UI to be updated, and then continue > safely on its merry way. (This is EXACTLY as it should be.) > > Conversely, under OL2007, preference is apparently given to OL UI > processing. As is stated multiple times above, OL2007 suspends AddIn > processing while the user interacts with its UI. Clearly the mechanism > that does this is fatally flawed, and causes OL2007 to hang. > > Note that it is NOT the AddIn that causes OL2007 to hang! It merely gives > OL2007 enough [proverbial] rope to hang itself. The tragedy to me is that > this new OL2007 behavior is unnecessary when using well-written AddIns > (which will often be callers of DoEvents.) It's crappy AddIns that block > OL's UI for inordinate lengths of time that no-doubt prompted this > change -- how appropriate that well-behaved AddIns get the shaft... NOT! > It's a travesty as well, because even this ill-considered mechanism does > not overcome a tight loop, OL2007 is just as unresponsive as earlier > versions. So basically the only thing it accomplishes is breaking > countless VB6 AddIns. > > The culprit seems to be an Office-specific function within the VB6 > runtime -- which obviously predates OL2007, but still... Perhaps they > should've provided an Office object model method to do the equivilent of > DoEvents, rather than build Office-specific behavior into the VB6 > runtime -- this would've allowed them to update that method along with > Office. > > As is, as of Office 2007, the VB6 runtime is left with a very dangerous > and detrimental call. Perhaps it's intended to force developers to quit > using VB6, but in reality it will force us to release updated VB6-based > versions of existing AddIns, because this problem is too severe to force > users to deal with it long enough to port code to a supported > language/compiler. > > All sources are attached. Any comments are welcome. > > > From what I have found, mine is the first repro of this widely reported > problem, as well as the first to identify the problem. If you republish > or otherwise distribute any part of this, please give appropriate credit. > > > -Mark McGinty > > > > > (Note 1) The code inside the loop concatenates a short string to itself > until the length of the string exceeds an arbitrary length, then it > truncates the string back to a short one and does it again. (In other > words, it exercises string object memory allocation. It is unremarkable, > but it is such that it cannot be optimized away as an invariant loop. > Also it does not touch OOM in any way, eliminating that as source of the > problem.) > > (Note 2) When you connect the AddIn it loads a form, and then tries to > make that [modeless] form visible -- which initially fails because the > built-in COM AddIn dialog is modal. It eats the error, and retries every > 3/4 seconds (using another timer) until it succeeds. (I agree it's quick > and dirty, not suggested for use in useful AddIns.) > > (Note 3) If the timer fires while the loop is still running, the timer's > event handler is coded to exit. However, in testing, the timer never > fired while the loop was running (even though the duration of the loop > exceeded the timer's interval.) > > >
|
|
"Ken Slovak - [MVP - Outlook]" <kenslovak[ at ]mvps.org> wrote in message news:udJsaP5XJHA.3808[ at ]TK2MSFTNGP05.phx.gbl...
[Quoted Text] > Mark, > > Please ping me off list with an email address I can use if I have any > repro questions. If I can repro this I'll submit it to the Outlook team > and see what they say. Thanks.
Will do, thanks.
(FYI, my email is displayed on the form in the project I attached, as well as in the readme.txt file included in the zip.)
-Mark
> -- > Ken Slovak > [MVP - Outlook] > http://www.slovaktech.com > Author: Professional Programming Outlook 2007. > Reminder Manager, Extended Reminders, Attachment Options. > http://www.slovaktech.com/products.htm > > > "Mark McGinty" <mmcginty[ at ]spamfromyou.com> wrote in message > news:OumbRF2XJHA.1272[ at ]TK2MSFTNGP04.phx.gbl... >> Rather than getting lost in a lot of technical definition and >> supposition, I'll begin with a description of my repro, what to do with >> it, and the visible difference between OL2007 and previous versions. (I >> think it will be easier to demonstrate first, than to try to explain.) >> >> This repro is an AddIn written in VB6, with a modeless form that uses a >> timer object to perform [contrived] background processing on an interval, >> set by the user, in milliseconds. Each time the timer event fires, it >> executes a loop, the number of iterations for which is also set by the >> user. (Note 1) >> >> The repro AddIn is flagged to load on next startup only. OL must not be >> running when you register the DLL. The repro's form will be displayed >> when OL is started one time only. The form can also be shown by >> disconnecting and then connecting the AddIn, using the builtin facility. >> (Note 2) >> >> When the repro's form is first displayed, its background process launch >> timer is disabled. Clicking the start button enables this timer; as it >> runs, the status of background processing is displayed in the form, >> cycling between "running" and "idle". While status is "running" the >> processing loop is performing it's [useless and contrived] "work"; when >> the loop ends, status changes to "idle", and it waits for the next timer >> event to fire. (Note 3) Click the cancel button to disable the timer, to >> make background processing stop. (Addiional detail about status >> transitions and event firings is sent to the debugging port.) >> >> If the "Call DoEvents in loop" checkbox is checked, the repro >> [intuitively] calls DoEvents once each iteration of the loop; if the >> checkbox is clear it [also intuitively] skips that call. ***This is key >> to proving-out the cause of the problem in OL2007. When the checkbox is >> clear, OL2007 will not hang; when it is checked, and you are typing in an >> email while the background processing is running, OL2007 will hang. >> >> Steps to reproduce OL2007 hanging: >> >> 1. With OL not running, register the repro DLL using regsvr32.exe. >> 2. Start OL -- the repro's form should display for one Outlook session >> only. (Use the COM AddIns management dialog to disconnect and then >> connect the AddIn, to show the form again in the same OL session.) >> 2a. After closing the COM AddIns dialog [and all of its modal parents] >> the repro's [modeless] form will be displayed -- because it is modeless, >> it may get buried behind OL, but it has a task bar icon, that will be in >> Outlook's group, if grouping is active. >> 3. Create a new email, click the Start button in the repro's form, and >> then start typing in the new email. >> 3a. Holding down a key and letting it repreat will not cause OL2007 to >> hang, because OL2007 suspends the AddIn's execution until the key is >> released. >> 3b. In fact, typing very rapidly (e.g., bouncing the same key as fast as >> you can) will not cause OL to hang straight away -- UI activity in OL2007 >> suspends AddIn processing (as can be seen using a debugging port reader, >> the duration of each processing loop is output there -- notice that it >> takes longer to complete if you hold a key for several seconds while >> status is "running".) >> 3c. Position the repro's form so it is visible while you are typing; if >> you can see its status transitioning between "idle" and "running" as you >> are typing, it should not take very long for OL 2007 to hang. >> >> The "Call DoEvents in loop" checkbox is checked by default when the form >> loads. If the test above is performed with the checkbox cleared, the >> email composition window (in fact, all of OL) will seem frozen while >> background processing is running; when it completes, all user input that >> occurred in the [apparently] frozen UI plays out almost instantaneously. >> This behavior tends to be unsettling to users -- thus the reason for >> calling DoEvents in the first place. However, hanging OL in >> mid-composition is more than unsettling, so avoiding calls to DoEvents >> under OL2007 seems the lesser of two evils. >> >> The repro DLL was built on an OL2003 system, so it will work in either >> 2003 or 2007 -- though it will not hang OL2003. Under OL2003, native OL >> code and AddIns seem to run without preference for one or the other, >> i.e., UI activity does NOT suspend AddIn processing. (Logically it must >> slow the AddIn down infantessimally, but with whole-second accuracy of >> duration timing, it's imperceptible using this repro.) In OL2003, an >> AddIn can yield the processor to permit OL's UI to be updated, and then >> continue safely on its merry way. (This is EXACTLY as it should be.) >> >> Conversely, under OL2007, preference is apparently given to OL UI >> processing. As is stated multiple times above, OL2007 suspends AddIn >> processing while the user interacts with its UI. Clearly the mechanism >> that does this is fatally flawed, and causes OL2007 to hang. >> >> Note that it is NOT the AddIn that causes OL2007 to hang! It merely >> gives OL2007 enough [proverbial] rope to hang itself. The tragedy to me >> is that this new OL2007 behavior is unnecessary when using well-written >> AddIns (which will often be callers of DoEvents.) It's crappy AddIns >> that block OL's UI for inordinate lengths of time that no-doubt prompted >> this change -- how appropriate that well-behaved AddIns get the shaft... >> NOT! It's a travesty as well, because even this ill-considered mechanism >> does not overcome a tight loop, OL2007 is just as unresponsive as earlier >> versions. So basically the only thing it accomplishes is breaking >> countless VB6 AddIns. >> >> The culprit seems to be an Office-specific function within the VB6 >> runtime -- which obviously predates OL2007, but still... Perhaps they >> should've provided an Office object model method to do the equivilent of >> DoEvents, rather than build Office-specific behavior into the VB6 >> runtime -- this would've allowed them to update that method along with >> Office. >> >> As is, as of Office 2007, the VB6 runtime is left with a very dangerous >> and detrimental call. Perhaps it's intended to force developers to quit >> using VB6, but in reality it will force us to release updated VB6-based >> versions of existing AddIns, because this problem is too severe to force >> users to deal with it long enough to port code to a supported >> language/compiler. >> >> All sources are attached. Any comments are welcome. >> >> >> From what I have found, mine is the first repro of this widely reported >> problem, as well as the first to identify the problem. If you republish >> or otherwise distribute any part of this, please give appropriate credit. >> >> >> -Mark McGinty >> >> >> >> >> (Note 1) The code inside the loop concatenates a short string to itself >> until the length of the string exceeds an arbitrary length, then it >> truncates the string back to a short one and does it again. (In other >> words, it exercises string object memory allocation. It is unremarkable, >> but it is such that it cannot be optimized away as an invariant loop. >> Also it does not touch OOM in any way, eliminating that as source of the >> problem.) >> >> (Note 2) When you connect the AddIn it loads a form, and then tries to >> make that [modeless] form visible -- which initially fails because the >> built-in COM AddIn dialog is modal. It eats the error, and retries every >> 3/4 seconds (using another timer) until it succeeds. (I agree it's quick >> and dirty, not suggested for use in useful AddIns.) >> >> (Note 3) If the timer fires while the loop is still running, the timer's >> event handler is coded to exit. However, in testing, the timer never >> fired while the loop was running (even though the duration of the loop >> exceeded the timer's interval.) >> >> >> >
|
|
|