One thing I miss in PowerBuilder development is something like a hash array. Are there any good* implementations/solutions out for PB? (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets) *good means for me: - no special runtime requirements like additional OLE components or special Windows components (like the .NET framework) - it shouldn't have much overhead Is there a PBNI implementation?
![]() |
0 |
![]() |
Hi JKorth, it should not be that hard to implement using datastore. Have you checked pfc if it contains what you need ? Regards JKorth pisze: > One thing I miss in PowerBuilder development is something like a hash > array. > > Are there any good* implementations/solutions out for PB? > (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets) > > *good means for me: > - no special runtime requirements like additional OLE components or > special Windows components (like the .NET framework) > - it shouldn't have much overhead > > > Is there a PBNI implementation?
![]() |
0 |
![]() |
PFC (http://pfc.codexchange.sybase.com) has linked list implementations, which can be extended to hash lists (node.key is name, node.data is value). I've done it, but I find it's not a very good performer. Good luck, Terry [TeamSybase] and Sequel the techno-kitten On 26 Mar 2008 03:39:11 -0800, fisher <fisher_NO@SPAM_wckp.lodz.pl_PLEASE> wrote: >Hi JKorth, > >it should not be that hard to implement using datastore. >Have you checked pfc if it contains what you need ? > >Regards > >JKorth pisze: >> One thing I miss in PowerBuilder development is something like a hash >> array. >> >> Are there any good* implementations/solutions out for PB? >> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets) >> >> *good means for me: >> - no special runtime requirements like additional OLE components or >> special Windows components (like the .NET framework) >> - it shouldn't have much overhead >> >> >> Is there a PBNI implementation? ********************************* Build your vocabulary while feeding the hungry http://www.freerice.com ********************************* Newsgroup User Manual ===================== TeamSybase <> Sybase employee Forums = Peer-to-peer Forums <> Communication with Sybase IsNull (AnswerTo (Posting)) can return TRUE Forums.Moderated = TRUE, so behave or be deleted ********************************* Sequel's Sandbox: http://www.techno-kitten.com Home of PBL Peeper, a free PowerBuilder Developer's Toolkit. Version 4.0.3 now available at the Sandbox PB Futures updated Feb 22/2008 See the PB Troubleshooting & Migration Guides at the Sandbox ^ ^ o o =*=
![]() |
0 |
![]() |
Isn't this what a database is good at ? Or are you looking for something lighter weight (or for only a few entries...) Regards, Reed Shilts <Standard-Disclaimers-Apply/> On 26 Mar 2008 01:46:44 -0800, JKorth <nooospaaam_jk@epos-gmbh.de> wrote: >One thing I miss in PowerBuilder development is something like a hash array. > >Are there any good* implementations/solutions out for PB? >(I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets) > >*good means for me: >- no special runtime requirements like additional OLE components or >special Windows components (like the .NET framework) >- it shouldn't have much overhead > > >Is there a PBNI implementation?
![]() |
0 |
![]() |
Reed Shilts [Sybase] schrieb: > Isn't this what a database is good at ? Hm - I use the database only for permanent storage. > > Or are you looking for something lighter weight (or for only a few > entries...) Yes - lightweight but not limited (I think of something like the hash arrays in PHP and Perl which are THE data structure for all uses - highly optimized like nothing else)
![]() |
0 |
![]() |
I agree. An external DataWindow and a datastore should provide this functionality. Regards, Dave Fish Sybase PowerBuilder Blog: http://powerbuilderevangelist.blogspot.com/ On 26 Mar 2008 03:39:11 -0800, fisher <fisher_NO@SPAM_wckp.lodz.pl_PLEASE> wrote: >Hi JKorth, > >it should not be that hard to implement using datastore. >Have you checked pfc if it contains what you need ? > >Regards > >JKorth pisze: >> One thing I miss in PowerBuilder development is something like a hash >> array. >> >> Are there any good* implementations/solutions out for PB? >> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets) >> >> *good means for me: >> - no special runtime requirements like additional OLE components or >> special Windows components (like the .NET framework) >> - it shouldn't have much overhead >> >> >> Is there a PBNI implementation?
![]() |
0 |
![]() |
A DataWindow approach is OK for scalar values, but won't help for any complex data types, like window handles or NVOs. We need something native that performs better than the PowerScript implementations. <hint, hint> Just my two cents, Terry [TeamSybase] and Sequel the techno-kitten Dave Fish [TeamSybase] wrote: > I agree. An external DataWindow and a datastore should provide this > functionality. > > Regards, > Dave Fish > Sybase > > PowerBuilder Blog: > http://powerbuilderevangelist.blogspot.com/ > > On 26 Mar 2008 03:39:11 -0800, fisher > <fisher_NO@SPAM_wckp.lodz.pl_PLEASE> wrote: > >> Hi JKorth, >> >> it should not be that hard to implement using datastore. >> Have you checked pfc if it contains what you need ? >> >> Regards >> >> JKorth pisze: >>> One thing I miss in PowerBuilder development is something like a hash >>> array. >>> >>> Are there any good* implementations/solutions out for PB? >>> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets) >>> >>> *good means for me: >>> - no special runtime requirements like additional OLE components or >>> special Windows components (like the .NET framework) >>> - it shouldn't have much overhead >>> >>> >>> Is there a PBNI implementation? -- ********************************* Build your vocabulary and feed the hungry http://www.freerice.com ********************************* Newsgroup User Manual ===================== TeamSybase <> Sybase employee Forums = Peer-to-peer Forums <> Communication with Sybase IsNull (AnswerTo (Posting)) can return TRUE Forums.Moderated = TRUE, so behave or be deleted ********************************* Sequel's Sandbox: http://www.techno-kitten.com Home of PBL Peeper, a free PowerBuilder Developer's Toolkit. Version 4.0.3 now available at the Sandbox PB Futures updated Feb 22/2008 See the PB Troubleshooting & Migration Guides at the Sandbox ^ ^ o o =*=
![]() |
0 |
![]() |
I don't see this type of functionality being added to native PowerBuilder PowerScript. You can do it in a .NET target and PowerBuilder 12 will offer language enhancements for WPF Targets. Regards, Dave Fish Sybase PowerBuilder Blog: http://powerbuilderevangelist.blogspot.com/ On 26 Mar 2008 05:59:56 -0800, "Terry Voth [TeamSybase]" <sequel@techno-kitten.com> wrote: >A DataWindow approach is OK for scalar values, but won't help for any >complex data types, like window handles or NVOs. > >We need something native that performs better than the PowerScript >implementations. <hint, hint> > >Just my two cents, > >Terry [TeamSybase] and Sequel the techno-kitten > >Dave Fish [TeamSybase] wrote: >> I agree. An external DataWindow and a datastore should provide this >> functionality. >> >> Regards, >> Dave Fish >> Sybase >> >> PowerBuilder Blog: >> http://powerbuilderevangelist.blogspot.com/ >> >> On 26 Mar 2008 03:39:11 -0800, fisher >> <fisher_NO@SPAM_wckp.lodz.pl_PLEASE> wrote: >> >>> Hi JKorth, >>> >>> it should not be that hard to implement using datastore. >>> Have you checked pfc if it contains what you need ? >>> >>> Regards >>> >>> JKorth pisze: >>>> One thing I miss in PowerBuilder development is something like a hash >>>> array. >>>> >>>> Are there any good* implementations/solutions out for PB? >>>> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets) >>>> >>>> *good means for me: >>>> - no special runtime requirements like additional OLE components or >>>> special Windows components (like the .NET framework) >>>> - it shouldn't have much overhead >>>> >>>> >>>> Is there a PBNI implementation?
![]() |
0 |
![]() |
Here is an old implementation by Michael Ogrinz "JKorth" <nooospaaam_jk@epos-gmbh.de> wrote in message news:47ea1b84$1@forums-1-dub... > One thing I miss in PowerBuilder development is something like a hash > array. > > Are there any good* implementations/solutions out for PB? > (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets) > > *good means for me: > - no special runtime requirements like additional OLE components or > special Windows components (like the .NET framework) > - it shouldn't have much overhead > > > Is there a PBNI implementation? begin 666 associative_array.zip M4$L#!!0````(`"Y^3RC/AV5VG0```,,!```;````;E]C<W1?87-S;V-I871I M=F5?87)R87DN<W)UK<ZQ"L(P$ ;@/9!W"*6#@O0AA(*C@WLXDTL-U%RY7*M] M>TLK3@87MX/__S^N/A_;YT L)P2/7"?KLEC(F5P$B1-:8(:YR3QJ%8@?P%ZK MKJ<K]$;F`4UA80+3W0S!V4)!*TQ^);;K@_^??WLEJBAH1:F4-HX19,$O'+L. MN9TPR<[(+>:#J1RE+#PZ(:[,?ON%T@_1X[*AN4"NZ3?Q!5!+`P04````" `O M?D\H`E]-7^4$```'$P``'P```'!F8U]N7V-S=%]A<W-O8VEA=&EV95]A<G)A M>2YS<G7M6%MO&D<4?@:)_W"$\@`RCDM>JOB2*';7,I*]((S35A9"P^X`TRX[ MJYE9,/WU.7/9"U>;*JI2*2_V[LR<[WSG.F=YU[OV7A(NU!TE(17ODDDPBD>! M5",B)0\846Q!1T0(LGHO15JK3KA8$A'6JM.(CTD$:I50." %$\'G$/-XP61* M4.8O&JA:E<:A$;5/.>CW@W4XAR .[&DFAL*""$;&$96U:J_?^?IEX)W7JB1> M`2,C%H?TY7G8TL\A4>1Y: F49')_02*XXAH25Y-T'+$`)FD<*,9CT'A\,II2 MQ12=0T._$X??W#[.8D6G5&@1N4ND!>Y-DSHLGR8)%6.>(NO&CI..&*H01'%1 M,,P@"-O+<H^L.?ZO`.0^Y;F]"Q*E]+#!@B*,L55'JAR4(\-R<78&?:I2$4M0 M,PK:UT"4>98)#=B$T1"<M;D4)%PRQ\D<M94%G4D!PB3FM<*:,%%A],)L&?E: M%;7B/HO15!8VP7^ZO]<+PC"AX7MM1V8N:T'$1I+]@^4@E6#Q%""2ELDHB##I M32I7<)6,XC2*M# JN.-+F&MC:43G-%9RC>SG6M6APA4\Z?RYUDP;14$T'<[O M,_2',<F4$I.%(1IDC0EBW>C_/IG31BGW#= U#4@J:<'!^=5Y:L;G?$ICGLH6 M+"G,R */<I"4B&!FA- ()K0\^L @-OPN5C(\D+\1$<8L)F*5"40$,\ZHONWV M@5VU-5CNR$KGML0T-YH-FW#Y:<.],+CS?!2IH,:.8>P\JID3"-ED0H5^+9RD M9B361A"D:_GHL&$3T3 W77_0\9\\?/;N'SUD4M*/'LS\ENOM>X.GOI_W)S;4 MDOYOT+FM57WOCX'SKT\7F"XVX98Z:$A@23"+L",_4N5C:C1<BJ!?'&B>,Z:! MNYK954;'M2M=5ZCS>Q25MLW8YZK+RH6<VK0AD< [#[/\A4F%3=Q&)0RQBF!; MS)S"!"N7:9K@T^9Q3%1AD!1:FB@=/LR?`.,ZM1G<XTNLF91%>-\:*!-X8R7^ ML=I0HIP?^D3+*$$`;$QPVH;&+6%1*FASK?ZAT;$^F*2X0BU?,F814RN-:OM? M9D2FF63>#9S^N;X"4=T8_8YW!,X'B-W,'?K@=>&Y??:A??;QU^'/EO.SY10M MIU)QVF]-.\G=?PXW5DV6?S%=&A*GYM;^K*4V[71-J[D9*=,H"HVH[$\JS\US M(67)Z1>SX;I66[]H2S))GY]7W/,#E9),Z35_::P[]:1^#@,])4!/8*M$[WV1 MDDUC[==Z:S?ED_KEI_K)#M[-,IU3R\>UY.-Z\X5N5CI1;+J%V&"+=,62S.+D M\NBD78Z7V3=D-[>MQ_(VWSZJP:_-DYLCDBE@7FZJ^:SME.VK[=<8O'U.W3FV MV:^'_1=-)GST]&8+?VV$>WU\V^J/6!89!;C<;(#VPR.OAHT;/Y/#)IWEUG]P MXQ\Y^F_&Q)[[/P<ER]SMJ-B='R,L;_V@VA[)?IS80!</BB63;M3I];VOG>[3 M(QCJY:-K4;2+1\<QE\16N:/$*EMKMJ4:+AAJ>^V4`FG!FN4L*(*:<7PMK#N^ M;B_L;Q0(HD?0569'JU@)W>\5Q3TPK%Q5MK8+'Y1WW5*)[B^PS1.I'?HU*<#I M6Z%7!H)-D;ZG[]6&GI=PI*H'/,;Q,0TP3>O@+H WH884Y?AJ#ZS9W87Z#5!+ M`P04````" "%=8LE?9Q*L$@```!@````" ```%1%35 N5%A49<M!"L @#$31 MO> =YCH>8] LI*E"$H7>OJ5==OL?OT#[(1C33BIHQLMS*E^E^ZR=T;?\2!6- M07C8JK%,7ALB#<1F?:XY<KH!4$L#!!0````(`&YF3BB2S&N\TAT```!X```* M````5U)$0TY4+E!"3.Q;?7 =U74_=_5ER7X@?X&QA+T67Y(M;$D((XP%:]DR M-I5E(<O8?-CRZKV5M/;3/K%O94D9J)_3I"4!@H<Z*7&:U).V&9,R22=#*,DX MM6;Z#Y/2EF;:#&WS!].20-N9UFTS@<XT4<\Y]]Y]N_N>P-"FDQ2MO.^>^[OG M?IYSS[WW[/6>78,;!W+3CM\SY68SC@_0MK6MK>\OW[D=%I^/P+-[L'<CA?/R MN?P^[(O/_[.G?_^NC='XNJ5'H0J^%\9[^X<VDD6 >@"K#N!GWR/+<!5,Y_Q, M.C?E!9OMR6R1:RW TT8YKKQO%[G6`=PO`"[?<Z$KSC49Y6H"6(ZEG+>(JQZF MAXM\TZY7Y-N%)366Y\O[T\D.+SZ+S^*S^"P^B\_BL_@L/HO/1_C9M6-H(ZP` M^(GPH0)&+8 E(/?O]!)]'27CD[-REA#KF!8%XKN1Z4EK$O&[F#8*`O$=3#]J M/8KX$-,5!0/QAYCV+1]Q25<6*A _QG1@!8A+NJI0B?@XTZ/6J"4JJ24"Z9K" MIT3 ^%'K*/+_*M/CUCC23S'M6B[2SS%]W#J.] M,G[!.(/TRTX];CR/]"M-/ M6D\B_==,?]'Z(M)_S_37K*\A_6],/V(]@O02IFL*5=BVGR)E@&=ACVM_ROB* M`OW6"HZ *9_BV08"W_;R=CIP<Q[D'\VF;<C,>O:$F\XX^;3O3E*"[3LV)6;" MQ'Q@C[G>F$[(V^#X?LZ'"2>?M\<<L"<GLV[:EJ4&_E0ZF/(=F+#=K.^DW4G7 MP9H=[Z3KY[P)HBEEU,TZNE*6_RJ2/Y5 J;KDC!W8>,[*Y*;3XVXV`UDW'YQT MG6DW<":P,XX31M(YSW.X8ZXWFH-)<B?E1HXC%#V,X=&L`P>N`^(#)(="]KE< M!XOY9SC?_+Q447Y2HJ"QJT+,"+%5(5818FM#K#+$S!"K"K'F$*M!Y16P245U MNS>E422!`YMP) ,_-XNC,#%A>YFLZR&8FW0\: #95)WE?J#9)(NO1G6^_P`L MPV@-EEZ'O5M.&AZK8]CUW"#OIV.ZLX#6E-&7A36E.*@L_VM(_A]&>W[N.O.8 MT/((9;Y:!H0M5Y 5P:X'FIAQK!/#R@1V+[ 08M@^D/5$L8,8UB4P&Y2H(M@) M#)<E^*8P3"6P7P.IJU'L&0RO3F"_"^3,B&-?!]GG*'8)PQ4)[%4,5R:POP$Y M'Z+8V\K^KR'Y<V>BJ3_&\%J%K8++6+.6@=9/@$\"%"#RG$;S&(U7%V"N`D-Z M5V.I#=BN)2J^#/\J>!P%_QDPBA(Q8!W*L![1]<* +FH;M F!-1G0("KAN&A% MY#?P;<"LQX45Q@3&CH4Q`V./A;$*C#VE8O(QN!5K42^:H0JV8LV[<"8.8LT9 M;&%I3\]2.R((3B><<([BK(Y,*3T9@#Q8N)3-ST>G+^FB0&R!:0Q[J&W%].A\ MY@6Q`M/DQ ;X!- 2.C]?#S2:`FAD5F!HJ?"8"A]3X5,JO!%[+* 18_4L?Y/E MWXA8/?X:_%O!OY4L"7KD>%4CL@QSKT!JS8)CE42:6+I?$6O@HO@X_('U'?PE MN;^$,NO"=Z7B)ZV099J)$J+&-6H?I)6.KPG5(4;Z3OIC7;NB4-I*6LI)[VH* MJ[%U-05:GY;"^@1?B9V7MGU[:<6K84YC]1 :B! CRV\H3%95KDD0=@"J:F09 M&,;P2/B>Z54B$:_A&NFE]M"KYG\CR7\TYT_;?B95-Y;-C=A9,Z*T)B_284IY MU35Y#4\R1?37Y.4]9& EEK\AIJ:.#E-UCI<QPX85FS8[Z9BA$IBC?F["C"QO MJ3J3\A%7F*7('5)4(/:MZ"V6DD[5J:EM=IM-86)3JDXWKMN4C,56\O 4\<C( M<5HFDE9^[)@M7\H6&3T<"QZPD$6-'/64ZDGT16EKJDX1S5*&9DL<R;#\\?DM M*$G+QQ%9?131`](2;85S$C<*)LV1NU)U6[:8^Y$R@W$<+=OUS$/80'.GE /O M$[#9Q- <F=2J."XH50>+S\_ST?*_7]"V9A:RX,(8+C0!FN AI"> %K)[*P]5 M3JO=:18V<%QNJ03;M"?$9XVZ?SS%Z2;\2%37?-9H0_JU&MHZ7P7G.]O57NU- M\;=;`%ZX^DVQ!'E>^M8[EU[\U['3QQ#?VM&^G$(JYS_?/@4]N8;EQ/^B,F,] M/YD_(\FF';YK9R%X=OPT18_]4%9\^<U3,'#FV.G)9Y.<[UP"Q F@/*>1G_*L MNN>=2TG.,V?_Z]*X*D^72\^K;R4YX4P[+K0M6"?QWR*^.O#J6Z?@-U]JY([. M2^OZB_]H^?L:*/#OZ6C[ZR&Y:J@M6QG>FT NN<N@R$O+JSR4B=._+./R47E8 M_C=J_X]G24G_CG6AB[ZG$GV#.D9[EJ?\,-+O\2G1P/AGK,]80IA,/V0]A+0\ M*C]H/8CT'4S;EHWT+J:'K"&D#S(M?3C#3$L?S@33TH<SR[3TX3S-M/3A?)YI MZ<-YGFGIPWF):>G#^1.FI0]'?LU6/AR>Q*>L4Q9N.YF^UKH6\?5,7V==AW0+ MTVNL-4AWRDEO`=)WRRV=M1KI^^36RZI"^@&FOV!]`<MTF!ZT!A'WF#YMG;:$ MVNO1+%@"?XPFLPJ&R7<D_M2@PP/1I^$'!FV!)?YC@^PKXU8][8MAQ!K!,AN8 M9E_9#DDW%\@.WU AYZG>2T8WR7*EQ7.)-Z5HVAI)DN5_,\E_&C<;@4*GU5$\ MR.6R([9O9]TQZ0#XA7$2D!96X_:=S]<XIDI,C_^0"0&A+P6H6VXZ<&8"&,UY M07K<]O..I"==C#(UBKNM["P4.XH=R$[:0>#X'HS@2#I^/IC-.I#'[5C6H7.( MDW%Q@+#8M)UW] %E9"H(L+N1;4[OC#TQB1G+MO>Y[Y2V=S?NLO+N!.UFW6"V M%?=.;IYVMZ:=ST_A&.(^*SMK'IBTTTAGL"D3KMS4YC>#7)IVX^";_;B#W09# MO?L&-@\='I(MVNT[CTXY7GI6MFV;N2//\F]F_T\N[>)(G73,';YOSRZ0HS_G M3^!V6K+LLT\X9AZUP9S-39GC-N:U,QDGP_N]@=T[S<T#/7VW8.MQ.[=C!T7, M($>\OIEU1WS;GS5QC,?-$0?W^([I3WDHZ#'98T>.VP;PAG$;/(R*ATDP.9H> MC@$R@D.C6S]L<].*C*5I&=\>4VJD=?(-((^)`%KC*92^2NT_+#>I*,T+XB=/ MHU"+L9V)7)NFG&&/ATW53P"W2L=+CIAI%/X))\.K:+2H^Z%/N0I_)N(IH:M0 M3?9H4\M.?#7=6?X;>?[_<DS\R'1&X=[VOS*G@^&.Y,3.9YUAZ@O[>!:8Y>F1 MJ'))61+&!!;:3C^=_S<*W,EK0<(?`1I;KJ"H>X]V:4+*OY7]/[$<]&TGZ49M M`>FB>3_7J@6TOL4Q<JTFW:U'@9S?<8Q<7$D7[$D,:Q/8QZ'4+?LY#)<FL"]# MJ5OV&U#JEKT$I6Y9<J->G<#^#DK=LF]!J5OVWR'T]H38.U#JJJT0I:[:E"AU MU:X1LJ@HUH38-0ELLR@Z;36V34BY1=MRCY :P/+?3/*/YN@74JK1' \+Z<.* M\F6$_* 2Q7PAI1_-^^M"2C^*/2.D]*/86:'T-X)]'K'&1!U?$=+1'\7^"+%U M">PO$%N?P/Y9T!DUCI'V;U#8E;NZC41\92*^-A%O3,37)^)F(KXA$6^*Q44! MYDA&E:AG)[$7,W"(^T#8K;BE6U&(MF]^_E8<"?V1;#W^R726?YN:_PMP-B1* MVH;EIU3L!OQ;5Z#OOG('LP'36S%/BD^(I&-KWC?]REJZ<'JEVC_)CP@"=?V[ MQG6(KF6-N)[UG.S9]>PN)FJK$' 1SRGDBM[$N<D-_3B&=*9YED\V[4 7HK=C MB;\/3?A[#KKX`P!]C.B"K2#+[@O+'E+4Q^ FL0W+;+8NBAFN889G7Y>H"!W= M5/[SHAK;T,$<'6PKI#O<P)I_6]7\37P;C0:<.UWP"')\FW,;L,98*VJPE"5< M2A<<4>UJ@2R *LO@&G]/T*<3G*48;\!Y^2V,/PFRKVM%I91_!\G_3D0D*K % M-"::KP+Z!*'_H=I.)0FTA ;,"2J38MOQ_;KHQG@-?%6U\B+&*B*I9B+>+60] MU-/!6*ON#&N>PS[T8+Y*U#,#5AFR/@.B.67)-2S53W(+*\KR)'OU"K[G%AB9 MTC$8,,J/P0M&<@RH'<F>7A1+!4EZJ=#:=E%,L^RG65XD]Y689[=!NG%1W,)I MMX2ZJ36'+&8MKKIU,(!KW5E<G\[AFO(*&LP?H)XO$]>!*=9"*X['0V(=S(CU M\((PX671A&7>B*-Y,WP72_T7L1''LA7UB.7?2?+?@IK6!FU&.QPU.N""<3OV M3'Z,R4/\;)EUY=9H:@)<BDR-T&]QORG4`D!/=F1X%$'<[.4E06S MB 5\N2' M^<,.AIR:]4[JW1%-6#HL]:GP12"!DLD.MSG\F<.S"%L9PW8PW^H$'Y78H+%; M"=O-?)TA7PWS48W=(1\M7K_"?(<UQI]59+W'8M@`\XTKJ#)U0X&.JU2O'L#8 MYA)D7YIQ>>!=+?$!&<9JZ.7O?#MMS\M)E[I)N<QM9B2/YL5,N='A,0=WIB<< MCS<!<\.@G7&"ZU^F1I+"(1FR_+>R_2?306;9-U:Q\:1OK50Z?3/5IK0+M+G; M`Q_>E%[ <@9 F]('0):=#<L.X(.:4N.*3.F7!$W<+OX>JDWI.31M%6P`GN?O MS8^#-J5/P4*FE*9W)4]QZKTGS@.HGE,[!KD=@XFQ$#@6]$U:FA9ZM&F)ED5\ M4;/5PAIOA'VN@._C>P';4,WY6GB3"I&::&%(FJ[7!:':=%'.&C9=_48#R[^+ MY5_)N"<NQWJ3-%L-(=\R\5Y\Y<W;GXN%S%M#Y%LSS:):7.*70@_JZ%'4RB_C MENP";LV^CWK]3\B[5C3B)O5Z.(R&[3@:ML^A83N'^O<ET8K&[E;XD=@,]Z$I MZS<Z8529L;VJ]#)F#$EINDI,D6WKE*)1DB;/A?/P08U1H\8BQN/&&":-46N( MW530?%L51 9%&Z,=FB]2[[T1;)60!DMWN?1 R?+?1O*71TOJR4V%^?FXB?HF MFX^BB?HVG_'>VT2UA'DT;SD3=0K3),@'?S+7<V<EEM<8GG'F+DAL:G+2\4=X M09'Y+TH<&7T[R/FZ(-?+.#,T"'ABF?NK\CQD&N?>!6ENZ5H$&3<RC7M4F%5A MH$(R"&0@SZOP116^JL++*EPF=+@$U;AXG44`7[5!@RHON32':%L$W1.B`Q$T M&Z)!!'TB1,]$T/,A>B&"OARB<Q&4Y;^=Y/^:2B?T=9!Z2?0;$?KM"'TY0K\; MH6E.:WJ)HK\AJ@N0JD'#RV=BT-=)KL%)WXJFMP>UXS 9%=2_3^"8G5OP:DD] MEOB'$81]0"!GX,UX`J-P)>DO^71 RO86/(E1N+9$KX%E3CI*82.FE_/IT QJ M@?4%"M<K'D[ AY:2C7ARH]"4];)U?P[?37B"HW"#Q'F'06UOQ9,<A4U45LX+ M_%P6=W"D^[:E^Z';K=NGVZ#KT^7K\NI!ZBCI%^ERLXJWJ;C6Z0$5U[K-\K^; MY!^HE"=4RAD5/Z_B%U3\916?4_'75/QU%;ZAPK=5>%F%[ZJ0_E&X1(7C*/?B MI2_2EGJ.F;%85RPV%(N-QV(SL=@384P^4N^N0KUK1+W;R">K&K2Z2[#,A73N M#$@]B>G<M.-K6;&NH6&DL2>9Q73,"R9)%B3#<KIE@91KJ%/"L^BD1S*6NN19 MDR!E+77(LPH0E[FIPBZ(;>UX7"B<4:&6+(T"G<@K\)?E;Y'\R<MF%.@KOZ&N M0FU+C,0'=V0/</[8"IFX$2426 L4;TEIC":4\E^IFU-G56&Z93,P"]-N)AB' M<<<=&P\`#7S6&;%]2<"(G3Z1SF5QI5+SC5WBN$J,Y&9@PIZAP'?R[L?L$>D/ MODTYA:.2O$)W[SA:_6UAGS=4`J_$2]3J3#[+?Q :NX?YR#_Y9U5Q/O(3/AWF MW14?+[[))?F:,/J8@ (LK^8M#F&D;W-S<Y5PO1'R=7!>Q#AO/_/AM)?SOX?D M7TR5.7IC.0YPCKX(IO<;#RA90(K\7X>9[^$0(Q]8\I#4B-@1YIL(L?4AW^D0 M,PL4$/;I$-L08L^$F/*+'5%WA2+WXO3HZQ'7HZQ'%@=.1._9Z9'4Y<BPHJ#[ MG Q!Y=-A,5V6"Q@:594%2C:JJ@IGJ/SVZH*63KP>%>I[>PN&W%Y+AT953>&# MYN.'Y<7R'U'^OY3R6+*$0$D%0DGHT:<1)]VFER1!+SUD04!RB/EYO=)+O4WR MDIT197A;RO!*>\5$[/Y(>QE>LFH597@!%KIS*?'9!%YB4= &H&W(@/J0G)[* M^TXZL.FC4<2\4"J:$0>7!\XU:J>E\4A^IE(?IXI?K-8(W14*AZDM52+L'JGV M\8HXQF:C,HZ1V?AT(N]UJFOZ`BAA&S!\F921Y;^[[/U/OF19=.O(:Y:'U*V] MX@5+YB.3*1F*W^?,:3<8=[UH&>7R=7RH?!'#K/+'OM]=21EE[+DL*O:5[TI+ M^A]DI[7C0PT"+C<?,%_)?5J6_QZ2_Q4(W47@<'=[V^UW2/K![LZNVR1YB.9* M=WMGU^TROH?UO[N]?2L"([E<UK$]<X@6XQ[;[P[\*;HVR\=IB78WE=Z9:$K5 M97/(T(/3:R=-K^X[[KRCL[V]HZU8Y$ZYGN_#]5R5JE/VN5Y/;B8)VC.EX*!> M^14NK[ F-CMF,]]SU4F1;8],X1E /TQVL&8C&=73:"155T[]RF"2,4R5$&L, M_3#9R9H0%;.^]!P19$PABAUA^=]'\H_U]BZ4H3/F^+6UM5EWF"Z4]$]-M)IN MJ\G.#P["\AX^$HXE\2N/KY8O01'?[\-',+/TLC!!6*HN^DF\MNAJ,;=LH6LD M!V1D`,TGA0<<_Z2;=J@;T0O&U$K4F+"Y9C=#E-X<'?K--$]:*/?>W::;[S_8 MU]=<S-5B[A\T8X7<VFX.[>GM3]75[I,?VU&#FIO8\='4VE3&]=&TJ:2ZU@-# M^P<.[+VW?P-67#O8.W1P$ OL[=]E[MVM^M&7RTUB/_S<U-@X]X<*:#5MDX;* MM .D`I<49]=^\]">O7V]W+M!Q\Y$6M^JAK;%W'XW-KRMC0JOQ=)I[!PNEHM# M\>9,<L.P_/M(_E[>;.9K1-3"L Y5WO:[FW VUE))R?M)TXXYI8HF6=WK!$/D MWI&%M9AY*2RZ`Z0*D/>8Y#6F?+EK3,2G- .'_^# 0.]@<U$G-N=&AW4ES5J3 MFLRF%A8IUW `ITYZG P=-XL+0IM(]X[X1G^3O+\D*R)]IFK(L]1#6MH<5=<6 MYE$J31JUH^] +V&[44W<;E2-_7)*$%:+"A73=?<(9M%=44I4JT:1RM.MNPN; MAV<GNJ5BND$>K:ZZ=A7RNU+'F^1_1C"5':B5\[,X$V6%"623V:Y8B_T8&CS( MW6#Y]Y/\:VM[#^\=(C9FUKI96]O?>WB(0GJQ@_W[A\RPH+!/V$0VX#07..DN MN@I&U[WXOP:,RA%GUM@(\=AM:H^,D^2)=B'"PQTI3IO:OOW[!TP,4W6*XJDT MZ$SF_ !U91O;@_>1;QE)1B9Z0IZM4@F;$V-,RB?'B1NP,YM34T(:)?IE+&IH M8O_-H=S"$C'"<3/\W^U<2V];110>NS6B(!!4@98%Q,FBM:LH\N/ZD2!3ASR4 M2%2)XJ@DM$%U'B6NW-BRW4;A(8RR8 M(L*C$_V#!HG^ %5NVW; "J6+1%7/. MS)F7K^-'W+BM:BD9^]R9.S/G^\ZY]\P]<VFYVG"QJ%9?I]J2/G1.+6KS*HC_ M"OI_PP.?Z\4'J]-Q+<^NSL^LS8?;]/S28P_ 8P_63R/^J^C_A^FQ%RL'87[3 M?(@*JXM44CY@I!7FDY;JPHT7RS6NO\.KLMV5*Q_!+>#V;K5QKU@N'TXKVP"' M0L2\`4TWP]+=TV%I71%538YSJ;%[-R)G$XV&I=O3M,.Z4>WZC%/&3/<D/"8? MY)+R[>3O+VL7WS@DWSZCS45[2_\YJHG)84JO+X8AW;TUK8(]+>U"$/\UP!_: M1;MTJE)U=#-8PCKD::V.#;?;T=62:S7;+]%#&PG,$CS8B92BT8EN:D/%OCPS MUIT3JY@"' '(W'QA;75Y0\_1<N(5*^Y2^PF!O9,0&N3DUCT1)I X88@3)#;< MD3ILA0]8S2=>H-J^H81JI&HB_M=Q_7_7"#!H;'%C;'$M]@RQ)\4R$KNQF?M* M37CBDC%-_<.8B!+ZC-<Z9@E@-.8/[QMW(Z0!0\M62#6\:*LLT2(S!NL>\QFS M7Q4_.<S 1^9%S8GTMK0BHO.I%,7FV8QGQ>:)Q)0=FR>SG-" _SK@3]'PO%CH MRMTNENM&D,Y[S8V?8&_"N(ZW%V#U;)56SZ@C)]2/)]+)*2\AIP#=%TI?[N;X M%5).2DS"@PNF'.,"[Q:V/>3$%CW>XP+GY.Q>L<;=7]CXGIO9KY?&Q.$%7(@+ MZZ^YPD&I7I='5V!M+JR^Y:X7^9FY>L;,:+O7M2RYC)**$5+IC E4,FZOH60R M6G7'@E.B;1_=Z1I:S2+^G^'Z#V@]F4RE/"^9:($CG8G'LMGT\P1'/TN$$AHO M3=#$4[81Q9,Q"YPIN?ZU5MQ:AAT%.5#(QQ7X6H#-!6'C>P[_?P*;&79WQC1& M,_<:E<7"-G>>95]@:1//N F<`U>_J"#^-P'_T\;G!,NO`J6LLA_/-J!X(I6U M/5ULRD$I$7-TC,&KS_XHYY9LO']-GZ)^13 I-Q&);?@X/YP5CP)@=, [/CO$ M_W/ WYHGO\>K%FO\+)/S/H%IQ(Y=^UP%=U%,)F(]HICL#D5SS]J+`R#<E39J M1>[)X"429;@,URK%[3T?Z,R570<[Q/\6X-_KPP@!G[[=2*?3-GQI^S*6B*6Z MNXZ=QJ["[JZ0/=^-9)X)]O3R<&A.[O__.D"(>OJVQ+,?[B3IN8]$-)G.MD64 MQ.+R)Q^L]'A=['3O@LADD_RV));M%[%GP][9T#Z(_P[8/R:0B*?#E_#0HX#Y MQ#C%RX=_/60BJ43(KO+R/WC5A?&T>9&7/Z@$%R%;YN5CE:0B9.NRCV!HI$DR M/@X61-F[2E91LG>:V,0GS8.>EM,3<GHJ3D_"F5F^06D6.FV#YD#CIG%1OS2F MQV9ZB)O^0>?E^B$]T?'?C';!T(6FU4[6"X8N\GX@G>.])NE>USL^>>'(D?>0 MO(#XWP;\Y3973&,81$+#A)70\ M.Q4YHF'5DD-#PH4,=2&BXYM1KE]#PQ*%8 M.QHS8)1#8P8;YPP9)(N[U%YEK=3>8*W4WI+]FM3>9ZW4/F2=J4UZ(UV1?D@G MS"S[H#;BOP?X]T#RH"3M69/D3X9-\D91;.JV]G87>6RU5\?82K!?DWQ0U/X) M)V!3^X$C`VK?\<G5V73J`;5?<V20X@=Y:Z TDDU*99C4AG3-4-"FHJ1VL"VU M$?\[,O]K6"0G#9+62%.D'=((M6.RG57.!SJ2O0^*YZ$,R+0YTB[]]FL?#+W? M%+\=XX3V3*#HMA=;81<@S8V-LB@F<8-UB9TQ$YP!/P?@[8YQT0)KG^%XPQ&= M**U?(1+ =-FSG&$BI?F\E)/I3$_3:P-&$/^RVO]+G ;.Y2]$FA%F;_US$G[9 M`;\I(*3AW9TP<MCZ`&."5&-PRZ.<"V/2B-]V1J+>=#%B=8\?E>U;=!JUMWQE MX?W9]3^*W5"N0)]H!>N_DEW_J2SC49#L^F\?N[[+['I@UR..#'3\IF.OEUGK M92?&6BTRPUHM,H]*(HL4?4#"KFN1GS+#(A'_?<+?QS97Y*AIYC1;FB'-BMHQ MV8[*0=DDV0QIS*T'W@]&#S.$/_@`^R AE5OR=XI6C W3WAB\$[<+*[/R[.]W M867A_JP,\:\B_L.Q-\%3V]ZJZCJ:[]G>]'7T`R4[KZZCZ:=F;T+6T=[@<XR5 MT7Q=*Z.Y4#LFVU'9MY4A_C6R?Q][2P_ WCK=VCT'R=</@K8,B/BO#Q'_<-JV MBU4V'"*>-.3^W1G?,NLNY$;\&X#_#CM9\$T:(JV0)IA9'D-=FD'7U#7+8X+O M#8/ 3R,N^=&1MR6O3W3B4'FP`7B>D_H51>H(3@<(<C-/I#X*"OSO"_O'HZ\K M>E\+V2V WE7E%]_RH;>H!_0.*)D@$O2N8Y@MK.=9;<]@/0QSP84@Y44]"'6U M&;RJ?*HV@V^QWBUF^FUQOB^8:0:B7A7[(#,0YX-ME9K\HM[WK#/Y2:M'DKRD M,](38T8Y2+]MEGC>IB_Y]7%!?LO+0SU:_QT5-2XV"27K#%2^_+QHG_\!4$L# M!!0````(``ETBR62'"JEFR ```"\```&````04$N1$]#[)U]?!35N<>?S6Z2 MW20#@?*J*$- A!H"2D&*;X0D"A0!(7BU6.-F,R2#F]UU=P-$;8N*-;Y6]-(+ MZNT':^V]_<->K.]%!2UB_1BM%-\11:E:!20!6\2WW-]S9F;WS&8G+"&@];-/ M\IV9<^:\S7G.\YQS9I?PTE_[;+_[_F/>I10YD]ST=8>/\J0X%[C0"A03+3#C MON[HZ."H"T!'5OZM9->]3]%EY/- =7W7)S0+04S]<*)>5+NH=E'\I/A)U$E\ MG@&T/T8TH-PEJ!O:.0U+CGGNZ.B=B'.ZMN0GXGB+F97/\C7+VVG._:02+G8? M_%R*\PTX+Y?BVP82C<"P/L9CA)W.QYOGV_/3GQ\::#SY(P.-<";G$3CW&TST M*>KW'DL41W@KXOM39[&>VZHO508B_DIR;M]6L]X#?8US:O]:SVD)/^^!G&2\ ME2_US.5/S#?*F626PUFL]EK]]M! 2BM[D6XBSJ/<QCFU7:EGN;]9N!TY[F1[ MOD#G17&>A_O5.&]"OD&4;$]WQ:K/>IY>.!?AW+;BLOE5)SSI2AUOS_4B&H<T M_S.0K>K;(J&:0"Q>XX_%P@'=']<7:S7^:-3?K"A*I18+1/5(7 ^'?.4AM3R9 M1"WG)*H>4_UJG3_N5V/Q:%,@WA35U)C>J ?]434>QKUXU%^G<WY_4!6EEJK: MTH 6B:OQ!DW50W7:4E6/:XTH!UE#X;@:U2YKTJ-:'>>OY21QK5Z+QLK4>?&H M'JJ/E2:B2M7:IG@\'(JI8U1_J%FT(]X<T1 ,^$.<N2F&<OPH.V145:96HU:S MO6&NQ"\W)!*.B;:*[/Y@3#0@O-!6>)DZ?2$_+#=%M-FJ(U%,*5\VBWL!?TP; M$]-"7.QBK4Q1O.6A@(;<S6ID8:#&H>-]BM<GQ/&^E0`R/12+^U&HNM@?U?VU M02VFS(GJB_UQ357+T6Z?[J\1S5KPD\XW^*$0+Q4WNW:1%HBK"YM"`>X)%-94 M&]0#*KJAYAPM/AVJDJ,0COK1DYG<F\ZM2)M@7N?,<[68%I<CTJ29'XEHT=IP M4ZA.46;JM5%_M-E77EXV9^I,Q:>8#Z)$M:!?/$F#'HGY9H5#FJ+,C_GK-5]U MF'7'8Z/3N)Z,`BJU0)!UZ$_T+ \%,;X<]%)8Z*0PGQY:G"9]Q=RJ\NHJ->U- M]0S':I0*?S"HQK3H8AUZ3ZBJE$=A2-/JM+JRPL+J!MBFMM3?&$'#4493HV;: M0;K*]-115*C,U8(:AJ\8UXU:8QAC5@SUVF81E>B4)0T:2HVS*PB%U6 X!-,T MFU%86%DUKWKN[ O3UPH'4W1V8J I#H^+O(%@4QU:'XEJ8P)AE*N&4T9IF3K? M:&E,Z@]V((W^D!YI"O*@-PKC$:\HTF"V^3A$QH3"@TTH*!IN%(\J-4DU&UX> M@!G'?,9@5)1YS:&X?ZG/ZL60OU$K2]:AC@J&Z_6 /V@8XNA"I3Q:#WV$XOE2 MY?GY<O;\A%USB$>>0_?DLXAR\\MG79AP4Z5J+*(%](7-\%-X(K,!20^GA](_ MFO'42QKT0(/:'&Y2E_A#<>[(<&W<CSQ<?'X^Q@8\?<CH)TP,S<(IFLX\)KSX M0C;+1"V&XY\U?^9,OA\5N3%*+4L4XSG.`]92'E=I)#,'&RM$+@T51$4HUA2) M!'6MSG3PBE)EC/F8SV8!>/B@X:,EO5BUH?GQ;MC(9$69;DQ%[#F#>DT`#QU7 M*C':JG4HC2/KXC5L($I%N!%CL6ZJF+!\P4!M#49S#/:D*&/'JFB0\8PQ:=2) MD6:5BL+.2-\N::"-*ID)/8?4"LY1,EJQ:L\TLS\65T4)G#?91#63S,:3J7., M+"A 23<]=,?:U$S-+;4V=52DH3EV1 W/7D&^N3)),3XK48]8'Y8PB; >@A4T MBNG-R-G9T$O%')=4E)/QVA^$K33<%(_I=8;_%Y-L3,Q_&9CS5"W@;S)G#J,X M*V.GYS77:8%P(QK,CGVAL*YP4RSAR3"O<5=P2J/0%#<1#(<CB(V&F^H;C,4< M]*M'S1HR<PB=1HY<09T>BP315L-):;9>#S1%HZ@NV&RM)YTTVR,N1B]5$UZ& MW4;:.3[>@#6MU5:QU+7Y3;/'.3NZ/;18B\:-M;;?7-66J4FGTX7AB\775!X7 MHT8K9\^>J^IGG*Q6STXVT'<N3!;#86IXZ2A?224W! T+A@.BYR:K)2<9]8W2 M1Y>J(Q5C^6E%.=6:JBAD'CU:F55U0;6")9OCHC.-VS%W!$?.^XB:OW,N*&G3 M8FB5J4?#H5S8E?UW:IALGVP*9D]@TY#H!6L4.IMK1FYC7AIO$0F;Z\WTO;M$ MCS=@Z0ZS0S.,*5^XACA/TWB^6%IWA)6#XXY*=E%<)W8ML9@U<)*]PD6D;'PU M/W3LW"='QFTYFO:\=&N8TI/'C<X@2V4X(&Q*K83C#^ !FTM*2RHF7U2226:Q M[*FJTU%;8U"K6:AKP;H,\F%]%/,OUDJKY\ZOPFJG)WRFZE-L3K."5<EJG#ZK MLNJ"@[K/"DOSF?M/,8(,)^I+7W5E>77YD:A9-6LU?'=1NM<!-J\]3UXL.CJO M5&=],%]M67"*FRX5IC):^?9[ZQ1''=.$LT[NF:3MD;E\%,T0^SC[?A&+`7:D MW(+$RD&>`(3?X)&0:%3*LQS!B4"=C;O1)7I,*S5\;U2'C[ \:!>-LI>2T7S" M75AGKE;^G><.JP*QDQ;C(C$HOE.^?W8$3V]-`+&2T@F99*J*1L-1JYX)/>>^ M?0ZO^M(YG5%ZZ;B$`PQ;KSQM3J\BJ/FCL?3#(=-UJ2AVU!%8>-K-77ZSFOY] M3H ?)NE;_"'SG8WP/*P[QVUB9A8E'O3PW^DXZL_L2#%7?1-3E.TEXI&;H6S5 M],P[Q4.>I'INCK(_C<,494MTQ&>H3K4=X@2%E7X@L;,W^[&;)M.#DU!W3"T# M1_V-30@V?V^W\]EBQVET8DR_7'/T6YFZ:'EBZ7F#MH_YF6%^Q6-$&8\0:FJL MU:)<BA[G#V(-(W(RYBY\O'C5S.;(G_Z(;:D&)]:HA[2#=U5FXS7948?OYQ7^ MJ$H-!FNX70@9%QG/_])NJ616H@=Y,&'(F1LDLTQL<U@.]C%\5K*2E:QD)2M9 MR4I6LI*5K&0E*UG)2E:RDI6L9"4K6<E*5K*2E:QD)2M9R4KWQ4,T$ SR&'^I M8238"#:#1;E$EX(@: *W@=O!`^!!\!)PY1'E`#?8"%K!-K 3M(/]8$8^T5JP MP$NT%.P%7X,"']$I8#*8`J:"Z6 ^\(/+0 M8"9X$Z\$&\!1X&OP%C"L@.AF< M`LX"YX"98"EH!E>!9\#^=FJG/=3^=]J^I?69)QZF9ZA=_-R/G]\;E_?2/73G M2OS>@V,[K<0%K4QT5.$$[U6S9Q"=!WKA>F(R2&Z$\XPXZHUSQ8Q!-'M&#F[F MD'?V##<NW$1%%3.*$]%FNF2$XE[$U<SWNAJGD:=(+H(&&_?DY&:Z?+.V?D8* M,V3>)#<:9+3;R&34J28+_B&9NA]LZM_2.>OZCZ:N6<\?2;H^#HP#,T$CN![< M`>X#?S;'P1;PBCD6VL!7\IAS#NQW#+3+@0Q+V^T8V.D8V'&4`F\Y!MYTO&.) MRTTP)V63EW+6Y Z%)7&P]W*U0-F42RZ.<$&W;B..<ETDXB.(S^6X-;E]EE_R MN?C338./EO[9%_1#*P> ^_F,QC2#R\$5X!?@.M .KAE M!ST.HXH,)RH#FA@ MX7#C;Q()^?+ O_:U[?[PW;>WOO[*W_[:^MRF/S_QI[<?>? /O_OUG:M6WG8K MR\WX3==]F4ENWF#XEQR7"U<[<96;XZ%<=V[>>=R->7-Q[)VW_NN.#J^+?*X" M_F,RO?-&=%AA[MR"O/56&#F>PG5NWM_%\3,<"W+<*#-O#"YQ=ZR(/U,<SQ+' M^>+8(([-XKA2'!\6Q[^)X_NBG!RH.$_G<LSK14:95XLT=XKCH^+XF#B^P<<< M%P^&TD/5#?ONKTS_S;Y[/"@W?7<47 &N`Y_)7>D<^"BS@',!'\J!]^6 L^EM M<PS8BL[PSE8Y\+ICH(?$[:8!(USL`5A]27OO;?PI-I>'<%4PD@K/=L'2O?G* M)L75X'*OR?7F(UU>JM_H?]TASK&7@\VR4WI1;ITML*8HHV31QUT9)9,#03FP MB%(EM7?&$'?:P!&NG%\%*??501[4F [OJ^.X9W*47:.XF(X4L>(X:2*N!\NV MDEIQIJX/LP:KQ+2U%K$^KP`O@!?!Y$*BT\!L4 =^!GX.[@)O@/Y0ZOG@/\"E M( CN!K\!:\']8"?XE)6O$'TNZ\5F1'OE@,W:;7=L-MV=@+.UVP*V2IT#KW;C MCNVQMS@&NA!C)*2;\S?D)4:YVPC[W(DI7MGD$7=LG@*SCINL.P-Y;;P)/ ]: MI7'PFC06SC?UO-34]>_!_YFZ?A1L!&^ CX$+.N\%3@63P _!9' :F $N`0V@ M%6P!N\$G8 _X$GAZ$?4%YX!I8 [8!MX&[X!_@/^&B_LU>*X8CAWL`4/[$)T( MQH"Q8"*8"BX"C6 Y6 '^!-:!Q\$3X$GP`M@!=H(S^V(?`:: <\%\$ "KP&IP M-^CW/=@!& "&@B_V[<$`WK'UU:T?$?_LH9=IWP[\OKQO1RM^^"8"M*.+5'(: M%MYAG/E]EVV'D=Q)I.XQY+V)O-ZW]B2I^Q6O=36';?1@.I-U-+U7C_O_5ND/ M\67]O^OH^G_6YPS)OBS;>@@\#/X)^A3#EL#YX%KP%-@$GBTV;/"]8L,.V095 M4-;'L,$06-(G90[X5 Y\(@=L7MMVY]UO(F!K088!V]8MPSNV5>(KY"C)E5_* M/)"9W\]-WI;\_R#6SS5]#NX?9;_XI=RL%V5G8+MC"]B<@7.RJ$=R!ETDDP,V M9Y"0[X#]'V[975F^.9J*6)]W@#O[)N>TZGZ8]T 0-((U8!OHWY^H$E2!Q> F ML!'D8:]^)K@27#W V+^O`JM!ZX"4=S+.:\!=<L"V8;/=>:='`]LR2_9:9LEL M`9LMV^[8GL<6L$UY*7;.KU]R#5OOLUQUB?W>X=@^SY*#ADKZ9OU=)>F0]7>O MJ<.7P9M@*W@/? +<`XF.!:> LT #T,$B<"D(@BO "K :_ /L`GL&&G]EN1WL M!?O 9V#2(**SP3E@&I@.S@<7@R"X&]P#7@!;P4?@8] .Y@S&@@;,!0O G&,0 M!C\Z%L\#K@'+P2W@#O (6 ^>`<^"%\&;8 ?X`'P%"H80C0<_`!/ 1' JF 2J MP'1P'CC0OHO:=[5_0/SS'FVGUP_@=_OK!UXZ8%WA_ 'AN!T\3R*0/A-ND+0^ MZ[0.[.K-L[SRRVRM2'-8MR^8>CT&.A@"3@`G=Z'7`_(@M9EPFV-@MV-@O3R! M."=;(4\@SLF.@!RF%[:$X[X!#]]YO2![AB+93IWL4K9'MK>=@Y*V9ME9`]#! M76!S<48K^LV9[0\V5[LR2B8'_B('GI8#3SC>L>5YT/'.VLP""7'TT)(GEORS MK)V>6?];8L79QE\_H2_@AK_S@ G'&C[SIY+/O-GTF^PS'P6;3)_Y(6@#7Z;X MRR_DY^].P.9@; %;LGV.`=N<FN&=C^7 AXZ!QV1WY9RL"SE,?1ZVS?,ZPAR5 MU,]I?IL!?@3N`;\=8GP6,Q:<!DX'X>,R-N U<N ..;!*#MSN>,>6YP8Y<+5C M,EO@"DJ1E-[)M[])Z])6C^*[A9ZW?RMI(JX7KU]^(^GY/E/7XTP]3S-UO03\ M%/P,7 M6@-^!)\#+X%U0<#Q1(2@""N@%AH";P0IP._A/L!+\"OP7N N\!3X" M'X.=8!<X`%Q#40:H`%4@#*X$-X ;P6W@%? J> UL!\TJT>6@_S"B$6 <^#&H M!0U@$;@,_!3<"&X!]X(_@JW@+; -O W>`=O!;C"F!#8"K@6_`->!6\&_P/X2 MXS-*_GSR`)S*@4\^V$?\(Z\%I?,^:R6XQ4C^0>?TB+7NL=Z\&:W_G+]Y(*\, M;>N_>:S;B*G7Q\&3X%FPI0N]9M=_/69_AUFV55:Z^C*:"XID.W6R3]DNV>YN MDFS.LK?[P'N@'VQE\Z >7?_-<6643 YDUW^9S3#4C_7%OG+X,,-?LJ]<`/1A MAJ_\)5@%?CO,V4_:%F7_= Q\THT[MN6:\_<#ULD^Q#G9S?*(<TYF2@_V^[?. M[JWU7[$\SY5A'ALKS6_6W.;!O)8+)@Q/_WV<S7*O/2\'GI,#&QWOV/*L<[SS M0#<"]W<CT,,"77U;5YA4;.G09L-9^8Y+8F7H&D)#U[XT5EV[_8QA:]O<)6LO M<0^_=4WN"'#"6JQP+Q_:MAG#\82EUPPY+W_>4R<^=LP5ZHV?/WWSYD_KZY[_ MY?].N_BD\[15;1,[>,2-!AA)&._&_X@V#1DW]C(HME6_3/S2LF7&B7\X"H<- M&S8@ID/\8I0:)_[I$(.6EJ21"-*TI)%#BE]VT'CR+O.V$,++B*^M^&7\PX<6 M;XO7NTR.Y]]T\2W4PF7A)Z4<0S@]GU/C4:_7L9TM1SO^FO&3TL:?-GY\I_C6 MUM;GUZU[8-*AQ:_K%']3:VOA^O3QM/Z+=2VI\2VM&WQWKGLT7?SJU:O[=(Z_ MR>L0WY(^ON60XU>M6I4V_OKKK[\J7;PD/1F?D+[4API@L@NH=^+_Z1Q!-*6] M(T?\;Y1Y-(O"%*5&\HL/6CF-AQJG^3Q3R'6)"^$IB/'1--*0HHYT"E$]J70R ML=&[*&^$RYKIIHRD0I(VHG0ZY8@23D];PBF(Q>*%2Y@RTM6;4KXN3Y7D%KDK MT^8>C]CO89DC<N?(RR![&Z:11Y0R+6TI/Q"E>(Q2W'(I9GN&R.W)59W;,T'T M1ZY1DL>:VWM3RI8=?9'719],%*7D&:7DBE+^D(=>2FSTA9Q.Y5/V=MPMRAB M]FBT$*4T07]QE#$'UU%0+XX1:D#<V=!Q2/QOHTF91!5HR5[Q?W@6TU2DJ*-F MI*U&>4M%2=.1IPXA(V<>GH95S3DOA.9S7)RS"/6'*8#:&\V4*ITKZN4<Q32F M4G5Q^SUHOS%M\'*I?FAR?>M*7%GBHG3"L1XKX$WFX+(0'^%K+BF7TPWKZ#!+ MP94Q[CG.G8CS).)RK8+H2D2^4T"TO"_1N,%&R03KX;K7$]M&/^*E=2$E6N(Q M_O4)?\K*;]JLU186U<13)I9V8IR?:J;E;V/S-W+Y6YG\S2S^=@Y_0X,_I>=/ MZOC3&GYCSV]M^<T-[]YY!\>K>"Z7I]\3P$AP(AE3\O?!263\7[=E8"P8!]A" MV4IXC//HG&BV@<L983Y!;S3)6+;GM0W",<=K> #$&U\W)F-J/XM<;<N)OY>1 MW\9Y\_,[K1#H#;>1_OB(*!#/;:1U>R[>O?[$(34_OFCR>^_G--=_/*&#%IO* ML31_L')9CC=?^4ZAX]N+15Y1@EA6[.=FPL&UC<CA*V^;N1^BWAY^&'?;TRX^ M>]I8*2[RM1539\FA`I&/>T;D17IV&U-=1GP>]Q@45T&%HK,J71SQ<Y<8'BZN M]__;._?@*JHS@']['WE )/=&PB- B'5 ' %)+)! J^$-0DB ()5'(21(@."% M)!0%;;&BP$ [^%:&$;7@J]HJTM%.$6CQCUH>HQT<ZP.+5*UVJ +5B58P_7WG MG!O")6F2.EK^V"_SNV=WS^YY[)[]OOW.`^J]B+E=D>,AB3?CJ-D.-I%><AO3 M"S1*KZGRI;0QO6"C]-)=>GJ/MX=L>NDNO7+26\AF:)C6*/Q[33M)%Z"(OF,I M<NM>;7:[@SDR!S50@QJH1B7,E84TQ[FHA26FO'P+R8G3]J%I6#=)9$XI#J@+ MX\?MEBVA-"IA>U?"X:)&S9;05)!7: HES-8RF%KN,S?>EBT4Y&V3JX)V-D6T MX;DLXN=.> X"`?NJ:WU7A>QHPM]Y4==R_.Y"3<L\>1(J$AO."HM3ILDN9A[! M1A?:F!07,]7%3&V(4>$]-]U.KT ORM /EL%&> ">@7?@`ZB#KZ 7Y;D<\F$\ ME$(5+ O8LMX!#\ C\!3\!OX`N4'[K:[VHPS*X098!?? _?!K^"<$*'4YW !K MX$$X":=@'+6>`W,A!FOA;G@47H3]< @^YMY]#E&<XMXP&B9",4R#&5 .%; 4 MJN%FV Q;X0EX&=Z =^$#2.)Q9T(.7 PC8!HLA!?@+_ F? @>=_L"Z F#8&BJ M779X%(Y!B#:=`??"%MC;SDZ/KM?C-+-:6 =/P)/P%.R :)I(5^@.5T$13$VS M4^7+X">P"NZ$W\%.>!%>AG=A$ I_!LR"1; :-L(C\%O8=8&=-CV5%ET.@W@I M"^'G\# \"KO@(+P.ET6(ASE0!N6P"!;#S^ AV /[X$TX#*<A%.6C!S)A8/3, M5.I14 0E4 .WP#K8`/=&[53!W?!'>!7^#+R*XD$`DB$*^5 `PV$\3(!EL!QN MR+#F]3XXJM=A.$.0`7EP)93 ?*B"%7!*S^E(NC :?MC13ET[`&]!=2:F&_X$ MA^$2#.GW8";,@MDP'Q; .M@,.^%5. $A7L8T2.]LI\04PEB8",MA-6R @_ W M. VI*,%ND <OP7YX'_X-'?ATZ-O5?D(,@=M@&SP&.^ 0'(&3D(JQ[P#=( ?Z MP$/P.+P-'X'7C7,@!C=!'>#72PG,@Q6PJ;L=VCL`1R' QT,F? >6PGK8!L_" M7G@3'D-E[H #<!1.01 ]&(8TU8>0!P/A*A@//X!K80Y40"5TEV0?GV^4Y ;+ MB2$TG[]]8#H[E;#0H5:]RK.65%%+N@E>@;?A(_@,>F 5+X$!, 0FP#6P&);# M.K@+-L%6>!J>!UW)<! ..0[#/Z .OH"5(>M$K'&LA1,.M:*?0CLL9 ?(PT)> M":_#6TG6^CWHK-[;R=;:=7%6[MH4N[#^)K@:"S8)/H$OX4.LUC'X# L52+-6 MZD)GE>;"^C0[MJI6:!]\`O^"`UB:0U"(I9D`#\-6Z(EEN3C=6I$ESHK\PEF/ M(Q%K-;HX:S'&68?[G%50BZ!6("/#:G_5_+<ZC7\[;(,G8"4:_:<PKJ.=F'H" M/H49:._9F5935SE-O<5IZD-.4R<YS3S):>;;81,\!._ >S"JBYW,]C0\ZS2R M$G5:.0_&P@28@8:-P3'X'.Y$N]X#1^"];E:[WNRTZS-.N[[?W6K7SCWL1(K! M< ML@(W9=I"U#K[,MMHTV6G10J<Q0Y)%BXX3:D16*TD\W^YG2=M2^2;HV.(9 M+1%J\8S64%]/@R(LDF+3%:)=++G2!>]HB,S$/XD?6\%>A>G"J&&K6*9+%<?G MXKO8HXDI]'8IU/*MK[[-3!F&UU/+N9,Y4D[X(^,!:5=*C929O1R.7L=OX]3+ MB*WXEE/W:W\^USZSA?*5\==<R5(IR9"$<T+R<<F(Y*"DANK3)4$\&?KCW4/2 MFXF[?/ZEDY849,?JTQ/_/'DFNK76:^8Z3*OQ;!.E?42'1RN]Z.K[O\K43LU* M+ZGX:D\F0:P/ESU^W'-)G"--7(JE-3U=35_1P5S1*R6Z>N5I<T6OE*2!V@5I MIT29_.1_+^KSI@]![U[CR_2N--[7.]AX7Y]$X_W$P=MXAZ2++0RN.E.QX[TG MA[TF*AJ(N WMO"C4WHY"VS$TII-V(P0"2<%P*!P(AM8$SKYPBPM+:3S::UM# M\YQ(N)QP,DU'QP*N)WX@Z00D'/8"7G)2(!RO0#Q;E57Z,X4&OYB&'3,C"%?T M-KFW3PH%5)K-?9AIO';487#NQK/J%SS[DH;*CR"/9>:Z>6:-V,"&O*AJB+Q6 MF--6I;CSZUU82CZ5KF;:.QN2I2EK^3#(\>P'I,A?9_1]5#D,ML"I/)%'LO2. MEGIJLH.1)QN5,=S0BE0N2BRP+VV0;4E[DG?(#AI3]@!M7EU18/I/UXB9\?EU M19_F98'Z^@RWWYFV/=NHU%I"5<4U1EUJ6ZSE5Y7V;#.&HN,G-[JK$A5NXO[Y M*E_5:]M-> 7%MMPCMVTY^45Q9>27=Z3(99<\]\8`CMU$1-3%;Q1[]^X7^T:^ M(';4X"6Q>N:0F(DO<D14^=BEOZEB)ZOHW8YX=O2DKV>[;_,]'2_2CFDS^"$E MGNF]E9F>[8"N\*QR41<.[T!J/9O_>V2JW;N\L-+,?X9GXLW;2'RV*T]1\?SJ M!=?GGHEC7[>U+!/UOY&OZE\1XY$W=;[FFR?V?"U+T8+RZEA-[+K:G&FQZHJ< M_/X#I+I0SHC9/KCDZ,A>NSRS/;WNTE$)VWH/];YIJ-I%0]4POO+PQ1=??/'% M%U]\\<477WSQY>M*<_Z_'@F\=N"US?V[1>ZZ#_^_[Q>_&LFQ<,(Q[?N*.+]= M?>A*L;[Z$K&^[ ;1>9XB=XOM-]@LME]UJU@_^RFQ/OT.L7[T3M$YJ[8/0?L` M]HM-^[B<[>MK6L.JJA:8_]A]1-F2!;5E55(SKUI]9>V'T[#4A=I+I&%N9HK) M4US>3879$5N/_]:7D!:Q9=%R:-U*%]16S3,YV/Z^-._,3-0^[NADL==,%UN6 M[6Y?T3Z0V27C1LX>,W7<2!.;%C\R=L*XB>.G--1\&.%$T2EH(V4T?Z-DA R6 M*R17^DD!QP9QI!][N6S;8P6$>6P-X"\?!G+5"!G.UG#Y+E?>;$JIZ9:XVFC^ MVM.KH78\:YCN>B.T)CU=^9J;RM=3FNRG]\477WSQQ1=??/'%%U]\\>7_*NJI MJ7>IWIWZK.JSJQ>HX_8ZYJWC]>J?JG^L7I_ZY#HFKSY^1*P?KF/YZKOKA,I, ML?Z[^OCJ0^LLC2SH)KH00*2'6+]9O<0<N$CL:LB+Q:XZ["5G5B^J[WRIG+V" ML9^<NXHQ3\Y=R3A8Q*Q<+1#MXZBO'RIBUL-^'ZX47;%HQ^35\QTN.G-(S,K= M43 :QKCKQA%>#>-A@M@E7NJ!%[OX26)]^RFBLXCL,JYK8)J+/PW3W7:<\TET M/E?,K,H=95;G5C?,:&F==)*P%T]+VU!2JNU+VF.C]5;*G$%CZW3>PY[U=TS3 M>0XSQ4T,$WU^.O=JKE29I7%MEPZTWL;U:>E\%9V9IPME5*:)KFZO.&>5<FLE M2P*>OC-MR5^EKL:&85J.YKK8S"BZT:RIOD[B*^YUOE',S+5K3OJ0O]YQ?7=; MF_]8_8G8[? Y-6];>?+)OZWWOT1_(G;;,W/VM.>HV/0CM54RS/_09756:_-7 MB>=D<]7)N;64*^;F*+9>.HG78ON+M_MXV-0Y7T=:RK\IN="\H2E&_Y]O.LF7 M;T\\GGZPG6U#B;I;[7?"O+:1L?)EB^==7VN^"8JFZ#$.F9=9M_O'X_OGRZ<% MVY<VT?!\.:_D/U!+`P04````" " =(LE4MQ.&\L-````0@``!@```$%!+E!" M3.T;;6P<1_7MV4GL2TXX-"UIDK93-ZK.CI/84512QTG/J6UB*;&-XY2V:6JM M[];VIN?;8_?.CJL672I5@/JG1:(J/XJ 7_U2`0F!J$"R$"#QEQ\("?$#T1_E M7Z56_(/RWIN9O=F]O3N[":6T'FL]LV_>O'GSON;-K'U^;+9_QEMS_'-5MUAP M?(#!!P8'>Y[[^@,`HT'@Y5V[XJXZ8M3W[77Q<-$.`M@NGYTR,3O>3_5'6&IM M<+?+9Z],38_UF^]=NW\`G5 ,W\>GYOHI(D /P!\Z`?Y]@R+#(2C-YX/*O%V/ M$/,V18ACU8)7'W,'P,M6^S&!7ZV/V0]PZ7: =WF,@/)B?GY3<QT#^-,7-S>. MYMLNVV6[;)?MLEVVRW;9+MOE\UC&1N?Z`?/F?UH^=,!\#D\`"/T79M&4M5.[ M$[-IX+Y4S>J4$&I_VQIA"D_DGLA95A>W4S4:_QX`CQ&R-,O[6^7H4*8["6_A MFI.OX-FT"_ 8\16:@5M87GRYGQN6>J@DX64WB7<S],[C<QN^E57]BJHW5-T# M)W"\4-CMI+)/S2TUP263JJ60SITQ"D?ROF-7'#A2<(**[ZU#.H;P581<A[U8 M1^'S;LFM!'X>-<#ZWT?Z;ZZ+S>AHII'KVR&$[56@G $["DJ"!FP<ZY3"VP?O MXSA-3;,.\#Q #8QR@ZVN7JP:;*04':)Z"(^4G>J]`V=,*=U9T,MO=\,IGF70 MLJ /#H/DZI250MW)0B-[H(!8C=P,@%RQAN2]$NJBFJ]X/E1\=VG)\9U5IU2A M47L`-DB[-$>FR?QBB_-G8_.S*21,3W,3/:'F9KHU2_H_EK\2+S6RU-WM[2S+ MW3%E;VA8#X2*W9 $&]GF<G$GN4H-@BX:S#5A=BDZ](2EQK]OF+">!%Q2JY6 MNUV:%*W_EZU%SU^S_4(FO53T%NRBJ*R7'='$]<6B[ZV(%O$[DW9*!28A6R'Q M6T]>T6M&JBF%3-HK->L])BT^DYZ3/C1./I05E64W&!"]AH_WBC[)BU=J0U'Y M3A.2=;>-46RGOYLMK/\#\?W_[[CWOZOV_PS'*\"^^9S<_SO4_G^2X4_FGL3] M_RRWEW/+V+[ ;3?G8OM1;E_+7<.VO%5\*O<4MJ]S^]G<L]C^%K=?R+V [>]R M^]7<J]C^$;??SKV-[9]RNS'7Z+%D(-"AI55.4?)*JVY0M8MJSY(BK_H.K-AN MT7?R;MFE6.D@FN^55JA-/8MNT4$%Y7VW7'&]$L-6G""PEQPHV!5[S2T5O+7\ MLELL0-$-*JNNL^96G!6,P(X3OJ#5E'!6)."6%KW(Y@E-<I+?;BXGR?VN$6\# M9.[Q'I@YR&'56Y<6Z_]0Z_V_>4;R1HR>;6-J47"N@[<XO^14>-T((R$1*% @ M;%;+9<=?\*JE`MAN?1!V^S9Z03@Z`2:1D>RJ7:PZ$0QC`M_!E\:MRP>Y9VJ. M]0:"M34Z"I'W0T9[$CLG\?V,@EF$/QE]-]N!27=R%%,PHKP+^_9SG<)=7[Z? M5_6<@LN4[?<QR88I6]R(6QG\)@R<]7\WZ?^3,?5.-M"MY(GW0F.>2)+6>:*& MD4MTQ&"7`3CW,V$VUCMB,/H>L#,&NP&DCRCL)9!\F[#O8]T=@[V)=3H&>P?K MW;"UW/9O";EM-UL)E7IN2_-3;MNM8@#]D'\2K!.?'?CLQ(?L#$\B5AI[#EB4 M>[+^!>G_+M"YZ2\M"UY S&>Q?<#J``^)_LKJAC=SO[;D# \BQBE\GF<,"X88 MJL=TP),,_8"Y/(B<',2>OV#](<YX%X4;GH>@(_C\V'K>2J9_$&F]PRM*P4^P M_3X_1.-P`@WB\VE<E<0XF8 A+:D#?>UUJQ/7] '/^0%#?Z[FO W7VPGU2&JQ M=/<@UWOA+!Z5BRBGU] 8WX([X(\H__=QA@^QM\>2.?H)-4YK-8R)+GK,?. ^ M[4 QD*#Y/']/+]KSI6JQB*.I1'QC1U<(T[X!.ZP0ID\()NR@AF5VAK#P$Q_2 MHU.[`,T?Z[^7]"_ U9R"Y,!2)PZS=E4TIW-/"M_)9O9@SR%5'U;U257_V?H" MVUH'ZR39PCK;6E@JT<)2H85UL)61A96LJ(6EVEI89\3"KEGT1"TLU6!A$N/D MIF?Q\$GN>0.DKS[.%$<:* J+QCYBD4;J,M!V?,T:`OIR;\+F6-)C(:4.-6X$ M:<XJBJ H*O\_+/W_0LLQS;@`KGN K)'BT5D\/Q:1QFOX]A;<@SYR+QRV>F'" MN@\IW(\K[4.^!U!31^$5ZSC\1OG-L*+5X#<Z@6CK/S*G;.\_=9@^Z2;ZCP&[ M3\,,G])^3O1H[Z;]7//^<3Q)U[I_LQXVHNHQ55]0M0!YN]#H=:;>6/_WD_YI M[VQVRW (HK<,2>O3?"ZC1W6P%&GN'F-NLJ9_L&53SW[0U@:Q^/RZ9;6(S5'^ M21^[D-YNI+$''E4KB-]@A"FF-I4L=T=-I:YNTU0$1 \86FTT3JN+:L*AY>^' M)#&8*HB*H1ZJ_B=B8/UG.?^#S0F$F.TQB(:VL/M,*F[C<=O]#C+:6BB+*B\Q MXV]=,#IJW<7>$>TU8U0'/(?B2[407PJ2Q-<%.=SM%S!W6\1S[W-*C(<57H,8 MPS,(RM-W,-$N@;P3WXP<->R `2.?WF_,E.1GV@!)IF1XNM:RUO%A0-43*(U4 MZ(OW6!9G1&_C*?H9A+/^^TG_6N82`T*,(68N'C<ZB6'D=1<,*BGE(&H7*!-G MI5Q9URNP9-K-)>SCE43[:/UTLCVIZJP!5>6H;!&&U@W!:,4]$)%>Q%5-:1(] MRW!;+;7/VYTPZW^ ]!^]'=[%M\-=^)N.,*G:'<17[4LX;ZJVGRRJ=B?:0*IV M`!67JAU$#]*WQ]^,\6-<!32]`MC2R7]K!_Z?,3.Q`^>&AM&BK1CL;E ?#PP8 MJ;0C!LN!/%R:L,= 6;(!6P%YN#1AJR /ER;L&Z!X#._-R<![(&+0H0%;ZA*( MBC9T$[8/ZNXCZYD0JHK7!3/Z_O<7) 7"%48OEXL[P]OY]U2]UZ!$G%-1)UV: MJ_;11RE-A0U[$*3#:5PR)AE.4A'<XR"=FO T+IL<XT($=P*?,9!IE\8EPR0M MQ7EX7.&>-W#)?#L3<)_!ARXJYPQ<,O(=C!OE]T5HY)=<@;0=Y_=[^)1CN&0# MNVK<B'RM^&$"+F^K";@W65C_@^3_B??_+6Z7Y"5][#IJD_?^-T-6T6E%HN67 M@TR:65BU?==>*#I!)CTS._G(Z-SX<"9ME]:%=K(K5P>$<JPK5R4#QIA,6BU- ME'VOXA%)A):K"T4W+Q:K);[]$D2O'O]$EM[UN::O$=TM51R,SJ(>)Z-#!H1Z M(Z9:CZ\'5Y%-P%2,N?+^[P3I/QIJ1583T]E.*RH)8?IC$0B:31ZNG/.MUDOG MC8!733HSU;-%!9T^?ES,<EH7B,JR(TCJPJYP.R@[>7?1=0I"K38<)<I>X"J> M&%5^_Q&3BW4B;H 67D'O8/VXSFGNXO&9-,Z*_6X)E^H6^L34Y0L7"" 33*=P MC-:AE^L."'4HSJ1QOW-+2T)$3\=LU-T(E2D_#<8)SGMK8H46R_H_R?HO.G0A M'$38?BB35O3%&7&9;.H<\9RM.TF?HOBU990,+X[=RPWJ2R(B$9Z0%O\GR92] MXF0-?V!"YYR\70V<.@]*PDIFR]Z*M^24O&HP(-8<L6RO(JHG`L?V\\L\"!?A M^C0>I<$4LU/3Z-WBHOT44A0+;LGVU_6 (B8+/D\],3TKW#-#1"P4:??DA,%I MN&CW:I\8.1L3M)@[/SZ%0[IQQDGF6$F4.+=%P5U<Q,2K9 JILFR7:!$VLBOY M(05B8"$R#T]/S4U.71[']OB%2^/(B3$_2E#++9QW=GSN\NQ4&+/<JS1R:DQ, M3F324^./SBGY3F'RYRO36UMF_3] ^D?U(2MK-EH6QNM+3F4*S26KS 8EI,B' M=L3A7?E1DFMM+9B1K^&<M\+1:)6\4N5Q<ES!<Z0!V47,$ OKPKGN!A4,\5(_ MA0)ZEF@<QEAH:J;K5LO8BJ.CR?I,J5*AHPTI$BTICQI>DK9L_I<5DV(3X%7B M+SD;CC MA3 &>!(D@,%*'!T2V0G;+59]IR\2$T1V4LI@L4K?>R2_]H);="OK M1%7&1+T(/;,M`M;_*=*_E'-><;)"6R5.O( :P+W$\VG!?:%H+XY/BRM#QT\, M'7_PRU=O:4#:#D.?:!AB_0^3_F]]0.KN5GQ,<+ )%3$L'I;3:)LL.6O,SE'> MW1^B4?$5JY#6%]<9!X_ZC#C98TXPS.WZ*,D<O7"'BF1#]$(KT2.GO.%NU;XH MOWF>\ZYGH^(]TCLLYBB;$#/R%"U&@\!=XF^IO0/)+!_I'3G;>R2![SZ3G:.2 M'Q6PVT=N,UZ?I@!&)B,-KX!!MVZXZ)Q:3\JBC@R%^F+]CY#^"Y1[:+;CB%)V MX28PM*7P'\E%XTD5.[5GAMPP3U>3-?/W=APTR4X3$M/$1$^>/)IO0WKPEO,] M&0PB25_[A*\A9J*#:!;$2#PHRD-+Z!>QS$"/P\ ]SOH_2_I7]M;&TFY%9K#% M8T-<.Q+O_UD]VH8;]2-[3 7]E]7"^L_QW__<_+&L,8G[]&A)3".BO^8&*CF: MF1U_9'+Z\B7!K)NH$7U*X)8U&H[$\)G@=MT-,!EFF1=4NMR4#)5*8GVF/=35 MJWELYW<)9^33^OYOT)*W']%;>[H#B=S57Y')GHXPW6>Z&[KKTC![%<A@?% T M<HQ,MOK'W8__5YFMJ'Y*_S+SDRG_`5!+`0(4"Q0````(`"Y^3RC/AV5VG0`` M`,,!```;``````````$`( ````````!N7V-S=%]A<W-O8VEA=&EV95]A<G)A M>2YS<G502P$"% L4````" `O?D\H`E]-7^4$```'$P``'P`````````!`" ` M``#6````<&9C7VY?8W-T7V%S<V]C:6%T:79E7V%R<F%Y+G-R=5!+`0(4"Q0` M```(`(5UBR5]G$JP2 ```& ````(``````````$`( ```/@%``!414U0+E18 M5%!+`0(4"Q0````(`&YF3BB2S&N\TAT```!X```*````````````( ```&8& M``!74D1#3E0N4$),4$L!`A0+% ````@`"72+)9(<*J6;( ```+P```8````` M```````@````8"0``$%!+D1/0U!+`0(4"Q0````(`(!TBR52W$X;RPT```!" M```&````````````( ```!]%``!!02Y00DQ02P4&``````8`!@!L`0``#E,` #```` ` end
![]() |
0 |
![]() |
This is a multi-part message in MIME format. --------------020003060200010203070608 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit And here's an implementation that I threw together recently. I'll have to review Mr. Ogrinz's version to see how I can improve mine. Philip Salgannik wrote: > Here is an old implementation by Michael Ogrinz > > "JKorth" <nooospaaam_jk@epos-gmbh.de> wrote in message > news:47ea1b84$1@forums-1-dub... >> One thing I miss in PowerBuilder development is something like a hash >> array. >> >> Are there any good* implementations/solutions out for PB? >> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets) >> >> *good means for me: >> - no special runtime requirements like additional OLE components or >> special Windows components (like the .NET framework) >> - it shouldn't have much overhead >> >> >> Is there a PBNI implementation? > > --------------020003060200010203070608 Content-Type: application/x-zip-compressed; name="_hashtable.zip" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="_hashtable.zip" UEsDBBQAAAAIAIxgejhKpOHRGQcAACA4AAAOAAAAX2hhc2h0YWJsZS5zcnXtW21v2zYQvq8e sP9AFMWarl2bBQO2tdiGtnHarG06pO5eMAyFYzupVtfOLNtZ/vy25+5IkZIoW0q2ph4EwrZE HnnH4/G540n++6/r9AM9pC79Sac0pRnN6QmNqE9DfM/oOr2mN7hL8T3H7xGNUX8H9zNa0Mf0 ER1LrzO0zdCHa05AMwVlH78Gvc4x8ghXsZEM+s9A/Q5XE/xOaEkJaBbSm0f5HVQD9OCRR2gf BmOGdWU53r8seW5xHrFaJ62XbynzSDKKVNpfgoJrJ+DUEdle01O0ntOv9JtQPEDbubT10faj SLIAhWt/JvPi3o9wtcD1POPuZhTnndevgZysq7l8VGqlO8Wo3C+Bpoxo70goF6BjyXl2AxmX RzK0RTcj/Y5FtoH0YYmNaJYl595O8vq9+6IXg/4j2y8NdGnorWix3lhH+J3aGUyyviPsoERG TdeOr5pTWxpZ662e7xStry/AZf06nMpd1Ti3A70tM0uqpyPXb4Ye71C3FH6r5HXWV2VXdedU tK37dJc+/aALz2wXCPwSe/KQ9oHHPXy/oANpOQw0mIpmx4IuI9kBrEut99g1B7awJhzOGAqR 2+lynVRXXXTuXWDYPjSj+jDwTXzXw90h/WI115dd1EExKLu4Zl3x/mHrmUlLJ9eewkpYc6eZ xfJIn0WKidZWl6b0TQrLuEPbKF/ibpu+xvfn9AV4fi8rrTvvBrz5ArvrBq73rJU4LfD891GT yLzVSy2lNbV62BT7uJvJmfeJY/GJXeyDU8GPol8ci18st/Mn9KeGviFTGk2p8p7VUfZLlN7D Ks12ydPGECyOdU384f8B8eaY0QxzSgM8m6DuHXQyEmxnr2jEkhkfU7me1EY/RpYevcLvAaSI cf03ua3Tx1WXFmuLpcVaXzzWhrvGrDhBFNGqLqbVjdI3HeFeQAuME4nFmj5ppHws9jESrYwE S6a29QS0S2nxKOTt5wF4PMa6PAfHA3BSROtYfd0LcCqRc/1EdH4sseOM3Nk5pFIO9dFy9Qzc uLFZGJGkzNuIP1abYPz1p+87srOq+7B8LM9E0CqxZ4+h3PUpzAJo/xDH/TnHYX6VXLNAA3yG y/uW57ImT6229sn7jb70NGLZU7kekvMmLF3Mk/CZ81zaU8GegSDKPNsXZRnP5PqNHXMhOPSH nZdaBWtxV2pYwvw6JRmSTSxynYmsby3HtKSdsazTCXGuhHfvbcqvWfXMj7JzYtF2+oImLF05 I7F6NL+KuioPhZL7nYo8isdjoR3YkRiNxtm8ylZ3Q7imEm2p9Zxl1uNkcOtR7u1XpLzSqn8f NRjsteqoQkcaW1kndhZeC3X3Yl461bXmveZ2DJ2pxrL51c73TWR9OQo43hif1sY85fJ+Yx7l 9JVw2sH3Drg24/QTrJFtf0js1Sagmwt/xruUPL67DJqe7LpBBo1PSwZ4ORLKKUb5bkPs18dk PqOb2FggPOmGfppbX8r9gWAdr85WhO5mNnZCenKt0h/319qb1s/tCR4Y+pb4vMtI9kRiEhPh o2OXM9VJcCbPR5zxOfHnspHnZXK6mx6N7ovuEvGEc1Lvqr5N94+ef/k79A5hLKeacJFRk5Nx /cg1FsM4n5aSZnwHwkej2ZgFxWPXHmpegaoYicZmmLeIvE9fNeP7lI8YufceZv8MMnWth3Xa PhMObf6g9aV1fem69bnaUpU/2KrlV5wv8V5pPdb/18/XNh3xOWYI0b4fIFx9TPuwULz67JqI vfDKFk+t/jyouZBhJhOfwooctqnoIZz8Q4yrmlQPqVbqLKmZRyxnD3qyGjx6GKk6b6uxrssh hDMfyzw2AyNaH1IurQ/xJX7e4SzTJxZrOmLxsROGf+62J3akJxRueQWLUJt5SJrL5n20ReGT QPZAbH8Gujdii12gqZG1UM7u1BO+jcNnGOXhnie6k9A6aZOMoks/Y+we6u6iGPRllOS3tHSn O1wZiEY0G7jIfJViKu+KKXDqjhQdmaXYFcvYk5oD4dSLYq2JyOno1vvh9W9rXOwNlE33vw+g t6H1vBMK87b5HN1lvW4599s8/98JNH8vQuO9t8tAhnbU5sHbPHibB/+Qi9upbdzlCsvYxl1a qvPM/Ll4fljjsjA/3DQmu0XGRmAqyaroSylieWal8rVMGb63dQuF61ysc5k3tpq9E7vpMc5h MMuUypFO0/dV10c78RxD84jHIWL7xkNerjB/nX/jYZ2lXHVpfVyxtD7OF+/jVj87dR7QndH5 U/95alNfmfeXmgMvZhGqnqk+Jvf+XDhiJyJt2W+uoo15UEcfek1nYcVMQxFZL/NEVy00/u+0 gWCV7mWmHZD71wT7b93J91CKdD3ZySdycptBzqW1+S1SVGRt8Ynums25qOdeiHTsT66hLf9v lroSDwVJ5uITzxvK4vvGJKmae5ljTOZ/AFBLAQIUCxQAAAAIAIxgejhKpOHRGQcAACA4AAAO AAAAAAAAAAEAIAAAAAAAAABfaGFzaHRhYmxlLnNydVBLBQYAAAAAAQABADwAAABFBwAAAAA= --------------020003060200010203070608--
![]() |
0 |
![]() |
This is a multi-part message in MIME format. --------------060201040706020400060704 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit An array of names and an array of objects.... Can't you guys do any better than that? The slowest part of this object is the hash function. Replace that with an external dll call of some kind and it will be fast enough to store a few thousand objects without being a bottleneck. I have a dll somewhere that does MD5 hashes that I use myself, but the code isn't very portable. Jason 'Bug' Fenter [TeamSybase] wrote: > And here's an implementation that I threw together recently. I'll have > to review Mr. Ogrinz's version to see how I can improve mine. > > Philip Salgannik wrote: >> Here is an old implementation by Michael Ogrinz >> >> "JKorth" <nooospaaam_jk@epos-gmbh.de> wrote in message >> news:47ea1b84$1@forums-1-dub... >>> One thing I miss in PowerBuilder development is something like a hash >>> array. >>> >>> Are there any good* implementations/solutions out for PB? >>> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets) >>> >>> *good means for me: >>> - no special runtime requirements like additional OLE components or >>> special Windows components (like the .NET framework) >>> - it shouldn't have much overhead >>> >>> >>> Is there a PBNI implementation? >> >> > --------------060201040706020400060704 Content-Type: text/plain; name="n_cst_hash_table.sru" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="n_cst_hash_table.sru" //4kAFAAQgBFAHgAcABvAHIAdABIAGUAYQBkAGUAcgAkAG4AXwBjAHMAdABfAGgAYQBzAGgA XwB0AGEAYgBsAGUALgBzAHIAdQANAAoAJABQAEIARQB4AHAAbwByAHQAQwBvAG0AbQBlAG4A dABzACQAZQBjAHMALgBwAGIAbAAgAC0AIABOAEUAVwANAAoAZgBvAHIAdwBhAHIAZAANAAoA ZwBsAG8AYgBhAGwAIAB0AHkAcABlACAAbgBfAGMAcwB0AF8AaABhAHMAaABfAHQAYQBiAGwA ZQAgAGYAcgBvAG0AIABuAG8AbgB2AGkAcwB1AGEAbABvAGIAagBlAGMAdAANAAoAZQBuAGQA IAB0AHkAcABlAA0ACgB0AHkAcABlACAAbgBfAGMAcwB0AF8AaABhAHMAaABfAGwAaQBzAHQA IABmAHIAbwBtACAAbgBvAG4AdgBpAHMAdQBhAGwAbwBiAGoAZQBjAHQAIAB3AGkAdABoAGkA bgAgAG4AXwBjAHMAdABfAGgAYQBzAGgAXwB0AGEAYgBsAGUADQAKAGUAbgBkACAAdAB5AHAA ZQANAAoAZQBuAGQAIABmAG8AcgB3AGEAcgBkAA0ACgANAAoAZwBsAG8AYgBhAGwAIAB0AHkA cABlACAAbgBfAGMAcwB0AF8AaABhAHMAaABfAHQAYQBiAGwAZQAgAGYAcgBvAG0AIABvAGwA ZQBvAGIAagBlAGMAdAANAAoAZQB2AGUAbgB0ACAAdQBlAF8AZABvAGMAdQBtAGUAbgB0AGEA dABpAG8AbgAgACgAIAApAA0ACgBuAF8AYwBzAHQAXwBoAGEAcwBoAF8AbABpAHMAdAAgAG4A XwBjAHMAdABfAGgAYQBzAGgAXwBsAGkAcwB0AA0ACgBlAG4AZAAgAHQAeQBwAGUADQAKAGcA bABvAGIAYQBsACAAbgBfAGMAcwB0AF8AaABhAHMAaABfAHQAYQBiAGwAZQAgAG4AXwBjAHMA dABfAGgAYQBzAGgAXwB0AGEAYgBsAGUADQAKAA0ACgB0AHkAcABlACAAdgBhAHIAaQBhAGIA bABlAHMADQAKAHAAcgBpAHYAYQB0AGUAOgANAAoAbgBfAGMAcwB0AF8AaABhAHMAaABfAGwA aQBzAHQAIABpAG4AXwBiAHUAYwBrAGUAdABzAFsAXQAsACAAaQBuAF8AZQBtAHAAdAB5AA0A CgANAAoAdQBuAHMAaQBnAG4AZQBkAGwAbwBuAGcAIABpAGwAXwBzAHAAbABpAHQAXwBwAHQA cgAsACAAaQBsAF8AbQBhAHgAXwBzAHAAbABpAHQAPQAxACwAIABpAGwAXwBrAGUAeQBfAGMA bwB1AG4AdAANAAoAZQBuAGQAIAB2AGEAcgBpAGEAYgBsAGUAcwANAAoADQAKAGYAbwByAHcA YQByAGQAIABwAHIAbwB0AG8AdAB5AHAAZQBzAA0ACgBwAHIAaQB2AGEAdABlACAAcwB1AGIA cgBvAHUAdABpAG4AZQAgAG8AZgBfAHQAaAByAG8AdwAoAHMAdAByAGkAbgBnACAAYQBzAF8A ZQByAHIAbwByACkADQAKAHAAcgBpAHYAYQB0AGUAIABmAHUAbgBjAHQAaQBvAG4AIABsAG8A bgBnACAAbwBmAF8AaABhAHMAaAAgACgAcwB0AHIAaQBuAGcAIABhAHMAXwBzAHQAcgBpAG4A ZwApAA0ACgBwAHIAaQB2AGEAdABlACAAcwB1AGIAcgBvAHUAdABpAG4AZQAgAG8AZgBfAHMA cABsAGkAdABfAGIAdQBjAGsAZQB0ACAAKAApAA0ACgBwAHIAaQB2AGEAdABlACAAcwB1AGIA cgBvAHUAdABpAG4AZQAgAG8AZgBfAG0AZQByAGcAZQBfAGIAdQBjAGsAZQB0ACAAKAApAA0A CgBwAHUAYgBsAGkAYwAgAHMAdQBiAHIAbwB1AHQAaQBuAGUAIABvAGYAXwByAGUAbQBvAHYA ZQAgACgAcwB0AHIAaQBuAGcAIABhAHMAXwBrAGUAeQApACAAdABoAHIAbwB3AHMAIABlAHgA YwBlAHAAdABpAG8AbgANAAoAcAByAGkAdgBhAHQAZQAgAGYAdQBuAGMAdABpAG8AbgAgAGwA bwBuAGcAIABvAGYAXwBiAHUAYwBrAGUAdABfAG8AZgBmAHMAZQB0ACAAKABsAG8AbgBnACAA YQBsAF8AbQBhAHgAXwBzAHAAbABpAHQALAAgAGwAbwBuAGcAIABhAGwAXwBzAHAAbABpAHQA XwBwAHQAcgAsACAAdQBuAHMAaQBnAG4AZQBkAGwAbwBuAGcAIABhAGwAXwBoAGEAcwBoAF8A dgBhAGwAKQANAAoAcAB1AGIAbABpAGMAIABzAHUAYgByAG8AdQB0AGkAbgBlACAAbwBmAF8A YQBkAGQAIAAoAHMAdAByAGkAbgBnACAAYQBzAF8AbgBhAG0AZQAsACAAYQBuAHkAIABhAGEA XwB2AGEAbAB1AGUALAAgAGIAbwBvAGwAZQBhAG4AIABhAGIAXwBmAGEAaQBsAF8AZQB4AGkA cwB0AHMAKQAgAHQAaAByAG8AdwBzACAAZQB4AGMAZQBwAHQAaQBvAG4ADQAKAHAAdQBiAGwA aQBjACAAZgB1AG4AYwB0AGkAbwBuACAAYgBvAG8AbABlAGEAbgAgAG8AZgBfAGcAZQB0ACAA KABzAHQAcgBpAG4AZwAgAGEAcwBfAGsAZQB5ACwAIAByAGUAZgAgAGEAbgB5ACAAYQBhAF8A cgBlAHQAKQAgAHQAaAByAG8AdwBzACAAZQB4AGMAZQBwAHQAaQBvAG4ADQAKAHAAdQBiAGwA aQBjACAAcwB1AGIAcgBvAHUAdABpAG4AZQAgAG8AZgBfAGMAbABlAGEAbgBfAHUAcAAgACgA KQANAAoAZQBuAGQAIABwAHIAbwB0AG8AdAB5AHAAZQBzAA0ACgANAAoAZQB2AGUAbgB0ACAA dQBlAF8AZABvAGMAdQBtAGUAbgB0AGEAdABpAG8AbgAoACkAOwAvAC8AIABwAG8AcgB0AGUA ZAAgAHQAaABpAHMAIABoAGEAcwBoACAAaQBtAHAAbABlAG0AZQBuAHQAYQB0AGkAbwBuACAA dABvACAAUABCACAAZgByAG8AbQAgAGEAbgAgAGUAeABhAG0AcABsAGUAIABmAG8AdQBuAGQA IABvAG4AIAB0AGgAZQAgAG4AZQB0AA0ACgANAAoALwAvACAAYQBuACAAZQBsAGUAbQBlAG4A dAAgAGkAcwAgAGYAbwB1AG4AZAAgAGkAbgAgAHQAaABlACAAdABhAGIAbABlACAAYgB5ACAA dQBzAGkAbgBnACAAbQBvAGQAKABoAGEAcwBoACwAIABuACkAIAB3AGgAZQByAGUAIABuACAA aQBzACAAYQAgAHAAbwB3AGUAcgAgAG8AZgAgADIADQAKAC8ALwAgAGEAcwAgAHQAaABlACAA dABhAGIAbABlACAAZQB4AHAAYQBuAGQAcwAgAG4AIAB3AGkAbABsACAAZABvAHUAYgBsAGUA DQAKAC8ALwAgAHQAbwAgAHIAZQBkAHUAYwBlACAAdABoAGUAIAB3AG8AcgBrACAAbwBmACAA ZQB4AHAAYQBuAGQAaQBuAGcAIAB0AGgAZQAgAHQAYQBiAGwAZQAsACAAbwBuAGUAIABoAGEA cwBoACAAYgB1AGMAawBlAHQAIAB3AGkAbABsACAAYgBlACAAcwBwAGwAaQB0ACAAYQB0ACAA YQAgAHQAaQBtAGUADQAKAC8ALwAgAGEAbgBkACAAYgBvAHQAaAAgAGgAYQBzAGgAIAB0AGEA YgBsAGUAIABzAGkAegBlAHMAIAB3AGkAbABsACAAYwBvAGUAeABpAHMAdAAuAA0ACgANAAoA LwAvACAAZgBvAHIAIABlAHgAYQBtAHAAbABlADoADQAKAC8ALwAgAFsAMAAgADEAIAAyACAA MwBdACAANAAgADUAXQANAAoALwAvACAAYgB1AGMAawBlAHQAcwAgADYAIABhAG4AZAAgADcA IABkAG8AbgAnAHQAIAB5AGUAdAAgAGUAeABpAHMAdAANAAoALwAvACAAdABoAGUAIAB2AGEA bAB1AGUAcwAgAGMAYQBuACAAYwB1AHIAcgBlAG4AdABsAHkAIABiAGUAIABmAG8AdQBuAGQA IABpAG4AIABiAHUAYwBrAGUAdABzACAAMgAgAGEAbgBkACAAMwAgAHUAcwBpAG4AZwAgAG0A bwBkACgALAA0ACkAIABpAG4AcwB0AGUAYQBkACAAbwBmACAAbQBvAGQAKAAsADgAKQANAAoA LwAvACAAaQBmACAAdwBlACAAYQBkAGQAIABhAG4AbwB0AGgAZQByACAAZQBsAGUAbQBlAG4A dAAsACAAdABoAGUAIABiAHUAYwBrAGUAdAAgAGEAdAAgADIAIAB3AGkAbABsACAAYgBlACAA cwBwAGwAaQB0ACAAaQBuAHQAbwAgAG0AbwBkACgAaABhAHMAaAAsADgAKQA9ADIAIABhAG4A ZAAgAG0AbwBkACgAaABhAHMAaAAsADgAKQA9ADYADQAKAC8ALwAgAGkAZgAgAGEAbgAgAGUA bABlAG0AZQBuAHQAIAB3AGEAcwAgAHIAZQBtAG8AdgBlAGQALAAgAHQAaABlACAAMgAgAGIA dQBjAGsAZQB0AHMAIAAyACAAYQBuAGQAIAA2ACAAdwBvAHUAbABkACAAYgBlACAAcgBlAGMA bwBtAGIAaQBuAGUAZAAgAGEAZwBhAGkAbgAuAA0ACgBlAG4AZAAgAGUAdgBlAG4AdAANAAoA DQAKAHAAcgBpAHYAYQB0AGUAIABzAHUAYgByAG8AdQB0AGkAbgBlACAAbwBmAF8AdABoAHIA bwB3ACgAcwB0AHIAaQBuAGcAIABhAHMAXwBlAHIAcgBvAHIAKQAgAHQAaAByAG8AdwBzACAA ZQB4AGMAZQBwAHQAaQBvAG4AOwBlAHgAYwBlAHAAdABpAG8AbgAgAGUADQAKAGUAPQBjAHIA ZQBhAHQAZQAgAGUAeABjAGUAcAB0AGkAbwBuAA0ACgBlAC4AcwBlAHQAbQBlAHMAcwBhAGcA ZQAoAGEAcwBfAGUAcgByAG8AcgApAA0ACgB0AGgAcgBvAHcAIABlAA0ACgBlAG4AZAAgAHMA dQBiAHIAbwB1AHQAaQBuAGUADQAKAA0ACgBwAHIAaQB2AGEAdABlACAAZgB1AG4AYwB0AGkA bwBuACAAbABvAG4AZwAgAG8AZgBfAGgAYQBzAGgAIAAoAHMAdAByAGkAbgBnACAAYQBzAF8A cwB0AHIAaQBuAGcAKQA7AA0ACgBjAGgAYQByAGEAYwB0AGUAcgAgAGwAYwBfAHYAYQBsAHUA ZQBzAFsAXQANAAoAbABvAG4AZwAgAGwAbABfAGkADQAKAHUAbgBzAGkAZwBuAGUAZABsAG8A bgBnACAAbABsAF8AcgBlAHQADQAKAA0ACgBsAGMAXwB2AGEAbAB1AGUAcwA9AGEAcwBfAHMA dAByAGkAbgBnAA0ACgBmAG8AcgAgAGwAbABfAGkAIAA9ACAAMQAgAHQAbwAgAGwAZQBuACgA YQBzAF8AcwB0AHIAaQBuAGcAKQANAAoACQBsAGwAXwByAGUAdAArAD0AYQBzAGMAKABsAGMA XwB2AGEAbAB1AGUAcwBbAGwAbABfAGkAXQApACsANAA4ADUAMwAxADgADQAKAAkAbABsAF8A cgBlAHQAKgA9ADIANgA1ADQANAAzADUANwA2ADEADQAKAG4AZQB4AHQADQAKAA0ACgByAGUA dAB1AHIAbgAgAGwAbABfAHIAZQB0AA0ACgBlAG4AZAAgAGYAdQBuAGMAdABpAG8AbgANAAoA DQAKAHAAcgBpAHYAYQB0AGUAIABzAHUAYgByAG8AdQB0AGkAbgBlACAAbwBmAF8AcwBwAGwA aQB0AF8AYgB1AGMAawBlAHQAIAAoACkAOwBsAG8AbgBnACAAbABsAF8AbwBsAGQAXwBwAGwA YQBjAGUALAAgAGwAbABfAG4AZQB3AF8AcABsAGEAYwBlACwAIABsAGwAXwBpAA0ACgBuAF8A YwBzAHQAXwBoAGEAcwBoAF8AbABpAHMAdAAgAGwAbgBfAG8AbABkAF8AYwBoAGEAaQBuACwA IABsAG4AXwBuAGUAdwBfAGMAaABhAGkAbgAsACAAbABuAF8AYwB1AHIAXwBwAHQAcgAsACAA bABuAF8AbgBlAHgAdABfAHAAdAByAA0ACgANAAoAbABsAF8AbwBsAGQAXwBwAGwAYQBjAGUA PQBpAGwAXwBzAHAAbABpAHQAXwBwAHQAcgANAAoAbABsAF8AbgBlAHcAXwBwAGwAYQBjAGUA PQBsAGwAXwBvAGwAZABfAHAAbABhAGMAZQArAGkAbABfAG0AYQB4AF8AcwBwAGwAaQB0AA0A CgANAAoAaQBmACAAbABsAF8AbwBsAGQAXwBwAGwAYQBjAGUAKwAxACAAPgA9ACAAaQBsAF8A bQBhAHgAXwBzAHAAbABpAHQAIAB0AGgAZQBuAA0ACgAJAGkAZgAgAGkAbABfAGsAZQB5AF8A YwBvAHUAbgB0ACAAPAAgADIAIAB0AGgAZQBuACAAcgBlAHQAdQByAG4ADQAKAAkADQAKAAkA aQBsAF8AbQBhAHgAXwBzAHAAbABpAHQAIAArAD0AIABpAGwAXwBtAGEAeABfAHMAcABsAGkA dAANAAoACQBpAGwAXwBzAHAAbABpAHQAXwBwAHQAcgA9ADAADQAKAGUAbABzAGUADQAKAAkA aQBsAF8AcwBwAGwAaQB0AF8AcAB0AHIAPQBsAGwAXwBvAGwAZABfAHAAbABhAGMAZQArADEA DQAKAGUAbgBkACAAaQBmAA0ACgANAAoAbABuAF8AYwB1AHIAXwBwAHQAcgA9AGkAbgBfAGIA dQBjAGsAZQB0AHMAWwBsAGwAXwBvAGwAZABfAHAAbABhAGMAZQAgACsAMQBdAA0ACgANAAoA ZABvACAAdwBoAGkAbABlACAAaQBzAHYAYQBsAGkAZAAoAGwAbgBfAGMAdQByAF8AcAB0AHIA KQANAAoACQBsAG4AXwBuAGUAeAB0AF8AcAB0AHIAPQBsAG4AXwBjAHUAcgBfAHAAdAByAC4A aQBuAF8AbgBlAHgAdAANAAoACQANAAoACQBpAGYAIABvAGYAXwBiAHUAYwBrAGUAdABfAG8A ZgBmAHMAZQB0ACgAaQBsAF8AbQBhAHgAXwBzAHAAbABpAHQALAAgAGkAbABfAHMAcABsAGkA dABfAHAAdAByACwAIABsAG4AXwBjAHUAcgBfAHAAdAByAC4AaQBsAF8AaABhAHMAaAApAD0A bABsAF8AbwBsAGQAXwBwAGwAYQBjAGUAIAB0AGgAZQBuAA0ACgAJAAkAbABuAF8AYwB1AHIA XwBwAHQAcgAuAGkAbgBfAG4AZQB4AHQAPQBsAG4AXwBvAGwAZABfAGMAaABhAGkAbgANAAoA CQAJAGwAbgBfAG8AbABkAF8AYwBoAGEAaQBuAD0AbABuAF8AYwB1AHIAXwBwAHQAcgANAAoA CQBlAGwAcwBlAA0ACgAJAAkAbABuAF8AYwB1AHIAXwBwAHQAcgAuAGkAbgBfAG4AZQB4AHQA PQBsAG4AXwBuAGUAdwBfAGMAaABhAGkAbgANAAoACQAJAGwAbgBfAG4AZQB3AF8AYwBoAGEA aQBuAD0AbABuAF8AYwB1AHIAXwBwAHQAcgANAAoACQBlAG4AZAAgAGkAZgANAAoACQANAAoA CQBsAG4AXwBjAHUAcgBfAHAAdAByAD0AbABuAF8AbgBlAHgAdABfAHAAdAByAA0ACgBsAG8A bwBwAA0ACgANAAoAaQBmACAAaQBzAHYAYQBsAGkAZAAoAGwAbgBfAG8AbABkAF8AYwBoAGEA aQBuACkAIAB0AGgAZQBuAA0ACgAJAGkAbgBfAGIAdQBjAGsAZQB0AHMAWwBsAGwAXwBvAGwA ZABfAHAAbABhAGMAZQAgACsAMQBdAD0AbABuAF8AbwBsAGQAXwBjAGgAYQBpAG4ALgBvAGYA XwByAGUAdgBlAHIAcwBlACgAKQANAAoAZQBsAHMAZQANAAoACQBpAG4AXwBiAHUAYwBrAGUA dABzAFsAbABsAF8AbwBsAGQAXwBwAGwAYQBjAGUAIAArADEAXQA9AGkAbgBfAGUAbQBwAHQA eQANAAoAZQBuAGQAIABpAGYADQAKAA0ACgBpAGYAIABpAHMAdgBhAGwAaQBkACgAbABuAF8A bgBlAHcAXwBjAGgAYQBpAG4AKQAgAHQAaABlAG4ADQAKAAkAaQBuAF8AYgB1AGMAawBlAHQA cwBbAGwAbABfAG4AZQB3AF8AcABsAGEAYwBlACAAKwAxAF0APQBsAG4AXwBuAGUAdwBfAGMA aABhAGkAbgAuAG8AZgBfAHIAZQB2AGUAcgBzAGUAKAApAA0ACgBlAGwAcwBlAA0ACgAJAGkA bgBfAGIAdQBjAGsAZQB0AHMAWwBsAGwAXwBuAGUAdwBfAHAAbABhAGMAZQAgACsAMQBdAD0A aQBuAF8AZQBtAHAAdAB5AA0ACgBlAG4AZAAgAGkAZgANAAoADQAKAGUAbgBkACAAcwB1AGIA cgBvAHUAdABpAG4AZQANAAoADQAKAHAAcgBpAHYAYQB0AGUAIABzAHUAYgByAG8AdQB0AGkA bgBlACAAbwBmAF8AbQBlAHIAZwBlAF8AYgB1AGMAawBlAHQAIAAoACkAOwBsAG8AbgBnACAA bABsAF8AbgBlAHcAXwBwAGwAYQBjAGUALAAgAGwAbABfAG8AbABkAF8AcABsAGEAYwBlAA0A CgBiAG8AbwBsAGUAYQBuACAAbABiAF8AdQBzAGUAXwBvAGwAZABfAGMAaABhAGkAbgANAAoA bgBfAGMAcwB0AF8AaABhAHMAaABfAGwAaQBzAHQAIABsAG4AXwBvAGwAZABfAGMAaABhAGkA bgAsACAAbABuAF8AbgBlAHcAXwBjAGgAYQBpAG4ALAAgAGwAbgBfAG0AZQByAGcAZQBfAGwA aQBzAHQALAAgAGwAbgBfAHQAbQBwAA0ACgANAAoAaQBmACAAaQBsAF8AcwBwAGwAaQB0AF8A cAB0AHIAPQAwACAAdABoAGUAbgANAAoACQBpAGYAIABpAGwAXwBrAGUAeQBfAGMAbwB1AG4A dAA8ADEAIAB0AGgAZQBuACAAcgBlAHQAdQByAG4ADQAKAAkAaQBsAF8AbQBhAHgAXwBzAHAA bABpAHQAIAA9ACAAaQBsAF8AbQBhAHgAXwBzAHAAbABpAHQAIAAvACAAMgANAAoACQBpAGwA XwBzAHAAbABpAHQAXwBwAHQAcgAgAD0AIABpAGwAXwBtAGEAeABfAHMAcABsAGkAdAAgAC0A MQANAAoAZQBsAHMAZQANAAoACQBpAGwAXwBzAHAAbABpAHQAXwBwAHQAcgAgAC0ALQANAAoA ZQBuAGQAIABpAGYADQAKAA0ACgBsAGwAXwBuAGUAdwBfAHAAbABhAGMAZQA9AGkAbABfAHMA cABsAGkAdABfAHAAdAByAA0ACgBsAGwAXwBvAGwAZABfAHAAbABhAGMAZQA9AGwAbABfAG4A ZQB3AF8AcABsAGEAYwBlACAAKwAgAGkAbABfAG0AYQB4AF8AcwBwAGwAaQB0AA0ACgANAAoA bABuAF8AbwBsAGQAXwBjAGgAYQBpAG4APQBpAG4AXwBiAHUAYwBrAGUAdABzAFsAbABsAF8A bwBsAGQAXwBwAGwAYQBjAGUAIAArADEAXQANAAoAbABuAF8AbgBlAHcAXwBjAGgAYQBpAG4A PQBpAG4AXwBiAHUAYwBrAGUAdABzAFsAbABsAF8AbgBlAHcAXwBwAGwAYQBjAGUAIAArADEA XQANAAoADQAKAGQAbwAgAHcAaABpAGwAZQAgAGkAcwB2AGEAbABpAGQAKABsAG4AXwBvAGwA ZABfAGMAaABhAGkAbgApACAAbwByACAAaQBzAHYAYQBsAGkAZAAoAGwAbgBfAG4AZQB3AF8A YwBoAGEAaQBuACkADQAKAAkAaQBmACAAbgBvAHQAIABpAHMAdgBhAGwAaQBkACgAbABuAF8A bwBsAGQAXwBjAGgAYQBpAG4AKQAgAHQAaABlAG4ADQAKAAkACQBsAGIAXwB1AHMAZQBfAG8A bABkAF8AYwBoAGEAaQBuAD0AZgBhAGwAcwBlAA0ACgAJAGUAbABzAGUAaQBmACAAbgBvAHQA IABpAHMAdgBhAGwAaQBkACgAbABuAF8AbgBlAHcAXwBjAGgAYQBpAG4AKQAgAHQAaABlAG4A DQAKAAkACQBsAGIAXwB1AHMAZQBfAG8AbABkAF8AYwBoAGEAaQBuAD0AdAByAHUAZQANAAoA CQBlAGwAcwBlAA0ACgAJAAkAbABiAF8AdQBzAGUAXwBvAGwAZABfAGMAaABhAGkAbgAgAD0A IABsAG4AXwBvAGwAZABfAGMAaABhAGkAbgAuAGkAcwBfAG4AYQBtAGUAIAA8ACAAbABuAF8A bgBlAHcAXwBjAGgAYQBpAG4ALgBpAHMAXwBuAGEAbQBlAA0ACgAJAGUAbgBkACAAaQBmAA0A CgAJAA0ACgAJAGkAZgAgAGwAYgBfAHUAcwBlAF8AbwBsAGQAXwBjAGgAYQBpAG4AIAB0AGgA ZQBuAA0ACgAJAAkAbABuAF8AdABtAHAAPQBsAG4AXwBvAGwAZABfAGMAaABhAGkAbgAuAGkA bgBfAG4AZQB4AHQADQAKAAkACQBsAG4AXwBvAGwAZABfAGMAaABhAGkAbgAuAGkAbgBfAG4A ZQB4AHQAPQBsAG4AXwBtAGUAcgBnAGUAXwBsAGkAcwB0AA0ACgAJAAkAbABuAF8AbQBlAHIA ZwBlAF8AbABpAHMAdAA9AGwAbgBfAG8AbABkAF8AYwBoAGEAaQBuAA0ACgAJAAkAbABuAF8A bwBsAGQAXwBjAGgAYQBpAG4APQBsAG4AXwB0AG0AcAANAAoACQBlAGwAcwBlAA0ACgAJAAkA bABuAF8AdABtAHAAPQBsAG4AXwBuAGUAdwBfAGMAaABhAGkAbgAuAGkAbgBfAG4AZQB4AHQA DQAKAAkACQBsAG4AXwBuAGUAdwBfAGMAaABhAGkAbgAuAGkAbgBfAG4AZQB4AHQAPQBsAG4A XwBtAGUAcgBnAGUAXwBsAGkAcwB0AA0ACgAJAAkAbABuAF8AbQBlAHIAZwBlAF8AbABpAHMA dAA9AGwAbgBfAG4AZQB3AF8AYwBoAGEAaQBuAA0ACgAJAAkAbABuAF8AbgBlAHcAXwBjAGgA YQBpAG4APQBsAG4AXwB0AG0AcAANAAoACQBlAG4AZAAgAGkAZgANAAoACQAJAA0ACgBsAG8A bwBwAA0ACgANAAoAaQBmACAAaQBzAHYAYQBsAGkAZAAoAGwAbgBfAG0AZQByAGcAZQBfAGwA aQBzAHQAKQAgAHQAaABlAG4ADQAKAAkAaQBuAF8AYgB1AGMAawBlAHQAcwBbAGwAbABfAG4A ZQB3AF8AcABsAGEAYwBlACAAKwAxAF0APQBsAG4AXwBtAGUAcgBnAGUAXwBsAGkAcwB0AC4A bwBmAF8AcgBlAHYAZQByAHMAZQAoACkADQAKAGUAbABzAGUADQAKAAkAaQBuAF8AYgB1AGMA awBlAHQAcwBbAGwAbABfAG4AZQB3AF8AcABsAGEAYwBlACAAKwAxAF0APQBpAG4AXwBlAG0A cAB0AHkADQAKAGUAbgBkACAAaQBmAA0ACgANAAoAaQBuAF8AYgB1AGMAawBlAHQAcwBbAGwA bABfAG8AbABkAF8AcABsAGEAYwBlACAAKwAxAF0APQBpAG4AXwBlAG0AcAB0AHkADQAKAA0A CgBlAG4AZAAgAHMAdQBiAHIAbwB1AHQAaQBuAGUADQAKAA0ACgBwAHUAYgBsAGkAYwAgAHMA dQBiAHIAbwB1AHQAaQBuAGUAIABvAGYAXwByAGUAbQBvAHYAZQAgACgAcwB0AHIAaQBuAGcA IABhAHMAXwBrAGUAeQApACAAdABoAHIAbwB3AHMAIABlAHgAYwBlAHAAdABpAG8AbgA7AGwA bwBuAGcAIABsAGwAXwBoAGEAcwBoACwAIABsAGwAXwBpAG4AZABlAHgADQAKAG4AXwBjAHMA dABfAGgAYQBzAGgAXwBsAGkAcwB0ACAAbABuAF8AcAB0AHIALAAgAGwAbgBfAGwAYQBzAHQA DQAKAA0ACgBpAGYAIABpAGwAXwBrAGUAeQBfAGMAbwB1AG4AdAA9ADAAIAB0AGgAZQBuAA0A CgAJAG8AZgBfAHQAaAByAG8AdwAoACcASwBlAHkAIABuAG8AdAAgAGYAbwB1AG4AZAAnACkA DQAKAGUAbgBkACAAaQBmAA0ACgANAAoAYQBzAF8AawBlAHkAPQBsAG8AdwBlAHIAKABhAHMA XwBrAGUAeQApAA0ACgANAAoAbABsAF8AaABhAHMAaAA9AG8AZgBfAGgAYQBzAGgAKABhAHMA XwBrAGUAeQApAA0ACgBsAGwAXwBpAG4AZABlAHgAPQBvAGYAXwBiAHUAYwBrAGUAdABfAG8A ZgBmAHMAZQB0ACgAaQBsAF8AbQBhAHgAXwBzAHAAbABpAHQALAAgAGkAbABfAHMAcABsAGkA dABfAHAAdAByACwAIABsAGwAXwBoAGEAcwBoACkADQAKAA0ACgBsAG4AXwBwAHQAcgA9AGkA bgBfAGIAdQBjAGsAZQB0AHMAWwBsAGwAXwBpAG4AZABlAHgAKwAxAF0ADQAKAA0ACgBkAG8A IAB3AGgAaQBsAGUAIABpAHMAdgBhAGwAaQBkACgAbABuAF8AcAB0AHIAKQANAAoACQBpAGYA IABsAG4AXwBwAHQAcgAuAGkAcwBfAG4AYQBtAGUAPQBhAHMAXwBrAGUAeQAgAHQAaABlAG4A DQAKAAkACQBpAGYAIABpAHMAdgBhAGwAaQBkACgAbABuAF8AbABhAHMAdAApACAAdABoAGUA bgANAAoACQAJAAkAbABuAF8AbABhAHMAdAAuAGkAbgBfAG4AZQB4AHQAPQBsAG4AXwBwAHQA cgAuAGkAbgBfAG4AZQB4AHQADQAKAAkACQBlAGwAcwBlAA0ACgAJAAkACQBpAG4AXwBiAHUA YwBrAGUAdABzAFsAbABsAF8AaQBuAGQAZQB4ACsAMQBdAD0AbABuAF8AcAB0AHIALgBpAG4A XwBuAGUAeAB0AA0ACgAJAAkAZQBuAGQAIABpAGYADQAKAAkACQBkAGUAcwB0AHIAbwB5ACAA bABuAF8AcAB0AHIADQAKAAkACQBpAGwAXwBrAGUAeQBfAGMAbwB1AG4AdAAgAC0ALQANAAoA CQAJAG8AZgBfAG0AZQByAGcAZQBfAGIAdQBjAGsAZQB0ACgAKQANAAoACQAJAHIAZQB0AHUA cgBuAA0ACgAJAGUAbgBkACAAaQBmAA0ACgAJAA0ACgAJAGwAbgBfAGwAYQBzAHQAPQBsAG4A XwBwAHQAcgANAAoACQBsAG4AXwBwAHQAcgA9AGwAbgBfAHAAdAByAC4AaQBuAF8AbgBlAHgA dAANAAoAbABvAG8AcAANAAoADQAKAG8AZgBfAHQAaAByAG8AdwAoACcASwBlAHkAIABuAG8A dAAgAGYAbwB1AG4AZAAnACkADQAKAGUAbgBkACAAcwB1AGIAcgBvAHUAdABpAG4AZQANAAoA DQAKAHAAcgBpAHYAYQB0AGUAIABmAHUAbgBjAHQAaQBvAG4AIABsAG8AbgBnACAAbwBmAF8A YgB1AGMAawBlAHQAXwBvAGYAZgBzAGUAdAAgACgAbABvAG4AZwAgAGEAbABfAG0AYQB4AF8A cwBwAGwAaQB0ACwAIABsAG8AbgBnACAAYQBsAF8AcwBwAGwAaQB0AF8AcAB0AHIALAAgAHUA bgBzAGkAZwBuAGUAZABsAG8AbgBnACAAYQBsAF8AaABhAHMAaABfAHYAYQBsACkAOwBpAGYA IABtAG8AZAAoAGEAbABfAGgAYQBzAGgAXwB2AGEAbAAsAGEAbABfAG0AYQB4AF8AcwBwAGwA aQB0ACkAPABhAGwAXwBzAHAAbABpAHQAXwBwAHQAcgAgAHQAaABlAG4ADQAKAAkAcgBlAHQA dQByAG4AIABtAG8AZAAoAGEAbABfAGgAYQBzAGgAXwB2AGEAbAAsAGEAbABfAG0AYQB4AF8A cwBwAGwAaQB0ACAAKwAgAGEAbABfAG0AYQB4AF8AcwBwAGwAaQB0ACkADQAKAGUAbABzAGUA DQAKAAkAcgBlAHQAdQByAG4AIABtAG8AZAAoAGEAbABfAGgAYQBzAGgAXwB2AGEAbAAsAGEA bABfAG0AYQB4AF8AcwBwAGwAaQB0ACkADQAKAGUAbgBkACAAaQBmAA0ACgANAAoAZQBuAGQA IABmAHUAbgBjAHQAaQBvAG4ADQAKAA0ACgBwAHUAYgBsAGkAYwAgAHMAdQBiAHIAbwB1AHQA aQBuAGUAIABvAGYAXwBhAGQAZAAgACgAcwB0AHIAaQBuAGcAIABhAHMAXwBuAGEAbQBlACwA IABhAG4AeQAgAGEAYQBfAHYAYQBsAHUAZQAsACAAYgBvAG8AbABlAGEAbgAgAGEAYgBfAGYA YQBpAGwAXwBlAHgAaQBzAHQAcwApACAAdABoAHIAbwB3AHMAIABlAHgAYwBlAHAAdABpAG8A bgA7AGwAbwBuAGcAIABsAGwAXwBoAGEAcwBoACwAIABsAGwAXwBpAG4AZABlAHgADQAKAG4A XwBjAHMAdABfAGgAYQBzAGgAXwBsAGkAcwB0ACAAbABuAF8AcAB0AHIALAAgAGwAbgBfAGwA YQBzAHQALAAgAGwAbgBfAG4AZQB3AA0ACgANAAoAYQBzAF8AbgBhAG0AZQA9AGwAbwB3AGUA cgAoAGEAcwBfAG4AYQBtAGUAKQANAAoADQAKAGwAbABfAGgAYQBzAGgAPQBvAGYAXwBoAGEA cwBoACgAYQBzAF8AbgBhAG0AZQApAA0ACgBsAGwAXwBpAG4AZABlAHgAPQBvAGYAXwBiAHUA YwBrAGUAdABfAG8AZgBmAHMAZQB0ACgAaQBsAF8AbQBhAHgAXwBzAHAAbABpAHQALAAgAGkA bABfAHMAcABsAGkAdABfAHAAdAByACwAIABsAGwAXwBoAGEAcwBoACkADQAKAA0ACgBpAGYA IABpAGwAXwBrAGUAeQBfAGMAbwB1AG4AdAA+ADAAIAB0AGgAZQBuAA0ACgAJAGwAbgBfAHAA dAByAD0AaQBuAF8AYgB1AGMAawBlAHQAcwBbAGwAbABfAGkAbgBkAGUAeAArADEAXQANAAoA CQANAAoACQBkAG8AIAB3AGgAaQBsAGUAIAB0AHIAdQBlAA0ACgAJAAkAaQBmACAAbgBvAHQA IABpAHMAdgBhAGwAaQBkACgAbABuAF8AcAB0AHIAKQAgAHQAaABlAG4AIABlAHgAaQB0AA0A CgAJAAkADQAKAAkACQBpAGYAIABsAG4AXwBwAHQAcgAuAGkAbABfAGgAYQBzAGgAPQBsAGwA XwBoAGEAcwBoACAAdABoAGUAbgANAAoACQAJAAkAaQBmACAAbABuAF8AcAB0AHIALgBpAHMA XwBuAGEAbQBlAD0AYQBzAF8AbgBhAG0AZQAgAHQAaABlAG4ADQAKAAkACQAJAAkAaQBmACAA YQBiAF8AZgBhAGkAbABfAGUAeABpAHMAdABzACAAdABoAGUAbgANAAoACQAJAAkACQAJAC8A LwAgAG8AbgBsAHkAIABmAGEAaQBsACAAaQBmACAAdABoAGUAeQAgAGEAcgBlACAAZABpAGYA ZgBlAHIAZQBuAHQAIAB0AHkAcABlAHMAIABvAHIAIAB2AGEAbAB1AGUAcwANAAoACQAJAAkA CQAJAGkAZgAgAGMAbABhAHMAcwBuAGEAbQBlACgAbABuAF8AcAB0AHIALgBpAGEAXwB2AGEA bAB1AGUAKQA8AD4AYwBsAGEAcwBzAG4AYQBtAGUAKABhAGEAXwB2AGEAbAB1AGUAKQAgAHQA aABlAG4ADQAKAAkACQAJAAkACQAJAG8AZgBfAHQAaAByAG8AdwAoACcAQQAgAHYAYQBsAHUA ZQAgAGEAbAByAGUAYQBkAHkAIABlAHgAaQBzAHQAcwAgAGYAbwByACAAJwArAGEAcwBfAG4A YQBtAGUAKQANAAoACQAJAAkACQAJAGUAbgBkACAAaQBmAA0ACgAJAAkACQAJAAkAaQBmACAA bABuAF8AcAB0AHIALgBpAGEAXwB2AGEAbAB1AGUAPAA+AGEAYQBfAHYAYQBsAHUAZQAgAHQA aABlAG4ADQAKAAkACQAJAAkACQAJAG8AZgBfAHQAaAByAG8AdwAoACcAQQAgAHYAYQBsAHUA ZQAgAGEAbAByAGUAYQBkAHkAIABlAHgAaQBzAHQAcwAgAGYAbwByACAAJwArAGEAcwBfAG4A YQBtAGUAKQANAAoACQAJAAkACQAJAGUAbgBkACAAaQBmAA0ACgAJAAkACQAJAGUAbABzAGUA DQAKAAkACQAJAAkACQAvAC8AIAByAGUAcABsAGEAYwBlACAAdABoAGUAIABlAHgAaQBzAHQA aQBuAGcAIAB2AGEAbAB1AGUADQAKAAkACQAJAAkACQBsAG4AXwBwAHQAcgAuAGkAYQBfAHYA YQBsAHUAZQA9AGEAYQBfAHYAYQBsAHUAZQANAAoACQAJAAkACQBlAG4AZAAgAGkAZgANAAoA CQAJAAkACQByAGUAdAB1AHIAbgANAAoACQAJAAkAZQBuAGQAIABpAGYADQAKAAkACQBlAG4A ZAAgAGkAZgANAAoACQAJAA0ACgAJAAkAaQBmACAAYQBzAF8AbgBhAG0AZQAgADwAIABsAG4A XwBwAHQAcgAuAGkAcwBfAG4AYQBtAGUAIAB0AGgAZQBuACAAZQB4AGkAdAANAAoACQAJAA0A CgAJAAkAbABuAF8AbABhAHMAdAA9AGwAbgBfAHAAdAByAA0ACgAJAAkAbABuAF8AcAB0AHIA PQBsAG4AXwBwAHQAcgAuAGkAbgBfAG4AZQB4AHQADQAKAAkAbABvAG8AcAANAAoAZQBuAGQA IABpAGYADQAKAA0ACgBsAG4AXwBuAGUAdwA9AGMAcgBlAGEAdABlACAAbgBfAGMAcwB0AF8A aABhAHMAaABfAGwAaQBzAHQADQAKAGwAbgBfAG4AZQB3AC4AaQBzAF8AbgBhAG0AZQA9AGEA cwBfAG4AYQBtAGUADQAKAGwAbgBfAG4AZQB3AC4AaQBhAF8AdgBhAGwAdQBlAD0AYQBhAF8A dgBhAGwAdQBlAA0ACgBsAG4AXwBuAGUAdwAuAGkAbABfAGgAYQBzAGgAPQBsAGwAXwBoAGEA cwBoAA0ACgANAAoAaQBmACAAaQBzAHYAYQBsAGkAZAAoAGwAbgBfAGwAYQBzAHQAKQAgAHQA aABlAG4ADQAKAAkAbABuAF8AbABhAHMAdAAuAGkAbgBfAG4AZQB4AHQAPQBsAG4AXwBuAGUA dwANAAoAZQBsAHMAZQANAAoACQBpAG4AXwBiAHUAYwBrAGUAdABzAFsAbABsAF8AaQBuAGQA ZQB4ACsAMQBdAD0AbABuAF8AbgBlAHcADQAKAGUAbgBkACAAaQBmAA0ACgANAAoAbABuAF8A bgBlAHcALgBpAG4AXwBuAGUAeAB0AD0AbABuAF8AcAB0AHIADQAKAA0ACgBpAGwAXwBrAGUA eQBfAGMAbwB1AG4AdAArACsADQAKAGkAZgAgAGkAbABfAGsAZQB5AF8AYwBvAHUAbgB0AD4A IAB1AHAAcABlAHIAYgBvAHUAbgBkACgAaQBuAF8AYgB1AGMAawBlAHQAcwApACAAdABoAGUA bgANAAoACQBpAG4AXwBiAHUAYwBrAGUAdABzAFsAaQBsAF8AawBlAHkAXwBjAG8AdQBuAHQA XQA9AGkAbgBfAGUAbQBwAHQAeQANAAoAZQBuAGQAIABpAGYADQAKAA0ACgBvAGYAXwBzAHAA bABpAHQAXwBiAHUAYwBrAGUAdAAoACkADQAKAGUAbgBkACAAcwB1AGIAcgBvAHUAdABpAG4A ZQANAAoADQAKAHAAdQBiAGwAaQBjACAAZgB1AG4AYwB0AGkAbwBuACAAYgBvAG8AbABlAGEA bgAgAG8AZgBfAGcAZQB0ACAAKABzAHQAcgBpAG4AZwAgAGEAcwBfAGsAZQB5ACwAIAByAGUA ZgAgAGEAbgB5ACAAYQBhAF8AcgBlAHQAKQAgAHQAaAByAG8AdwBzACAAZQB4AGMAZQBwAHQA aQBvAG4AOwBsAG8AbgBnACAAbABsAF8AaABhAHMAaAANAAoAbABvAG4AZwAgAGwAbABfAGkA bgBkAGUAeAA9AC0AMQANAAoAbgBfAGMAcwB0AF8AaABhAHMAaABfAGwAaQBzAHQAIABsAG4A XwBsAGkAcwB0AA0ACgANAAoAYQBzAF8AawBlAHkAPQBsAG8AdwBlAHIAKABhAHMAXwBrAGUA eQApAA0ACgBsAGwAXwBoAGEAcwBoAD0AbwBmAF8AaABhAHMAaAAoAGEAcwBfAGsAZQB5ACkA DQAKAA0ACgBsAGwAXwBpAG4AZABlAHgAPQBvAGYAXwBiAHUAYwBrAGUAdABfAG8AZgBmAHMA ZQB0ACgAaQBsAF8AbQBhAHgAXwBzAHAAbABpAHQALAAgAGkAbABfAHMAcABsAGkAdABfAHAA dAByACwAIABsAGwAXwBoAGEAcwBoACkADQAKAA0ACgBpAGYAIABsAGwAXwBpAG4AZABlAHgA KwAxACAAPAAgADEAIABvAHIAIABsAGwAXwBpAG4AZABlAHgAIAArADEAIAA+ACAAdQBwAHAA ZQByAGIAbwB1AG4AZAAoAGkAbgBfAGIAdQBjAGsAZQB0AHMAKQAgAHQAaABlAG4ADQAKAAkA cgBlAHQAdQByAG4AIABmAGEAbABzAGUADQAKAGUAbgBkACAAaQBmAA0ACgANAAoAbABuAF8A bABpAHMAdAA9AGkAbgBfAGIAdQBjAGsAZQB0AHMAWwBsAGwAXwBpAG4AZABlAHgAKwAxAF0A DQAKAA0ACgBkAG8AIAB3AGgAaQBsAGUAIABpAHMAdgBhAGwAaQBkACgAbABuAF8AbABpAHMA dAApAA0ACgAJAGkAZgAgAGwAbgBfAGwAaQBzAHQALgBpAGwAXwBoAGEAcwBoAD0AbABsAF8A aABhAHMAaAAgAHQAaABlAG4ADQAKAAkACQBpAGYAIABsAG4AXwBsAGkAcwB0AC4AaQBzAF8A bgBhAG0AZQA9AGEAcwBfAGsAZQB5ACAAdABoAGUAbgANAAoACQAJAAkAYQBhAF8AcgBlAHQA PQBsAG4AXwBsAGkAcwB0AC4AaQBhAF8AdgBhAGwAdQBlAA0ACgAJAAkACQByAGUAdAB1AHIA bgAgAHQAcgB1AGUADQAKAAkACQBlAG4AZAAgAGkAZgANAAoACQBlAG4AZAAgAGkAZgANAAoA CQBsAG4AXwBsAGkAcwB0AD0AbABuAF8AbABpAHMAdAAuAGkAbgBfAG4AZQB4AHQADQAKAGwA bwBvAHAADQAKAA0ACgByAGUAdAB1AHIAbgAgAGYAYQBsAHMAZQANAAoADQAKAGUAbgBkACAA ZgB1AG4AYwB0AGkAbwBuAA0ACgANAAoAcAB1AGIAbABpAGMAIABzAHUAYgByAG8AdQB0AGkA bgBlACAAbwBmAF8AYwBsAGUAYQBuAF8AdQBwACAAKAApADsAbABvAG4AZwAgAGwAbABfAGkA DQAKAG4AXwBjAHMAdABfAGgAYQBzAGgAXwBsAGkAcwB0ACAAbABuAF8AaQB0AGUAbQAsACAA bABuAF8AbgBlAHgAdAAsACAAbABuAF8AZQBtAHAAdAB5AFsAXQANAAoADQAKAGYAbwByACAA bABsAF8AaQAgAD0AIABsAG8AdwBlAHIAYgBvAHUAbgBkACgAaQBuAF8AYgB1AGMAawBlAHQA cwApACAAdABvACAAdQBwAHAAZQByAGIAbwB1AG4AZAAoAGkAbgBfAGIAdQBjAGsAZQB0AHMA KQANAAoACQBsAG4AXwBpAHQAZQBtAD0AaQBuAF8AYgB1AGMAawBlAHQAcwBbAGwAbABfAGkA XQANAAoACQBkAG8AIAB3AGgAaQBsAGUAIABpAHMAdgBhAGwAaQBkACgAbABuAF8AaQB0AGUA bQApAA0ACgAJAAkAbABuAF8AbgBlAHgAdAA9AGwAbgBfAGkAdABlAG0ALgBpAG4AXwBuAGUA eAB0AA0ACgAJAAkAZABlAHMAdAByAG8AeQAgAGwAbgBfAGkAdABlAG0ADQAKAAkACQBsAG4A XwBpAHQAZQBtAD0AbABuAF8AbgBlAHgAdAANAAoACQBsAG8AbwBwAA0ACgBuAGUAeAB0AA0A CgANAAoAaQBuAF8AYgB1AGMAawBlAHQAcwA9AGwAbgBfAGUAbQBwAHQAeQANAAoADQAKAGkA bABfAHMAcABsAGkAdABfAHAAdAByAD0AMAANAAoAaQBsAF8AbQBhAHgAXwBzAHAAbABpAHQA PQAxAA0ACgBpAGwAXwBrAGUAeQBfAGMAbwB1AG4AdAA9ADAADQAKAGUAbgBkACAAcwB1AGIA cgBvAHUAdABpAG4AZQANAAoADQAKAG8AbgAgAG4AXwBjAHMAdABfAGgAYQBzAGgAXwB0AGEA YgBsAGUALgBjAHIAZQBhAHQAZQANAAoAYwBhAGwAbAAgAHMAdQBwAGUAcgA6ADoAYwByAGUA YQB0AGUADQAKAHQAaABpAHMALgBuAF8AYwBzAHQAXwBoAGEAcwBoAF8AbABpAHMAdAA9AGMA cgBlAGEAdABlACAAbgBfAGMAcwB0AF8AaABhAHMAaABfAGwAaQBzAHQADQAKAFQAcgBpAGcA ZwBlAHIARQB2AGUAbgB0ACgAIAB0AGgAaQBzACwAIAAiAGMAbwBuAHMAdAByAHUAYwB0AG8A cgAiACAAKQANAAoAZQBuAGQAIABvAG4ADQAKAA0ACgBvAG4AIABuAF8AYwBzAHQAXwBoAGEA cwBoAF8AdABhAGIAbABlAC4AZABlAHMAdAByAG8AeQANAAoAVAByAGkAZwBnAGUAcgBFAHYA ZQBuAHQAKAAgAHQAaABpAHMALAAgACIAZABlAHMAdAByAHUAYwB0AG8AcgAiACAAKQANAAoA YwBhAGwAbAAgAHMAdQBwAGUAcgA6ADoAZABlAHMAdAByAG8AeQANAAoAZABlAHMAdAByAG8A eQAoAHQAaABpAHMALgBuAF8AYwBzAHQAXwBoAGEAcwBoAF8AbABpAHMAdAApAA0ACgBlAG4A ZAAgAG8AbgANAAoADQAKAGUAdgBlAG4AdAAgAGQAZQBzAHQAcgB1AGMAdABvAHIAOwBpAGYA IABpAHMAdgBhAGwAaQBkACgAdABoAGkAcwApACAAdABoAGUAbgAgAG8AZgBfAGMAbABlAGEA bgBfAHUAcAAoACkADQAKAA0ACgANAAoAZQBuAGQAIABlAHYAZQBuAHQADQAKAA0ACgB0AHkA cABlACAAbgBfAGMAcwB0AF8AaABhAHMAaABfAGwAaQBzAHQAIABmAHIAbwBtACAAbgBvAG4A dgBpAHMAdQBhAGwAbwBiAGoAZQBjAHQAIAB3AGkAdABoAGkAbgAgAG4AXwBjAHMAdABfAGgA YQBzAGgAXwB0AGEAYgBsAGUAIABkAGUAcwBjAHIAaQBwAHQAbwByACAAIgBwAGIAXwBuAHYA bwAiACAAPQAgACIAdAByAHUAZQAiACAADQAKAGUAbgBkACAAdAB5AHAAZQANAAoADQAKAHQA eQBwAGUAIAB2AGEAcgBpAGEAYgBsAGUAcwANAAoAbABvAG4AZwAgAGkAbABfAGgAYQBzAGgA DQAKAHMAdAByAGkAbgBnACAAaQBzAF8AbgBhAG0AZQANAAoAYQBuAHkAIABpAGEAXwB2AGEA bAB1AGUADQAKAG4AXwBjAHMAdABfAGgAYQBzAGgAXwBsAGkAcwB0ACAAaQBuAF8AbgBlAHgA dAANAAoAZQBuAGQAIAB2AGEAcgBpAGEAYgBsAGUAcwANAAoADQAKAGYAbwByAHcAYQByAGQA IABwAHIAbwB0AG8AdAB5AHAAZQBzAA0ACgBwAHUAYgBsAGkAYwAgAGYAdQBuAGMAdABpAG8A bgAgAG4AXwBjAHMAdABfAGgAYQBzAGgAXwBsAGkAcwB0ACAAbwBmAF8AcgBlAHYAZQByAHMA ZQAgACgAKQANAAoAZQBuAGQAIABwAHIAbwB0AG8AdAB5AHAAZQBzAA0ACgANAAoAcAB1AGIA bABpAGMAIABmAHUAbgBjAHQAaQBvAG4AIABuAF8AYwBzAHQAXwBoAGEAcwBoAF8AbABpAHMA dAAgAG8AZgBfAHIAZQB2AGUAcgBzAGUAIAAoACkAOwBuAF8AYwBzAHQAXwBoAGEAcwBoAF8A bABpAHMAdAAgAGwAbgBfAHAAdAByACwAIABsAG4AXwBsAGEAcwB0ACwAIABsAG4AXwBuAGUA eAB0AA0ACgANAAoAbABuAF8AcAB0AHIAPQB0AGgAaQBzAA0ACgBkAG8AIAB3AGgAaQBsAGUA IABpAHMAdgBhAGwAaQBkACgAbABuAF8AcAB0AHIAKQANAAoACQBsAG4AXwBuAGUAeAB0AD0A bABuAF8AcAB0AHIALgBpAG4AXwBuAGUAeAB0AA0ACgAJAA0ACgAJAGwAbgBfAHAAdAByAC4A aQBuAF8AbgBlAHgAdAA9AGwAbgBfAGwAYQBzAHQADQAKAAkAbABuAF8AbABhAHMAdAA9AGwA bgBfAHAAdAByAA0ACgAJAA0ACgAJAGwAbgBfAHAAdAByAD0AbABuAF8AbgBlAHgAdAANAAoA bABvAG8AcAANAAoADQAKAHIAZQB0AHUAcgBuACAAbABuAF8AbABhAHMAdAANAAoAZQBuAGQA IABmAHUAbgBjAHQAaQBvAG4ADQAKAA0ACgBvAG4AIABuAF8AYwBzAHQAXwBoAGEAcwBoAF8A bABpAHMAdAAuAGMAcgBlAGEAdABlAA0ACgBjAGEAbABsACAAcwB1AHAAZQByADoAOgBjAHIA ZQBhAHQAZQANAAoAVAByAGkAZwBnAGUAcgBFAHYAZQBuAHQAKAAgAHQAaABpAHMALAAgACIA YwBvAG4AcwB0AHIAdQBjAHQAbwByACIAIAApAA0ACgBlAG4AZAAgAG8AbgANAAoADQAKAG8A bgAgAG4AXwBjAHMAdABfAGgAYQBzAGgAXwBsAGkAcwB0AC4AZABlAHMAdAByAG8AeQANAAoA VAByAGkAZwBnAGUAcgBFAHYAZQBuAHQAKAAgAHQAaABpAHMALAAgACIAZABlAHMAdAByAHUA YwB0AG8AcgAiACAAKQANAAoAYwBhAGwAbAAgAHMAdQBwAGUAcgA6ADoAZABlAHMAdAByAG8A eQANAAoAZQBuAGQAIABvAG4ADQAKAA0ACgA= --------------060201040706020400060704--
![]() |
0 |
![]() |
I personally never used any of these implementations - there wasn't even once a need for it in the last 14 years :-)))) "Jeremy Lakeman" <jeremy.lakeman@gmail.com> wrote in message news:47eb833b@forums-1-dub... > An array of names and an array of objects.... > Can't you guys do any better than that? > > The slowest part of this object is the hash function. Replace that with > an external dll call of some kind and it will be fast enough to store a > few thousand objects without being a bottleneck. > > I have a dll somewhere that does MD5 hashes that I use myself, but the > code isn't very portable. > > Jason 'Bug' Fenter [TeamSybase] wrote: >> And here's an implementation that I threw together recently. I'll have >> to review Mr. Ogrinz's version to see how I can improve mine. >> >> Philip Salgannik wrote: >>> Here is an old implementation by Michael Ogrinz >>> >>> "JKorth" <nooospaaam_jk@epos-gmbh.de> wrote in message >>> news:47ea1b84$1@forums-1-dub... >>>> One thing I miss in PowerBuilder development is something like a hash >>>> array. >>>> >>>> Are there any good* implementations/solutions out for PB? >>>> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets) >>>> >>>> *good means for me: >>>> - no special runtime requirements like additional OLE components or >>>> special Windows components (like the .NET framework) >>>> - it shouldn't have much overhead >>>> >>>> >>>> Is there a PBNI implementation? >>> >>> >> > > -------------------------------------------------------------------------------- > ��$PBExportHeader$n_cst_hash_table.sru > $PBExportComments$ecs.pbl - NEW > forward > global type n_cst_hash_table from nonvisualobject > end type > type n_cst_hash_list from nonvisualobject within n_cst_hash_table > end type > end forward > > global type n_cst_hash_table from oleobject > event ue_documentation ( ) > n_cst_hash_list n_cst_hash_list > end type > global n_cst_hash_table n_cst_hash_table > > type variables > private: > n_cst_hash_list in_buckets[], in_empty > > unsignedlong il_split_ptr, il_max_split=1, il_key_count > end variables > > forward prototypes > private subroutine of_throw(string as_error) > private function long of_hash (string as_string) > private subroutine of_split_bucket () > private subroutine of_merge_bucket () > public subroutine of_remove (string as_key) throws exception > private function long of_bucket_offset (long al_max_split, long > al_split_ptr, unsignedlong al_hash_val) > public subroutine of_add (string as_name, any aa_value, boolean > ab_fail_exists) throws exception > public function boolean of_get (string as_key, ref any aa_ret) throws > exception > public subroutine of_clean_up () > end prototypes > > event ue_documentation();// ported this hash implementation to PB from an > example found on the net > > // an element is found in the table by using mod(hash, n) where n is a > power of 2 > // as the table expands n will double > // to reduce the work of expanding the table, one hash bucket will be > split at a time > // and both hash table sizes will coexist. > > // for example: > // [0 1 2 3] 4 5] > // buckets 6 and 7 don't yet exist > // the values can currently be found in buckets 2 and 3 using mod(,4) > instead of mod(,8) > // if we add another element, the bucket at 2 will be split into > mod(hash,8)=2 and mod(hash,8)=6 > // if an element was removed, the 2 buckets 2 and 6 would be recombined > again. > end event > > private subroutine of_throw(string as_error) throws exception;exception e > e=create exception > e.setmessage(as_error) > throw e > end subroutine > > private function long of_hash (string as_string); > character lc_values[] > long ll_i > unsignedlong ll_ret > > lc_values=as_string > for ll_i = 1 to len(as_string) > ll_ret+=asc(lc_values[ll_i])+485318 > ll_ret*=2654435761 > next > > return ll_ret > end function > > private subroutine of_split_bucket ();long ll_old_place, ll_new_place, > ll_i > n_cst_hash_list ln_old_chain, ln_new_chain, ln_cur_ptr, ln_next_ptr > > ll_old_place=il_split_ptr > ll_new_place=ll_old_place+il_max_split > > if ll_old_place+1 >= il_max_split then > if il_key_count < 2 then return > > il_max_split += il_max_split > il_split_ptr=0 > else > il_split_ptr=ll_old_place+1 > end if > > ln_cur_ptr=in_buckets[ll_old_place +1] > > do while isvalid(ln_cur_ptr) > ln_next_ptr=ln_cur_ptr.in_next > > if of_bucket_offset(il_max_split, il_split_ptr, > ln_cur_ptr.il_hash)=ll_old_place then > ln_cur_ptr.in_next=ln_old_chain > ln_old_chain=ln_cur_ptr > else > ln_cur_ptr.in_next=ln_new_chain > ln_new_chain=ln_cur_ptr > end if > > ln_cur_ptr=ln_next_ptr > loop > > if isvalid(ln_old_chain) then > in_buckets[ll_old_place +1]=ln_old_chain.of_reverse() > else > in_buckets[ll_old_place +1]=in_empty > end if > > if isvalid(ln_new_chain) then > in_buckets[ll_new_place +1]=ln_new_chain.of_reverse() > else > in_buckets[ll_new_place +1]=in_empty > end if > > end subroutine > > private subroutine of_merge_bucket ();long ll_new_place, ll_old_place > boolean lb_use_old_chain > n_cst_hash_list ln_old_chain, ln_new_chain, ln_merge_list, ln_tmp > > if il_split_ptr=0 then > if il_key_count<1 then return > il_max_split = il_max_split / 2 > il_split_ptr = il_max_split -1 > else > il_split_ptr -- > end if > > ll_new_place=il_split_ptr > ll_old_place=ll_new_place + il_max_split > > ln_old_chain=in_buckets[ll_old_place +1] > ln_new_chain=in_buckets[ll_new_place +1] > > do while isvalid(ln_old_chain) or isvalid(ln_new_chain) > if not isvalid(ln_old_chain) then > lb_use_old_chain=false > elseif not isvalid(ln_new_chain) then > lb_use_old_chain=true > else > lb_use_old_chain = ln_old_chain.is_name < ln_new_chain.is_name > end if > > if lb_use_old_chain then > ln_tmp=ln_old_chain.in_next > ln_old_chain.in_next=ln_merge_list > ln_merge_list=ln_old_chain > ln_old_chain=ln_tmp > else > ln_tmp=ln_new_chain.in_next > ln_new_chain.in_next=ln_merge_list > ln_merge_list=ln_new_chain > ln_new_chain=ln_tmp > end if > > loop > > if isvalid(ln_merge_list) then > in_buckets[ll_new_place +1]=ln_merge_list.of_reverse() > else > in_buckets[ll_new_place +1]=in_empty > end if > > in_buckets[ll_old_place +1]=in_empty > > end subroutine > > public subroutine of_remove (string as_key) throws exception;long ll_hash, > ll_index > n_cst_hash_list ln_ptr, ln_last > > if il_key_count=0 then > of_throw('Key not found') > end if > > as_key=lower(as_key) > > ll_hash=of_hash(as_key) > ll_index=of_bucket_offset(il_max_split, il_split_ptr, ll_hash) > > ln_ptr=in_buckets[ll_index+1] > > do while isvalid(ln_ptr) > if ln_ptr.is_name=as_key then > if isvalid(ln_last) then > ln_last.in_next=ln_ptr.in_next > else > in_buckets[ll_index+1]=ln_ptr.in_next > end if > destroy ln_ptr > il_key_count -- > of_merge_bucket() > return > end if > > ln_last=ln_ptr > ln_ptr=ln_ptr.in_next > loop > > of_throw('Key not found') > end subroutine > > private function long of_bucket_offset (long al_max_split, long > al_split_ptr, unsignedlong al_hash_val);if > mod(al_hash_val,al_max_split)<al_split_ptr then > return mod(al_hash_val,al_max_split + al_max_split) > else > return mod(al_hash_val,al_max_split) > end if > > end function > > public subroutine of_add (string as_name, any aa_value, boolean > ab_fail_exists) throws exception;long ll_hash, ll_index > n_cst_hash_list ln_ptr, ln_last, ln_new > > as_name=lower(as_name) > > ll_hash=of_hash(as_name) > ll_index=of_bucket_offset(il_max_split, il_split_ptr, ll_hash) > > if il_key_count>0 then > ln_ptr=in_buckets[ll_index+1] > > do while true > if not isvalid(ln_ptr) then exit > > if ln_ptr.il_hash=ll_hash then > if ln_ptr.is_name=as_name then > if ab_fail_exists then > // only fail if they are different types or values > if classname(ln_ptr.ia_value)<>classname(aa_value) then > of_throw('A value already exists for '+as_name) > end if > if ln_ptr.ia_value<>aa_value then > of_throw('A value already exists for '+as_name) > end if > else > // replace the existing value > ln_ptr.ia_value=aa_value > end if > return > end if > end if > > if as_name < ln_ptr.is_name then exit > > ln_last=ln_ptr > ln_ptr=ln_ptr.in_next > loop > end if > > ln_new=create n_cst_hash_list > ln_new.is_name=as_name > ln_new.ia_value=aa_value > ln_new.il_hash=ll_hash > > if isvalid(ln_last) then > ln_last.in_next=ln_new > else > in_buckets[ll_index+1]=ln_new > end if > > ln_new.in_next=ln_ptr > > il_key_count++ > if il_key_count> upperbound(in_buckets) then > in_buckets[il_key_count]=in_empty > end if > > of_split_bucket() > end subroutine > > public function boolean of_get (string as_key, ref any aa_ret) throws > exception;long ll_hash > long ll_index=-1 > n_cst_hash_list ln_list > > as_key=lower(as_key) > ll_hash=of_hash(as_key) > > ll_index=of_bucket_offset(il_max_split, il_split_ptr, ll_hash) > > if ll_index+1 < 1 or ll_index +1 > upperbound(in_buckets) then > return false > end if > > ln_list=in_buckets[ll_index+1] > > do while isvalid(ln_list) > if ln_list.il_hash=ll_hash then > if ln_list.is_name=as_key then > aa_ret=ln_list.ia_value > return true > end if > end if > ln_list=ln_list.in_next > loop > > return false > > end function > > public subroutine of_clean_up ();long ll_i > n_cst_hash_list ln_item, ln_next, ln_empty[] > > for ll_i = lowerbound(in_buckets) to upperbound(in_buckets) > ln_item=in_buckets[ll_i] > do while isvalid(ln_item) > ln_next=ln_item.in_next > destroy ln_item > ln_item=ln_next > loop > next > > in_buckets=ln_empty > > il_split_ptr=0 > il_max_split=1 > il_key_count=0 > end subroutine > > on n_cst_hash_table.create > call super::create > this.n_cst_hash_list=create n_cst_hash_list > TriggerEvent( this, "constructor" ) > end on > > on n_cst_hash_table.destroy > TriggerEvent( this, "destructor" ) > call super::destroy > destroy(this.n_cst_hash_list) > end on > > event destructor;if isvalid(this) then of_clean_up() > > > end event > > type n_cst_hash_list from nonvisualobject within n_cst_hash_table > descriptor "pb_nvo" = "true" > end type > > type variables > long il_hash > string is_name > any ia_value > n_cst_hash_list in_next > end variables > > forward prototypes > public function n_cst_hash_list of_reverse () > end prototypes > > public function n_cst_hash_list of_reverse ();n_cst_hash_list ln_ptr, > ln_last, ln_next > > ln_ptr=this > do while isvalid(ln_ptr) > ln_next=ln_ptr.in_next > > ln_ptr.in_next=ln_last > ln_last=ln_ptr > > ln_ptr=ln_next > loop > > return ln_last > end function > > on n_cst_hash_list.create > call super::create > TriggerEvent( this, "constructor" ) > end on > > on n_cst_hash_list.destroy > TriggerEvent( this, "destructor" ) > call super::destroy > end on > >
![]() |
0 |
![]() |
And mine was just an exercise. (It should be enhanced to use datastores on scaler data types, for instance.) There's been a couple of times when I *thought* I needed this, but like Philip, I realized that it wasn't necessary. I know you're looking for a generic solution, but let's take a look at the specifics that you're working with. Are all of your objects of the same class? If so, can you serialize them into a datastore? From my experience, the datawindow engine is the fastest component within PowerScript. Check out the help files under: DataWindow Reference Accessing Data in Code Techniques for accessing data About DataWindow data expressions Getting and storing the data from a DataWindow data expression Philip Salgannik wrote: > I personally never used any of these implementations - there wasn't even > once a need for it in the last 14 years :-)))) > > "Jeremy Lakeman" <jeremy.lakeman@gmail.com> wrote in message > news:47eb833b@forums-1-dub... >> An array of names and an array of objects.... >> Can't you guys do any better than that? >> >> The slowest part of this object is the hash function. Replace that with >> an external dll call of some kind and it will be fast enough to store a >> few thousand objects without being a bottleneck. >> >> I have a dll somewhere that does MD5 hashes that I use myself, but the >> code isn't very portable. >> >> Jason 'Bug' Fenter [TeamSybase] wrote: >>> And here's an implementation that I threw together recently. I'll have >>> to review Mr. Ogrinz's version to see how I can improve mine. >>> >>> Philip Salgannik wrote: >>>> Here is an old implementation by Michael Ogrinz >>>> >>>> "JKorth" <nooospaaam_jk@epos-gmbh.de> wrote in message >>>> news:47ea1b84$1@forums-1-dub... >>>>> One thing I miss in PowerBuilder development is something like a hash >>>>> array. >>>>> >>>>> Are there any good* implementations/solutions out for PB? >>>>> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets) >>>>> >>>>> *good means for me: >>>>> - no special runtime requirements like additional OLE components or >>>>> special Windows components (like the .NET framework) >>>>> - it shouldn't have much overhead >>>>> >>>>> >>>>> Is there a PBNI implementation? >>>> >> > > > -------------------------------------------------------------------------------- > > >> ��$PBExportHeader$n_cst_hash_table.sru >> $PBExportComments$ecs.pbl - NEW >> forward >> global type n_cst_hash_table from nonvisualobject >> end type >> type n_cst_hash_list from nonvisualobject within n_cst_hash_table >> end type >> end forward >> >> global type n_cst_hash_table from oleobject >> event ue_documentation ( ) >> n_cst_hash_list n_cst_hash_list >> end type >> global n_cst_hash_table n_cst_hash_table >> >> type variables >> private: >> n_cst_hash_list in_buckets[], in_empty >> >> unsignedlong il_split_ptr, il_max_split=1, il_key_count >> end variables >> >> forward prototypes >> private subroutine of_throw(string as_error) >> private function long of_hash (string as_string) >> private subroutine of_split_bucket () >> private subroutine of_merge_bucket () >> public subroutine of_remove (string as_key) throws exception >> private function long of_bucket_offset (long al_max_split, long >> al_split_ptr, unsignedlong al_hash_val) >> public subroutine of_add (string as_name, any aa_value, boolean >> ab_fail_exists) throws exception >> public function boolean of_get (string as_key, ref any aa_ret) throws >> exception >> public subroutine of_clean_up () >> end prototypes >> >> event ue_documentation();// ported this hash implementation to PB from an >> example found on the net >> >> // an element is found in the table by using mod(hash, n) where n is a >> power of 2 >> // as the table expands n will double >> // to reduce the work of expanding the table, one hash bucket will be >> split at a time >> // and both hash table sizes will coexist. >> >> // for example: >> // [0 1 2 3] 4 5] >> // buckets 6 and 7 don't yet exist >> // the values can currently be found in buckets 2 and 3 using mod(,4) >> instead of mod(,8) >> // if we add another element, the bucket at 2 will be split into >> mod(hash,8)=2 and mod(hash,8)=6 >> // if an element was removed, the 2 buckets 2 and 6 would be recombined >> again. >> end event >> >> private subroutine of_throw(string as_error) throws exception;exception e >> e=create exception >> e.setmessage(as_error) >> throw e >> end subroutine >> >> private function long of_hash (string as_string); >> character lc_values[] >> long ll_i >> unsignedlong ll_ret >> >> lc_values=as_string >> for ll_i = 1 to len(as_string) >> ll_ret+=asc(lc_values[ll_i])+485318 >> ll_ret*=2654435761 >> next >> >> return ll_ret >> end function >> >> private subroutine of_split_bucket ();long ll_old_place, ll_new_place, >> ll_i >> n_cst_hash_list ln_old_chain, ln_new_chain, ln_cur_ptr, ln_next_ptr >> >> ll_old_place=il_split_ptr >> ll_new_place=ll_old_place+il_max_split >> >> if ll_old_place+1 >= il_max_split then >> if il_key_count < 2 then return >> >> il_max_split += il_max_split >> il_split_ptr=0 >> else >> il_split_ptr=ll_old_place+1 >> end if >> >> ln_cur_ptr=in_buckets[ll_old_place +1] >> >> do while isvalid(ln_cur_ptr) >> ln_next_ptr=ln_cur_ptr.in_next >> >> if of_bucket_offset(il_max_split, il_split_ptr, >> ln_cur_ptr.il_hash)=ll_old_place then >> ln_cur_ptr.in_next=ln_old_chain >> ln_old_chain=ln_cur_ptr >> else >> ln_cur_ptr.in_next=ln_new_chain >> ln_new_chain=ln_cur_ptr >> end if >> >> ln_cur_ptr=ln_next_ptr >> loop >> >> if isvalid(ln_old_chain) then >> in_buckets[ll_old_place +1]=ln_old_chain.of_reverse() >> else >> in_buckets[ll_old_place +1]=in_empty >> end if >> >> if isvalid(ln_new_chain) then >> in_buckets[ll_new_place +1]=ln_new_chain.of_reverse() >> else >> in_buckets[ll_new_place +1]=in_empty >> end if >> >> end subroutine >> >> private subroutine of_merge_bucket ();long ll_new_place, ll_old_place >> boolean lb_use_old_chain >> n_cst_hash_list ln_old_chain, ln_new_chain, ln_merge_list, ln_tmp >> >> if il_split_ptr=0 then >> if il_key_count<1 then return >> il_max_split = il_max_split / 2 >> il_split_ptr = il_max_split -1 >> else >> il_split_ptr -- >> end if >> >> ll_new_place=il_split_ptr >> ll_old_place=ll_new_place + il_max_split >> >> ln_old_chain=in_buckets[ll_old_place +1] >> ln_new_chain=in_buckets[ll_new_place +1] >> >> do while isvalid(ln_old_chain) or isvalid(ln_new_chain) >> if not isvalid(ln_old_chain) then >> lb_use_old_chain=false >> elseif not isvalid(ln_new_chain) then >> lb_use_old_chain=true >> else >> lb_use_old_chain = ln_old_chain.is_name < ln_new_chain.is_name >> end if >> >> if lb_use_old_chain then >> ln_tmp=ln_old_chain.in_next >> ln_old_chain.in_next=ln_merge_list >> ln_merge_list=ln_old_chain >> ln_old_chain=ln_tmp >> else >> ln_tmp=ln_new_chain.in_next >> ln_new_chain.in_next=ln_merge_list >> ln_merge_list=ln_new_chain >> ln_new_chain=ln_tmp >> end if >> >> loop >> >> if isvalid(ln_merge_list) then >> in_buckets[ll_new_place +1]=ln_merge_list.of_reverse() >> else >> in_buckets[ll_new_place +1]=in_empty >> end if >> >> in_buckets[ll_old_place +1]=in_empty >> >> end subroutine >> >> public subroutine of_remove (string as_key) throws exception;long ll_hash, >> ll_index >> n_cst_hash_list ln_ptr, ln_last >> >> if il_key_count=0 then >> of_throw('Key not found') >> end if >> >> as_key=lower(as_key) >> >> ll_hash=of_hash(as_key) >> ll_index=of_bucket_offset(il_max_split, il_split_ptr, ll_hash) >> >> ln_ptr=in_buckets[ll_index+1] >> >> do while isvalid(ln_ptr) >> if ln_ptr.is_name=as_key then >> if isvalid(ln_last) then >> ln_last.in_next=ln_ptr.in_next >> else >> in_buckets[ll_index+1]=ln_ptr.in_next >> end if >> destroy ln_ptr >> il_key_count -- >> of_merge_bucket() >> return >> end if >> >> ln_last=ln_ptr >> ln_ptr=ln_ptr.in_next >> loop >> >> of_throw('Key not found') >> end subroutine >> >> private function long of_bucket_offset (long al_max_split, long >> al_split_ptr, unsignedlong al_hash_val);if >> mod(al_hash_val,al_max_split)<al_split_ptr then >> return mod(al_hash_val,al_max_split + al_max_split) >> else >> return mod(al_hash_val,al_max_split) >> end if >> >> end function >> >> public subroutine of_add (string as_name, any aa_value, boolean >> ab_fail_exists) throws exception;long ll_hash, ll_index >> n_cst_hash_list ln_ptr, ln_last, ln_new >> >> as_name=lower(as_name) >> >> ll_hash=of_hash(as_name) >> ll_index=of_bucket_offset(il_max_split, il_split_ptr, ll_hash) >> >> if il_key_count>0 then >> ln_ptr=in_buckets[ll_index+1] >> >> do while true >> if not isvalid(ln_ptr) then exit >> >> if ln_ptr.il_hash=ll_hash then >> if ln_ptr.is_name=as_name then >> if ab_fail_exists then >> // only fail if they are different types or values >> if classname(ln_ptr.ia_value)<>classname(aa_value) then >> of_throw('A value already exists for '+as_name) >> end if >> if ln_ptr.ia_value<>aa_value then >> of_throw('A value already exists for '+as_name) >> end if >> else >> // replace the existing value >> ln_ptr.ia_value=aa_value >> end if >> return >> end if >> end if >> >> if as_name < ln_ptr.is_name then exit >> >> ln_last=ln_ptr >> ln_ptr=ln_ptr.in_next >> loop >> end if >> >> ln_new=create n_cst_hash_list >> ln_new.is_name=as_name >> ln_new.ia_value=aa_value >> ln_new.il_hash=ll_hash >> >> if isvalid(ln_last) then >> ln_last.in_next=ln_new >> else >> in_buckets[ll_index+1]=ln_new >> end if >> >> ln_new.in_next=ln_ptr >> >> il_key_count++ >> if il_key_count> upperbound(in_buckets) then >> in_buckets[il_key_count]=in_empty >> end if >> >> of_split_bucket() >> end subroutine >> >> public function boolean of_get (string as_key, ref any aa_ret) throws >> exception;long ll_hash >> long ll_index=-1 >> n_cst_hash_list ln_list >> >> as_key=lower(as_key) >> ll_hash=of_hash(as_key) >> >> ll_index=of_bucket_offset(il_max_split, il_split_ptr, ll_hash) >> >> if ll_index+1 < 1 or ll_index +1 > upperbound(in_buckets) then >> return false >> end if >> >> ln_list=in_buckets[ll_index+1] >> >> do while isvalid(ln_list) >> if ln_list.il_hash=ll_hash then >> if ln_list.is_name=as_key then >> aa_ret=ln_list.ia_value >> return true >> end if >> end if >> ln_list=ln_list.in_next >> loop >> >> return false >> >> end function >> >> public subroutine of_clean_up ();long ll_i >> n_cst_hash_list ln_item, ln_next, ln_empty[] >> >> for ll_i = lowerbound(in_buckets) to upperbound(in_buckets) >> ln_item=in_buckets[ll_i] >> do while isvalid(ln_item) >> ln_next=ln_item.in_next >> destroy ln_item >> ln_item=ln_next >> loop >> next >> >> in_buckets=ln_empty >> >> il_split_ptr=0 >> il_max_split=1 >> il_key_count=0 >> end subroutine >> >> on n_cst_hash_table.create >> call super::create >> this.n_cst_hash_list=create n_cst_hash_list >> TriggerEvent( this, "constructor" ) >> end on >> >> on n_cst_hash_table.destroy >> TriggerEvent( this, "destructor" ) >> call super::destroy >> destroy(this.n_cst_hash_list) >> end on >> >> event destructor;if isvalid(this) then of_clean_up() >> >> >> end event >> >> type n_cst_hash_list from nonvisualobject within n_cst_hash_table >> descriptor "pb_nvo" = "true" >> end type >> >> type variables >> long il_hash >> string is_name >> any ia_value >> n_cst_hash_list in_next >> end variables >> >> forward prototypes >> public function n_cst_hash_list of_reverse () >> end prototypes >> >> public function n_cst_hash_list of_reverse ();n_cst_hash_list ln_ptr, >> ln_last, ln_next >> >> ln_ptr=this >> do while isvalid(ln_ptr) >> ln_next=ln_ptr.in_next >> >> ln_ptr.in_next=ln_last >> ln_last=ln_ptr >> >> ln_ptr=ln_next >> loop >> >> return ln_last >> end function >> >> on n_cst_hash_list.create >> call super::create >> TriggerEvent( this, "constructor" ) >> end on >> >> on n_cst_hash_list.destroy >> TriggerEvent( this, "destructor" ) >> call super::destroy >> end on >> >> >
![]() |
0 |
![]() |
Hmmmmmmm - maybe something to add to PocketBuilder... Ideally I'd approach this as an object - maybe I'll copy some ideas from Java in my copious spare time... (makes you wish we had generics - 'eh?) Regards, Reed Shilts <Standard-Disclaimers-Apply/> On 26 Mar 2008 05:01:33 -0800, JKorth <nooospaaam_jk@epos-gmbh.de> wrote: >Reed Shilts [Sybase] schrieb: >> Isn't this what a database is good at ? >Hm - I use the database only for permanent storage. >> >> Or are you looking for something lighter weight (or for only a few >> entries...) >Yes - lightweight but not limited >(I think of something like the hash arrays in PHP and Perl which are THE >data structure for all uses - highly optimized like nothing else)
![]() |
0 |
![]() |
Reed, don't forget queues, stacks, and linked lists. (Yes, I've created those and they're dead-simple, but if you're going to be adding stuff...) Reed Shilts [Sybase] wrote: > Hmmmmmmm - maybe something to add to PocketBuilder... > > Ideally I'd approach this as an object - maybe I'll copy some ideas > from Java in my copious spare time... > (makes you wish we had generics - 'eh?) > > Regards, > Reed Shilts > <Standard-Disclaimers-Apply/> > > On 26 Mar 2008 05:01:33 -0800, JKorth <nooospaaam_jk@epos-gmbh.de> > wrote: > >> Reed Shilts [Sybase] schrieb: >>> Isn't this what a database is good at ? >> Hm - I use the database only for permanent storage. >>> Or are you looking for something lighter weight (or for only a few >>> entries...) >> Yes - lightweight but not limited >> (I think of something like the hash arrays in PHP and Perl which are THE >> data structure for all uses - highly optimized like nothing else) >
![]() |
0 |
![]() |
IIRC, at one point it was going to be part of Next Gen PowerScript or whatever they were calling it. One can only hope... Just dreaming, Terry [TeamSybase] and Sequel the techno-kitten On 26 Mar 2008 06:08:35 -0800, "Dave Fish [TeamSybase]" <dfish@[N0Spam]sybase.com> wrote: >I don't see this type of functionality being added to native >PowerBuilder PowerScript. You can do it in a .NET target and >PowerBuilder 12 will offer language enhancements for WPF Targets. > >Regards, >Dave Fish >Sybase > >PowerBuilder Blog: >http://powerbuilderevangelist.blogspot.com/ > >On 26 Mar 2008 05:59:56 -0800, "Terry Voth [TeamSybase]" ><sequel@techno-kitten.com> wrote: > >>A DataWindow approach is OK for scalar values, but won't help for any >>complex data types, like window handles or NVOs. >> >>We need something native that performs better than the PowerScript >>implementations. <hint, hint> >> >>Just my two cents, >> >>Terry [TeamSybase] and Sequel the techno-kitten >> >>Dave Fish [TeamSybase] wrote: >>> I agree. An external DataWindow and a datastore should provide this >>> functionality. >>> >>> Regards, >>> Dave Fish >>> Sybase >>> >>> PowerBuilder Blog: >>> http://powerbuilderevangelist.blogspot.com/ >>> >>> On 26 Mar 2008 03:39:11 -0800, fisher >>> <fisher_NO@SPAM_wckp.lodz.pl_PLEASE> wrote: >>> >>>> Hi JKorth, >>>> >>>> it should not be that hard to implement using datastore. >>>> Have you checked pfc if it contains what you need ? >>>> >>>> Regards >>>> >>>> JKorth pisze: >>>>> One thing I miss in PowerBuilder development is something like a hash >>>>> array. >>>>> >>>>> Are there any good* implementations/solutions out for PB? >>>>> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets) >>>>> >>>>> *good means for me: >>>>> - no special runtime requirements like additional OLE components or >>>>> special Windows components (like the .NET framework) >>>>> - it shouldn't have much overhead >>>>> >>>>> >>>>> Is there a PBNI implementation? ********************************* Build your vocabulary while feeding the hungry http://www.freerice.com ********************************* Newsgroup User Manual ===================== TeamSybase <> Sybase employee Forums = Peer-to-peer Forums <> Communication with Sybase IsNull (AnswerTo (Posting)) can return TRUE Forums.Moderated = TRUE, so behave or be deleted ********************************* Sequel's Sandbox: http://www.techno-kitten.com Home of PBL Peeper, a free PowerBuilder Developer's Toolkit. Version 4.0.3 now available at the Sandbox PB Futures updated Feb 22/2008 See the PB Troubleshooting & Migration Guides at the Sandbox ^ ^ o o =*=
![]() |
0 |
![]() |
The MS Crypto package does hashes. http://www.topwizprogramming.com/freecode_crypto.html "Jeremy Lakeman" <jeremy.lakeman@gmail.com> wrote in message news:47eb833b@forums-1-dub... > An array of names and an array of objects.... > Can't you guys do any better than that? > > The slowest part of this object is the hash function. Replace that with > an external dll call of some kind and it will be fast enough to store a > few thousand objects without being a bottleneck. > > I have a dll somewhere that does MD5 hashes that I use myself, but the > code isn't very portable. > > Jason 'Bug' Fenter [TeamSybase] wrote: >> And here's an implementation that I threw together recently. I'll have >> to review Mr. Ogrinz's version to see how I can improve mine. >> >> Philip Salgannik wrote: >>> Here is an old implementation by Michael Ogrinz >>> >>> "JKorth" <nooospaaam_jk@epos-gmbh.de> wrote in message >>> news:47ea1b84$1@forums-1-dub... >>>> One thing I miss in PowerBuilder development is something like a hash >>>> array. >>>> >>>> Are there any good* implementations/solutions out for PB? >>>> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets) >>>> >>>> *good means for me: >>>> - no special runtime requirements like additional OLE components or >>>> special Windows components (like the .NET framework) >>>> - it shouldn't have much overhead >>>> >>>> >>>> Is there a PBNI implementation? >>> >>> >> > > -------------------------------------------------------------------------------- > ��$PBExportHeader$n_cst_hash_table.sru > $PBExportComments$ecs.pbl - NEW > forward > global type n_cst_hash_table from nonvisualobject > end type > type n_cst_hash_list from nonvisualobject within n_cst_hash_table > end type > end forward > > global type n_cst_hash_table from oleobject > event ue_documentation ( ) > n_cst_hash_list n_cst_hash_list > end type > global n_cst_hash_table n_cst_hash_table > > type variables > private: > n_cst_hash_list in_buckets[], in_empty > > unsignedlong il_split_ptr, il_max_split=1, il_key_count > end variables > > forward prototypes > private subroutine of_throw(string as_error) > private function long of_hash (string as_string) > private subroutine of_split_bucket () > private subroutine of_merge_bucket () > public subroutine of_remove (string as_key) throws exception > private function long of_bucket_offset (long al_max_split, long > al_split_ptr, unsignedlong al_hash_val) > public subroutine of_add (string as_name, any aa_value, boolean > ab_fail_exists) throws exception > public function boolean of_get (string as_key, ref any aa_ret) throws > exception > public subroutine of_clean_up () > end prototypes > > event ue_documentation();// ported this hash implementation to PB from an > example found on the net > > // an element is found in the table by using mod(hash, n) where n is a > power of 2 > // as the table expands n will double > // to reduce the work of expanding the table, one hash bucket will be > split at a time > // and both hash table sizes will coexist. > > // for example: > // [0 1 2 3] 4 5] > // buckets 6 and 7 don't yet exist > // the values can currently be found in buckets 2 and 3 using mod(,4) > instead of mod(,8) > // if we add another element, the bucket at 2 will be split into > mod(hash,8)=2 and mod(hash,8)=6 > // if an element was removed, the 2 buckets 2 and 6 would be recombined > again. > end event > > private subroutine of_throw(string as_error) throws exception;exception e > e=create exception > e.setmessage(as_error) > throw e > end subroutine > > private function long of_hash (string as_string); > character lc_values[] > long ll_i > unsignedlong ll_ret > > lc_values=as_string > for ll_i = 1 to len(as_string) > ll_ret+=asc(lc_values[ll_i])+485318 > ll_ret*=2654435761 > next > > return ll_ret > end function > > private subroutine of_split_bucket ();long ll_old_place, ll_new_place, > ll_i > n_cst_hash_list ln_old_chain, ln_new_chain, ln_cur_ptr, ln_next_ptr > > ll_old_place=il_split_ptr > ll_new_place=ll_old_place+il_max_split > > if ll_old_place+1 >= il_max_split then > if il_key_count < 2 then return > > il_max_split += il_max_split > il_split_ptr=0 > else > il_split_ptr=ll_old_place+1 > end if > > ln_cur_ptr=in_buckets[ll_old_place +1] > > do while isvalid(ln_cur_ptr) > ln_next_ptr=ln_cur_ptr.in_next > > if of_bucket_offset(il_max_split, il_split_ptr, > ln_cur_ptr.il_hash)=ll_old_place then > ln_cur_ptr.in_next=ln_old_chain > ln_old_chain=ln_cur_ptr > else > ln_cur_ptr.in_next=ln_new_chain > ln_new_chain=ln_cur_ptr > end if > > ln_cur_ptr=ln_next_ptr > loop > > if isvalid(ln_old_chain) then > in_buckets[ll_old_place +1]=ln_old_chain.of_reverse() > else > in_buckets[ll_old_place +1]=in_empty > end if > > if isvalid(ln_new_chain) then > in_buckets[ll_new_place +1]=ln_new_chain.of_reverse() > else > in_buckets[ll_new_place +1]=in_empty > end if > > end subroutine > > private subroutine of_merge_bucket ();long ll_new_place, ll_old_place > boolean lb_use_old_chain > n_cst_hash_list ln_old_chain, ln_new_chain, ln_merge_list, ln_tmp > > if il_split_ptr=0 then > if il_key_count<1 then return > il_max_split = il_max_split / 2 > il_split_ptr = il_max_split -1 > else > il_split_ptr -- > end if > > ll_new_place=il_split_ptr > ll_old_place=ll_new_place + il_max_split > > ln_old_chain=in_buckets[ll_old_place +1] > ln_new_chain=in_buckets[ll_new_place +1] > > do while isvalid(ln_old_chain) or isvalid(ln_new_chain) > if not isvalid(ln_old_chain) then > lb_use_old_chain=false > elseif not isvalid(ln_new_chain) then > lb_use_old_chain=true > else > lb_use_old_chain = ln_old_chain.is_name < ln_new_chain.is_name > end if > > if lb_use_old_chain then > ln_tmp=ln_old_chain.in_next > ln_old_chain.in_next=ln_merge_list > ln_merge_list=ln_old_chain > ln_old_chain=ln_tmp > else > ln_tmp=ln_new_chain.in_next > ln_new_chain.in_next=ln_merge_list > ln_merge_list=ln_new_chain > ln_new_chain=ln_tmp > end if > > loop > > if isvalid(ln_merge_list) then > in_buckets[ll_new_place +1]=ln_merge_list.of_reverse() > else > in_buckets[ll_new_place +1]=in_empty > end if > > in_buckets[ll_old_place +1]=in_empty > > end subroutine > > public subroutine of_remove (string as_key) throws exception;long ll_hash, > ll_index > n_cst_hash_list ln_ptr, ln_last > > if il_key_count=0 then > of_throw('Key not found') > end if > > as_key=lower(as_key) > > ll_hash=of_hash(as_key) > ll_index=of_bucket_offset(il_max_split, il_split_ptr, ll_hash) > > ln_ptr=in_buckets[ll_index+1] > > do while isvalid(ln_ptr) > if ln_ptr.is_name=as_key then > if isvalid(ln_last) then > ln_last.in_next=ln_ptr.in_next > else > in_buckets[ll_index+1]=ln_ptr.in_next > end if > destroy ln_ptr > il_key_count -- > of_merge_bucket() > return > end if > > ln_last=ln_ptr > ln_ptr=ln_ptr.in_next > loop > > of_throw('Key not found') > end subroutine > > private function long of_bucket_offset (long al_max_split, long > al_split_ptr, unsignedlong al_hash_val);if > mod(al_hash_val,al_max_split)<al_split_ptr then > return mod(al_hash_val,al_max_split + al_max_split) > else > return mod(al_hash_val,al_max_split) > end if > > end function > > public subroutine of_add (string as_name, any aa_value, boolean > ab_fail_exists) throws exception;long ll_hash, ll_index > n_cst_hash_list ln_ptr, ln_last, ln_new > > as_name=lower(as_name) > > ll_hash=of_hash(as_name) > ll_index=of_bucket_offset(il_max_split, il_split_ptr, ll_hash) > > if il_key_count>0 then > ln_ptr=in_buckets[ll_index+1] > > do while true > if not isvalid(ln_ptr) then exit > > if ln_ptr.il_hash=ll_hash then > if ln_ptr.is_name=as_name then > if ab_fail_exists then > // only fail if they are different types or values > if classname(ln_ptr.ia_value)<>classname(aa_value) then > of_throw('A value already exists for '+as_name) > end if > if ln_ptr.ia_value<>aa_value then > of_throw('A value already exists for '+as_name) > end if > else > // replace the existing value > ln_ptr.ia_value=aa_value > end if > return > end if > end if > > if as_name < ln_ptr.is_name then exit > > ln_last=ln_ptr > ln_ptr=ln_ptr.in_next > loop > end if > > ln_new=create n_cst_hash_list > ln_new.is_name=as_name > ln_new.ia_value=aa_value > ln_new.il_hash=ll_hash > > if isvalid(ln_last) then > ln_last.in_next=ln_new > else > in_buckets[ll_index+1]=ln_new > end if > > ln_new.in_next=ln_ptr > > il_key_count++ > if il_key_count> upperbound(in_buckets) then > in_buckets[il_key_count]=in_empty > end if > > of_split_bucket() > end subroutine > > public function boolean of_get (string as_key, ref any aa_ret) throws > exception;long ll_hash > long ll_index=-1 > n_cst_hash_list ln_list > > as_key=lower(as_key) > ll_hash=of_hash(as_key) > > ll_index=of_bucket_offset(il_max_split, il_split_ptr, ll_hash) > > if ll_index+1 < 1 or ll_index +1 > upperbound(in_buckets) then > return false > end if > > ln_list=in_buckets[ll_index+1] > > do while isvalid(ln_list) > if ln_list.il_hash=ll_hash then > if ln_list.is_name=as_key then > aa_ret=ln_list.ia_value > return true > end if > end if > ln_list=ln_list.in_next > loop > > return false > > end function > > public subroutine of_clean_up ();long ll_i > n_cst_hash_list ln_item, ln_next, ln_empty[] > > for ll_i = lowerbound(in_buckets) to upperbound(in_buckets) > ln_item=in_buckets[ll_i] > do while isvalid(ln_item) > ln_next=ln_item.in_next > destroy ln_item > ln_item=ln_next > loop > next > > in_buckets=ln_empty > > il_split_ptr=0 > il_max_split=1 > il_key_count=0 > end subroutine > > on n_cst_hash_table.create > call super::create > this.n_cst_hash_list=create n_cst_hash_list > TriggerEvent( this, "constructor" ) > end on > > on n_cst_hash_table.destroy > TriggerEvent( this, "destructor" ) > call super::destroy > destroy(this.n_cst_hash_list) > end on > > event destructor;if isvalid(this) then of_clean_up() > > > end event > > type n_cst_hash_list from nonvisualobject within n_cst_hash_table > descriptor "pb_nvo" = "true" > end type > > type variables > long il_hash > string is_name > any ia_value > n_cst_hash_list in_next > end variables > > forward prototypes > public function n_cst_hash_list of_reverse () > end prototypes > > public function n_cst_hash_list of_reverse ();n_cst_hash_list ln_ptr, > ln_last, ln_next > > ln_ptr=this > do while isvalid(ln_ptr) > ln_next=ln_ptr.in_next > > ln_ptr.in_next=ln_last > ln_last=ln_ptr > > ln_ptr=ln_next > loop > > return ln_last > end function > > on n_cst_hash_list.create > call super::create > TriggerEvent( this, "constructor" ) > end on > > on n_cst_hash_list.destroy > TriggerEvent( this, "destructor" ) > call super::destroy > end on > >
![]() |
0 |
![]() |
Language enhancements going forward will be for .NET Targets. Since you can do this today using .NET Interop I don't think it is something that will be added to PowerScript itself, but I've been wrong before. Regards, Dave Fish Sybase PowerBuilder Blog: http://powerbuilderevangelist.blogspot.com/ On 27 Mar 2008 17:11:11 -0800, Terry Voth <sequel@techno-kitten.com> wrote: >IIRC, at one point it was going to be part of Next Gen PowerScript or >whatever they were calling it. One can only hope... > >Just dreaming, > >Terry [TeamSybase] and Sequel the techno-kitten > >On 26 Mar 2008 06:08:35 -0800, "Dave Fish [TeamSybase]" ><dfish@[N0Spam]sybase.com> wrote: > >>I don't see this type of functionality being added to native >>PowerBuilder PowerScript. You can do it in a .NET target and >>PowerBuilder 12 will offer language enhancements for WPF Targets. >> >>Regards, >>Dave Fish >>Sybase >> >>PowerBuilder Blog: >>http://powerbuilderevangelist.blogspot.com/ >> >>On 26 Mar 2008 05:59:56 -0800, "Terry Voth [TeamSybase]" >><sequel@techno-kitten.com> wrote: >> >>>A DataWindow approach is OK for scalar values, but won't help for any >>>complex data types, like window handles or NVOs. >>> >>>We need something native that performs better than the PowerScript >>>implementations. <hint, hint> >>> >>>Just my two cents, >>> >>>Terry [TeamSybase] and Sequel the techno-kitten >>> >>>Dave Fish [TeamSybase] wrote: >>>> I agree. An external DataWindow and a datastore should provide this >>>> functionality. >>>> >>>> Regards, >>>> Dave Fish >>>> Sybase >>>> >>>> PowerBuilder Blog: >>>> http://powerbuilderevangelist.blogspot.com/ >>>> >>>> On 26 Mar 2008 03:39:11 -0800, fisher >>>> <fisher_NO@SPAM_wckp.lodz.pl_PLEASE> wrote: >>>> >>>>> Hi JKorth, >>>>> >>>>> it should not be that hard to implement using datastore. >>>>> Have you checked pfc if it contains what you need ? >>>>> >>>>> Regards >>>>> >>>>> JKorth pisze: >>>>>> One thing I miss in PowerBuilder development is something like a hash >>>>>> array. >>>>>> >>>>>> Are there any good* implementations/solutions out for PB? >>>>>> (I use PB9/PB11 for "normal applications" - no JAVA/.NET/Web targets) >>>>>> >>>>>> *good means for me: >>>>>> - no special runtime requirements like additional OLE components or >>>>>> special Windows components (like the .NET framework) >>>>>> - it shouldn't have much overhead >>>>>> >>>>>> >>>>>> Is there a PBNI implementation? > >********************************* >Build your vocabulary while feeding the hungry >http://www.freerice.com >********************************* >Newsgroup User Manual >===================== >TeamSybase <> Sybase employee >Forums = Peer-to-peer >Forums <> Communication with Sybase >IsNull (AnswerTo (Posting)) can return TRUE >Forums.Moderated = TRUE, so behave or be deleted >********************************* > >Sequel's Sandbox: http://www.techno-kitten.com >Home of PBL Peeper, a free PowerBuilder Developer's Toolkit. >Version 4.0.3 now available at the Sandbox >PB Futures updated Feb 22/2008 >See the PB Troubleshooting & Migration Guides at the Sandbox >^ ^ >o o >=*=
![]() |
0 |
![]() |