Group:  Microsoft Outlook ยป microsoft.public.outlook.program_addins
Thread: VB6 AddIn hangs OL2007 (calling DoEvents) -- Repro

Geek News

VB6 AddIn hangs OL2007 (calling DoEvents) -- Repro
"Mark McGinty" <mmcginty[ at ]spamfromyou.com> 12/16/2008 9:33:11 AM
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,9&#A,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'?![Q+*\3/
M<BP/1U?[ at ](#%G#B],$H[[1Y>L$%ZS0G[ at ]0PD>?)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

Re: VB6 AddIn hangs OL2007 (calling DoEvents) -- Repro
"Ken Slovak - [MVP - Outlook]" <kenslovak[ at ]mvps.org> 12/16/2008 3:34:51 PM
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.)
>
>
>

Re: VB6 AddIn hangs OL2007 (calling DoEvents) -- Repro
"Mark McGinty" <mmcginty[ at ]spamfromyou.com> 12/16/2008 3:56:10 PM

"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.)
>>
>>
>>
>


Home | Search | Terms | Imprint Contact
Newsgroups Reader - provided by WiredBox.Net