Q _`IBM `ph Bx@1w^CPxx,<p rA:$Q$&BB~5050FQQQHz0?< NA\Nuxc8$ "D" "@"N"D"I"N" "D$ "Dx8Y+' Y,' DISK 166 - The RenaissanceY-' D-Bug have arrived. From the look of this disk I think you know by now that we know our stuff. This boot sector was coded by Cyrano Jones. The logo was also 'knocked up' by Cyrano. At long last a quality crew is back on-line! on-line!UE CLEARING MEMORY R :O` @!#%- 5`7=AC@oIKMOQ S@U`WY[]c@e`gm/sw{// o @ ` @ ` @ ` ǀ ɠ @ ` ׀ ٠  @` @`!Aa   !Aa!!#A%a')+-/1!3A5a79;=?A!CAEaGIKMOQ!SAUaWY[]_a!cAeagikmoq!sAuawy{}!Aa!Aa!Aa!Aa!Aaǁɡ!Aaׁ١!Aa!Aa " B b  !"!B!b!!!!!"!""#B"%b"'")"-/#1"#3B#5b#7#9#;#=#?$A"$CB$Eb$G$I$K$M$O%Q"%SB%Ub%W%Y%[%]%_&a"&cB&eb&g&i&k&m&o'q"'sB'ub'w'y'{'}'("(B(b((((()")B)b)))))*"*B*b****+B+b++++,",B,o,,ɢ,,,"-B-b-ׂ-٢--.".B.b.....B/b/////0#0C0c00 0 0 01#1C1c111112!#2#%c2'AO` @!#%- 5`7=AC@oIKMOQ S@U`WY[]c@e`gm/sw{// o @ ` @ ` @ ` ǀ ɠ @ ` ׀ ٠  @` @`!Aa   !Aa!!#A%a')+-/1!3A5a79;=?A!CAEaGIKMOQ!SAUaWY[]_a!cAeagikmoq!sAuawy{}!Aa!Aa!Aa!Aa!Aaǁɡ!Aaׁ١!Aa!Aa " B b  !"!B!b!!!!!"!""#B"%b"'")"-/#1"#3B#5b#7#9#;#=#?$A"$CB$Eb$G$I$K$M$O%Q"%SB%Ub%W%Y%[%]%_&a"&cB&eb&g&i&k&m&o'q"'sB'ub'w'y'{'}'("(B(b((((()")B)b)))))*"*B*b****+B+b++++,",B,o,,ɢ,,,"-B-b-ׂ-٢--.".B.b.....B/b/////0#0C0c00 0 0 01#1C1c111112!#2#%c2'AAUTO  c-'GEMDEMO  f-' HHA  -'GMYCALC  -'aNEWDOC  -'tPASCAL1  -'}UNITS  -'HSPC TTP !FWAGES M2 $u DESKTOP INF 8(ASSIGN1 PAS ݈p+)f,.  d-'.. 166 PRG ՘-'s`R*oHyX?< NA\AN"HaL+D +E+F -Є+@Ѕ+@ބޅ$GEG / G"KJg BѓBBJAg<fG``IA" A/r( QNu&WSfBSjBBBBBBBABNupH,OM"H SPv3f@JQf<* .$H# # # # Gp&Q/ aa EaaLNu@A g 8`fHEBE< GvxfTCTCQx KG##Q`Frp Ajg@QNu @QNu QAjNur2aJg.8D@gHg d~` ra@D` G30lNu `````` D-BUG SPv3/ fJMMk#ϩOh4t4?&NN\.ψ PBHz/9/}!}(QRU[pdLIAH@<^a ?@jFlb!N ؂w^!q##<l VIDq8SPIVAP+& s tBgHx/GNNOP/8a-^aZav2<4v!8x,.Fh r$:FQXX&(BB~5CWFQɁPkHzV< ANA\TEc82 @+D"I"N" "Dx 8( )SD-B#Gk)66L* +1i.GHSP(EEDAKSCAL0, -j s.&HIdTHEDP-dSPR(E-GGSTER/mQASAR-ICEM*-CYRANOJONES-PHFYx CPyE_\-hAEC괌`TBMn#94X<=Zq7cQDž!Uj6t`6T 4lt`+JX]E'8XJu"R!@~KǯMM8֯'9њ -uҌ~B|q;uq%jكk`*Q)Y+P)@V 8-L.h|@,J;޹=:~>BuE}+k@L/{H;с(KehR#Q?/u蚻Y3R -NufvLhLWîi]mqe-9(*Nu@-!  M  /t gUzaw GG߳^S#t:}YN8r\{.eQ>,r Ȃ  ~Gjd ^YTO KD(C6X;8 52/,z'`&#!AfArAB l%*6.1 %$8KEdAlt]  ڇe  . +Z)~ lr24a!M7"k69ek"rM0؂49 # E ڲά#g-Z*_L/ԂV+HK$4A{Ǽh=Czr܇ЅfJ41k R 3Dcu /Sƌ~L1ŌQ #*@ݯ!IX(K XÈ%b(&*(,*.,2426 "5(/ 7A2- CA<:UABCBAA<:7::4)72575525672777<@3IH@rL^w}ϷrWw@P`[[}GqBrstuAvwgWAG7'AqmcRnAgQ!fdDM w?c@u8هO_`PB W1`ST*6Yy9ѓ'ق6SA ̳@ÈbUM[E м: M'N9HBSdB d1uϲXf}:f'[%!?V[ $ D;[dA2#|!pbBG}9<_HpG@sQ^9>'̜|fp <` );NP eZMoky]k*cTߦhh.Nλ,p8,&g;xsdWO D  Sנ(H1E("#(%(#( #C((h*<ͤ9,^*—E@32Dӎh`=C:!Zޏzط޷^_~wfH,m_RE_=wK$B6.SBq4D~"{vH±98/~}E=b AU\0iy%J,YYYyoT,bf&E[fp]@W[o&dq)w PO<c“Q`FlqBn@Bxc˜ES.d`)8`~@Bǟ^!A'gLoaCڿޮ-*jzҀz*eAe:K"8>vV>@^:P} ט8!98 8qQ9x ,)n~C/Cgʎ8AP`RAR+6&-+-*T&uEVTdԵ֒F,FT8Pf >Q#""ѳ~DEMOWINDUNI ψp+?vGEMINTERUNI ψp+B RPN UNI ψp+E8SPv3Qz(:] ?2`5zs*?]A*v.CMrNA.ִW. PX4l$Dix~t$U#K *-7JAE i hCX*3j©+2E# 2&#. 2OV? &]~8WtMObKcxT^Z9o)5$U*f`n67`/X钉 #=KY d/`ğxrT .*▰^FZ.^0J4\2I%71V -KJ .)z-K{J7 M> \HV(zA1mbPBt>dw\Na+cu >Sq$ f e8%~)…^(7Q'߃Ku\ 'lޣr|>Aa8_ (SN(яi_'0BãhpRa?q~`8ւI+ >,YZDE$tvG8BFW G\I ~?P$@ΗfL`!5X*k9I*-@&i@XcӾ 6@q[AG<>&aTњK΍%|ހaA5őa+j#U6qz-HFOJ-5AMI2w/@ݙ 0A6'-qp ;q TƯiqFN5E@xj,QgL,PaU; Q]L#ZrL$W>F@ HHF0jpHz]T̄dc,=e F 8 6x3{q~ `(i "/X(LX NB=.h4Qxً`W{ }MJo0":i 'w&~5A (xl8`@#AK!JGn픵BtB [ ޒ=VR-Ȥ(>L*p + Sve$;9j HCA,2L0)jMΊdOݛ? Vv$Axx):R[٣BǓElA 5`uMrBQhGe LfGnZIc[h6afBo 8`_XI&kr^ (zHri{1O h"8f{P9#Fq P1a6d ]b5Ti%hPX`0 7k%i'e`3YcЖp$MsHeB Ǔ) P@g^L;9Am2bUaM! Iy7zƅT/L2 H'9 v"mS'],*mF1puI r%+ eoratsiyl,_(dcuAnRM0Sfm1Evhpw:CDk{2LTWFx=PgUOBNIY)H4[G].-bVX8$Q'9} Z67#!P{ eNlSPv3lToU1_9<=u4ed{+"'*S' ?K*Z Mmƻ8S:.Svv{vU #6$ Z0 CGIW }`@{_>pZ鐖>( dDz$B~DRg\\ar~kf8M#~UP?&p,j]S@$;).:_N"wJ8ա$*=ńްg!.!Ąz~0B7V' o!) FNPհa9P J)~#? t00:(!:հ~tt#*\<쬶8DP5" 6/Z2nE@ [.}O~f}=v#%#!!"mQd-jR Lj)7~Mi dwRP1&zhVۉT2%ڄ/ D _F d 0pq>J{.{ +yT|IOv, }3>!(]{`v@ꛖ(* TV7B Y熒Y5N ^NRDT7g5Z *`♚ h%VL2Ⱥ9O^ )BqY Q:J%;xB.J \(Op;>q<`HW?2BEz&[WByaBJ*OWWJ`_Ĭ#YPB'UHt,wJ@Bc%TW;G<@iR0<1TIR%= %=6A> @[ g2A ^ w M,U[kg@5Ebsb³ADR9I. X6iI$G;0ȢsD3&!$MV4k)O0{y=.u4T]MBneBJ-0R Z4DJ74żR$@>P;`& <VVHo< 4%qz_M=) ډ65,݅SܦVm1&eHS t`* eoairptsn_ydwDEc,lIxgmW1fv.(uR0hSHMA-)LPXY:bk2{F3NOTG4+9[BV65$C];=!} *z^8tʧaSE'QIG@>vQ'E1A$S`]ۉ#qap9gJamgiGEգ ؈(EA^('b[l>]=C/* bV0ptAd(V6Z}h'@0F1 &Hv=$ↃJUES2TL9|Q HWG=AاDVѐ8 @~(82E7K*4 1Ŋp&b a.Ă!,%qyNËd;9&"oT{H@T!dtn 鑻mҁfGf<X,غ2᠛ѪiHa褓$#`SxaTٞ4'96#F)&zP_ 0ba +$$M5شנӥwqz=7ԱnjG97*(0G) ?CƝ3BO{u?zE&!1!³ P*Q:CC, 1jl>/6HA+ h9 7G 9]8ή !(=6BP2ccjf`[(H8cx,ljbF!A1kaDE4[,C] jЌ L"`Iq mJy|(Pbq! A_z*| (]{yLLR8j& MxsU[i(u)~PvIŨZ)%:Ԁa CNg S7)&,XƘI ql.Q`Cye T\,z\GfЎfev/Y ,It'>$YV]2q!ayTnA$Y:;>?H+:( HY5>OWSqFYkkTɏ!z$=QpEt[٘9I%"ԼsN \jn$MLI{IÒ Į F+[;la{U 7m!P5;&kBaMRArP!/ aoreslitdEnpc(_hmuRTIgLNw.AbSf'O0kx,1PyDCvM)F[H]W-+!{UG=BX9:z2V^><|#KY; j$\q5}JP{Ǹ/B) ;Q SPv3[ @RSN&>haFA*AM{ pÁӴ=)Ċw8UB]r$Y7"k"<.@vjhDab5 j^ҞDJ%1ʡdZzXޡeV7 ).)26/Ibwjt-WD1,/ mv޸&_*xb5rDKI^}!c:v!9 G^֘爡fyj~^Wb xxz\PZʌz*lzF|C#wC`=vcqk67E8LJ_ /` 0}xAR.C]CE@pC;Q nH50ܔJ4Vs1OdfHN- -n%y F%VT 1>CSJN"`< L'qP!1?&sP!҄(5%/C"_>E\VH bBT%#~qP9*H"@ PR: .t555G $DB~ Ň!ub5LL9%Y.5F|Q!  a TN [@x/*1^!$[5$  Ù7`'&H)  T)Yt={ŢFH|SAVyRK abȲdQ ?r䊛8 ;D»#@0jor*JdY@xvo9NJ/>_tR֟ Ł Wkђȋ2ĉQG(  @w@Yi LrNbu1﮷d Xy{GF#Qx!l ֛1LŅ9T~Q >"M+$̨0M'u@n((^9A>SI1 JZ$ kYYAN -OTyyA lz&䘗RWq"wډԗ;2|tc)s+Y0AY% @⦑ ; MJ/X1Ke0Sqz=vCnq A$XcTh0b4b0w&XX\ R#(0H)1hU*d2 ,a8:rTB6E@ F|jHQ 5qyV,켆N -Yh㖈oaTmj첾'Dv^5jk5U-n#`Hh׬ 1+R%Tʚ;VCpNn $ S]HrN99G`3&I<-o =GRtܱ+`tplCnvcJj (q.2\-7/@z-:!(&yĜFjek l%Ce:<`~挚&Dk8VBT|3^6]H9FγA/A'N! -`do0"⅌ )ƝabB Vr1"iWk)b.H ʚVF =W\( ARNCxAti  We$2Lꌏ4/5L}pe)H'`Œ%Ȟ* ), j%%7,7)g|e4QCrHH meA2YNI0=ΠC "d43,ſ!`bs-<;\R5qAith (d2ٚx\#tU$S)Ldp ѾV}P _D#cllE@7w(AH7c!+EਲمB=޵-c9BK[B@¨BA|G%ō g3 -:p#$Fg@*\9f+A6,>fq$'$ƈQ1p4s7.2?.X|'D76~kYTuvK?d=D?v~:YG]u$9e!):fUz.Tm .[3 ]e=Vd\xg#IA.-f̕yyfXP3ZDI !+ַhZIlI2C= /^V *0 WVrpk:cx-ɒXj(T"i Ehb$]0^ L>$9 LTlC2LۜȎD$\7_Zǔ /%(đk;p`W#&3&uI\Fu4ҁA @TQӁӋ}-V)K<@ {/8F:CL JSPv3N gb"a 9)d =rŰm.j>7YI  j8 Acs!>@b+r@OFD'2p1 $nCLd*9@ʸ&!Regğf"߰A%@2K@pX/?C(4sB~EJbt9m J%{Lr cqqwJcab#6Q!V% Cqi&s="`+2h.͌#,HfW8xm.HĈ *kR,0. R1Y`|ּFHw0kP|f)VOI'As[0T"dC Hq)̈́MiQQ*f-C2ESҢq$)͚V{-}6랮4NV[Q64AvO&D ܕҰgji XokS8҆n1A$ #!I( ]_f_N ZN~ ϠE%D%9#u57A.hnf5Xc[hKv8O/ޚh}]]^x*3^,i0cQ !R"زHrJJyPU{."4! E(\ P KKUHz0 j=4}HmG#F-@t8Ou%,_9bi%5^*n.GZА{YÆٱD3VRPI4ĕZl6I*XU"Zoq["1bQ9֙p]!R"").!A:+.Y#]6"&8/*LV0򊂢Eϖn4`*NCՖ< 1ABuGxK!7;|#PYߝ"Pz} &7H Gb,3-zl_Kj! ^ $ eatsronildmb(c'fw,upk1ySE)HTLOgMI-RvNhDC_WA:".P0{=3Y2FVx4+ G9 BX@ {3-<SPv3 `ї^ Ziם"P@5  T8 vh:\Hx7 Kh4#!jbcv)Kޒl%E Q( 2/2P0e Rs N%+O# J{B٥ c,9/('7C`0']Wr;G;ŕ"蓏ALCDs]t[,  Vjy\B[hrŢݺ-m0F%cDH25? =b_[#/3N6N<(Mb&MO|Mؼ{yZ*#  d5~v >x%~> + =1E oOlQ XC̹p ;a#eStAI{ZX>rzdG: wNRy…H M@uT;@E@B5|M*7;PK9nT" M@_tms8QFI0 ۟ #-(!N;MKvW 8 H/j!PG~9e md]^*a|@Aǹ X f'p.i]Gr*UH HŒ@&M0 !{` (@;kY ƯF# 6F2:57B1N*K\T0H84RɧۭY^sP&8u.J1 ɺS8cilV*`\]AK6J M|30 1Gڀd`"$14 _޸!v&I9" 6.80JͰA C<],,M̜XXCH]J 1 b@V&$i8 pgĤ٢/1 \ p8hhh3" $1#]!i ~GL*"2F ?o Nlٹ o"&: ;{Q2BrCHBH`,݁:@8NXPLik-4R 1© Z%k2vK :"hn =4 >?s @A % esaotlirnmdcfp'hIguObRF(Ny_MSAYDvHTk{Ew-1:Bx.,[0LK]W)G"2P$ +!;9?V ^Xj|UC=7}#P{a3t PSPv3 4n 7!+/RPwBN HHemStuu'O#)-A&Ә޳MDbg XW8XVp21fjDIA!Xȟ(  R| Y` eFR4< _0%2}*k{Lr"AkJ٤C5%d IcS-220eXf6>U,)E,3ѡZ\( "CD)z1wτ])4l;݄plgnռ%DTC4o PٮF\t'E2eݨ+ #K xZRIsj& <7 Χc8SGp\) )BUkѠ W ^YD9;!//S0_2I`!1^(r V"`JbyK!|DxˆayCB,>E'`*zrJbD x0͂ t6@qႢ8(,TsvJg+ؾ#5Xxa f=FqEj- LV49%$>B(% earsolinmhtcfp'dg(I.uE"bCS1w-v0FOL:DARk,yN{TM_)#*xVP5>WH!$+4]G9[ B2\^/]E T H]*2jLAe| /NANOM!œ+umqz+gxB}8QR/IH*F9P{rW0 C#HSPv34! .ꅀ0 93Z ĬPۅG@gJ)f!@0 Qk S9]Ϧ@V2v)1g)U3+Vf(22`$LIF,7xZd4cԅ4U%5&-n$sU }KxxY֪,sN5y/҃&VBљز3d1 x\ `!} ?ɺI { c1L,M ,F7KK4}7~VRVϓj0BڀBa~% B6T0'.4Ŗ6( +,b5 P '^@(h161 ʤA]#dOqV#>FUD? (엩// ]kCd]R#aH9Nڒ0@c.OKE0=' !ǡʛ8-Dkf =# #s2>IS' e“ 5"X%3b^2+RZRa5A> #}5kCiUA (Gz z0  a 5slJ: /*F* ʷVy? Tz7\aHE0ɼVyQ$ V8MlF(y-ᦏ@RW*I2Xv’_Ve&tm|)9E=4+^vg8n5$J55(šh*^BL&@'>R5xWaX$wgvd W$z/Հq}!>ɀ1@V`,sR_(N0::4w*8)'M׶#6ޔ"{R(gpHD/* $pJzBnEc: 9# Q*341r_ LĈg y"|C7 0$Uʿ(f*K E # UE-G<]΍ Y Z R~~ͼU:2c4 N_-HMq(,!PMDd<yMS[$~,!mu)y pB44dq|]bYq"_0't4pjf/(sI"j 48@P?1vu !jCm]3kG9̞$e %56 {3K>d$&Ӑ?[@A!@Dg jFH^@ N~dL2Ad@efbDgpXbPikDkRD"i4@;5iLLѥzH? ǽ 1  NFcoYQpױ$! |g ̛S C 3j98Y~&i/ @LCp\94tCke"YEoͥ3J,$-d{)UIm`RRwoIE!-\Q_VˠDnHAV'-'lhAD5cVG1kYi_%l 0WG b@4I/TPUW;%QB ;m03"pP~>y?1 9ፎ5^T=W;%f攣fTWUe #'CUwS + M-WJbjBk=%fUTnFG/[G~2j@3*#E{'-+:zs[! 앚R ɒrϓܧDjjj)ǻ6(=qi I HM~7"?BRz4yS!X +Q@lwtVMZh[[mpcjƴNT!OnB#h>RbPC:% b6,G0,e{E,My w2rs [A>J؂%YQ$rVz&Ȇ,քx Tq!*;=p jJ O8<5 z9(qHА_CZ4<,*;X\^*@ȹJ) 3fB$e'\R_2Ym:/A@B^Ju薇g쫤|=Wewv6KuT1-u[[Zrx'UIS43A5 eaorsitlcnpd_fI(TuEOmb0wvSAR.Fkh1C'LgND]-M[W,B2)U5HGyXx4Y|9"P3*^z>Kj{+#VH{3>Х,$SPv3?+HffR "Bj܎Tr0 0H-`fKK93A%p832E:OX0PI0EYM2(&SVQs*YdbCHS>ɡf-lh7`]$:GJ V!AE$~,2>IY$H9a^xp:T DQW B,*=ju2 } ?1Ql: Եë5] #_H3lGR9jN 3Q,z<m>dVa e0 199`9O9O9O9O9O9Os090>l89p8 4Ddf" ,x30000 0(0 oeiRgd pP<We BҵA5bEJP/%}<ـy`7pr+(1^fh #LULr8 (X b&Ufu502  Xn鉪hԝ-h&T"AD`@}U^ 9$nPkUÆg4 |ӑ K0b E$ఉ4) tI(t lQIӱ F{):K&)haJ(;J?`:$鸼7!?d>ғ-Cqa C%\Z(SHQq7v4=]iHeܦV$t=+ \ȃu (BpT(DTXUB\M&xeTY4&Tfh 4>4%BbT 1 ugCOI:ԶAS7L(\-g?9 DMM:I8UuA*ae4SF)QJs/?&=yP>d&$+ @J8(lTTLg|L:b5؛R7N T@Qx(=y>f=!=. )lNhp:զIH2eD& $MnM:0Co*Ȧ8<0ȂԌL\ aҢ*|vAAABl*C *5 !JL*+@YV,˵r7v[ĦHSԆ5LjmwE[eS8&*i1̣lR  - erotanlsicupwdhm(ybfk2gHIOR,10SAW_D-E')FTxMNvLP{3Y:XC9GB.45+=7! V6$@8[UK]?}; *P{3 |z<BSPv3iH,g\>dɤ|V-!37#19  Y]'a5ؘY' ">d18!6Ԉ#jA"ee/2 ndhKм}"j3r?8iJa4/BuЉ8I>8I A SN)K=0LrU$=v܃Y!e*T9Lpj"_csH)AϞELU"By?:*dv1i:L̳9/fXXN?`b Ge>>@2gxqH [. qi_-{@. %>( H ͘4L,K I]^5@K9?&:G_H(!Å83z6'4,NQ)(.2gibJՊ7'VTP(@ ;cn8*)A3iFBpA#% Jl~$[9ߦ s3KZ `iG5VU)~20O]8χ@VV48{|**T.5MM<HGSj4<lؾ'T-^Ӧl8 ~GVA:Ӱ"lPKJPKnB,4\#s-LSL70DYnLL>U%D' @㻂<T]?qZeȳwl%T^( lo?.HT e@:F`dDZg['s1 5|{A~$dQbFe$NU:;b P `JE]ulXNC2h~Waw ʁ`W :&HGPIKҠ BoII.S` * ֱ c|!U}.aMb'vAqa$ QPdQZK9?=oh |lИ2" 7ɯC :詡I$!`jOHeQ aa; c:f>N_xbUBTN.$9]R֡ 7 @( esraiolptdcm_n0y(f'vuh1)2,kDw-AIPSgE5*R4xH+CO.b6T8{MW3jFXY G9:N VB[L]$K!;=}>P{32 !@SPv3,fT*C7g, %g^J&r((OZGgR?)!^YBWMڣMPJ<g@0LMuC4 Cpr"#VYv ( D"$#"l n91( 0!azHBb@b (("ʸ8$xBB erntlsa'i[]op1kmg:f(dh|0 ,C=_SWOBv >b.)xATUHE<;5#uw-cG3*@@ p`3=\ SPv3,OB tdÆb3v kN#z!uq.aDО F?D-c#T"UP,ue2oX 5P p(NJ :kDIFv }v`Icvq'S?r3 5jC4knU7"5mO!C왬, lh@PFNs@Ҙr)w=tdvKb۫0x-@W|@i6 Z <7iXZ_G4,ELdnb pȪ!H(t5~¨@ɒ 0D[K؋ F R;>(<#8b^f󀕞k\/SD(яEo0å!qFe2_gb(`jiz,e/-P{1pYv!9r #Sp('R>Dg=Q^޻)5x!d].;vzr#+PX"3$@(Ev׿. NQ{ [P*̖ˬ%MCI`0@0M-F )H@W$GU L@#*U&ZiaO ȇKӝ=fy(~mOe$'_F2 4/(y;?Hf;46ٿڦ}}?'PVeq{O+6TC>bXEQQ/.R#d NYtW=G q a/䉼A²pMX$SF]@A32, X!Y_[/ v̬tT? MH*%LzW.H j+DbU5p&H JG`Svaci~E1A+zC}X ag7 !J T|&I+f#,]쀣C"G\BY)-HT("lD,gJCM`vBE XIgj.%,q- Zy'P5"q KXVn[;H ҳ( 30}%R"x˯I EI\mzfLyb@ W$2/1C 4- : $5"kC<^Ti+]!uɜ/* \d4XjB:ꛢBZ8.[U0J*{LHLHq LȨN GL C6hff]  R&525c0>لWԠ'հTjjkM*! & i3Xz ZC!6"MU h-K5@D4+HY)FUA2a"ao15(de`UHdއtx,dMG2(?E{[-8R|nuk LtXP9\n%ŲܩN%:%sTY%$=y@) eraontsdil'E_IcfT(MubDSmh1v0p,AyNFw.gRLk{HCP-OU32x4!G)[]=W+Q9 :jVBX\$?K#q;5Y}P{3{K2CF|HٔfSPv3xYA1g 7 ԍG,ͽ.E3 (Hn9d[< YR2 8fAyeY ,e )%sNP:I& @dh=xPPYO_);&3 ˅HÐ mbLBD:1t<0 A H.aKe@],ag0vGX-l_((l@ $8)&(cC $n@sI@:R'+w!L?'t2 +$0[n]N\'&ٖ4&.%v#.yRno]`JqeCۻUULB?Ug 2P4YC(dB5jGWZ\H᱉$ >u5)Z`:/wS}" Vҍ&Q18;1‹&)<ٚ 5EuL\D2`b:4J Bs$q)SSaQR',A. /8g#*h4hi;( i3(RYKjoEKץ,LRJWHYUEêm4v-/XA3 {5QmV5GJ-#J%-28ɫ54t sFj'֚q*6jT|˘?¹ļtI9>Uah0y܌#s)]7RAXYRLF"j( [Cf5TZZc,"EuGd5 zE\j8R:aٱS^єAYq#;hGP>^wTc}Su[zlAƖH}MAyLtUVۗ`#OhaL4yL2xQQGRK\ HSPapL U#d8&Q.| a6(/A.irIa\b6^TR1ꭌ+Z\ J$ϼl8󊧓+h.fBlQ`Ce$Y8? "QK$d'8AYc)4 RRwT"W$Qӯ1ъ J ,,IkJ.(4nX:#.5 T0 ӂF" 4F(HWȀH1 370=&Zgkݕ['v֛ɜy L} 8 [$:;XMjIir t5"`,fC 0(TU,EÄ8,mXcXF 173n?\i Ef1,Y,3MK S_! jw[+l?y;4,6t@ tx Li2$s)42DNEJ"I, %/xVDł$[Ŵ`>'U&ETOh>apJ%:P\I,7&|tW8u\T!*aDW"t #*7% #R7 JM ] 4fҀ[`aQ 㯱#\}TI펵4\LPX 6eFg=4L oDƱ mc@vYʥ6 )󗣸5kC:Cj?j.6Pp)8$h&$_ڈT0k,Sar f[d!;[8j%.# f|B()'-9xA>e9ghEdlE(hH R(*_nqpbSJrV^g "ۿ ²xa` ^'(" M4z^"<(k$|Dn7zG@,SV1.uBl.NXwɞ# ^j1G1#4'=93E,87=w3WWBGQT#`GWg] ))hzZç\Q DĴ  ) 8, $=:MYc]@RHYGs-؞p5# j,:\$Ϧ"մ"iퟋ,U#0:'UeGNShxէ@eC=Z^HꏬRD[STDDNM6[-DpLJ*#;pB N W3fQ^S-uzW2"%C3@ yX7<z~>EzBy)ɖ C>GɲfTQfy&ͣS_}^TB|KT\t_'glŷd6ZrGW8?Z&0hrT. ,pSa0`:%jE} y{"#4a:%44aT¡h+0G3YgCyr"*CB8E*EL[Sx4-@( ¨YAa HM.b:(IL9N]JMR+ J km*2cB)< &=z3muYQaz .Ek!Z<#p#[0{TMlM&C#o  B@$K O+bDpT?و `ɲMVAbSGFBIbBkC0ɰ }~Gȇ4#.z!JjV~ǡ( D)6,76#Ȃy/";"&d$Ɉ;&2x LCÛ7 %uZH-x)&~2U8$aMHݏ&2Qxm'mn[nO UlTlY4nc>/!HZhnED&i*@ 2XAp9YYc"Tّ~mRC;P<%]":@z.$ˡpGP( q9cFI7UW 'hO^L`jaIXfM:;0] IJY;ծ^0; qu MTiˉVi2yԗL8@/ eiorsatlcnhdpm'fy_DgRvILuE2N3WO(01-SAbF.xP{TMHw,)UVXkCY#BG;j:]!5K9+=[ >$$$$$$$$d h Desk Examples File Menu demo - Desk Accessory 1 Desk Accessory 2 Desk Accessory 3 Desk Accessory 4 Desk Accessory 5 Desk Accessory 6 Item 1 Item 2 - Item 3 Item 4 Quit  PP  $ +  6 P = K ` u           $SPv3 !ԣxJvX "7EXAʡ ή Eb }~Q#!@(̕`)Dp&w\":`:$*vD2 "E)Ѿ%RDWx_Nޡ6B JY (䁴HUq&!Zzқt2x^k츣4^ڹ̱#iIGR60ٛaaV [cSfrKS<̖ OL8E>BoBD5 oq-"}- iro ex !و3ڨ ?Ιzme /U;/K!Ka`'1_+&!*RRƁcxt&,?Ҭʮcs4WJ Ck t2:D'khS4фR,PjgcHc-,PS]1E悷tEHr^!kl'c axc 1 ;+p,YjUfk VPlH?HqCdA@ݕFӸ'_JC<$b,"$ڮd-v zCd# kw|[ Pă,3=]sлm>%00d6C4vBLKKOP~GԐx-1%v_?~ܰm&:6 JZRF9c^K(Z,G+PPt&r.SԶqŌu׶RQ->]&b0=8a@A@RHDANE@PSG 0 =I_n Or T,&6Lf^VCs?hlj`2pyՁe-7Momb$zt<.|FX(x` U1 ! jSPv3 (ڦ2U)P[4b*jJH7 *$&ʔFC?u2}(PT mŚPFk*ȟptzt{Bkc_|*P h$j*, 8 UjW!|YZ rPK9pßyՠ,X- e5xR"rrM)p܅oǣPZICa\ޔE`~[x.֢pAK$3 ,{״@^<%v ḱ.D8"cꓓP\] ʥxXCXyEǦ5(E8 X.VK\w<ۮh;J‡T@k#w݉jT9+>VhUX>ZpPhV)ZhblǢvL_]fYagQ'Wb` (ʢklcŇ,ǜ"j 2,Kѥ͌+hS$ҮZf:cˣ܈Y"wb"yj\CY:&~=1Z`q)z#x]]:(ɦd}1^]T@R^vI@ia0dz(U=x0V$b<ʶz恘zh]ǚRVD(\ :%m x4Pxy(7F%s.kMXxNWQLP*``Q>2AS-GuBYq,+QW j3T rq(QA"TQ[13Z"leYT) m+Q.:8&TS0,*GBbh(H  ^ F*MҬH$"pt^r^v:)FCXiiQ2˝ĺ:ZK%7G*BWQ*/QRP<6F1+F$F,( dyŅ2IxXfH( VyG5  % "^-R8w=f9dfm`KLcLc ς\JltBRn`\[ReEv,9EB*4^"Ikvh cNqnc@0}Iu;q 8ԪCIl4!:~ح>jpĭ>Y* R  QZpґIhg}lsgSVSu5C1cx8ߌ /*f 5[@ k:$@%* PI ]A:̛.D{И ͤLyQv/B34C7) t3fhA44>D3x!E]%l$fKFA&~1c8z@?3=fy " /}sSB& (PBA'q0HHF1d%O>P8LL6N au?!nBNkCy`d!g`bB -f; Ďz AHYkA?}؋fV<I(o/^N*ʯ_))p$߲mǮ@:=Jm9' \a~?ILTƻ&ޘ1cfc@ +UG䏲1qJ[ͧ`!0Cu`cl{wcDs]`^!@; ^ ~%H֦gz!Bk^c:d]f[RkB]4r.p|D% \Z\z AҢxҌHyQQ R'5rb4њH9F+|GxJ . RNG {'I~EKr! m!~?g!qWty=ه@M+Yk@&bf툘 V38EA/Ѓ/e ~H=Ekg4/ol `b@2t 0 /2ODmyE2|qV%)9b:%!R|2?uvRj,Q&TNe & ETNSRAOnIt.BH DCiPLseo r\lX|a_F U@6`dG J^0"hb<3M=?uvf,(` U<1(RRPdiSPv3~4sF1PmJ5;\'ԀHJ(>{6TpSKW981f*Qf(@}*Lpl@^8(ōhJ cd(4.\ X^TCV n[e:M#ƂT8K! ,+TeC,\ 5 E>8c ҉\"5_Mv `=t"owA7tmq T@mO+?Y7S< m20@ (bSγ!}P¿sE8||zLx\Bx"*"3dw\tCkyv*> 9gأ h9}B4N$Isq4I&P yTNB,D2؀)I!eRQz 3u@X=բA-e$qX<8$!NDE A .SU? \n"d8 1J@ 4,("~*r`ΪCP{L6|!9(jÒՆ͘٠$ UjlD-4o^t=Z{DyhX B_9A!+!i4FNOblF+8[ml@k^GDZ2MfZcv;pz1y-'':0 yHƻt,Gܤee1Lv6|I]Fx Mx18ZTrSJA! Lb4@z2(M$LC^pi O:jZb!FǧM51pr(&&s>4Ij訐Lʨ>᤾3 ~bj蠈՚8 tmlO"oC TdFlo @50`OpP$6 0cZ+K\ LsvC$:tll,MGư(\1@;`OT|)EӡIEK8Bpk(N[-]'6` 4=׾#മ:(u3ba4+m6?MQ:2@s,Жb;0Ĵj NڼO AC{hI7bȴ f`B3Bf)\&!4 $hq :l(Y)a|rhn5 IiE# g Q 0(@Z*NX( M"3,0ȥ/4C"KL4$C Ne90[&Hpl\ħ`#*],]:)*"H_ڧ#WΗW>X|1<+3<=}-#!<gI9իDb1̳/e,lJJiJw dsdqAP\5&;6kU-g}ɰ+~sx21ޫ#q)ҁ$/XɓDy.GTG-~@gZN%[([YS@ @go/eQtc;k= `7<g$ϨȂ 1o;'ygb0,Uh&Bf)Y)_\-CqLvbXi!JS  -O\1ɜ" F/LȈfb4]b>?RHǰ2QckE1ԉFxvmFW#JL>Tl/#-FGMYtdxt[wdLwyN+k 1fiԜ8zxRt2%x%y @"B) D EN n@SJHTpLOBV2RegrdIAC?^|6.v =U u3Wso*!Aԑb%:BRj2GNbYrP!!n4 q=3h6ڀȵK7Z zAMp]7/T5ApزTTнrB/S|-Sj U].b$VD k9'LJ zXTUt.,[ 3K  ":j6i&cHƌ M"Q򕱰 v7-9}ÝU ?+dT?!]]>a:LYU4= *NzR 5ǂIe2qB{`+cA^W*u)qB*pR4jtW*Qs,$qAv\R`C gMcDW֪2 m%2W+`mF] ->jl-#8"CRK۞xkK`0"7. n<((`:g J Xi3j&d{+x]Bĩ-(`1J5*4JICօ427B}w Dz8IT1!m2AbF F[3XoM]kwD|"&ͯJT[aR^ԫ ķr T< FyTJEep<,*. xyCaT $2B9Orq@#dzCU!@BjG޻0 5KC>4WWypV+QφMF9P O2{O#rH$K@7!(0mQrʢmԕ(5Hت!@ ,}™upֵ#΃NP8b#p#J[ =,X d1H5@ yN/<њz4gyv~ c($ \H$ZjǏ0` QѠ"#F:R  w4놽X>/5 KlNy9K,:^|mN>\b_N8,*bK  8-]\9^XM&0dĉfq޹ %ꔗ=Vx3v2\';b@,3=B#E)hC.Lc `H? v# @1=q0wxie *ALLA5 "as&B/P,HP>뷠:`FY7/B8 ќr7j'-9ʖ@0]Z"J`ҍeò \ ! ]Q[]Bb EQ (Ƿmhm4XpهX$`rN[!fHFz4Yh0g|fL?0ZfjXx, e[*ZcI),u@$$*&<\IԈq3WzPJ`f/ٕgtw'x8sTŸGwf!hfT5CaaUyݨiiAb,Fy~[i8dbks#pg|SsF3G,b~a|Fuk"Rdux9::Qlk1IYA$23>~9X w ,#dBm6/I r3x3O0(8p)/WbJ91/]f>"$R4B2jQ"`.$8 FO tA VTZ@[ ]i[Rb5֜]jiz fltR /\A|ΠU "G31JAkcp3AxhgaUͧC cY)+7܏7QIw_BuƉDEitOW pt(8=-0J6K ٟ 0aJB F^ $g$$MFNONN/ <)^) CTH7X _0 &B?:BQC$4sxo8Cԅzvxvm+[tkmC"gM7l(\f 9>5[8#qNc׊C1kyT!*m_BGuKuͩR rF7FnRǦ\j$Rɓ/%P!*TH AEBODSNRr|.n I _X`heC0vzt=Go?L2V6P~@MU3mWJl\F(ڈpic^  ǣHM3 uu)Êmiuę$$sESt4,U]6W+U7ˁ (i@bQUn@0t2,\da#y!cSL5- &jJEà$ @ 9f0d/.s|teFjb0=@`)*X`t9iBxBl6RGz(`l=tx+LjDY &vAQGYd/N #IF((nEtQ[ҡ,C݊58v<<7zH6EƋh Q<"J'D[A3{kM(w<%T!6N8fAɲC&y&p:YH&B,2vAB  l,ދl/|]<k0\h{ N <>˩SRYhV2;>`@J@dq=,6A ;t&Xѐgc[N9. Q! 8)EDrs y"٧/ '4%99+Pɪ6Z=ffuܗ lE!$lB A =R#0Bcs_bԏ<&.Ѫ$R0_Rh{wQ6@kQGP}7\qI:>wV{`wi6q"zx q]7)xQ > S} FR/"N&5E)!+ G -1/f)Kk"6hoqOZ;!$lQLW!si[T{ fB \U}NضEu,aBM0Y:"J+Z)RyqsHXI!B0#NADCHI жK93mW My/_`  U"B1ʋB.  -'G.. HHA ACC XHWHHA CFG X^ HHA DOC Јp+_b`TȘ `PXXXX kf o*HWDLԁ.BN@lN@(N=N/,N-N$zN xBgNANVH0. n J@oU?. ?. N)Jf`*N 0. y_H_29_RAA=@0. y_H_29_RAA=@HnHn?.NXHnN-XHnHn?<NQ p.n]D2.y_^Dg`=nHnNPF?<A?<ZNPZ?<_NP@?<0?<9NPFXHnHn/< NPZ n^D2.SAtA0?HnHn/< &NOHnNP:VDg Sn`p.n\D2.tA0?HnHn/< &NOjHnNOVDg Rn`HnHn?.0.n?NP`HnHn?<NO`N `HzHn?<NO<BHzN$HzxHnNOg\YHnN4-_ gB?<BN6/.HnNVB'/.HnNBgBN6J.gNzN8N&N^ _\NHELP NVH yuToJN SyuT09uTGrG/HkN3_3_NNN`N(LN^NuNqNqNVJy_f U?9_BgBg?9_?9_N6B3_Jy_l?<N"`?9_?<UHy_kN8UHy_kN8BgBgN7` y_oA_C""`nBg?<HnHnHnHnN6=n=nHnHnN'>0.nn0.nn?.?.HnHnN%zAC_""?9_?.?.?.?.N5`?9_?< BgBgBgBgN6N&HBgBN4N^NuNqNqNV n 0 @f N` @(fh n 0(y_fRJ9_gBN~Jy_l By_`NTJyuTfBgBgB'N~` NN`BgN!8`Z @f^ n 0(y_fH n Hh n Hh N&?9_?< n ?( n ?( n ?( n ?(N5N%P` @)f n 0(y_fBy_` @f n 0(y_fN&v` @fU?. ?.N$Jf n 0( @f N ` @f N `z @f N `j @f N `Z @fB'?<N `D @fB'?<N `. @f<?<N ` @f<?<N ` @fr n 0(y_f\ n ?( n ?( n Hh n HhN"?9_?< n ?( n ?( n ?( n ?(N40NN`x @fN":NN`` @f?9_?< BgBgBgBgN3`> @f n ?(?<N*N` @f n ?(?< N NN^ _PNNqNqNV0. @f NB` @bfBgBg<N` @af N,`x @f N$l`hN 0. @;f N `P @<f N `@ @PfJnf N `N ` @HfJnf N `N d` @Kf&JnfB'?<N ` B'?<N ` @Mf*Jnf<?<N `<?<N ` @ f(Jnf<?<N ` B'?<N z`v @GfnJnf8Jy_^DJy_^DgBy_By_NrNN=z=_ nWD nWDg` Jnf"UHnNRJfHn*N?N=D`B09_29_ֲ@m6=@=A`RnHn?.NXp.HѮ0.ذnf .YBg&N#o?<Nl`rHn*HnN=N<09_29_ֲ@m@=@=A`RnHn*Hn?.NXHnBgN@N@N<|0.ذnfHn*N>N0. kH_29_RAA=@Hn/NHn/NJ9_fNU?.?. NJg:?9_?9_N3_3__?9_?9_N0.ng0.n^D@J.WD@0.y_WD.g 3_0.R@??9_NZ`0.y_WD.g 3_?.09_S@?N&`f0.y_WD.g 3_0.S@??9_N`20.y_WD.g3_?.09_R@?N=n =n ?9_HnHnHn N%`$B9_LN^ _PNNVHUN=_09_ny_lRy_G_0+kS@=@0+SS@=@?0+y_??.?.??+?.0.y_??<N?0.R@y_??.?.N?0.R@y_?09_n?UN(NLN^NuNVHJy_oSy_G_0+SS@=@0+kS@=@??+?.0.y_??0+y_??.?.?<N0d=@HnHn?<DN'HzHn?< N'Hz~Hn?<DN'HnHn?< N'HnB?< SN'3uX09uXyudg(?9_?<?9uX?9uf?9uf?9ufN3uXudNN^Nu NVH?9_?.?. ?9uf?9uf?9ufN~ n fnUN r09__HzHn?<D&N&=CHnHn?< N&Hn Hn?<DN&HnHn?< N&HnB?< SN&3_`hUN 0<_Hz`Hn?<D&N&l-CHnHn?< N&XHn Hn?<DN&HHnHn?< N&8HnB?< SN&*3_&N^.NuNVH/.Hn?<N4 .f4JyuTo&09uTGrG7y_7y_`JyuToR09uTAr"0 f609uTAr3_09uTAr3_`p yuTfHysHyr?<:N6`RyuTBy_By_09uTGrG& HnHk?<N37y_7y_LN^ _O NNVH/.Hn?<N3ZJ9_f`-yrBnp.=@Gr0.HЮ-@ nH=@Jno0.nfv/.Hn0.R@?N54HnHnN3fRBn0.HЮ2.HЁR-@/.Hn?<N4HnHn?<N4 .2HҀ-A `"0.R@T@n`-| ``@LN^.NuNVH0.y_oHzj/. ?<N2>`N0.HG_Gp+@0Hйr-@/.Hnp+?N4DHn/. ?<N1LN^ _TN NqNqNVHzHn?<N1-yr=n 0.R@=@0.HЮ-@ nP . ^D . ]Dg:.H@ n0.HЮ-@Hn/..H@ ?N3`Sn0.HЮ-@"nSnJnltN^.Nu NqNqNVHy_?<BgN3\3_-yrBn0.nlX0.HЮ-@ n  f$Ry_09_H2.RAC_3`09_HC_R1Rn`N^ _TNNqNqNV=yoxJno*0.HAov20I0.C_Sn`N^NuNqNqNV/.Hn?<N0J9_f`HyrHy_?<N-FN(p0J@g?<N`Hyr/. N.N(ZHyrHn?<BN-N(BHyrHn?<BN-N(*HyrHyox?<BN-nN(N1 29rHЁ2.Hl?<N`JyroHyr09rH/N0Hz HnN/HnHnN/fHzHnN/ZHnHy_j?<N/HnHy_?<N.?9_?<UHy_kN0UHy_kN>BgBgNHyoz?< BgN1$HyrHyoz09oxH?BN,N'(0.@ 3rHyr09rH/N/Hyr/9r?.BN,JN&?.?.Nv?.NFNHyrN+N&N^ _PN Help on  NqNqNV*Hn*HzN'N&0J@fhHn*Hn*N)Hn*Hn*?<N-N)N&lHn*N(N&`p.*rA*0 A\gHzrHn*?<p.*R@?N.D`HzVHn*?<N-Hn*Hn*Hn*N-bHy_Hn*N-Hn*N XHn*Hy_?<ON-PN^NuHHA.CFG\ NqNqNVNHyrHy_?<N*rN%0J@WD_J9_gHyr?<BgN/`HyrHyr?<BN*N%jN. 29rHo6Hyr09rH/N.Hyr/9r?9rBN*N%&`B9_HyrN*N%N^NuNqNqNV/.Hn?<ON,bHzTHnN,>HnHnN,HzBHnN,HnHn?<N,.U?<HnN0 @WD@ N^.Nu[3][|&| |already exists.][Overwrite|Cancel] NqNqNVHz6Hn?<N+HyU?<BgN(`XN$@0. @fTHzHnN+Hy_HnN+Hz HnN+HzHnN+Hz HnN+HnHn?<N+V` @f0Hy_HnN+$HzHnN+tHnHn?<N+ `R @fHzHn?<N+`6 @fHzHn?<N*` @fHzHn?<N*HnHn?<?<N+^U?<HnNr=_N^ _TN [1][.][ OK ]Unable to access|| |Please modify HHA.CFG|and restart your machine/ has been removed.| |Please insert correct disk'|Internal Error !| |Insufficient memory(|Internal Error !| |No available windows |Insufficient| |disk space NqNqNVJ9_g?9_NB9_N^NuNqNqNVJ9_f?9_BgN _N^NuNqNqNV=n=n =n =n?9_HnN N^ _PNNqNqNV09_H_=@N^NuNqNqNV09_H_=@N^NuNqNqNVJ9_g$?9_?<HnHnHnHnNT`A_C""?9_?<?.?.?.?.NJ9_WD_N^NuNqNqNV?<?9_?.?. n ? n?Hy_Hy_Hy_Hy_N09_H_H@J@g"nSQSy_`09_H_H@J@g"n SQSy_`N^ _O NNqNqNV n =P n"n 2"n2N^ _PNNVHG_0. S^D2kn ^D2.k^D2+kn^D@ LN^.NuNVHG_?9_?<HSHkHkHkNG_0+SS@y_m0+SS@y_k0+kS@y_o0+kS@y_kLN^NuNVH"n SQG_"n RQ?<?9_ n ??.?.?.HSHkHkHkN0H_H@J@f"nSQG_"nRQ?<?9_?. n??.?.HSHkHkHkN0+H_H@J@f09_y_29_y_Ao09_"nQLN^ _PNNVH#_VJ9Vf(G_?9_?<HSHkHkHkNN` _?9_N ?9_NBy_N LN^NuNVHUNr=_0. noHn HnNN0. 2.@m=@=A`Rn0.y_=@Jn^D2.n_Dg^G_0.S@_k=@0.@y_=@0+SS@=@??.?.?.??.?.?.?< N 0.nfnN$LN^.NuNqNqNVBACp"Q=n=n=n =n =n=n=n=n?9_?.HnHnHnNN^ _ONNqNqNVHzPHy_X?<N$HzPHy_j?<N#3_HzHHy_?<ON#3__N^Nu HighSpeed Help Welcome to HHA PASCAL.HLP NqNqNV/.Hn?<N#p.rAm>=A=@`Rn0.2.tA0?N$d2C0.nfHn/. ?<N#.N^.NuNVH&nJgW<3<W>3:W@38WB36WD34WF32WH30WJ3.WL3,WN3*WP3(WR#$[3"WT3 WV?<?<?<?<BgN6=yX@D"n2XB"n2XD"n2XF"n2XH"n 2XJ"n2XLN^ _O3W@?<d?<?<BgBgN6=yX@N^ _O NNqNqNV3W83W:3 W<3 W>3W@?<e?<?<BgBgN6N^ _O NNqNqNV3W8?<f?<?<BgBgN6N^ _TNNqNqNV3W8?<g?<?<BgBgN6N^ _TNNqNqNV3W83W:?<h?<?<BgBgN6"n2XB"n2XD"n 2XF"n2XHN^ _ONNqNqNV3W83W:3W<3 W>3 W@3WB?<i?<?<BgBgN6N^ _O NNqNqNV3W8?<k?<?<BgBgN6N^ _TNNqNqNV3"W83 W:3W<3W>3W@3WB?<l?<?<BgBgN6"n2XB"n2XD"n 2XF"n2XHN^ _ONNqNqNV0. no =n `=n N^.NuNqNqNV0. nl =n `=n N^.NuNqNqNV/. H@=@ N^.NuNqNqNV/. =@ N^.NuNqNqNV n C""U n??.N<$=_U n?(?.N<$=_U n0 nh?0.n?N;=_U n0( nh?0.n?N;=_0.n0.nUHnN=JJWD@A"n""N^ _PNNqNqNV nC""Jn_DJn_D@ N^.NuNqNqNV n C"""n2"n3n0.nS@"n3@0.nS@"n3@N^ _PNNqNqNVHyW #W HyW8#WHyYX#WHyX@#WHyZz#WHyW #VHy\#VHyW8#VHyX@#WHy[#WHy[#WN^NuNqNqNV?<N?.NN^ _TNNqNqNV?<ENN^NuNVHBn &nJgBk?<eNUN.=_0. @f*JkoSk?<DN?< N"?<DNv` ?.N nVD nVDg0+2."k Rk n WD nWD2+kWDgf?<fN `>0+S@rAm0=A=@`Rn0.r k 0?N|0.nfBkLN^.Nu#VHV?NATLV/9VNup a|@Nupa|?@NuAVp  Qg pa|?@Nu _BpaTONB?< NA\O#V/?< NA\ONuaഹVlNu#V$āHBBBHBԹVa yVNNqNqNVHz0Hz$HyVN HyTHzN DHyUHz N 0N^Nu ConDevice(_V#VLDAH~#VJ9Vg$-mll$mb*//NSڏJ9Vg+E// Bg?<JNA ataA0J9Vg m$ (ga"A,#V#VNAa?<`Hz#VNuJ9VfAa~`ad&9Vg0VAtad09V>aFAuaTA|tJgaXHtaBaNuHz?<&NN\ONuxp<0<:m^a"QNuHQO ONTx OaPONuga`H ?/<NM\OLNuBaF#V3V.yV yVBV oN`?9V?<LNAAH x2| hg"h$#VNup98tg xp4Ug p5Sgp6 xαVd yV$f yV|?/``p7 o`Apa,#VA0<a#VNu yVpa yV0</??<NMPONu Runtime error: at offset: ????. Not enough space for heap Accessory errorPJ"6XPBF ,0CNVHaXBn np.{jNf. f&(* n a|>q`N`. f n J9VfaDLN^ _ NLN^"_ afN JzH`0H` ` r$gBBHBJ|~|gNu$rļNu "$g(| 4||BBBHBJ||gNut4TBSBeJ|? g"Nu `Jk |?kiJg B0 Nutpr`4<` n Jk"|kJJgFҼd RdRB|d$Jv &ƼH@|BH@ Nu4<pr`pr` n Jk|~k2Jg"мdRB|dJHBBB Nu4<p`p`~,ka~Jk ~Jg~HBB=GNuEJ9Vga`JkJk~JgJJgvBlCDEB|@lbE| e| "pJEg|.F̀f҄уe&NudBD@Jf gr| SBdRBNuB "$NuprtNuJ9Vga\`VJkJkJgJgEBE/t,.pBAHA*HE҅т:g HDHD҅т2HAp:g҅т*HEHDHD҅т:g҅т2HAp:HCHC҅т*HE҅т:g HDHD҅т*HE҅т2HAp*HEHCHC҅т:g҅т*HEHDHD҅т*HEHCHCЅ:HCHCHFH@܅BH@HAFHAHFFH@B$H@kSBNuJkJkJgJgEBERBJfgzNV-BH~Lx$ht=p4<HFBDHDچׄDBUH@HA02JgLSvp҄уdTGfLRBSBdN^NuNuJgBNuJ9Vfrt("gjDhLNuQBᘰgUrNu &<x*BEa8JkJgJBoƔ| lDBgDNuRn <Nu<aTBiNu _?HVNALVTJj 3V~DNJ9VgV~Nu2)/ "i "_RA3AifNLNutpaf"?@o SBp aQ4`aQNLNu4/"oApa _XONL4/a _\NL/A` L/A` t` t`t`t _"_BgJg$aNeg< gg< bRi`RNL/BBYBBBBBNKt`4<L faf2NJ`HaByV~23oNJgBQ _ N"o)SfNJ.NuAL`AL"oa8f#o 3iNeig3@V~ _XONAL`AL"oaf,#o 0/?)3@3@N3_"/g A0ByV~ _NLaf 2)a4rNL _PON"oa^2)a*/@Nu"oaL 2)a/@Nu$HBHBBBЂNu Ctv BAdAрQ&FNu"oaWD _XNa>f*prNL/prNL/ /rNL "NuprNuNK NKNL^NV n Ca n"OaHWHnBgpVaN^ _PONNV n"OaHWpAaN^.Nu$02"_ _/t @A`BQ`Q`BQNu"opBQNu _0"WrIN _20"WetJ€<RfRpSdN$02 _"_/`QNu _"_0|d 2I1NpNLpH0Q _PN"0 _"_/c)`QNu""_ _/tcSBeVfNu""_ _/prdPF`QNu$02 _"_/tJAnrBnARBJ@oBo0S@QNuBNuNVHn/. ?<?.SWNRf/.HnNR>Hn/. ?.?<NRfHnHnNR>Hn/. ?. NQN^ _O N _ Wam WznW N"_  _#VB P rҀ| kHp Pr N /gF^| yV" "H Xb If"i`Jk""#hÉ#A"o"BB _PON?<8//NB/ L^|"Q yVb`@ hbJk2#h"Ef #j ё!I$Hеf !i ѐ$_ _PN yVpИ PdR"W.N yVp` hd" j"W.N"0"_ _/ge` QNuQNu"_20 _`QNJlD-C"r \Y"gt/RlЁ`BNu;B@'d L *    t T  >F .Z 0D     vb &" 6  $ && .&$ J  @ & "@.` h2" (.2> 4 4P4 0  " 0  6@  x  \j4      .$T2".&" 6 ,* .N  * "   FV .0 $ " `$ 0  . . &  *D.$. " 8&. "$F    .  ." &   &( T$8  ", V2(, " Ш$@ 6* d0:,>N$.  ( 6"x *6HT1C:\PASCAL SPv3 z,%Aɵ: G)l8 dJ`0ImYCCK@+*Rf$z^M1zW9 yZBt$dO(fy !2}M#Qq,0?|+_x 9Y`5+vIBĠLi1*F1EC9iшT TCI`Q$D@*!l 4KR}C?'2Q3&\*pWDHJ##]Ҝ%iT2e50JA]]1bz d'GOE CwYQs9M/JN >+@z] IAAFCY_SdA>sK9"  ;@" JFʚ0U hr)HK^~x-[B@!rT39y3;C JG.B'` tWP&ᢅe8_?]r]'ms${?%/3kG(d]\&+!mHK9DUXjZPn#MGX}$5 06RhSPVL? qH 8yWEbEҷIk۠j>0R| !p⏈!Y)ď6-ܱe[1%ܥ|c3f19dlb/ D(acL(cfI1@k sԤbΊ v BIR0`r?D>5kMPn' yjf.d!fe 6#fKX`CR %0(`*kfQj&y?d]fP25 !@2} 5`$!ز LU R7P0z"CB`ʅU(55 kfhv@&)*tP؏?h*:5J:nÇd4K~#@M# N6 U(tU5L[ !?BȅxT$5  " Xv-n@+)iq 0zry6/$:0vE1/?N2{Xt=S{,)ij$43ӕ .P]mWOkdDkWqBRTp=c Z"gڸAQm K^t;#G n `cm,ڨa,m!"5%%3Gd=9EY{p9>;b?^AH|g„qAg@VVyM4 0#rF1ba8ύ&AOi^rF@(rNB= B&7=>!V`, xΓ=Cs,0G JIp.Ζ1al8͚!Kt g H*(z! dC(\lzQJ*)er75 C~`Ҝ PG}tv{%{J`*]s ;YƓv"|J{" HSXez4Мw2(8rR &]XMH׷-((hYA) k-H]lF;&NV r2=l3`DrD A{yP xVHHF캓 Bicd*XƨKJgI&f(C`yJZd`.1064y,#E`;6w skx}}JBBtNC~]8Aྊ1u*|꟤|U n664H01vuQTxP.%QC&yXCbXWV|W B-`N5_T JM`0 v "*dU :F #*']-Q|f ` {p=4 (vSֽ[$|>0uv6le qUY?* ~OxT9ЁZ:B~5kt4pX (5GW[5=P_ jd 5u +  OUddfH4`/K䰙/\ nJw/|]H('M +ׄLt:7j 0sUl<<hX!a0R:~b99(ȕ?X*bx&ۡ? '5Na l ='[еKCDr쌪fIWA 1Mw5ү,ITN"pPAqW`C'Bh3]Ǽ)9(AP++UnNCm;B;(>LԨ+YZwN0:)}mՖ;_. :a "m~A]KB6o lӃhp-\:=PyCy>@0`-8N"y#h%,O6F/9sΈh2o1@C*%{ĭ hK=\Kׯhp r)T H9ޛsو*j&La(M"R}ݑr,U6$èq6jJg C(zqqCZ5$%)p&iDIx|q!B>$\U4D 7j-U4W2 6c4ʛCD0Fk3iA#{#KPkT2Rƥk N|a| ~@b JO>2f"h;-3VϸyNq7A wF1e]vqAd:+e1f3us0 #ElES*!z 8 JqF]ChLwNKM/a%,ˤ?Z_1tq`a!Z%9( ;fWq%pV2(딺$Jm2s%-PЀ3P/hLL$D=bY<ga]ڔ-*  j~l x n{ bPQ %)/ ! A }ru ?@&z1~A˙X1 b/k(jt\aH  \2b [d2(1 ޑ !܊!++i)CB̗u:ܨQ#!́. ,",ӄ`DG6 XLq'i;o=;|Wҵnyz>JQtSLJɐDQ=6)W׮љB8ǸC:vM*l~b35J5,:+?~z8rNk*}j4LTJԢMYtIm7 )В*KB;J0 `%2AzM-~ ?D3$%'9? Hbsc|F5uHP}o94gJ8Q~h@+D{?Ȟc[0]M|4\"gF*m0OOؽ,F)&3PAAl'r!jvE% Y $Yn<%n%ce; $ˆ3m>1;yL+DhU;s 9-LGM4'_),H˭H SAFMQ)C(Ed:n2;- Sho0~lU4c*٩;zRFSX0BQXIS=4+p]Yo|JUT:ql. UyO490-s 1tPN`K #,L#>:; -\+ETwhJDojzSi+RK=0"j"b>!-#QCUXiܬcp@NIZ)0mUiBS+ܠ245(GUg+,-E/j2"Rt*{A214{Z+Ӄs:Y\vZ{`*EH{A+955]q ^ Onj*0)>Ix- y (v ' `7e[VdYӰ$A,ȓ\eo 2xtl:i(T+K$(lIDg&`MCfL3f4aSknYqoU/c0sL6s=@%9HJH@$_Da/P2 [T7GG;̝,|mWQ_Qc,H%[ѓOƽ>x# ?T%(n _!_-;)ډ*=5jU?ϗwUI%enj!]],43޳h+%K1%.#<ܬG'QRz ö \@I\!.h Qai撅\PZt9%Ts;Kp)o9gB2Q?V~#FE&7π2]>[16 gJT)e,X5HiU3 ĚqN J$6=(ToT)q#"_|: G"YZ>]&' O_hGV<ȼ ӓ8r-Q^B8tfhRػ)9^{< ;);HI m{(AHr^@S}ceOt : ]kV#{z :$AgvOɨc UfVOy9[]\]1?R9EW7 q@:nI-p 3QO`AЍG_ LTP-lPTB *YQw$Jd|Aƃ-M;3 eT{>BFMp,nOq G*J.0 <-6<9bH-* S_#͡'l@E0PXBM911@>LjԢj!6G[$y-폑 #8H5F.fe;f@ A< OzHRK/DG&D߈#\_b(NJJ'@2  =xBPF02%[5A>g1ÍI;f/gQ/ڌRĨ҅L4n-^Xn @%EД6uɈ5Ui?)}"I SX~He =M ZEijeGh5P EJ#Ό:QX$J _7zh-!BT)Ҝ-{ F3hx[br~|1N2+n-q/ QkPdK鼌<2Gګtf"m2|ْRHLТ PB(TCI "] tLdR s2L(> PSg fVHd1nu E4 =\V[jW޶:&MK O M@\tLs@5 oeair(lRsEctOufnpTCI_mAd.DSg,1wbhM'y-NLFPWB2v)kUx0[GH]:4K{|XY9+5"V^67!=>3/*8j<$q#}; Z \zQ@?`` {33ѾP5}~RSPv3kᅧ#UUuER5(9`NQw"Ze&*6ԙ !DG1 8.gQ66RZZIJLHEiPP Pf)$*oB)izZ_]S*2#{ 73av֎.G^}\H.(\v֯R @gA~'GJjgZQ[D|/ڌ$ɢ/:IUG>{8v$U=Yw50f#~2HSh{KP\q-$Jx3xCd?Ux)"WS,M2g4IGR[SɑHdEzmF&ORTr$d=xG4!- v-xX+OKa+2Q  1IQi4}A+5AQD@(6;G@e$ĥMhItx-8!`e$B2v 5hrw")bTU2;w$<0ɀ&Ge4ub=f4"6_Huu)!ԶH s) §<8d&3Zf[t+{alH4zXСM. M +LkD=9*B/H; "4CALCULATSEGMENTSEDISPLAYGMHELPKEYKESEVENEIGHTNINEDDIVKEYDFOURKEYDFIVEIVEYSIXFOUR MULTKEYSIONE  TWO THREE SUBKEY ZEROKEYRADIXROYSIGNKEYAPADDKEYADSWAPKEYENTERKEYDELKEYHELPSCR1 HELPOK1EY MOREEYXHELPSCR2 HELPOK2 BACKKEYBOARD\SPv3 &K6+P :2- S/ BdEdʇ0$TX@? Tbk2!!hE} ק`F9!@ jspV} ;J`V %[uE^Seb~ >a T |}$^I4).9 8 P :z^x5v 0 ]$,40E;NH/mIkH7HK$Hq%B|5LOqY%[0q G 7m~VJNN\l=pF9K0=7*D8_BId( XjzfTqN0C;L{v'Y6/Y!Kg 6~$wGŒ$.'x)$,\@?پnE$/Z$r& 5䱷~-5,^Ghzj#3'*"P5ּ rD]N] !#TJbILք3ٽ+bV.g Gσt2AGmSNO>J;" cWos :&LHGeE(bgtWopdp¬I;e5C2VX[*hE ~.:Qg&OxHw_Ąb[{:3rBdhqHWf􅊗; @ ؇uwl[efM0izIr}ц+hj" ֖½/ X֍ ^p_<4/&B)%CȰ>g Jݦ'\H5Rh2(H";7j-b+aqBN !̛YM:ێ-ub: L0Z1LfOv"\qݎT g"Q D.f ϖbldtU*1emA8Y]1+֥U`OPqk25@/BTJSdPu 2S *&x>&HqWl) "p8{sN%M487EbHEs7H,쁥+K"46"<"L^y&Ta$!>x8PhٖۏLY<"e '*ʲ=$&hk*0_O `F O33pI䜱 G0h .~R@PEU% pPM֠cT(Όưo&BMMl'>EL NLҭ#i HX (jC8p0aCL2<qyaqFHR,?'n!#FC$* ^N;5{l &i 8,y" v~ .*g[^ ԡs QU'?.Te$H91Hu}e F[nv*l;ba^@FD\ FV"9W% f .5  .Z₅ [/ \5 iXH7@)b_ݜ qzGT61(FH!98c6.D#ȦLA^T 4SUnif +$ ue`t?!pK#FKYnCJP<BHYv^` XrA#`ppNx/^`pA-pG`Hʦdpv yçr+ s 8ghx \5IA9B*JyKN\tta@!WpʤH $RHAB zX$`!J` ],w"&+ԩ΄I9rUdd2q-c#u*2 Y(͈GFॐTCRWdʛ yǠ r  Fl/  (z^!b'̤B!:&R  Y6,$'\6]mɰ(Z;@eK*M jΫ9J˰ISfDh+OгT"AG G ᛎo`( @D5 W 'YVh!DDK@,4A& 7 lV:fFX:!~;TJёui\b%+@O/ oeaircsultpdfb.nmghwyv-x(Ck)"RP3I24/EF+01*MNA:S,5THzGW'LYB;D 7U68 [q?9K]=<>@P CRC 9E2͂$ CALCULAT = 0; (* TREE *) HELPSCR1 = 1; (* TREE *) HELPSCR2 = 2; (* TREE *) KEYBOARD = 1; (* OBJECT in TREE #0 *) SEVEN = 2; (* OBJECT in TREE #0 *) EIGHT = 3; (* OBJECT in TREE #0 *) NINE = 4; (* OBJECT in TREE #0 *) DIVKEY = 5; (* OBJECT in TREE #0 *) FOUR = 6; (* OBJECT in TREE #0 *) FIVE = 7; (* OBJECT in TREE #0 *) SIX = 8; (* OBJECT in TREE #0 *) MULTKEY = 9; (* OBJECT in TREE #0 *) TWO = 10; (* OBJECT in TREE #0 *) THREE = 11; (* OBJECT in TREE #0 *) SUBKEY = 12; (* OBJECT in TREE #0 *) ZERO = 13; (* OBJECT in TREE #0 *) ADDKEY = 14; (* OBJECT in TREE #0 *) ONE = 15; (* OBJECT in TREE #0 *) DELKEY = 16; (* OBJECT in TREE #0 *) RADIX = 17; (* OBJECT in TREE #0 *) SIGNKEY = 18; (* OBJECT in TREE #0 *) ENTERKEY = 19; (* OBJECT in TREE #0 *) SWAPKEY = 20; (* OBJECT in TREE #0 *) HELPKEY = 21; (* OBJECT in TREE #0 *) DISPLAY = 23; (* OBJECT in TREE #0 *) SEGMENTS = 24; (* OBJECT in TREE #0 *) HELPOK1 = 12; (* OBJECT in TREE #1 *) MORE = 13; (* OBJECT in TREE #1 *) HELPOK2 = 12; (* OBJECT in TREE #2 *) BACK = 13; (* OBJECT in TREE #2 *) H$H 8 +/-ENTERSWAPMyCalc HelpMyCalc RPN ver. 1MyCalc - a HighSpeed Pascal accessory exampleThis accessory works like a RPN (Reverse Polish Notation) calculator,much like the Hewlett Packard calculators, i.e. with a four-elementstack. As this is a simple demo, only the simple functions are implemen-ted : Addition, subtraction, multiplication, division, sign inversion,and swapping of the two top elements of the stack. For those unfamiliarwith RPN, a small example to clearify the operation : The calculation of(2+3) / 4 : On a "normal" calculator, you would enter something like :2 + 3 = / 4 = or ( 2 + 3 ) / 4 =In RPN, you enter : 2 ENTER 3 + 4 / (the result is 1.25)For further understanding, please read MYCALC.DOC.OkMore...It should be noted that exponents can't be entered.MyCalc can be used on the keyboard too; these are the keys used :0 1 2 3 4 5 6 7 8 9 . - enter numberEnter - complete number entry/duplicate top element( - sign inversion : [+/-] button) - swap top elements (x and y registers)Backspace - delete last digitThe stack is laid out as follows :t register : its value is only changed when a number is pushedz registery registerx register : the one shown in the displayOkBack...MyCalc is programmed by Martin Eskildsen, October 1990Esc - close the MyCalc window   7 8 9  / 4 5  6   *  2  3   - 0 + 1  . $  (   . 3   ? MQ-EC HRFGH * F q (  = 2  AA 3HJA&C5+=i) "  >      ) 5=8=@6 w/ h .  -'t.. 68881 DOC шp+uFILE DOC шp+vRIA DOC шp+y bSPv35A+rL$fSer&1H _d2i݆ʝ:I[x kAtY5z3P+:dI tA5}ӓӶ -3:܋#C:pXX%S~LuB2-Y/ wVP|e@_H8.f9:]a6y y bbhWPXDԽP}C^ened:(  .l{C..=C*Nģlb3̬O;p hK#;-2+\8*ʿ8u[zFEfHBFW ȖcT,|:3htz=CqN8[r,v-eDci ;L:7l%L.JU7,dx[Fg[nۯ (`"Kۺf!{7)h ()?d@px&P1 &O-<#$t,*yf!$/+[>* husMm.{,D''AnM_Ty|&j>{":V^bQ*;9jeqe-@Po>='>OI!6$b/ @K)faBbrud' u4+˰ yɦ }!c E8mU>@k>,H7CGf]`UNԩ#(+h9HL<]~6Ey\@ד[;v 8j&a2]*^H D`k<}dN!߈PJEUХaMl~ In5s U XVeDοn CGaaT3(h 0i%Ɋe@ [J ;Psx̛+MP!ײvp:|p'ЇI.JpmNLpZWE X^!! =8A68O-Ѝ[k@ʒɇkcB"DAMi u(BBȮ&R =<0 eխ@]q*;@I.X ?HBP 㠢 /SۆU5=-˵e*fVS'A!#(В)' +e lsaotundircpwfygh(ObF,PmIkTAS.1)E:BDC'=RvNx;W-{UZ0z<^G4]> M8 K@/2#LqV+H5$3}[*PNDe_v^SPv3 |p[S7$ Z!K&9R^>x@@dhi  C$}l 4/1]92PYIHCipz |,]@8"a QҿrY^>M=N/_sLƈ]' } LpS as>@011%Qn lm̶(C,`rS{S\Ei5S334: ;<0=> ?@0AB CDaE'`;<=9P̦wR,lr lWuO& loeWⅩwJ4x߾޲/M=,n/ F =d#P>h yCK@Jb,Iro 11BG.`P>>:twgfK)+J* Фrt 7[xbjI2=6:KNbBI6b8il BbdQH@mLy!q oÌv"vZ8)ٵ.*)TC,N+J@*!C y]@M M6Seeo! 6n_)-g 0DJ$T˗E>345p `N.v*=;% +sjgA a$n@}2n{y?dwxK)n'oBhҙ/%|n7`u_` ̥}\Qu5<8G$l\0KL5"X%'?x E,R B  a# 6!\'\dKhTX[q0%H<@`.qXr*t=* D¹;D7^"trH0bF!UXy9Th4%6/Iz|6k]_՞CiT-!nREO7{ Ct&?T0"MdJePq~8&A w&;pgsxl^&'jGF ~^c3'xh;}ķ1I *IGVG6W i:8$:0dCSMQUiP^VA/k$P #D/%+c~*uaĪJBS4zlgQ*1q 2'# NPA .Q2$rhLx]|}D&eT8z %7~9w!ta_hFr0(nNNN4Z`Ly4u~/$4wļaJWd 6M46`T 99E79XjQ=C_[[$ÀۚZdaGm`ݵfhmp.GQ7 fP%~_<\tvNJrvD@*C s,BV?eh6BC %VmA 8uT䂧rJi,-y4X1!gi iכ3t D<%Da=:\na#/.9+k+O!Z7&\iDe.Dʲ ՘ AȒ@RGEQ *TV 0ݙaS rNM7)Ad0: QR"?./ZIpK.pJ2ll KS?H`Ѭe,rF䒨g|Xe^L:=3BAnH1m8('BB@7q1<`f+B 1K$ڵxDB.%`s(oJئ4Yg` 44;(/B! V Kf f8effsA?:~?Əa,Ж.e+u%D f@ ۂ)IRRy{)I}F\Q-NҺZY OtQ'  qjn%0AM(\"Cs F"jeUUWU_U}UUWU_+10T1o:6ұtc{جwacو5=JvA>RV>4("3C=& #d3D=Zb8ȷ.=|i'ne$x& G4J0IɆ8J9ޱhFR,ZTj 8%%}"D ?2/kBng;D8W7"tDX 0PYT/((D*U֑0Q @e(B . /8DB8R)V:j>Qs,!2D|W"J Vf":4Z"9iNAZc7 ǠqNs9%Wex$k\%*cG_>9 % N $G.*n +E6)IS/ G(wRn I qHQ d|(wP d-S>`LH7?z}FP 9lr T11G@㵑 U*WP[88@1Qu,;:aV%z#s&@UQ/3G.h.ѡ[\֭X#IdI=!$L~aEF!H5K]z1J ". yCDFUsLd" CV N{pQ#Ƨ`qz >!^Yz"%<h0"܂e[$ ]"k>X*5(ft j k5Z"-^|V (_hF9єT˜t8z}U 5(xjUrjMAI8R*+B!Iu\*N'oԄ-NxD8PU2}%iMVM h4^oܬ8cuveoX&9hz)yP.0¤/ asieortlu,nDcAmdSLpC.REfhMNPBgwyIbOT':W21Xx+U03()VkHYv/Z=>{<-4G@5J[*9z7]K#F6jQ!; |8^& _%}?`` N }4؇<Hit %.  -'}.. NONAME1 PAS шp+~dNONAME2 PAS шp+GRAFDEMO  -'DOSDEMO  -'HSPASCALPRG `qDOCS PRG `WDPASCAL HLP X(3ROB `'PASCAL DAT `2*READ ME ؈p++zPASCAL LIB X.zaSPv3d֠I VDNr* G# IWfaP#pXfVWP#]S}zQ/BQm5_tsyJ(%y' n ߅St8 uCXbFe)X&Qcj®rjF1ZE^ F:.qW@DTҠA J餖) 3: :O Du-/'|$d<ʑl2K45yd&$ !Cy'6aak(D?N:t |O=ەw\EN-z=630YzW?pD 5hJ=Eo,AA!po0Apk9A* q CU0+Qك [ NJacj T0$j18Gf#2Ր 6?JxTZgpQ1]@q0-YdLYbt 憳RK#QZ'B9=<A enERaxsroNiTctA*uI(:O1)ldf=2+pGLSDw'_mF.0B;, b{4}W-gVHvPy ChU>k<@ PGMwđSPv32 ӌ+FGK{G"H/F*]etDƴ +kvbMyCX ={U0 PC0+ϝ/84 2/4<]GP*1q&Fhc`UTh}[D=$io Lv;.S1!Y=* @@ PJ.4)UEw.  -'..  -'}BOUNCER PAS шp+0BOXES1 PAS шp+BOXES2 PAS шp+RANLINESPAS шp+BSPv30 Mg9s8cLzq(LDmIГw~ q>LQMBVC$(|l* p#%+$ e)AX=Gp5c x3d' )sVI0aiIYHTHxiD #LtM|o *(EM2op$)ʚA0U5"(׮~D]J?5Pr{ Ɣ4/)䁈Đ2X`Ba`'nxHhhyH, E@ J8s.P&:DsE@/ es9"M XJ5ՓF/Rp6 $>,W#   g/=3 * `KaG8" 76><HY 20b]u[IP8#-6iѰ݉7C8Se3~`4ēKu31ЏHB|$<+W,ȓNБDMDT @<&^L}ӢEh#V"yt8:gqLFepP|o$zKiҎS 2W8k\JIacoL߽`^E.aYCNHa'Q"9$LVD/I)mV 6), ]-ĘB F1/H@ PQp/X \ SPv3e#"r/p^ρ "߿4j 0*l:Xb `X* I@Ԍ AIf{CZjQ8"0qDȂ RY׸ZPYӡeP/8+ȥ!!?0tA\{1 ~~9 @<4[s,6_'4 a1qhڍU, M wZxexpBm e`,}mvP Bd⿣!ieTwM~wtJHpika CrQL bz^J"r1HP|4ABAHe oraintsdpm.E(-lPCgNcTOh1yIu)B2fDx+0G;{S 9U :V*FLbw,_v/XYzK8=RkJ@ P]!*(٫`.  -'..  -'}DIRDEMO PAS шp+tFIBONACCPAS шp+lFILECOPYPAS ҈p+MAGIC PAS ҈p+pMINICALCPAS ҈p+NOTABS PAS ҈p+PASTRI PAS ҈p+PRINT PAS ҈p+0 STRDEMO PAS ҈p+P SPv3t j )kk0nCz`އe>zu:v*Hq֑QTTo'M7vڰf2fbPRr}qޤѶ)P_"ЅgyCe>$6]Q!)h .4jB?-Z&vckZQ0N.?< ¶F*aQD,iK R&aaH]?pO&el!(>j Yo@)^N'$b-t&d}3Lu,i0<4l\%)\.'QDiJ8䍆FkAd(>`]fdXi|.(Fd0E*fV_s?Їlyg0 fIid[\c bD (s >%)?2eJR+bd5` 9F*0LS-B2ܨa+Ӎ*Xh>D@&>ԟɗOL~ +  [x_N$ZrK$c6=}WpQW_]z ؋ P7E!79 }em%jnm 0"ba* i$dT~? PXK4) tAD >SXC Cyx'  esBk0PPR\"0fYhLS "$G%O!+꘍& 豔'W O 4HL 5 v!BlD mCp ; 6@LA*8emG!, Y X5 o.(`!U ^p׵"Egg@#\j:,*P+(3`=ު DL r }mUY(dY!@ $"A=Ժjvm Dq0WHyg)N`b(@A:tǓ!0Y< n1,y=6A!I*:..P\P' eroands(ticl',uDSEphARmPIN0C1f-.yLg):BObkVWF=TG2Uv9xH;+*/>{<]4w M Z8K6?Jqz[Y}@PP{$SU jOSPv3l#9I0q{p:m3}#'e- 2dJ@[ȖiI$* jz@8ZH z R P1M6A O܀s;_ ^lbC/> p9 t9 93  -M"$Y8U(juWHHBH9XmBZ<_+BHC5Iѥ8NV}rئ<͊D. $B tLFqڙ~X|:}١M Gk\54 Oj rKN\)" eoasnritE,lC'NpmcOSf.Pd)UB(1gIuR20DLk:;FATMybVGx/h=Y 9 6XJKĀ3mYJQ-aC3:^  `܁m@Mt烙&1f$R3<#[@nP;x'<=hSvE4[q 5]- b*zP$OWCk39{}M@ {k"h(ݚVSPv3H#愘BQ70"9MEӨˎQ+ssuiHfL[-Dj3"ZbRd 7V<%`Gdb.oQ [7[b`X EQO# xJ7LKݍ1+@d@um.KT4T2ڟHKlW[kBp(pjiͣd.MM#4i. X?P;$5ܰ;s3gdn:do. 6p,+"G%ÑdS#E*_B cDA !}.;|%8^y-<@{e 3 rx2"]I!RTe*.w2 e,(Z xi%; J6!-tB]4cC8-PO"Lǝ^ jgD (M<['0QQ*Hy( H)7Jr@%ꏗc}xAGXE?4- U'C-à'&8|e ae Qݱ a!}W˔.Q8E4{} H|YEU&/>eID%"pȁd#Ċ%XҎ8t @("1˯c]+/fT%X hbOpFWʠ_o"U$fV#})]!V1O15=J;>gтcN$< g&#S*̋ `~ `rqѢ,}@OJwA> "$FrD!%C3c"#G]5QlB"=CiOiV-| 25h@yRIĶIrfAVx12=N!I/ e,|O73ɢMT h0YX@ ˡɕh+ Z1D(:Hv-!`&mHfHz $!BzI!E f&G{{n*p K(0F/HcW򏍟#OQ]2t?UCL[Pq>l5NV\0beG-,bneElCd z\Fe/ $hmRl0v15C1Sp-  `jbX͞#QJQ*0Tܤ0Crpsmꍿp? p$kW32ɞDRuVUiۭƉ #AFdG7^B!h ˤ y96)P2Մ<,Ipdw‡Pf퉿@ztQgH%E_6u E51gm؆-".|ꃶ8gFٱ5[uA: <&he  Fc < ˫pT[2I2Ȩ5Ф lU(O,-4N; s,ɃFb`26ȃgUy)8;VJD6R!L)"a~ $iU{%Zc$[f7,xbT!cholƒWlҩtrETR>5gPoxeaAx@-d,6:3U :"!bv2N.D3<5M^Xw8;49|WBkVU# ZjG$Q67zPPFdIO㡽):SPv3 sK47MmTHA(ؒ0sCY8t%6'#jQ0P1Wh UPF YH-@Bc$3^g?7gNo>rHV,@ Zް3$5 RuW( ĵs[A`Rd] U5Ɉ,ztCiL"@ !GFӐA>j6k..H0,^9Y-',z2D*0%CI2Wl \l& UGa #``[| GLj&)mORaI)ƟsN~$F(mA-0wJ{ڡcMGա(4@Wmx~8פce94W+9ʔwL˳uw }1'amCGQk2DbYՑ f1AVHWR.8~ԒMA 8a*1qCG8`iD*l$We3S#FGo,-Ʊ(<"EW,,z' :Qn }En((S(ŏET 6jSED "0+Ba&Y?Zeo?8yjeeYk#s` \+LJ0t-l@#@$#-5.E%sd w%6r0#.L#LW&$, I<Ŋt``;:F F[h8z,)Dp8"OgnA%C/nS*%Wm#i⢺.TN] 8tBc .'1A' FW& cBp< w ؁ BQ{A`C w3gHVpBdY6U89z+LMv/4@ P]GPė@:SPv3 0"'X+F |?<hkk2ѓѶeC83WG+TABD/%{H?.l];NQ, qT,~*͋f`D`4kw9&V~,T"5lix L/Wz,!6|F+FU BN@ N >iAaVQnFQ!0@ z< @ jVT`y]^ 2 7']ܢ򩔒f*- @rs୧0Ʒ,RC֨xf ڇ5F+: %+>`]f4#ZFVX  VE`!|#|;5D9bGs_| Y_}"$ y&!* s#u7 / ~) ըpwظVbEMazC25)z L/$$b+4 >$y%."J()  d}u/&m1??T+4:vq"8!b2>j _L3q$4Š*k[ # ~s#99pҌa2{bNr\_ @I?G&e*BSx @9:E^cm;Mה?)1(N&#&gC(lfp#e؝]>.K]n9=WpX.ipLvO0.,> p9[$!^'֑Q(66va?X#r\2Ut_1I 1<QNa< fd[>A di&&)#a/ N{}o0$#ȈB4 bgZBMr츢!6fQx4 0OBѽ=[B= bDEQ&i ^Kd]QV|떓OP$"= {ʨҊ4a$*B > ʺ"bMN8{%c/hkx&/,tO> lo&UF7)*r䘸ZÍJa(xi |BGH"ue,G +]Twr聄ǞtkHfm(]HL[YۣR"ܵ q?It>0Qzl'+O#1 +ɼc@btٽ |X*a OQ1!2e##x~F0Vy3Vd}`U"1!Ca=Pw)ȍcc٩r`Ov3 U#p8q(a p>!9JBC\;H%NF`H E#B$s5ݫt >h 2c! B'*d8Y)ir I{:3J`U:U!QG4›`8IY:b NZ#󝵋|oy,:!e=g _wIU x"<AP_˜C;, (;+V)Q-F Q߰c`D)}JM@']omX{^ :ڶRh4p\ { niEi+Ȱ&X<ਜ]f $c)0(n,#b^)ڝD p%2)>g8$: oxTv0ChGG  :ц=8 7E>4i 0hSȰ=p; H)0Q7Djȭn?oLcrp"T< 3%3]P(F*@U]8:Jl$ zx6+ZgJ< m]=La q xyqqjZnr0z)Ja@  CI\%D(4k(;s_PDނ=g7=Z+fcA-+Qz6a8WE>PKA(G%Hz* ŋ,2J hVt "|"6ĢIMnEG8@hغiZ4(jT 0 3:-*1,l3m5 ڀD4UsXL1 B7Qy[}URz ?!AJ%n 6aDIEI 5e;,W2q2 t3# UboV*\Fm;a_"T6I§ԁ=B@n1e oatrnsldipu(c'hm,CIgfD)bNS.EPyxAvLTw{-:1BFOk]=*R0+X#9UM}2VJ_[?H{3 ]=SPv3Pة(`!f=b\E3B_ fu̥U< E2p 3(l$Q*Xg;CQ] P_A(A^#H ٩z(pܽe3i-ደ ? ?!$NS %G@p}P }2uDB5G(AӆOJH bmT ELfa蕄AxA enotarlsudimU:f(cR'pg.IhT{S0ALw, E V;BON1bWPY2)D0 Pe }1:Bx`` Pack-Fire!A~*H,H a*oMGLI "grѓg f``GPM$]*$**ԓ**ԓaJ@g p`2aJ@gp`(aJ@gp`p``"agQk`U@C!!Q`  UFIREy `, *o0-Эo   JR O¯F/XB! \X!x"NWv s BaM/"\KCGNAH#"O\0e fiNq`ZfB!g9L*|FXB$NR Q?flLtEIǰ=<+a-v43 28 y.gBJ SBPҘ\8zv`.. )3}^$ X*#.OU"%/.,p i4fܑIl3huIT`#l0 "|x]K#cc?OBpBW 5]6# /|}@#`]$d-kg/9!۠=z:$Y3H/l*?|1Ob SPv3f.( h/Tq!??<*>NAXDBymNM^rob4PKEWACOxOFD-BUG SUu~PLIEDOYSLASHERگBOG;p'HMv"HJJQf<*.$H>#|p&Q/ a7LENFLtTBEe6#kHN0``v`t`r`p`n`J`2` xN`)```ar믰ajV5`+bTdF6;Kavͣ 'ra:JgmZe`mgJB`r a$g63CI:a>KG#@#Q;F^ pݻATjg]BmQ3AhQAjrN2aJg.8QD,Pb6gHg dԏ~raqD` Gnވ3!0HlNuQ$CQ4 C Q  T`C`````">" (@֛2u b .   DDV`$` Pack-Fire!A~*H ,Hfa*oMGLI "grѓg f``GPM$]*$**ԓ**ԓaJ@g p`2aJ@gp`(aJ@gp`p``"agQk`U@C!!Q`  UFIREf`w Bl/F/hC1xDWBx^'wYibV j,T)k8@jaah 6oQlƌA3V6Jk#O# =TP:Mz/P~?z#?;>z'apEފ5%H#2E4YhHsy5 \1\read.me!\h~$!\myhcՉunits\stpascal/`ia0file\new\.doc#AAHIGH^ENSkP-A.READEB.`H\,C.MY|@C]*D.SPA,LTE.IA 7*F.FI -hG.681A8FBBȓv`U f `* UVDISPLAYERC:1$92<-BUGE(P)H UN-uMABL>ONE /USEAZROWSTOkuANDOCu_P-PRINTQ-MENU}ESC-QUITjR@f a`rEPf8} >V5 x!$: {DpHfJZ^gf6p1.C  U a9$nlZ>TymfxE"Y#rł OFЈ5-Pu\p]1M_xTXmf`lM8k f8wqb`FΩ(bfZ l`vy~6bҠ\|>||8ld~>~fXl8|0h*D 8=y[5`_6iC8T%&pny <+| <> )x6 vY6KHE0Ӳ,8M8w|H~a0o|ivk lRCf[p` x`n nF0c~(a~rEx%L%r84ɺ/'QlÂjq p?~T+B@l|u82Az` fU0fC~0~%b`fZlb`HlFTbs:B`0>lۓf|`f2պϢB}~AG~x<6|#xo?0` ?Af<<` |;lf~<7H_,6*Lj^XA@;fi! $ 00~و|rRHp݋8 g] fa^ f iP`\tgnT'$F>:`:B>JkO]g$=gdO\gv#^g=>gɰ%;}R>RB-~7NjB(nAl*%? 0rw1ZرeCldj@] 6 fJ:g $H"`Ӽ Ui>#JgCpO PXQbBC&Hi&M`x?sG20*6H#`,#SfNZ`hQMB, ^Sjhe6#kHN0``v`t`r`p`n`J`2` xN`)```ar믪ajV5`+bTdF6;Kavͣ 'zra:JgZ` g8` r a$ 6fCIta>KGG0#Q|~6 pݻATjg]BmK QAjmg2aJg.8DbgHg d~~7ravD` G31-lNugY3  E QN5``````(NSdHIx,LƾP ICE!fnatKan."No!&Ntaf*K/d8><dJpa> |8#zi_BDCQQ7HQLShfpw##LmN[EማBUa*d"aa$dveY!a"HV6ҩ%Q`HELPARC'BARBAR3DCIRCLEE CLEARDEVICE CLEARVIEWPORT CLOSEGRAPH DETECTGRAPHwDRAWPOLYELLIPSEm FILLELLIPSEFILLPOLY) FLOODFILL GETARCCOORDS GETASPECTRATIOx GETBKCOLORGETCOLOR5GETDEFAULTPALETTE` GETDRIVERNAMEGETFILLPATTERN3GETFILLSETTINGS GETGRAPHMODEGETIMAGEoGETLINESETTINGS  GETMAXCOLOR GETMAXMODE GETMAXX EGETMAXY GETMODENAME GETMODERANGE 5 GETPALETTE GETPALETTESIZE GETPIXEL @GETTEXTSETTINGS PGETVIEWSETTINGS GETX GETY GRAPHDEFAULTS; GRAPHERRORMSG GRAPHRESULT1 IMAGESIZE INITGRAPH/LINE.LINERELuLINETOMOVEREL MOVETOYOUTTEXT OUTTEXTXYPIESLICE9PUTIMAGEPUTPIXEL RECTANGLEURESTORECRTMODESECTOR SETACTIVEPAGES SETALLPALETTESETASPECTRATIO SETBKCOLORSETCOLORSETFILLPATTERNG SETFILLSTYLE SETGRAPHMODE SETLINESTYLE{ SETPALETTE6 SETRGBPALETTESETTEXTJUSTIFY: SETTEXTSTYLE\ SETVIEWPORT SETVISUALPAGE SETWRITEMODE TEXTHEIGHTI TEXTWIDTHINSTALLUSERDRIVERSETGRAPHBUFSIZEREGISTERBGIDRIVER INSTALLUSERFONT REGISTERBGIFONT >SETUSERCHARSIZE ]GRAPH | GRAPHVERSION |GROK | GRNOINITGRAPH | GRNOTDETECTED |GRFILENOTFOUND |GRINVALIDDRIVER | GRNOLOADMEM | GRNOSCANMEM | GRNOFLOODMEM |GRFONTNOTFOUND | GRNOFONTMEM | GRINVALIDMODE |GRERROR | GRIOERROR | GRINVALIDFONT |GRINVALIDFONTNUM |DETECT |CGA |MCGA |EGA |EGA64 |EGAMONO |IBM8514 |HERCMONO |ATT400 |VGA |PC3270 |STCOLOR |STMONO |STLOW |STMEDIUM |STHIGH |CGAC0 |CGAC1 |CGAC2 |CGAC3 |CGAHI |MCGAC0 |MCGAC1 |MCGAC2 |MCGAC3 |MCGAMED |MCGAHI |EGALO |EGAHI |EGA64LO |EGA64HI | EGAMONOHI | HERCMONOHI |ATT400C0 |ATT400C1 |ATT400C2 |ATT400C3 | ATT400MED |ATT400HI |VGALO |VGAMED |VGAHI |PC3270HI | IBM8514LO | IBM8514HI |BLACK |BLUE |GREEN |CYAN |RED |MAGENTA |BROWN | LIGHTGRAY |DARKGRAY | LIGHTBLUE | LIGHTGREEN | LIGHTCYAN |LIGHTRED | LIGHTMAGENTA |YELLOW |WHITE |EGABLACK |EGABLUE |EGAGREEN |EGACYAN |EGARED | EGAMAGENTA |EGABROWN | EGALIGHTGRAY | EGADARKGRAY | EGALIGHTBLUE | EGALIGHTGREEN | EGALIGHTCYAN | EGALIGHTRED |EGALIGHTMAGENTA | EGAYELLOW |EGAWHITE |SOLIDLN |DOTTEDLN |CENTERLN |DASHEDLN | USERBITLN | NORMWIDTH | THICKWIDTH | DEFAULTFONT | TRIPLEXFONT | SMALLFONT | SANSSERIFFONT | GOTHICFONT |HORIZDIR |VERTDIR | USERCHARSIZE |LEFTTEXT | CENTERTEXT | RIGHTTEXT | BOTTOMTEXT |TOPTEXT |CLIPON |CLIPOFF |TOPON |TOPOFF | EMPTYFILL | SOLIDFILL |LINEFILL | LTSLASHFILL | SLASHFILL | BKSLASHFILL | LTBKSLASHFILL | HATCHFILL | XHATCHFILL |INTERLEAVEFILL | WIDEDOTFILL | CLOSEDOTFILL |USERFILL | NORMALPUT |COPYPUT |XORPUT |ORPUT |ANDPUT |NOTPUT | MAXCOLORS | PALETTETYPE |LINESETTINGSTYPE |TEXTSETTINGSTYPE |FILLSETTINGSTYPE |FILLPATTERNTYPE | POINTTYPE | VIEWPORTTYPE | ARCCOORDSTYPE |GEMAES%!MU_KEYBD%! MU_BUTTON%!MU_M1%!MU_M2%!MU_MESAG%!MU_TIMER%!K_RSHIFT%!K_LSHIFT%!K_CTRL%!K_ALT%! MN_SELECTED%! WM_REDRAW%! WM_TOPPED%! WM_CLOSED%! WM_FULLED%! WM_ARROWED%!WM_HSLID%!WM_VSLID%!WM_SIZED%!WM_MOVED%! WM_NEWTOP%!AC_OPEN%!AC_CLOSE%! FMD_START%!FMD_GROW%! FMD_SHRINK%! FMD_FINISH%!R_TREE%!R_OBJECT%! R_TEDINFO%! R_ICONBLK%!R_BITBLK%!R_STRING%! R_IMAGEDATA%!R_OBSPEC%! R_TEPTEXT%! R_TEPTMPLT%! R_TEPVALID%! R_IBPMASK%! R_IBPDATA%! R_IBPTEXT%! R_BIPDATA%!R_FRSTR%!R_FRIMG%!NAME%!CLOSER%!FULLER%!MOVER%!INFO%!SIZER%!UPARROW%!DNARROW%!VSLIDE%!LFARROW%!RTARROW%!HSLIDE%! WC_BORDER%!WC_WORK%!WF_KIND%!WF_NAME%!WF_INFO%! WF_WORKXYWH%! WF_CURRXYWH%! WF_PREVXYWH%! WF_FULLXYWH%! WF_HSLIDE%! WF_VSLIDE%!WF_TOP%! WF_FIRSTXYWH%! WF_NEXTXYWH%!WF_RESVD%! WF_NEWDESK%! WF_HSLSIZE%! WF_VSLSIZE%! WF_SCREEN%! END_UPDATE%! BEG_UPDATE%! END_MCTRL%! BEG_MCTRL%!ARROW%! TEXT_CRSR%!BUSYBEE%! HOURGLASS%! POINT_HAND%! FLAT_HAND%! THIN_CROSS%! THICK_CROSS%! OUTLN_CROSS%!USER_DEF%!M_OFF%!M_ON%!G_BOX%!G_TEXT%! G_BOXTEXT%!G_IMAGE%! G_USERDEF%!G_IBOX%!G_BUTTON%! G_BOXCHAR%!G_STRING%!G_FTEXT%! G_FBOXTEXT%!G_ICON%!G_TITLE%!NONE%! SELECTABLE%!DEFAULT%!F_EXIT%!EDITABLE%!RBUTTON%!LASTOB%! TOUCHEXIT%!HIDETREE%!INDIRECT%!SELECTED%!CROSSED%!CHECKED%!DISABLED%!OUTLINED%!SHADOWED%!LWHITE%!LBLACK%!LRED%!LGREEN%!LBLUE%!LCYAN%!LYELLOW%!LMAGENTA%!EDSTART%!EDINIT%!EDCHAR%!EDEND%!TE_LEFT%!TE_RIGHT%!TE_CNTR%! BACKSPACE%!TAB%!S_DELETE%!S_INSERT%! SHIFT_INS%!RETURN%!ENTER%!UNDO%!HOME%!CUR_UP%!CUR_DOWN%!CUR_LEFT%! CUR_RIGHT%! SHIFT_HOME%!SHIFT_CU%!SHIFT_CD%!SHIFT_CL%!SHIFT_CR%!ESC%!CTRL_A%!CTRL_B%!CTRL_C%!CTRL_D%!CTRL_E%!CTRL_F%!CTRL_G%!CTRL_H%!CTRL_I%!CTRL_J%!CTRL_K%!CTRL_L%!CTRL_M%!CTRL_N%!CTRL_O%!CTRL_P%!CTRL_Q%!CTRL_R%!CTRL_S%!CTRL_T%!CTRL_U%!CTRL_V%!CTRL_W%!CTRL_X%!CTRL_Y%!CTRL_Z%!CTRL_1%!CTRL_2%!CTRL_3%!CTRL_4%!CTRL_5%!CTRL_6%!CTRL_7%!CTRL_8%!CTRL_9%!CTRL_0%!ALT_A%!ALT_B%!ALT_C%!ALT_D%!ALT_E%!ALT_F%!ALT_G%!ALT_H%!ALT_I%!ALT_J%!ALT_K%!ALT_L%!ALT_M%!ALT_N%!ALT_O%!ALT_P%!ALT_Q%!ALT_R%!ALT_S%!ALT_T%!ALT_U%!ALT_V%!ALT_W%!ALT_X%!ALT_Y%!ALT_Z%!ALT_1%!ALT_2%!ALT_3%!ALT_4%!ALT_5%!ALT_6%!ALT_7%!ALT_8%!ALT_9%!ALT_0%!F1%!F2%!F3%!F4%!F5%!F6%!F7%!F8%!F9%!F10%!SHIFT_F1%!SHIFT_F2%!SHIFT_F3%!SHIFT_F4%!SHIFT_F5%!SHIFT_F6%!SHIFT_F7%!SHIFT_F8%!SHIFT_F9%! SHIFT_F10%!CTRL_AE%!CTRL_OE%!CTRL_UE%!ALT_AE%!ALT_OE%!ALT_UE%! SH_ALT_AE%! SH_ALT_OE%! SH_ALT_UE%!GEMDECL, CONTROL_MAX, INTIN_MAX, INTOUT_MAX, WORKOUT_MAX, ADDRIN_MAX, ADDROUT_MAX, GLOBAL_MAX,PTS_MAX, AES_PARAM, VDI_PARAM, GLOBAL_ARRAY, CONTROL_ARRAY, INTIN_ARRAY, INTOUT_ARRAY, PTSIN_ARRAY, PTSOUT_ARRAY, ADDRIN_ARRAY, ADDROUT_ARRAY, WORKOUT_ARRAY,ARRAY_2,ARRAY_3,ARRAY_4,ARRAY_5,ARRAY_6,ARRAY_8,ARRAY_10,ARRAY_16,ARRAY_37,GRECT,AES_PB,VDI_PB,CONTROL,INTIN,INTOUT,PTSIN,PTSOUT,ADDRIN,ADDROUT,GLOBAL,GEMVDI-HOLLOW-SOLID-PATTERN-HATCH- UDFILLSTYLE-DOTS-GRID-BRICKS-WEAVE-LDASHED-DOTTED-DASHDOT-DASHED- DASHDOTDOT-SQUARED-ARROWED-ROUNDED-NORMAL-BOLD-SHADED-SKEWED- UNDERLINED-OUTLINE-SHADOW- MD_REPLACE-MD_TRANS-MD_XOR-MD_ERASE- ALL_WHITE-S_AND_D- S_AND_NOTD-S_ONLY- NOTS_AND_D-D_ONLY-S_XOR_D-S_OR_D-NOT_SORD- NOT_SXORD-NOT_D- S_OR_NOTD-NOT_S- NOTS_OR_D- NOT_SANDD- ALL_BLACK-REQUEST-SAMPLE-MFDB-STRING80- STRING125-GEMERROR3 APPL_INIT3 APPL_READ3 APPL_WRITE4* APPL_FIND4W APPL_TPLAY4 APPL_TRECORD4 APPL_EXIT5 EVNT_KEYBD5- EVNT_BUTTON5F EVNT_MOUSE5 EVNT_MESAG6 EVNT_TIMER6% EVNT_MULTI6n EVNT_DCLICK7dMENU_BAR7 MENU_ICHECK7 MENU_IENABLE7 MENU_TNORMAL8 MENU_TEXT8t MENU_REGISTER8OBJC_ADD8 OBJC_DELETE9 OBJC_DRAW9; OBJC_FIND9z OBJC_OFFSET9 OBJC_ORDER9 OBJC_EDIT:, OBJC_CHANGE:FORM_DO: FORM_DIAL; FORM_ALERT;s FORM_ERROR< FORM_CENTER<# GRAF_RUBBOXC GRAF_SLIDEBOX> GRAF_HANDLE> GRAF_MOUSE?f GRAF_MKSTATE? SCRP_READ@ SCRP_WRITE@5 FSEL_INPUT@L FSEL_EXINPUTAN WIND_CREATEA WIND_OPENB WIND_CLOSEB WIND_DELETEBWIND_GETCWIND_SETC WIND_FINDD WIND_UPDATEDo WIND_CALCDWIND_NEWE RSRC_LOADE RSRC_FREEF RSRC_GADDRF- RSRC_SADDRF RSRC_OBFIXF SHEL_READG SHEL_WRITEGBSHEL_GETGSHEL_PUTG SHEL_FINDH SHEL_ENVRNH6MINHVMAXHiHIPTRH|LOPTRHBITTESTH INTERSECTH EMPTYRECTI!MAKEXYXYI8MAKEXYWHIdV_OPNWKIvV_CLSWKIV_OPNVWKIV_CLSVWKJ9V_CLRWKJ\V_UPDWKJVST_LOAD_FONTSJVST_UNLOAD_FONTSK VS_CLIPK.V_PLINEKz V_PMARKERKV_GTEXTL V_FILLAREAL> V_CELLARRAYLz V_CONTOURFILLLVR_RECFLLV_BARMDV_ARCMk V_PIESLICEMV_CIRCLEMV_ELLARCNV_ELLPIENL V_ELLIPSENV_RBOXNV_RFBOXN V_JUSTIFIEDO VSWR_MODEOdVS_COLOROVSL_TYPEO VSL_UDSTYP VSL_WIDTHP8 VSL_COLORP`VSL_ENDSPVSM_TYPEP VSM_HEIGHTP VSM_COLORQ VST_HEIGHTQ& VST_POINTQ VST_ROTATIONQVST_FONTQ VST_COLORR" VST_EFFECTSRE VST_ALIGNMENTR VSF_INTERIORR VSF_STYLES VSF_COLORSj VSF_PERIMETERS VSF_UDPATS VRO_CPYFMS VRT_CPYFMTdVR_TRNFMT V_GET_PIXELT VSIN_MODEU VRQ_LOCATORU% VSM_LOCATORUY VRQ_VALUATORU VSM_VALUATORU VRQ_CHOICEU VSM_CHOICEV VRQ_STRINGV VSM_STRINGVLVSC_FORMV~VEX_TIMVVV_SHOW_CVV_HIDE_CW1VQ_MOUSEWCVEX_BUTVWeVEX_MOTVWVEX_CURVWVQ_KEY_SX VQ_EXTENDX\VQ_COLORXVQL_ATTRIBUTESXVQM_ATTRIBUTESXVQF_ATTRIBUTESXVQT_ATTRIBUTESY VQT_EXTENTY& VQT_WIDTHYRVQT_NAMEYz VQ_CELLARRAYY VQIN_MODEY VQT_FONTINFOZ VQ_CHCELLSZX V_EXIT_CURZ V_ENTER_CURZV_CURUPZ V_CURDOWNZ V_CURRIGHTZ V_CURLEFTZ V_CURHOME[V_EEOS[V_EEOL[- VS_CURADDRESS[> V_CURTEXT[hV_RVON[V_RVOFF[ VQ_CURADDRESS[ VQ_TABSTATUS[ V_HARDCOPY[V_DSPCUR[V_RMCUR\ V_FORM_ADV\V_OUTPUT_WINDOW\.V_CLEAR_DISP_LIST\S V_BIT_IMAGE\j VS_PALETTE\ VQP_FILMS\ VQP_STATE\ VSP_STATE]?VSP_SAVE] VSP_MESSAGE] VQP_ERROR]V_META_EXTENTS] V_WRITE_META] VM_FILENAME^'ST_SHL^AST_SHR^uREADV^WRITEV^PUT_EGET_ ASSIGNMENTS_ ASSIGNMENT_ STATEMENT` STATEMENTS`SET`2TEXT`LABELaHGOTOaNILaPOINTERaBOOLEANbTRUEbFALSEbRESERVED_WORDSbOCONSTbTYPEbVARb PROCEDUREb PROCEDURESbFUNCTIONce FUNCTIONSceBYTEcSHORTINTcINTEGERcLONGINTcWORDcREALcSINGLEcDOUBLEcEXTENDEDcPROGRAMdUSESd+UNITdbIMPLEMENTATIONd INTERFACEeBEGINeXENDeCASEeCHARfAARRAYfRECORDgSTRINGgjREPEATgUNTILg REPEAT_UNTILgWHILEh WHILE_DOh FORh.FOR_DOh.TOh.DOWNTOh.IFh{THENh{ELSEhDOhOFhEXTERNALhINLINEi)PACKEDiTFORWARDj'WITHjeDIVjMODjNOTjANDjORjXORjSHLjSHRjINj OPERATORSjOPERATORjSTPASCALk- LONG_MAXINTk- SCREEN_DEVICEk-PRINTER_DEVICEk- MAX_C_STRINGk-MAX_FNk-MAX_PATHk-ALFAk- SHORT_INTEGERk- LONG_INTEGERk-C_STRINGk- STRING_PTRk- FILE_NAMEk- PATH_NAMEk- SHORT_ROUNDk- SHORT_TRUNCk- LONG_ROUNDk- LONG_TRUNCk-CTOPSTRk-PTOCSTRk-PWROFTENk-CMD_ARGSk- CMD_GETARGk-OPTIONk-FILENAMEk-KEYPRESSk- IO_RESULTk-PEEKk-WPEEKk-LPEEKk-POKEk-WPOKEk-LPOKEk-MOVE_Bk-MOVE_Wk-MOVE_Lk-CLOCKk-CUR_ONk-CUR_OFFk- CUR_UP_SCROLLk-CUR_DOWN_SCROLLk-CUR_HOMEk- CLEAR_HOMEk- SAVE_CURSORk-RESTORE_CURSORk- SELECT_COLORk-SELECT_BACKGROUNDk-INV_ONk-INV_OFFk- DELETE_LINEk- CLEAR_LINEk- INSERT_LINEk- START_OF_LINEk- END_OF_LINEk- END_OF_SCREENk-START_OF_SCREENk-WRAP_ONk-WRAP_OFFk-INSUPERk-SCRLEN_Bk-SCRLEN_Wk-SCRLEN_Lk-ERR_CODEk-SCREEN_Bk-SCREEN_Ik-SCREEN_Lk- PTR_SCREENk-PALETTEk- RESOLUTIONk- SCREEN_TYPEk- GET_SCREENk- PUT_SCREENk- READ_SCREENk- WRITE_SCREENk-NO_PORTk-ROOTk- NULL_INDEXk-MAX_LENk- MAX_DEPTHk-MAX_TREEk- NO_WINDOWk- MAX_WTITLEk- E_KEYBOARDk-E_BUTTONk-E_MOUSE1k-E_MOUSE2k- E_MESSAGEk-E_TIMERk- REPLACE_MODEk- TRANS_MODEk-XOR_MODEk-REV_TRANS_MODEk-PAT1k-PAT2k-PAT3k-PAT4k-PAT5k-PAT6k-PAT7k-PAT8k-PAT9k-PAT10k-PAT11k-PAT12k-PAT13k-PAT14k-PAT15k-PAT16k-PAT17k-PAT18k-PAT19k-PAT20k-PAT21k-PAT22k-PAT23k-PAT24k-HATCH1k-HATCH2k-HATCH3k-HATCH4k-HATCH5k-HATCH6k-HATCH7k-HATCH8k-HATCH9k-HATCH10k-HATCH11k-HATCH12k-LONGDASHk- THICKENEDk- LIGHTENEDk-SLANTEDk- SYSTEM_FONTk- SMALL_FONTk- G_PROGDEFk-EXIT_BTNk- RADIO_BTNk-LAST_OBk- TOUCH_EXITk- HIDE_TREEk-G_NAMEk-G_CLOSEk-G_FULLk-G_MOVEk-G_INFOk-G_SIZEk- G_UPARROWk- G_DNARROWk-G_VSLIDEk-G_LARROWk-G_RARROWk-G_HSLIDEk-G_ALLk-L_WHITEk-L_BLACKk-L_REDk-L_GREENk-L_BLUEk-L_CYANk-L_YELLOWk- L_MAGENTAk- COLOR_REGk- DRAW_MODESk- LINE_TYPESk- PAINT_TYPESk- GEM_DEVICEk-INQ_TYPEk- OPEN_VALSk-EXT_VALSk- MOUSE_TYPEk-M_ARROWk- M_TEXT_CURSk-M_BEEk- M_POINT_HANDk- M_FLAT_HANDk- M_THIN_CROSSk- M_THICK_CROSSk- M_OUTLN_CROSSk-TEXT_PTRk-WORD16k- MOUSE_FORMk- WINDOW_TITLEk-MESSAGE_BUFFERk- CTRL_PARMSk- INT_IN_PARMSk- INT_OUT_PARMSk- PTS_IN_PARMSk- PTS_OUT_PARMSk- ADDR_IN_PARMSk-ADDR_OUT_PARMSk-POINTk-STR30k-STR255k-TE_JUSTk- TE_CENTERk- TREE_RANGEk- TREE_INDEXk-OB_TYPEk- TEXT_ED_INFOk-TED_PTRk- SPEC_INFOk-OBJECTk-TREEk-TREE_PTRk-MENU_PTRk- DIALOG_PTRk- ICON_BLOCKk- BIT_BLOCKk-USER_BLKk-PARM_BLKk- ADD_DITEMk- ADD_MITEMk- ADD_MTITLEk-AES_CALLk- AES_VERSIONk- BEGIN_MOUSEk- BEGIN_UPDATEk- BORDER_RECTk-BRING_TO_FRONTk- CENTER_DIALOGk- CLEAR_SCREENk- CLOSE_WINDOWk- DELETE_DIALOGk- DELETE_MENUk- DELETE_WINDOWk-DO_ALERTk- DO_DIALOGk-DRAGBOXk- DRAW_MENUk- DRAW_MODEk- DRAW_STRINGk-D_COLORk- END_DIALOGk- END_MOUSEk- ERASE_MENUk-EXIT_GEMk- FIND_ALERTk- FIND_DIALOGk- FIND_MENUk- FIND_RESOURCEk- FIND_WINDOWk- FIRST_RECTk- FRAME_ARCk- FRAME_OVALk- FRAME_RECTk-FRAME_ROUND_RECTk- FREE_RESOURCEk- FRONT_WINDOWk- GET_DEDITk- GET_EVENTk-GET_EX_IN_FILEk- GET_IN_FILEk- GET_OUT_FILEk- GET_WINDOWk-GROWBOXk- HIDE_MOUSEk-INIT_GEMk- INIT_MOUSEk-JUSTIFIED_TEXTk- LINE_COLORk- LINE_ENDSTYLEk- LINE_STYLEk-LINE_TOk- LINE_WIDTHk- LOAD_RESOURCEk- MENU_CHECKk- MENU_DISABLEk- MENU_ENABLEk- MENU_HILIGHTk- MENU_NORMALk-MOVEBOXk-MOVE_TOk- NEW_DIALOGk-NEW_MENUk- NEW_WINDOWk- NEXT_RECTk-OBJ_DRAWk-OBJ_FINDk- OBJ_FLAGSk- OBJ_OFFSETk- OBJ_REDRAWk- OBJ_SETFLAGSk- OBJ_SETSTATEk-OBJ_SIZEk- OBJ_STATEk- OPEN_WINDOWk- PAINT_ARCk- PAINT_COLORk- PAINT_OUTLINEk- PAINT_OVALk- PAINT_RECTk-PAINT_ROUND_RECTk- PAINT_STYLEk-PLINEk-PLOTk-RECT_INTERSECTk- REDO_DIALOGk- RUBBERBOXk-SET_CLIPk- SET_COLORk- SET_DEDITk- SET_DTEXTk- SET_MFORMk- SET_MOUSEk- SET_WINDOWk- SET_WINFOk- SET_WNAMEk- SET_WSIZEk- SHOW_DIALOGk- SHOW_MOUSEk- SHRINKBOXk- SYS_FONT_SIZEk-TEXT_ALIGNMENTk- TEXT_COLORk- TEXT_HEIGTHk- TEXT_ROTATIONk- TEXT_STYLEk-VDI_CALLk- WORK_RECTk-BIOSs*XBIOSs*INITMOUSs*SSBRKs*PHYSBASEs*LOGBASEs*GETREZs* SETSCREENs*FLOPRDs*FLOPWRs*FLOPFMTs*MIDIWSs*MFPINTs*IORECs*RSCONFs*KEYTBLs*X_RANDOMs*PROTOBTs*FLOPVERs*SCRDMPs*CURSCONFs*XSETTIMEs*XGETTIMEs*BIOSKEYSs*IKBDWSs*JDISINTs*JENABINTs*GIACCESSs*OFFGIBITs*ONGIBITs*XBTIMERs*DOSOUNDs*SETPRTs*KBDVBASEs*KBRATEs*PRTBLKs*VSYNCs*SUPEXECs*PUNTAESs*GETMPBs*BCONSTATs*BCONINs*CONOUTs*RWABSs*SETEXCs*TICKCALs*GETBPBs*BCOSTATs*MEDIACHs*DRVMAPs*KBSHIFTs*DMAREADs*DMAWRITEs* NVMACCESSs*BCONMAPs* ESETSHIFTs* EGETSHIFTs*ESETBANKs* ESETCOLORs* ESETPALETTEs* EGETPALETTEs*ESETGRAYs* ESETSMEARs*COMPILEv^COMPILERvEDITwdEDITORwFILEwGENERALxLINKERxSEARCHyOPTIONSybRUNyDOSyREADONLYyHIDDENySYSFILEyVOLUMEIDy DIRECTORYyARCHIVEyANYFILEyCOMSTRyPATHSTRyDIRSTRyNAMESTRyEXTSTRy SEARCHRECyDATETIMEyEINVFNyEFILNFyEPTHNFyENHNDLyEACCDNyEIHNDLyENSMEMyEIMBAyEDRIVEyENSAMEyENMFILyERANGEyEINTRNyEPLFMTyEGSBFySYSTEMzPTRLENz PBASEPAGEz RBASEPAGEzP_LOWTPAzP_HITPAzDATAzBSSzP_DTAzP_PARENTz P_RESRVD0zP_ENVzP_STDFHz P_RESRVD1zP_CURDRVz P_RESRVD2zP_CMDLINzINPUTzOUTPUTzIORESVARzAPPFLAGzBASEPAGEzHEAPORGzDEVCHAINzHIGHSTAKzLOWSTACKzEXITCODEzERRORADDzSTRAP5zSTRAP102zLASTPCzSHFTSHFTzSYSTEM2{iCHAR32K{i CHAR32KPTR{iFILEREC{iFINPFLAG{iFOUTFLAG{iFHANDLE{iFBUFSIZE{iFBUFPOS{iFBUFEND{iFBUFFER{i FINOUTPROC{iABS{ADDR{APPEND|"ARCTAN| BLOCKREAD| BLOCKWRITE}1CHDIR}tCHR}CLOSE}CLREOL}CLREOS~CLRSCR~.CONCAT~ECOPY~wCOS~DEC~DELAYDELETE'DELLINEcDISKFREEDISKSIZEDISPOSEDOSERRORYENVCOUNTENVSTREOFEOLN_ERASEEXECEXIT EXITPROC?EXPFEXPANDFILEPOS$FILESIZEsFILLCHAR FINDFIRSTFINDNEXTFREEMEMFSPLIT GETDATE{GETDIRGETDRIVE GETENV1GETFATTRYGETFTIMEGETMEM<GETTIME| GETVERIFYGOTOXYHALTQHItHIWORDINCINCLUDEINSERTINSLINE*INTbIORESULT{ KEYPRESSEDLENGTHLN-LOKLOWORDbMAXAVAILxMEMAVAILMKDIRMOVENEW(ODDxOMITORDORD4PACKTIME+PAGE PARAMCOUNTPARAMSTR6PIPOSPREDPTRRANDOMN RANDOMIZERANDSEEDREADCREADKEYREADLNRENAMERESET7REWRITERMDIR7ROUNDO RUNFROMMEMORYnSEEKSEEKEOFSEEKEOLNSETDATEGSETDRIVESETFATTRSETFTIMESETTIMEs SETVERIFYSIN,SIZEOFLSPTRSQRSQRTSTRSUCCSUPER4SWAP SWAPVECTORSSWAPWORD TOSVERSIONTRUNC% UNPACKTIMEFUPCASEVAL VALIDREALWHEREXWHEREY:WRITEUWRITELNPRINTERLST BIOSERRORS*E_OK*ERROR*EDRVNR*EUNCMD*E_CRC*EBADRG*E_SEEK*EMEDIA*ESECNF*EPAPER*EWRITEF*EREADF*EWRPRO*E_CHNG*EUNDEV*EBADSF*OTHER* RUNTIMEERRORS RUNTIMEERRORCOMPILERERRORSR DIRECTIVE DIRECTIVES t              HighSpeed Pascal 1.1 On-line help Units:GemDecl, GemAES, GemVDI, Dos, Graph, Printer, Bios, STPascal, System, System2, Other:Editor, Directives, Reserved_Words CompilerErrors, RuntimeErrors, BiosErrors, DosError     # + 5  # 1Procedure Arc(X,Y : Integer; StAngle, EndAngle, Radius : Word); Draws a circular arc. (X,Y) specifies the center point, StAngle the start angle, EndAngle the end angle and Radius the radius of the arc. The arc is drawn using the current aspect ratio settings. The center point, the starting point and the ending point of the arc will be returned by a call to GetArcCoords. See also: SetAspectRatio, Sector, Circle, PieSlice, Rectangle, DrawPoly, Ellipse, Bar, GetArcCoords, Graph Program Arc_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Arc(GetMaxX DIV 2,GetMaxY DIV 2,30,330,45); C := ReadKey; CloseGraph; End.  + 8   + 0 :   Procedure Bar(x1, y1, x2, y2 : Integer); Fills a bar in the current fill color and style. The bar is filled, starting in the upper-left corner specified by (x1,y1), ending in the lower-right corner specified by (x2,y2). The bar is not outlined. To do that, call Rectangle or Bar3D. See also: Bar3D, SetFillStyle, Rectangle, Arc, PieSlice, Sector, DrawPoly, Ellipse, Graph Program Bar_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; Patt : Word; Begin Driver := DETECT; InitGraph(Driver,Mode,''); For Patt := EmptyFill To CloseDotFill Do Begin SetFillStyle(Patt,Random(GetMaxColor+1)); Bar(Patt*10,Patt*10,GetMaxX-(Patt*10),GetMaxY-(Patt*10)); End; C := ReadKey; CloseGraph; End. #     * 2  Procedure Bar3D(x1,y1,x2,y2 : Integer; Depth : Word; Top : Boolean); Draws and fills a 3-dimensional bar. The Depth parameter specifies the depth of the bar, Top specifies whether or not the top of the bar is to be drawn. The bar is drawn in the current line color, and filled using the current fill pattern and fill color. See also: Bar, Rectangle, Arc, PieSlice, Sector, DrawPoly, Ellipse, Graph Program Bar3D_Demo; Uses Graph; Var Driver,Mode,X,W : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); W := GetMaxX DIV 10; For X := 1 to 7 Do Begin SetFillStyle(Random(CloseDotFill+1),Random(GetMaxColor)+1); Bar3D(0+(W*X),Random(GetMaxY),W-15+(W*X),GetMaxY,20,TopOn); End; C := ReadKey; CloseGraph; End.     ( 2    #Procedure Circle(X,Y : Integer; Radius : Word); Draws a circle. (X,Y) specifies the center point and Radius the radius of the circle. The circle is drawn in the current color, using the current aspect ratio settings. See also: SetAspectRatio, Arc, Sector, PieSlice, Rectangle, DrawPoly, Ellipse, Bar, Graph Program Circle_Demo; Uses Graph; Var Driver,Mode,X : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); For X := 0 to 100 Do Begin SetColor(Random(GetMaxColor+1)); Circle(GetMaxX DIV 2, GetMaxY DIV 2, X); End; SetColor(Black); For X := 100 Downto 0 Do Circle(GetMaxX DIV 2, GetMaxY DIV 2, X); C := ReadKey; CloseGraph; End. gw Procedure ClearDevice; Clears the entire screen and moves the current pointer to point (0,0). See also: ClearViewPort, Graph Program ClearDevice_Demo;  Uses Graph; Var Driver,Mode : Integer; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Repeat Line(0,0,Random(GetMaxX),Random(GetMaxY)); Until (Random(999) = 1); ClearDevice; CloseGraph; End. O  %6Procedure ClearViewPort; Clears the viewport and moves the current pointer to point (0,0). The viewport is filled in the current background color, with the fill pattern set to EmptyFill. See also: ClearDevice, SetViewPort, GetViewSettings, Graph Program ClearViewPort_Demo; Uses Graph; Var Driver,Mode, RanX,RanY: Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); FloodFill(1,1,1); Repeat RanX := Random(GetMaxX); RanY := Random(GetMaxY); SetViewPort(RanX,RanY,RanX+10,RanY+10,ClipOn); ClearViewport; Until KeyPressed; C := ReadKey; CloseGraph; End. -   Procedure CloseGraph; De-initializes and shuts down the Graph unit. CloseGraph should always be called at the end of your programs if a successful call has previously been made to InitGraph. CloseGraph does the following: Restores the original screen mode, if it has been changed by a call to InitGraph or SetGraphMode. If InitGraph was able to allocate space for an extra screen page, this space is de-allocated. Restores the contents of the palette, as it was on entry to InitGraph. See also: InitGraph, Graph Program CloseGraph_Demo; Uses Graph; Var Driver,Mode : Integer; Begin Driver := DETECT; InitGraph(Driver,Mode,''); { Make use of the Graph unit routines. } CloseGraph; End. x $   #Procedure DetectGraph(var GraphDriver, GraphMode : Integer); Checks the hardware to find a legal graphics driver and mode. If DetectGraph fails to detect a graphics adapter, which is highly unlikely, the GraphDriver and GraphMode parameters will be set to the value -2 (GrNotDetected). Otherwise GraphDriver and GraphMode will be set to the detected driver and mode. Note: DetectGraph is called by the InitGraph procedure if InitGraph receives a driver value equaling DETECT. See also: InitGraph, GraphResult, Graph Program DetectGraph_Demo; Uses Graph; Var Driver,Mode : Integer; Begin Write('You can call InitGraph with: '); DetectGraph(Driver,Mode); Case Driver Of StColor : Begin Write('StColor, '); Case Mode Of StLow: Write('StLow'); StMedium : Write('StMedium'); End; End; StMono: Write('StMono, StHigh') Else Write('UNKNOWN?'); End; WriteLn('.'); End. K   #(0:  !Procedure DrawPoly(NumPoints : Word; var PolyPoints); Draws a polygon. PolyPoints contains the polygon coordinates. NumPoints specifies the number of coordinates contained in PolyPoints. Each coordinate in PolyPoints consists of an X and a Y value, both of type integer. Note: In order to draw a closed polygon, the last coordinate in PolyPoints must be the same as the first one. See also: FillPoly, SetWriteMode, Arc, Circle, PieSlice, Rectangle, Sector, Ellipse, Bar, Graph Program DrawPoly_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; Poly : Array[1..4] Of PointType; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Poly[1].X := GetMaxX DIV 2;{ Top middle point of triangle } Poly[1].Y := GetMaxY DIV 10; Poly[2].X := GetMaxX DIV 10;{ Bottom left point } Poly[2].Y := GetMaxY-Poly[1].Y; Poly[3].X := GetMaxX-Poly[2].X; { Bottom right point } Poly[3].Y := Poly[2].Y; Poly[4]:= Poly[1];{ Connect to top point } DrawPoly(4,Poly); C := ReadKey; CloseGraph; End. 4    % / :  (Procedure Ellipse(X, Y: Integer; StAngle, EndAngle, XRad, YRad: Word); Draws an elliptical arc. (X,Y) specifies the center point, StAngle the start angle, EndAngle the end angle, XRad the x-radius and YRad the y-radius of the arc. The arc is drawn in the current color. The center point, the starting point and the ending point of the arc will be returned by a call to GetArcCoords. See also: FillEllipse, Arc, Circle, PieSlice, Rectangle, Sector, DrawPoly, Bar, GetArcCoords, Graph Program Ellipse_Demo; Uses Graph; Var Rad, Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Rad := 0; Repeat Ellipse(GetMaxX DIV 2,GetMaxY DIV 2,0,360,300-Rad,Rad); Inc(Rad,10); Until (Rad = 300); C := ReadKey; CloseGraph; End. o  ) 2 7    ( 2 7Procedure FillEllipse(X, Y: Integer; XRadius, YRadius: Word); Draws and fills an ellipse. (X,Y) specifies the center point, XRadius the x-radius and YRadius the y-radius of the ellipse. The ellipse is drawn using the current color, and filled using the current fill pattern and fill color. See also: SetFillStyle, SetFillPattern, Ellipse, Arc, Circle, PieSlice, Rectangle, Sector, DrawPoly, Bar, Graph Program FillEllipse_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); FillEllipse(GetMaxX DIV 2,GetMaxY DIV 2,50,100); C := ReadKey; CloseGraph; End.    #(0:  !Procedure FillPoly(NumPoints : Word; var PolyPoints); Draws and fills a polygon. PolyPoints contains the polygon coordinates. NumPoints specifies the number of coordinates contained in PolyPoints. Each coordinate in PolyPoints consists of an X and a Y value, both of type Integer. The polygon is drawn in the current color, and filled using the current fill settings. See also: DrawPoly, SetFillStyle, Arc, Circle, PieSlice, Rectangle, Sector, Ellipse, Bar, Graph Program FillPoly_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; Poly : Array[1..3] Of PointType; Begin Driver := DETECT; InitGraph(Driver,Mode,''); SetFillStyle(XHatchFill,GetMaxColor); Poly[1].X := GetMaxX DIV 2;{ Top middle point of triangle } Poly[1].Y := GetMaxY DIV 10; Poly[2].X := GetMaxX DIV 10;{ Bottom left point } Poly[2].Y := GetMaxY-Poly[1].Y; Poly[3].X := GetMaxX-Poly[2].X; { Bottom right point } Poly[3].Y := Poly[2].Y; FillPoly(3,Poly); C := ReadKey; CloseGraph; End.   " ' .   )  Procedure FloodFill(X, Y : Integer; Border : Word); Fills an area surrounded by a specified color. (X,Y) specifies the point that is first filled. Border specifies the color that surrounds the area to fill. The area is filled in the current fill color, using the current fill pattern. See also: FillEllipse, FillPoly, Bar, Bar3D, PieSlice, SetFillPattern, SetFillStyle, GetFillPattern, GetFillSettings, Graph Program FloodFill_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); SetColor(Blue); Rectangle(10,10,100,100);{ Make BLUE rectangle } SetFillStyle(SolidFill,Green); FloodFill(11,11,Blue);{ Flood until BLUE is found } C := ReadKey; CloseGraph; End. ?; !+Procedure GetArcCoords(var ArcCoords : ArcCoordsType); Returns information about the last call to Arc or Ellipse. The ArcCoordsType record is declared in the Graph unit as: Type ArcCoordsType= Record X,Y : Integer; XStart: Integer; YStart: Integer; XEnd: Integer; YEnd: Integer; End; (X,Y) is the center point, (XStart,YStart) is the starting point and (XEnd,YEnd) is the ending point of the last drawn arc or ellipse. See also: Arc, Ellipse, Sector, PieSlice, Graph Program GetArcCoords_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; ArcInfo: ArcCoordsType; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Arc(GetMaxX DIV 2,GetMaxY DIV 2,30,330,45); GetArcCoords(ArcInfo); With ArcInfo Do Begin Line(X,Y,XStart,YStart); Line(X,Y,XEnd,YEnd); End; C := ReadKey; CloseGraph; End. y"-  (2Procedure GetAspectRatio(var Xasp, Yasp : Word); Returns the X and Y value used to calculate the aspect ratio. The aspect ratio is used by Arc, Circle and PieSlice to ensure that the circular figures will appear on the screen as being round and not egg-shaped. These are the default aspect values for the 3 graphic modes: ModeXaspYasp - StLow878810000 StMedium 439410000 StHigh967210000 See also: SetAspectRatio, Arc, Circle, PieSlice, Graph Program GetAspectRatio_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; Xasp,Yasp: Word; Begin Driver := DETECT; InitGraph(Driver,Mode,''); SetTextJustify(CenterText,CenterText); OutTextXY(100,100,'Circle'); Circle(100,100,45); GetAspectRatio(Xasp,Yasp); Dec(Yasp,5000); SetAspectRatio(Xasp,Yasp); OutTextXY(200,100,'Egg'); Circle(200,100,45); C := ReadKey; CloseGraph; End. 1 !Function GetBkColor : Word; Returns the number of the current background color. The range of the returned value depends on the current graphics driver and mode: DriverModeColor range - StColorStLow0..15 StColorStMedium 0..3 StMonoStHigh0..1 See also: GetBkColor, GetColor, Graph Program GetBkColor_Demo; Uses Graph,UtilUnit; Var Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); OutText('Current background color is '+Int2Str(GetBkColor)); C := ReadKey; CloseGraph; End. Fc  !Function GetColor : Word; Returns the current foreground color. See also: SetColor, GetBkColor, Graph Program GetColor_Demo; Uses Graph,UtilUnit; Var Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); OutText('Current color is: '+Int2Str(GetColor)); C := ReadKey; CloseGraph; End.   & 2 AProcedure GetDefaultPalette(var Palette :PaletteType); Returns the Graph unit default palette. The PaletteType record is declared in the Graph unit as: Type PaletteType= Record Size: Integer; Colors: Array[0..15] Of ShortInt; End; Upon return from GetDefaultPalette the Palette parameter will contain the palette color numbers, as they were when the Graph unit was initialized. See also: GetPalette, SetAllPalette, SetPalette, SetRGBPalette, Graph Program GetDefaultPalette_Demo; Uses Graph; Var Driver,Mode,X : Integer; C: Char; PalData: PaletteType; Begin Driver := DETECT; InitGraph(Driver,Mode,''); { Draw lines in random colors } For X := 1 to 200 Do Begin SetColor(Random(GetMaxColor+1)); Line(0,0,Random(GetMaxX),Random(GetMaxY)); End; { Change the palette colors } Repeat SetPalette(Random(GetMaxColor)+1,Random(GetMaxColor)+1); Until KeyPressed; C := ReadKey; GetDefaultPalette(PalData);{ Get original palette } SetAllPalette(PalData);{ Restore palette } C := ReadKey; CloseGraph; End. Gn  $ 2 Function GetDriverName : string; Returns the name of the active graphics driver. When working with the StColor driver the returned string will be "STColor". When working with the StMono driver, the returned string will be "STMono". See also: GetModeName, GetMaxMode, GetGraphMode, GetModeRange, SetGraphMode, Graph Program GetDriverName_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); SetTextJustify(CenterText,CenterText); OutTextXY(GetMaxX DIV 2,GetMaxY DIV 2,GetDriverName); C := ReadKey; CloseGraph; End.    , :  " ' . 8Procedure GetFillPattern(var FillPattern : FillPatternType); Returns the current user-defined fill pattern. The FillPatternType array is declared in the Graph unit as: Type FillPatternType = Packed Array[1..8] Of Byte; See also: GetFillSettings, GetFillPattern, SetFillStyle, FloodFill, FillEllipse, FillPoly, Bar, Bar3D, PieSlice, Graph Program GetFillPattern_Demo; Uses Graph; Var Driver,Mode,X : Integer; C: Char; PatternData: FillPatternType; Procedure WriteBinaryByte( Byt : Byte ); Var Bit : Byte; Begin For Bit := 0 to 7 Do Begin If (Byt AND 1 > 0) then OutText('1') Else OutText('0'); Byt := Byt SHR 1; End; End; Begin Driver := DETECT; InitGraph(Driver,Mode,''); GetFillPattern(PatternData); OutText('User-defined fill pattern is: '); For X := 1 to 8 Do Begin MoveTo(0,(X+2)*TextHeight('1')); WriteBinaryByte(PatternData[x]); End; C := ReadKey; CloseGraph; End. `   )9  "'.8Procedure GetFillSettings(var FillInfo : FillSettingsType); Returns the current fill settings. The FillSettingsType record is declared in the Graph unit as: Type FillSettingsType= Record Pattern: Word; Color: Word; End; Upon return from GetFillSettings, FillInfo will contain the currently active fill pattern and fill color. See also: GetFillPattern, SetFillStyle, SetFillPattern, FloodFill, FillEllipse, FillPoly, Bar, Bar3D, PieSlice, Graph Program GetFillSettings_Demo; Uses Graph,UtilUnit; Var Driver,Mode : Integer; C: Char; FillInfo: FillSettingsType; Begin Driver := DETECT; InitGraph(Driver,Mode,''); GetFillSettings(FillInfo); With FillInfo Do Begin OutTextXY(0,0,'Current fill pattern is: '+Int2Str(Pattern)); OutTextXY(0,TextHeight('M'), 'Current fill color is: '+Int2Str(Color)); End; C := ReadKey; CloseGraph; End. z  & 3 Function GetGraphMode : Integer; Returns the current graphics mode. When working with the StColor driver, the returned result will be either StLow or StMedium. When working with the StMono driver the result will always be StHigh. See also: GetMaxMode, GetDriverName, GetModeName, GetModeRange, SetGraphMode, Graph Program GetGraphMode_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); OutText('Current mode is: '); Case GetGraphMode Of StLow : OutText('StLow'); StMedium : OutText('StMedium'); StHigh: OutText('StHigh'); End; C := ReadKey; CloseGraph; End.   %   Procedure GetImage(x1, y1, x2, y2 : Integer; var BitMap); Stores a specified screen area in a buffer. (x1,y1),(x2,y2) defines the rectangular area to store. BitMap is the buffer to use for the storage. If BitMap is too small to hold the defined area, other data or code will be overwritten. Therefore you should ALWAYS use the ImageSize function to determine the required size of BitMap. See also: ImageSize, PutImage, Graph Program Image_Demo; Uses Graph; Const DelayTime= 10; Var Driver,Mode : Integer; C: Char; Storage: Pointer; Size : LongInt; Procedure DrawImage; Var ArcInfo : ArcCoordsType; Begin Arc(30,30,30,330,30); GetArcCoords(ArcInfo); With ArcInfo Do Begin Line(X,Y,XStart,YStart); Line(X,Y,XEnd,YEnd); End; End; { DrawImage } Procedure MoveImage; Var X : Integer; Begin ClearDevice; X := 60; Repeat PutImage(X,GetMaxY DIV 2,Storage^, CopyPut); Delay(DelayTime); PutImage(X,GetMaxY DIV 2,Storage^, XorPut); If (X >= GetMaxX - 60) then X := 60; Inc(X,10); Until KeyPressed; End; { MoveImage } Begin Driver := DETECT; InitGraph(Driver,Mode,''); DrawImage; Size := ImageSize(0,0,60,60); If (MaxAvail > Size) then GetMem(Storage,Size) Else Halt; GetImage(0,0,60,60,Storage^); MoveImage; FreeMem(Storage,Size); CloseGraph; End. C   '-5>Procedure GetLineSettings(var LineInfo : LineSettingsType); Returns the current style, pattern and width of lines. The LineSettingsType record is declared in the Graph unit as: Type LineSettingsType= Record LineStyle: W{ord; Pattern: Word; ThickNess: Word; End; LineStyle contains the number of the current line style. It will always be in the range SolidLn..UserBitLn. Pattern specifies the user-defined line pattern. ThickNess specifies the thickness of lines. If will always be either NormWidth or ThickWidth. See also: SetLineStyle, SetWriteMode, Line, LineTo, LineRel, Graph Program GetLineSettings_Demo; Uses Graph,UtilUnit; Var Driver,Mode : Integer; C: Char; LineInfo: LineSettingsType; Th: Integer; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Th := TextHeight('M'); GetLineSettings(LineInfo); With LineInfo Do Begin OutTextXY(0,Th*1,'Current style is: '+Int2Str(LineStyle)); OutTextXY(0,Th*2,'Current pattern is: '+Int2Str(Pattern)); OutTextXY(0,Th*3,'Current thickness is: '+Int2Str(ThickNess)); End; C := ReadKey; CloseGraph; End.    !Function GetMaxColor : Word; Returns the highest legal color number. The range of the returned value depends on the current graphics driver and mode: DriverModeGetMaxColor - StColorStLow0..15 StColorStMedium0..3 StMonoStHigh0..1 See also: SetColor, SetBkColor, Graph Program GetMaxColor_Demo; Uses Graph,UtilUnit; Var Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); OutText('Maximum color is: '+Int2Str(GetMaxColor)); C := ReadKey; CloseGraph; End. &   ( 5  Function GetMaxMode : Integer; Returns the highest mode number for the currently active driver. GetMaxMode can be used together with SetGraphMode, to determine the highest possible graphics mode for the currently active driver. The result returned by GetMaxMode depends on the current driver: DriverGetMaxMode - StColorStMedium StMono StHigh See also: GetGraphMode, GetDriverName, GetModeName, GetModeRange, SetGraphMode, Graph Program GetMaxMode_Demo; Uses Graph,UtilUnit; Var Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); OutText('Maximum mode for '+GetDriverName+' is '+Int2Str(GetMaxMode)); C := ReadKey; CloseGraph; End. U  Function GetMaxX : Integer; Returns the highest possible X coordinate. The result returned by GetMaxX depends on the current graphics driver and mode: DriverModeGetMaxX - StColorStLow319 StColorStMedium639 StMonoStHigh 639 The result can be different from the above listed, if a special monitor is being used (Big-Screen monitor). See also: GetMaxY, GetX, GetY, Graph Program GetMaxX_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Line(0,0,GetMaxX,0); C := ReadKey; CloseGraph; End. U  Function GetMaxY : Integer; Returns the highest possible Y coordinate. The result returned by GetMaxY depends on the current graphics driver and mode: DriverModeGetMaxY - StColorStLow199 StColorStMedium199 StMonoStHigh 399 The result can be different from the above listed, if a special monitor is being used (Big-Screen monitor). See also: GetMaxX, GetX, GetY, Graph Program GetMaxY_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Line(0,0,0,GetMaxY); C := ReadKey; CloseGraph; End.   & 4  Function GetModeName(ModeNumber : Integer) : string; Returns the name of the active graphics mode. GetModeName will return a string consisting of: The horizontal resolution The vertical resolution The number of colors If the current driver is StColor, and the mode is StLow, the returned string will be: "ATARI 320x200, 16 color" See also: GetDriverName, GetMaxMode, GetGraphMode, GetModeRange, SetGraphMode, Graph Program GetModeName_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); OutText('Current mode is: '+GetModeName(Mode)); C := ReadKey; CloseGraph; End. 4  % 4  Procedure GetModeRange(GraphDriver:Integer;var LoMode,HiMode:Integer); Returns the mode limits for a graphics driver. GetModeRange returns the minimum and the maximum graphics mode for a specified graphics driver. If GraphDriver contains an unknown driver, LoMode and HiMode will both be set to the value -1 (GrNoInitGraph). Otherwise LoMode and HiMode will be set to: DriverLoMode HiMode -& StColor StLowStMedium StMonoStHigh StHigh See also: GetMaxMode, GetGraphMode, GetDriverName, GetModeName, SetGraphMode, Graph Program GetModeRange_Demo; Uses Graph; Var Min,Max, Driver,Mode : Integer; C: Char; Begin DetectGraph(Driver,Mode); WriteLn('Driver is: ',Driver); GetModeRange(Driver,Min,Max); WriteLn('Range is : ',Min,'..',Max); C := ReadKey; End.   - 9  Procedure GetPalette(var Palette : PaletteType); Returns the current palette, and it's size. The PaletteType record is declared in the Graph unit as: Type PaletteType= Record Size: Integer; Colors: Array[0..15] Of ShortInt; End; Upon return from GetPalette, the Size field equals the number of colors in the current palette and Colors contains the actual colors. See also: GetDefaultPalette, SetAllPalette, SetPalette, SetRGBPalette, Graph Program GetPalette_Demo; Uses Graph; Var Driver,Mode : Integer; Palette: PaletteType; Begin Driver := DETECT; InitGraph(Driver,Mode,''); GetPalette(Palette); CloseGraph; End. G  & 5Function GetPaletteSize : Integer; Returns the number of entries in the palette. The range of the returned result depends on the current graphics driver and mode: DriverModeGetPaletteSize -" StColorStLow16 StColorStMedium4 StMonoStHigh2 See also: SetPalette, SetAllPalette, SetRGBPalette, Graph Program GetPaletteSize_Demo; Uses Graph,UtilUnit; Var Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); OutText(Int2Str(GetPaletteSize)+' colors in the palette.'); C := ReadKey; CloseGraph; End. oo Function GetPixel(X,Y : Integer) : Word; Returns the color of the specified pixel. See also: PutPixel, Graph   # )Procedure GetTextSettings(var TextInfo : TextSettingsType); Returns the current text settings. The TextSettingsType record is declared in the Graph unit as: Type TextSettingsType= Record Font: Word; Direction: Word; CharSize: Word; Horiz: Word; Vert: Word; End; Upon return from GetTextSettings, TextInfo will contain the current values as set by SetTextStyle and SetTextJustify: Font is the text appearance (DefaultFont..GothicFont). Direction is the text direction (HorizDir,VertDir). CharSize is the size of text. Horiz is the horizontal justification (LeftText..RightText). Vert is the vertical justification (BottomText..TopText). See also: SetTextStyle, SetTextJustify, Graph Program GetTextSettings_Demo; Uses Graph,UtilUnit; Var Driver,Mode,Th : Integer; C: Char; TextInfo: TextSettingsType; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Th := TextHeight('M'); GetTextSettings(TextInfo); With TextInfo Do Begin OutTextXY(0,Th*1,'Current font: '+Int2Str(Font)); OutTextXY(0,Th*2,'Current direction: '+Int2Str(Direction)); OutTextXY(0,Th*3,'Current charsize : '+Int2Str(CharSize)); OutTextXY(0,Th*4,'Horizontal just. : '+Int2Str(Horiz)); OutTextXY(0,Th*5,'Vertical just.: '+Int2Str(Vert)); End; C := ReadKey; CloseGraph; End. n  'Procedure GetViewSettings(var ViewPort : ViewPortType); Returns information about the viewport. The ViewPortType record is declared in the Graph unit as: Type ViewPortType= Record X1,Y1,X2,Y2 : Integer; Clip: Boolean; End; Upon return from GetViewSettings, ViewPort will contain the current viewport settings: X1,Y1 specifies the upper-left corner of the viewport. X2,Y2 specifies the lower-right corner of the viewport. Clip specifies the clipping state of the viewport. See also: SetViewPort, ClearViewPort, Graph Program GetViewSettings_Demo; Uses Graph,UtilUnit; Var Th, Driver,Mode : Integer; C: Char; ViewPortInfo: ViewPortType; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Th := TextHeight('M'); GetViewSettings(ViewPortInfo); With ViewPortInfo Do Begin OutTextXY(0,Th*0,'Minimum X coordinate : '+Int2Str(X1)); OutTextXY(0,Th*1,'Minimum Y coordinate : '+Int2Str(Y1)); OutTextXY(0,Th*2,'Maximum X coordinate : '+Int2Str(X2)); OutTextXY(0,Th*3,'Maximum Y coordinate : '+Int2Str(Y2)); MoveTo(0,Th*4); OutText('Clipping is currently: '); Case Clip Of True: OutText('ON'); False : OutText('OFF'); End; End; C := ReadKey; CloseGraph; End.  "*3  Function GetX : Integer; Returns the X part of the current pointer. The current pointer, also referred to as the CP, specifies the current position of the graphic cursor inside the current viewport. See also: GetY, MoveTo, MoveRel, LineTo, LineRel, GetMaxX, GetMaxY, Graph Program GetX_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; Procedure CurrentPos; Var Gx,Gy : String; Begin Str(GetX,Gx); Str(GetY,Gy); OutText('This is position '+Gx+','+Gy); End; Begin Driver := DETECT; InitGraph(Driver,Mode,''); MoveTo(10,10); CurrentPos; MoveTo(100,100); CurrentPos; MoveTo(200,200); CurrentPos; C := ReadKey; CloseGraph; End.  "*3  Function GetY : Integer; Returns the Y part of the current pointer. The current pointer, also referred to as the CP, specifies the current position of the graphic cursor inside the current viewport. See also: GetX, MoveTo, MoveRel, LineTo, LineRel, GetMaxX, GetMaxY, Graph Program GetY_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; Procedure CurrentPos; Var Gx,Gy : String; Begin Str(GetX,Gx); Str(GetY,Gy); OutText('This is position '+Gx+','+Gy); End; Begin Driver := DETECT; InitGraph(Driver,Mode,''); MoveTo(10,10); CurrentPos; MoveTo(100,100); CurrentPos; MoveTo(200,200); CurrentPos; C := ReadKey; CloseGraph; End. T Procedure GraphDefaults; Resets the Graph unit to its default values. GraphDefaults does the following: Sets the viewport to the entire screen, with clipping on. Restores the Graph unit default palette, and sets the foreground color to 1. Sets the line style to be solid and the line width to be 1 pixel. Sets the fill pattern to be solid, and the fill color to be the highest possible color. Sets the text font to be the default font, the direction to be horizontal and the size to be 1. See also: InitGraph, Graph q- " "Function GraphErrorMsg(ErrorCode : Integer) : string; Returns an error message corresponding to a Graph unit error code. GraphErrorMsg can be used together with the GraphResult function to obtain a string with an explanation to one of the Graph unit error codes. Graph contains 15 predefined error messages: { # 0} 'No error' { #-1} 'Graph not initialized. Use InitGraph.' { #-2} 'Graphics hardware not detected.' { #-3} 'Device driver not found.' { #-4} 'Invalid device driver.' { #-5} 'Not enough memory to load driver.' { #-6} 'Out of memory in scan fill.' { #-7} 'Out of memory in flood fill.' { #-8} 'Font file not found.' { #-9} 'Not enough memory to load font.' { #-10 } 'Invalid graphics mode for selected driver.' { #-11 } 'Graphics error.' { #-12 } 'Graphics I/O error.' { #-13 } 'Invalid font file.' { #-14 } 'Invalid font number.' If the ErrorCode parameter lies outside the range -14..0, the returned string will contain: 'Graph error #xx' Otherwise the returned string will contain one of the above listed error messages. See also: GraphResult, Graph Program GraphErrorMsg_Demo; Uses Graph; Var Driver,Mode,X : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); For X := GrOK Downto GrInvalidFontNum Do Begin OutText(GraphErrorMsg(x)); MoveTo(0,Succ(Abs(X))*TextHeight('M')); End; C := ReadKey; CloseGraph; End.  7  .  .  .  .   !# #Function GraphResult : Integer; Returns the error status of the last executed Graph command. The following error codes are declared in the Graph unit: Const GrOK=0; { No error } GrNoInitGraph= -1; { Graph not initialized. Use InitGraph } GrNotDetected= -2; { Graphics hardware not detected } GrFileNotFound = -3; { Device driver not found } GrInvalidDriver = -4; { Invalid device driver } GrNoLoadMem= -5; { Not enough memory to load driver } GrNoScanMem= -6; { Out of memory in scan fill } GrNoFloodMem= -7; { Out of memory in flood fill } GrFontNotFound = -8; { Font file not found } GrNoFontMem= -9; { Not enough memory to load font } GrInvalidMode= -10; { Invalid graphics mode for selected driver } GrError= -11; { Graphics error } GrIOError= -12; { Graphics I/O error } GrInvalidFont= -13; { Invalid font file } GrInvalidFontNum= -14; { Invalid font number } The following procedures updates GraphResult: DetectGraphDrawPolyFillPoly SetActivePageSetAllPaletteSetFillPattern SetFillStyleSetGraphModeSetLineStyle SetPalette SetTextJustifySetTextStyle SetViewPortSetVisualPage It should be noted, that GraphResult is cleared every time it is called, just like the IOresult function. See also: GraphErrorMsg, Graph Program GraphResult_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); SetActivePage(2); If GraphResult = GrOK then OutText('Impossible!') Else OutText('Only page 0 and 1 available.'); C := ReadKey; CloseGraph; End. ff   Function ImageSize(x1, y1, x2, y2 : Integer) : LongInt; Returns the size, i bytes, of a specified screen area. ImageSize calculates the storage needed to save a rectangular area of the screen, using the GetImage procedure. The point (x1,y1) is the upper-left, and (x2,y2) is the lower-right corner of the screen area. See also: GetImage, PutImage, Graph , , ,$ ,2 - - -' -6Procedure InitGraph(var GraphDriver, GraphMode: Integer; Path: string); Initializes and starts up the Graph unit. GraphDriver specifies the graphics driver to use. The legal drivers are declared in the Graph unit as: Const DETECT=0; StColor=11; { If you have a color monitor } StMono=12; { If you have a monochrome monitor } GraphMode specifies the mode of the selected driver. The legal modes are declared in the Graph unit as: Const StLow=0;{ 320x200 in 16 colors} StMedium =1;{ 640x200 in 4 colors} StHigh=2;{ 640x400 in monochrome} Path is ignored by InitGraph. There are two different ways of initializing the Graph unit: Auto detection: When using auto detection, InitGraph will automatically find out what driver and mode to use. Auto detection is activated when the GraphDriver parameter equals DETECT. User selection: User selection is activated if GraphDriver does not equal DETECT. When user selection has been requested, it is imperative that a legal driver and graphics mode are passed to InitGraph through the GraphDriver and GraphMode parameters. If InitGraph finds that the chosen driver does not match your monitor type, or that the chosen driver and mode cannot be used together, the program will halt, and an error message will be displayed. See also: DetectGraph, CloseGraph, GetModeRange, SetGraphMode, GraphResult, GraphErrorMsg, GraphDefaults, Graph Program InitGraph_Demo; Uses Graph,UtilUnit; Var Driver,Mode,Th : Integer; C: Char; Begin { Auto detection. } Driver := DETECT; InitGraph(Driver,Mode,''); Th := TextHeight('M'); OutTextXY(0,0,'The detected driver is: '+Int2Str(Driver)); OutTextXY(0,Th,'The detected mode is : '+Int2Str(Mode)); C := ReadKey; CloseGraph; { User selection. } Driver := StColor; Mode:= StLow; InitGraph(Driver,Mode,''); OutTextXY(0,0,'The selected driver is: '+Int2Str(Driver)); OutTextXY(0,Th,'The selected mode is : '+Int2Str(Mode)); C := ReadKey; CloseGraph; End. ,   *  Procedure Line(x1, y1, x2, y2 : Integer); Draws a line from point (x1,y1) to point (x2,y2). The line is drawn in the current color and line pattern, using the write mode defined by the SetWriteMode procedure. See also: LineTo, LineRel, SetWriteMode, SetLineStyle, GetLineSettings, Graph Program Line_Demo; Uses Graph; Var Driver,Mode : Integer; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Repeat SetColor(Random(GetMaxColor)+1); Line(0,0,Random(GetMaxX),Random(GetMaxY)); Until KeyPressed; CloseGraph; End. Jg   ' 5 Procedure LineRel(Dx, Dy : Integer); Draws a line from the CP to a point relative to it's current location. The line is drawn in the current color and line pattern, using the write mode defined by the SetWriteMode procedure. See also: LineTo, Line, SetWriteMode, SetLineStyle, GetLineSettings, Graph Program LineRel_Demo; Uses Graph; Var Driver,Mode : Integer; Begin Driver := DETECT; InitGraph(Driver,Mode,''); MoveTo(GetMaxX DIV 2,GetMaxY DIV 2); Randomize; Repeat SetColor(Random(GetMaxColor)+1); LineRel(Random(3)-1,Random(3)-1); Until KeyPressed; CloseGraph; End. :   ( 6 Procedure LineTo(X,Y : Integer); Draws a line from the current pointer (CP) to point (X,Y). The line is drawn in the current color and line pattern, using the write mode defined by the SetWriteMode procedure. See also: LineRel, Line, SetWriteMode, SetLineStyle, GetLineSettings, Graph Program LineTo_Demo; Uses Graph; Var Driver,Mode : Integer; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Repeat SetColor(Random(GetMaxColor)+1); LineTo(Random(GetMaxX),Random(GetMaxY)); Delay(500); Until KeyPressed; CloseGraph; End. Mg (0Procedure MoveRel(Dx, Dy : Integer); Moves the current pointer to a point relative to it's current location. The current pointer can be moved backwards by assigning a negative value to Dx, and upwards by assigning a negative value to Dy. See also: MoveTo, GetX, GetY, LineRel, LineTo, Graph Program MoveRel_Demo; Uses Graph; Var Driver,Mode : Integer; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Repeat MoveRel(Random(5)-2,Random(3)); PutPixel(GetX,GetY,Random(GetMaxColor+1)); If (GetY >= GetMaxY) then MoveTo(Random(GetMaxX),0); Until KeyPressed; CloseGraph; End. Pn  (1Procedure MoveTo(X, Y : Integer); Moves the current pointer to a new position. See also: MoveRel, GetX, GetY, LineTo, LineRel, Graph Program MoveTo_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); MoveTo(GetMaxX,GetMaxY); LineTo(0,0); C := ReadKey; CloseGraph; End.   " -  Procedure OutText(TextString : string); Outputs a string of text at the current pointer (CP). TextString is written at the current pointer, using the current text style, direction and justification. If the direction is HorizDir and the justification is LeftText, the X part of the current pointer will be updated according to the length of the output string. See also: OutTextXY, TextHeight, TextWidth, SetTextStyle, SetTextJustify, Graph Program OutText_Demo; Uses Graph,UtilUnit; Var Driver,Mode : Integer; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Repeat MoveTo(Random(GetMaxX),Random(GetMaxY)); OutText('('+Int2Str(GetX)+','+Int2Str(GetY)+')'); Until KeyPressed; CloseGraph; End.    +  Procedure OutTextXY(X,Y : Integer; TextString : string); Outputs a string of text at the specified coordinates. (X,Y) is the point where the text is written. TextString is the string to write. The current pointer is not updated by a call to OutTextXY. See also: OutText, TextHeight, TextWidth, SetTextStyle, SetTextJustify, Graph Program OutTextXY_Demo; Uses Graph,UtilUnit; Var Driver,Mode,P : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); P := 0; Repeat OutTextXY(P,P,'('+Int2Str(P)+','+Int2Str(P)+')'); Inc(P,TextHeight('X')); Until (P > GetMaxY) Or (P > GetMaxX); C := ReadKey; CloseGraph; End.    ).6  &+Procedure PieSlice(X, Y : Integer; StAngle, EndAngle, Radius : Word); Draws and fills a pie slice. (X,Y) specifies the center point, StAngle the start angle, EndAngle the end angle and Radius the radius of the pie slice. The pie slice is drawn in the current color, and filled using the current fill settings. The shape of the pie slice is effected by the current aspect ratio settings. See also: SetAspectRatio, SetFillStyle, Arc, Circle, Rectangle, Sector, DrawPoly, Ellipse, Bar, Graph Program PieSlice_Demo; Uses Graph; Var Slice,F,Hy, Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); F := 360 DIV 12; Hy := GetMaxY DIV 2; For Slice := EmptyFill to CloseDotFill Do Begin SetFillStyle(Slice,Random(GetMaxColor)+1); SetColor(Random(GetMaxColor)+1); PieSlice(GetMaxX DIV 2,Hy,(Slice*F)+2,(Succ(Slice)*F)-2,Hy); End; C := ReadKey; CloseGraph; End. }  Procedure PutImage(X, Y : Integer; var BitMap; BitBlt : Word); Puts a stored image onto the screen. (X,Y) specifies where on the screen to put the stored image. BitMap contains the image. BitBlt specifies the binary operation to use, when putting the image onto the screen. The legal values for BitBlt are declared in the Graph unit as: Const NormalPut=0; CopyPut=0; XorPut=1; OrPut=2; AndPut=3; NotPut=4; NormalPut and CopyPut will simply put the stored image onto the screen. XorPut will XOR (EOR), OrPut will OR and AndPut will AND the stored image with the current screen contents. NotPut will NOT (Invert) the stored image onto the screen. If BitBlt contains an illegal value, the image will not be put onto the screen. See also: GetImage, Graph   Procedure PutPixel(X, Y : Integer; Pixel : Word); Plots a pixel in the specified color at the specified point. See also: GetPixel, GetColor, Graph Program Pixel_Demo; Uses Graph; Var Rx,Ry, Driver,Mode : Integer; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Randomize; SetFillStyle(LtBkSlashFill,Random(GetMaxColor)+1); Bar3D(0,0,100,100,0,TopOff); Repeat Rx := Random(101); Ry := Random(101); PutPixel(100+Rx,100+Ry,GetPixel(Rx,Ry)); Until KeyPressed; CloseGraph; End. T|   # + 5   Procedure Rectangle(x1, y1, x2, y2 : Integer); Draws a rectangle. (x1,y1) specifies the upper-left and (x2,y2) the lower-right corner of the rectangle. The rectangle is drawn in the current color, using the current line style. See also: SetWriteMode, Bar, Arc, Circle, PieSlice, Sector, DrawPoly, Ellipse, Graph Program Rectangle_Demo; Uses Graph; Var Driver,Mode : Integer; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Repeat SetColor(Random(GetMaxColor)+1); Rectangle(Random(GetMaxX),Random(GetMaxY), Random(GetMaxX),Random(GetMaxY)); Until KeyPressed; CloseGraph; End. '[7  Procedure RestoreCrtMode; Clears the screen and turns on the text cursor. When the text cursor is no longer required, a call to SetGraphMode will turn it off. See also: SetGraphMode, Graph Program RestoreCrtMode_Demo; Uses Graph; Var Height, Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); RestoreCrtMode;{ Turn on text cursor } Write('Enter height of bar 0-',GetMaxY,': '); ReadLn(Height); SetGraphMode(GetGraphMode); { Turn off text cursor } Bar(10,0,30,Height); C := ReadKey; CloseGraph; End. (   & 0 ; Procedure Sector(x,y: Integer; StAngle,EndAngle,XRadius,YRadius: Word); Draws and fills an elliptical sector. (X,Y) specifies the center point of the sector. StAngle, EndAngle specifies the starting and ending angle and XRadius, YRadius specifies the x and y radius of the sector. The sector is drawn in the current color, and filled using the current fill settings. See also: SetFillStyle, Arc, Circle, PieSlice, Rectangle, DrawPoly, Ellipse, Bar, Graph Program Sector_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Randomize; SetColor(Random(GetMaxColor)); SetFillStyle(SolidFill,Random(GetMaxColor)); Sector(GetMaxX DIV 2,GetMaxY DIV 2,30,330,100,100); C := ReadKey; CloseGraph; End.  B * 3    'Procedure SetActivePage(Page : Word); Specifies what screen page to work on. Page must be either 0 or 1. Note: Page 0 will always be available since it is the default screen page, created by the operating system. Page 1 is a virtual screen page, created by the InitGraph procedure. If InitGraph could not create page 1, due to insufficient space in the heap, any reference to this page will be ignored, and the GraphResult function will return -11 (GrError). See also: SetVisualPage, GraphResult, Graph Program ScreenPage_Demo; Uses Graph; Const Mess = 'Press any key to look at page '; Var Driver,Mode : Integer; C: Char; Function RandX : Integer; Begin RandX := Random(GetMaxX); End; Function RandY : Integer; Begin RandY := Random(GetMaxY); End; Procedure Many_Triangles; Var Poly: Array[1..3] Of PointType; Extra : Byte; Begin Repeat Extra := Random(100); SetFillStyle(Random(UserFill),Random(GetMaxColor+1)); Poly[1].X := RandX; Poly[1].Y := RandY; Poly[2].X := Poly[1].X-Extra; Poly[2].Y := Poly[1].Y+Extra; Poly[3].X := Poly[1].X+Extra; Poly[3].Y := Poly[2].Y; FillPoly(3,Poly); Until KeyPressed; C := ReadKey; End; Procedure Many_Bars; Begin Repeat SetFillStyle(Random(CloseDotFill)+1,Random(GetMaxColor+1)); Bar3D(RandX,RandY,RandX,RandY,0,TopOff); Until KeyPressed; C := ReadKey; End; Procedure Message( Line1, Line2 : String ); Var Th,Hx,Hy,W : Integer; Begin Th := TextHeight('M')*2; Hx := GetMaxX DIV 2; Hy := GetMaxY DIV 2; W := (8+TextWidth(Line2) DIV 2); SetFillStyle(EmptyFill,GetMaxColor); Bar3D(Hx-W,Hy-Th*1,Hx+W,Hy+Th*2,0,TopOff); SetTextJustify(CenterText,CenterText); OutTextXY(Hx,Hy,'PAGE '+Line1); OutTextXY(Hx,Hy+Th,Line2); End; Begin Driver := DETECT; InitGraph(Driver,Mode,''); SetActivePage(1);{ Does page 1 exist ? } If (GraphResult = GrOK) then Begin SetActivePage(0); Message('0',Mess+'1');{ Display message on page 0. } SetActivePage(1);{ Start working on page 1. } Many_Triangles;{ Work, until a key is pressed. } Message('1',Mess+'0');{ Write a message. } SetVisualPage(1);{ Now display page 1. } SetActivePage(0);{ Start working on page 0. } Many_Bars;{ Work, until a key is pressed. } Message('0','The end'); { Write a message. } SetVisualPage(0);{ Now display page 0. } End Else OutText('Paging not possible.'); C := ReadKey; CloseGraph; End. wT  & 2 Procedure SetAllPalette(var Palette); Sets a number of palette entries to a new color. Palette is a typeless variable, but it's structure resembles the structure of the PaletteType record: Type PaletteType = Record Size: Integer; Colors: Array[0..15] Of ShortInt; End; The first integer specifies the number of colors in Palette. The following N bytes (ShortInt's) are the replacement colors to put into the palette. The number of colors that Palette may contain, depends on the current graphics driver and mode: DriverModePalette entries -" StColorStLow16 StColorStMedium4 StMonoStHigh2 If one of the color values in Palette equals -1, the palette entry for that color will not be changed. See also: SetPalette, SetRGBPalette, GetPalette, GetPaletteSize, GetDefaultPalette, Graph Program SetAllPalette_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; PalData: PaletteType; Begin Driver := DETECT; InitGraph(Driver,Mode,''); GetPalette(PalData); PalData.Colors[0] := Red; { No reaction on a mono screen } SetAllPalette(PalData); C := ReadKey; CloseGraph; End. x"-  *2Procedure SetAspectRatio(Xasp, Yasp : Word); Selects the X and Y value used in the aspect ratio calculations. The aspect ratio is used by Arc, Circle and PieSlice to ensure that the circular figures will appear on the screen as being round and not egg-shaped. These are the default aspect values for the 3 graphic modes: ModeXaspYasp - StLow878810000 StMedium 439410000 StHigh967210000 See also: GetAspectRatio, Arc, PieSlice, Circle, Graph Program SetAspectRatio_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; Xasp,Yasp: Word; Begin Driver := DETECT; InitGraph(Driver,Mode,''); SetTextJustify(CenterText,CenterText); OutTextXY(100,100,'Circle'); Circle(100,100,45); GetAspectRatio(Xasp,Yasp); Dec(Yasp,5000); SetAspectRatio(Xasp,Yasp); OutTextXY(200,100,'Egg'); Circle(200,100,45); C := ReadKey; CloseGraph; End.  ! . :Procedure SetBkColor( Color : Word ); Selects the background color. The range of the Color parameter depends on the current graphics driver and mode: DriverModeColor range - StColorStLow0..15 StColorStMedium 0..3 StMonoStHigh0..1 See also: GetBkColor, SetColor, GetMaxColor, SetPalette, Graph Program SetBkColor_Demo; Uses Graph; Var Driver,Mode : Integer; Begin Driver := DETECT; InitGraph(Driver,Mode,''); SetTextJustify(CenterText,CenterText); OutTextXY(GetMaxX DIV 2,GetMaxY DIV 2,'Hello'); Repeat SetBkColor(Random(GetMaxColor)); { No reaction on a mono screen } Until KeyPressed; CloseGraph; End. :=   " . :Procedure SetColor(Color : Word); Selects the foreground color. Color specifies what entry in the palette that is to be used as the foreground color. The range of Color depends on the current graphics driver and mode: DriverModeRange of Color -$ StColorStLow0..15 StColorStMedium0..3 StMonoStHigh0..1 If an illegal value is passed to SetColor, the foreground color will not be changed. The highest legal color number is returned by a call to the GetMaxColor function. See also: GetColor, GetMaxColor, SetBkColor, SetPalette, Graph Program SetColor_Demo; Uses Graph; Var Driver,Mode : Integer; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Repeat SetColor(Random(GetMaxColor+1)); Line(0,0,Random(GetMaxX),Random(GetMaxY)); Until KeyPressed; CloseGraph; End.  1 # ##)#: $ $ $#$-$2$9% Procedure SetFillPattern(Pattern : FillPatternType; Color : Word); Specifies the appearance of the user-defined fill pattern. The FillPatternType array is declared in the Graph unit as: Type FillPatternType = Packed Array[1..8] Of Byte; Fill patterns are made up of 8*8 bits. When filling is done, a pixel will be lit on the screen when a bit in the pattern is on. To fill the screen with small circles, the following fill pattern would have to be defined: Binary patternPattern[1..8] - 0001110028 { Pattern[1] } 0010001034 { Pattern[2] } 010165 { Pattern[3] } 010165 { Pattern[4] } 010165 { Pattern[5] } 0010001034 { Pattern[6] } 0001110028 { Pattern[7] } 0 0 { Pattern[8] } Color specifies what fill color to use. If illegal values are passed to SetFillPattern, GraphResult will return -11 (GrError), and the current fill settings will not be changed. Otherwise the current fill pattern and fill color will be set equal to the Pattern and Color parameters. See also: SetFillStyle, GetFillPattern, GetFillSettings, GraphResult, FloodFill, FillEllipse, FillPoly, Bar, Bar3D, PieSlice, Graph Program SetFillPattern_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; NewPattern: FillPatternType; Begin NewPattern[1] := 28; NewPattern[2] := 34; NewPattern[3] := 65; NewPattern[4] := 65; NewPattern[5] := 65; NewPattern[6] := 34; NewPattern[7] := 28; NewPattern[8] := 0; Driver := DETECT; InitGraph(Driver,Mode,''); SetColor(GetColor); Rectangle(0,0,GetMaxX,GetMaxY); SetFillPattern(NewPattern,GetColor); FloodFill(1,1,GetColor); C := ReadKey; CloseGraph; End. H? 3 / # ##,#< $ $ $#$-$2$9% Procedure SetFillStyle(Pattern, Color : Word); Selects the pattern and the color to use in fill operations. Pattern specifies the fill pattern to use. The legal values are declared in the Graph unit as: Const EmptyFill=0;{ Background color is used. } SolidFill=1;{ Solid fill. } LineFill =2;{ --- } LtSlashFill=3;{ \\\ thin lines. } SlashFill=4;{ \\\ thick lines. } BkSlashFill=5;{ /// thick lines. } LtBkSlashFill=6;{ /// thin lines. } HatchFill=7;{ Hatch fill. } XHatchFill=8;{ Cross fill. } InterLeaveFill=9; { Very close dots. } WideDotFill=10;{ Widely dotted fill. } CloseDotFill=11;{ Close dots. } UserFill =12;{ User defined fill. } EmptyFill..CloseDotFill selects one of the predefined fill patterns. UserFill selects the pattern defined in a call to SetFillPattern. If no such call has been made, the user-defined pattern will default to SolidFill. Color specifies what fill color to use. The range of Color depends on the current graphics driver and mode. If illegal values are passed to SetFillStyle, GraphResult will return -11 (GrError), and the current fill settings will not be changed. See also: SetFillPattern, GetFillSettings, GetFillPattern, GetMaxColor, FloodFill, FillEllipse, FillPoly, Bar, Bar3D, PieSlice, Graph Program SetFillStyle_Demo; Uses Graph; Var Sx,Sy, Driver,Mode : Integer; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Repeat SetFillStyle(Random(UserFill),Random(GetMaxColor)+1); Sx := Random(GetMaxX-20); Sy := Random(GetMaxY-20); Bar(Sx,Sy,Sx+20,Sy+20); Until KeyPressed; CloseGraph; End. ' 5   %5   &Procedure SetGraphMode(Mode : Integer); Sets the active driver to operate in the specified mode. Mode specifies the mode to change to. The range of Mode depends on the current driver: DriverPossible modes -! StColorStLow and StMedium StMonoStHigh SetGraphMode can also be used to turn off the text cursor, after a call has been made to RestoreCrtMode. If an invalid mode value is passed to SetGraphMode, GraphResult will return -10 (GrInvalidMode) and the current mode will not be changed. See also: GetMaxMode, GetGraphMode, RestoreCrtMode, GetDriverName, GetModeName, GetModeRange, Graph Program SetGraphMode_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); If (Driver = StColor) then Begin OutText(GetModeName(Mode)); C := ReadKey; If (Mode = StLow) then SetGraphMode(StMedium) Else SetGraphMode(StLow); OutText(GetModeName(Mode)); End{ Change resolution } Else OutText('Can''t change the resolution.'); C := ReadKey; CloseGraph; End. 3 ! ! !*!0!8" Procedure SetLineStyle(LineStyle, Pattern, Thickness : Word); Specifies the pattern and width of lines. LineStyle specifies what line pattern to use. The legal values are declared in the Graph unit as: Const{ Bit-pattern used: } SolidLn=0; { 1} DottedLn =1; { 11101110} CenterLn =2; { 1000111000} DashedLn =3; { 1 0000} UserBitLn=4; If LineStyle equals UserBTitLn, the 16 bits passed in the Pattern parameter will be used as the line pattern. Otherwise one of the predefined line patterns will be used. Thickness specifies how thick lines are to be. The legal values are declared in the Graph unit as: Const NormWidth=1; { Width is 1 pixel } ThickWidth=3; { Width is 3 pixels } If the VDI in your machine does not support thick lines with different patterns, the width will default to NormWidth, even if the Thickness parameter equals ThickWidth. If illegal values are passed to SetLineStyle, the GraphResult function will return -11 (GrError), and the current settings will not be changed. See also: GetLineSettings, SetWriteMode, Line, LineTo, LineRel, Graph Program SetLineStyle_Demo; Uses Graph; Var Driver,Mode,X : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); SetWriteMode(XorPut); Repeat For X := SolidLn to DashedLn Do Begin SetLineStyle(X,0,NormWidth); Line(0,0,GetMaxX,GetMaxY); End; Until KeyPressed; C := ReadKey; CloseGraph; End. A  )9Procedure SetPalette( PalEntry, NewColor : Integer ); Sets a specified palette entry to a new color. PalEntry is the palette entry to change. The range of PalEntry depends on the current driver and mode: DriverModePalEntry range -" StColorStLow0..15 StColorStMedium0..3 StMonoStHigh0..1 NewColor is the new color to put into the palette. The range of NewColor is 0..15. See also: SetAllPalette, SetRGBPalette, GetPaletteSize, Graph Program SetPalette_Demo; Uses Graph; Var Driver,Mode,X : Integer; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Repeat SetColor(Random(GetMaxColor+1)); Line(0,0,Random(GetMaxX),Random(GetMaxY)); Until KeyPressed; For X := 0 to GetMaxColor Do Begin SetPalette(X,0); { Remove color X from screen } Delay(100); End; CloseGraph; End. l  &6Procedure SetRGBPalette( PalEntry, Red, Green, Blue : Integer ); Changes the Red-Green-Blue color mix for a specified palette entry. PalEntry specifies the palette entry to change. The range of PalEntry depends on the current graphics driver and mode: DriverModeRange of PalEntry -% StColorStLow0..15 StColorStMedium0..3 StMonoStHigh0..1 The Red, Green and Blue parameters represents the intensity of the three basic colors, and must all be in the range 0..63. If illegal values are passed to SetRGBPalette, no change will be made to the palette. See also: SetPalette, SetAllPalette, GetPaletteSize, Graph Program SetRGBPalette_Demo; Uses Graph; Var RGB, Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); SetTextJustify(CenterText,CenterText); MoveTo(GetMaxX DIV 2,GetMaxY DIV 2); OutTextXY(GetX,GetY-10,'HighSpeed Pascal'); OutTextXY(GetX,GetY+10,'programming'); Repeat For RGB := 0 to 63 Do Begin SetRGBPalette(GetColor,RGB,RGB,RGB); Delay(5); End; For RGB := 63 Downto 0 Do Begin SetRGBPalette(GetColor,RGB,RGB,RGB); Delay(5); End; Until KeyPressed; C := ReadKey; CloseGraph; End.  ; '1 + ++*+3 +>Procedure SetTextJustify(Horiz, Vert : Word); Sets the justification for graphic text output. Horiz specifies the horizontal justification. The legal values are declared in the Graph unit as: Const LeftText =0; CenterText=1; RightText=2; Vert specifies the vertical justification: Const BottomText=0; {CenterText=1;} TopText=2; Text is always centered around a, so called, base-point. When using OutText the base-point is the current pointer, when using OutTextXY the base-point is the point defined by the specified X and Y coordi- nates. This is a listing of the various justification settings: Horizontal justification: -: LeftText Text is output to the left of the base-point. CenterTextText is output right on top of the base-point. RightTextText is output to the right of the base-point. Vertical justification: -: TopTextText is output with it's top on the base-point. CenterTextSame as above. BottomTextText is output with it's bottom on the base-point. If illegal values are passed to SetTextJustify, GraphResult will return -11 (GrError), and the current justification settings will not be changed. See also: SetTextStyle, GetTextSettings, OutText, OutTextXY, Graph Program SetTextJustify_Demo; Uses Graph; Var ExtraX, Driver,Mode : Integer; C: Char; Procedure OutPutX( Data : String ); Begin OutText(Data); MoveRel(ExtraX,0); End; Procedure OutPutY( Data : String ); Begin OutText(Data); MoveTo(GetMaxX DIV 2,GetY+TextHeight('M')); End; Begin Driver := DETECT; InitGraph(Driver,Mode,''); SetTextStyle(DefaultFont,HorizDir,2); ExtraX := TextWidth('M')*12; Line(0,30,GetMaxX,30); MoveTo((GetMaxX DIV 2)-ExtraX ,30); SetTextJustify(CenterText,TopText); OutPutX('TopText'); SetTextJustify(CenterText,CenterText); OutPutX('CenterText'); SetTextJustify(CenterText,BottomText); OutPutX('BottomText'); Line(GetMaxX DIV 2, 100,GetMaxX DIV 2, 200); MoveTo(GetMaxX DIV 2,100); SetTextJustify(LeftText ,CenterText); OutPutY('LeftText'); SetTextJustify(CenterText,CenterText); OutPutY('CenterText'); SetTextJustify(RightText ,CenterText); OutPutY('RightText'); C := ReadKey; CloseGraph; End. 3  ,5 @Procedure SetTextStyle(Font, Direction, CharSize : Word); Selects the style, direction and size of graphic text. Font specifies the appearance of text. The legal values are declared in the Graph unit as: Const DefaultFont=0; TriplexFont=1; SmallFont=2; SansSerifFont=3; GothicFont=4; Direction specifies the direction of text: Const HorizDir =0; { From left to right } VertDir=1; { From bottom towards the top } CharSize specifies the size of text. The range of CharSize should be 1..7. If Font is illegal, GraphResult will return -14 (GrInvalidFontNum). If Direction is illegal -11 (GrError) will be returned. See also: SetTextJustify, GetTextSettings, OutText, OutTextXY, Graph Program SetTextStyle_Demo; Uses Graph,UtilUnit; Var Xc,Yc,Size: Word; Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Xc := 40; Yc := GetMaxY-40; MoveTo(Xc,0); LineTo(GetX,Yc); LineTo(GetMaxX,GetY); SetTextJustify(LeftText,BottomText); SetTextStyle(DefaultFont,VertDir,2); OutTextXY(Xc,Yc,'Vertical'); SetTextJustify(LeftText,TopText); SetTextStyle(DefaultFont,HorizDir,2); OutTextXY(Xc,Yc,'Horizontal'); SetTextJustify(CenterText,TopText); MoveTo(GetMaxX DIV 2,0); For Size := 1 to 7 Do Begin SetTextStyle(DefaultFont,HorizDir,Size); OutText('Size '+Int2Str(Size)); MoveRel(0,TextHeight('S')); End; C := ReadKey; CloseGraph; End.  .   +Procedure SetViewPort(x1, y1, x2, y2 : Integer; newClip : Boolean); Specifies the boundaries and clipping state of the viewport. (x1,y1) specifies the upper-left corner, and (x2,y2) the lower-right corner of the viewport. newClip specifies whether or not to clip off any graphic output that exceeds the boundaries of the viewport. If illegal values are passed to SetViewPort, GraphResult will return -11 (GrError), and the current viewport settings will not be changed. Otherwise GraphResult will return 0 (GrOK), and the current pointer will be placed in the upper-left corner of the new viewport. See also: GetViewSettings, ClearViewPort, Graph Program SetViewPort_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); Rectangle(0,0,10,10); SetViewPort(20,20,GetMaxX,GetMaxY,ClipOn); Rectangle(0,0,10,10); SetViewPort(200,200,GetMaxX,GetMaxY,ClipOn); Rectangle(0,0,10,10); C := ReadKey; CloseGraph; End.   3    'Procedure SetVisualPage(Page : Word); Specifies what screen page to display. Page must be either 0 or 1. Note: Page 0 will always be available since it is the default screen page, created by the operating system. Page 1 is a virtual screen page, created by the InitGraph procedure. If InitGraph could not create page 1, due to insufficient space in the heap, any reference to this page will be ignored, and the GraphResult function will return -11 (GrError). See also: SetActivePage, GraphResult, Graph  #, 7Procedure SetWriteMode(WritMode : Integer); Specifies the way in which lines are to be put on the screen. The legal values for WritMode are declared in the Graph unit as: Const CopyPut=0; XorPut=1; When the write mode is set to CopyPut, it means that lines are simply put on the screen. When using XorPut, the lines will be XOR'ed (EOR'ed) onto the screen, which means that if the line is drawn twice at the same coordinates, the original contents of the screen will be restored. See also: DrawPoly, Line, LineTo, LineRel, Rectangle, Graph Program SetWriteMode_Demo; Uses Graph; Var C, Driver,Mode : Integer; Begin Driver := DETECT; InitGraph(Driver,Mode,''); C := 1; SetWriteMode(XorPut); Repeat Rectangle(C,C,GetMaxX-C,GetMaxY-C); { Draw rectangle } Rectangle(C,C,GetMaxX-C,GetMaxY-C); { Remove it } If (C > GetMaxY DIV 2) then C := 0 Else Inc(C,2); Until KeyPressed; CloseGraph; End. S{   *Function TextHeight(TextString : string) : Word; Returns the height, in pixels, of a text string. The value returned by TextHeight depends on the current font settings. TextHeight, together with the TextWidth function, is useful when centering text on the screen. See also: TextWidth, OutText, OutTextXY, Graph Program TextDimension_Demo; Uses Graph; Var Driver,Mode : Integer; C: Char; Begin Driver := DETECT; InitGraph(Driver,Mode,''); C := 'A'; Repeat OutText(C); MoveRel(TextWidth(C),TextHeight(C)); C := Succ(C); Until (GetY >= GetMaxY); C := ReadKey; CloseGraph; End. ::  +Function TextWidth(TextString : string) : Word; Returns the width, in pixels, of a text string. The value returned by TextWidth depends on the current font settings. TextWidth, together with the TextHeight function, is useful when centering text on the screen. See also: TextHeight, OutText, OutTextXY, Graph  / Function InstallUserDriver(Name:String;AutoDetectPtr:Pointer):Integer; InstallUserDriver is not implemented in this Graph unit version. See also: SetGraphBufSize, RegisterBGIDriver, InstallUserFont, RegisterBGIFont, SetUserCharSize  1 Procedure SetGraphBufSize(BufSize : Word); SetGraphBufSize is not implemented in this Graph unit version. See also: InstallUserDriver, RegisterBGIDriver, InstallUserFont, RegisterBGIFont, SetUserCharSize  / Function RegisterBGIdriver(Driver : Pointer) : Integer; RegisterBGIdriver is not implemented in this Graph unit version. See also: InstallUserDriver, SetGraphBufSize, InstallUserFont, RegisterBGIFont, SetUserCharSize  / Function (FontFileName : String) : Integer; InstallUserFont is not implemented in this Graph unit version. See also: InstallUserDriver, SetGraphBufSize, RegisterBGIDriver, RegisterBGIFont, SetUserCharSize  / FunctionRegisterBGIfont(Font : Pointer) : Integer; RegisterBGIfont is not implemented in this Graph unit version. See also: InstallUserDriver, SetGraphBufSize, RegisterBGIDriver, InstallUserFont, SetUserCharSize  / Procedure SetUserCharSize(MultX,DivX,MultY,DivY : Word); SetUserCharSize is not implemented in this Graph unit version. See also: InstallUserDriver, SetGraphBufSize, RegisterBGIDriver, InstallUserFont, RegisterBGIFont #~-i !*'8  ' 8 ' 8  '8   ' 8   ' 8   ' 8   ' 8   ' 8 ' 8   '8'8 '8 '8  ' 8 ' 8   '8   ' 8   - - 3/ *  , /        These are the routines implemented in the Graph unit: See also: Dos, Printer, System, System2, STPascal ArcBarBar3DCircle ClearDeviceClearViewPort CloseGraphDetectGraph DrawPolyEllipseFillEllipseFillPoly FloodFillGetArcCoordsGetAspectRatioGetBkColor GetColorGetDefaultPalette GetDriverNameGetFillPattern GetFillSettings GetGraphModeGetImageGetLineSettings GetMaxColorGetMaxModeGetMaxXGetMaxY GetModeNameGetModeRangeGetPalette GetPaletteSize GetPixelGetTextSettingsGetViewSettings GetX GetYGraphDefaultsGraphErrorMsgGraphResult ImageSizeInitGraphLineLineRel LineToMoveRelMoveTo OutText OutTextXYPieSlicePutImagePutPixel RectangleRestoreCrtModeSectorSetActivePage SetAllPaletteSetAspectRatioSetBkColorSetColor SetFillPatternSetFillStyleSetGraphModeSetLineStyle SetPaletteSetRGBPaletteSetTextJustifySetTextStyle SetViewPortSetVisualPage SetWriteMode TextHeight TextWidth UNIT Graph; INTERFACE Uses STPascal, GemDecl, GemAES, GemVDI, BIOS; Const { GraphResult return values. } GrOK=0;{ No error } GrNoInitGraph= -1;{ Graph has not been initialized } GrNotDetected= -2;{ No graphics adapter detected } GrFileNotFound =-3; GrInvalidDriver =-4;{ Bad driver for hardware configuration } GrNoLoadMem=-5; GrNoScanMem=-6; GrNoFloodMem=-7; GrFontNotFound =-8; GrNoFontMem=-9; GrInvalidMode= -10;{ Bad mode for graphics driver } GrError= -11;{ Generic error } GrIOError= -12; GrInvalidFont= -13; GrInvalidFontNum= -14;{ Invalid font number requested } { Driver numbers. } DETECT=0; CGA=1; MCGA=2; EGA=3; EGA64=4; EGAMono=5; IBM8514=6; HercMono=7; ATT400=8; VGA=9; PC3270=10; StColor=11; { If you have a color monitor. } StMono=12; { If you have a monochrome monitor. } { Mode numbers. } StLow=0; { 320 x 200, 4 bitplanes, Color } StMedium=1; { 640 x 200, 2 bitplanes, Color } StHigh=2; { 640 x 400, 1 bitplane , Mono } CGAC0=0; CGAC1=1; CGAC2=2; CGAC3=3; CGAHi=4; MCGAC0=0; MCGAC1=1; MCGAC2=2; MCGAC3=3; MCGAMed=4; MCGAHi=5; EGALo=0; EGAHi=1; EGA64Lo=0; EGA64Hi=1; EGAMonoHi=3; HercMonoHi=0; ATT400C0=0; ATT400C1=1; ATT400C2=2; ATT400C3=3; ATT400Med=4; ATT400Hi=5; VGALo=0; VGAMed=1; VGAHi=2; PC3270Hi=0; IBM8514Lo=0; IBM8514Hi=1; { Color numbers. } Black=0; Blue=1; Green=2; Cyan=3; Red=4; Magenta=5; Brown=6; LightGray=7; DarkGray=8; LightBlue=9; LightGreen=10; LightCyan=11; LightRed=12; LightMagenta=13; Yellow=14; White=15; { EGA colors on the IBM8514. } EGABlack=0; EGABlue=1; EGAGreen=2; EGACyan=3; EGARed=4; EGAMagenta=5; EGABrown=20; EGALightGray= 7; EGADarkGray=56; EGALightBlue=57; EGALightGreen= 58; EGALightCyan=59; EGALightRed=60; EGALightMagenta =61; EGAYellow=62; EGAWhite=63; { Line styles used by GetLineSettings and SetLineStyle. } SolidLn=0; DottedLn=1; CenterLn=2; DashedLn=3; UserBitLn=4; NormWidth=1; ThickWidth=3; { Font styles used by GetTextSettings and SetTextStyle. } DefaultFont=0; TriplexFont=1; SmallFont=2; SansSerifFont=3; GothicFont=4; HorizDir=0; VertDir=1; UserCharSize= 0; { Horizontal and vertical justification used by SetTextJustify. } LeftText=0; CenterText=1; RightText=2; BottomText=0; TopText=2; { Clipping status controls. } ClipOn= True; ClipOff= False; { Bar3D status controls. } TopOn= True; TopOff= False; { Fill patterns used by GetFillSettings and SetFillStyle. } EmptyFill=0; { Background color is used. } SolidFill=1; { Solid fill. } LineFill=2; { --- } LtSlashFill=3; { \\\ thin lines. } SlashFill=4; { \\\ thick lines. } BkSlashFill=5; { /// thick lines. } LtBkSlashFill=6; { /// thin lines. } HatchFill=7; { Hatch fill. } XHatchFill=8; { Cross fill. } InterLeaveFill =9; { Very close dots. } WideDotFill=10; { Widely dotted fill. } CloseDotFill=11; { Close dots. } UserFill=12; { User defined fill. } { Status controls used by PutImage and SetWriteMode. } NormalPut=0; { = MOV } CopyPut=0; { = MOV } XorPut=1; { = XOR } { Status controls used by PutImage. } OrPut=2; { = OR } AndPut=3; { = AND } NotPut=4; { = NOT } { Used by GetPalette, GetDefaultPalette, SetAllPalette. } MaxColors=15; Type { Used by GetPalette, GetDefaultPalette and SetAllPalette. } PaletteType= Record Size: Integer; Colors: Array[0..MaxColors] Of ShortInt;  End; { Used by GetLineSettings. } LineSettingsType= Record LineStyle, Pattern, ThickNess : Word;  End; { Used by GetTextSettings. } TextSettingsType= Record Font, Direction, CharSize, Horiz, Vert: Word;  End; { Used by GetFillSettings. } FillSettingsType= Record Pattern, Color: Word;  End; { Used by GetFillPattern and SetFillPattern. } FillPatternType = Packed Array[1..8] Of Byte; { Used by DrawPoly and FillPoly. } PointType= Record X,Y: Integer;  End; { Used by GetViewSettings. } ViewPortType= Record X1,Y1,X2,Y2 : Integer; Clip: Boolean;  End; { Used by GetArcCoords. } ArcCoordsType= Record X,Y, XStart, YStart, XEnd, YEnd: Integer;  End; { Aspect Routines } Procedure GetAspectRatio(var Xasp, Yasp : Word); Procedure SetAspectRatio(Xasp, Yasp : Word); { Bar Routines } Procedure Bar(x1, y1, x2, y2 : Integer); Procedure Bar3D(x1, y1, x2, y2 : Integer; Depth : Word; Top : Boolean); { Color and Palette Routines } FunctionGetBkColor : Word; FunctionGetColor : Word; Procedure GetDefaultPalette(var Palette :PaletteType); FunctionGetMaxColor : Word; Procedure GetPalette(var Palette : PaletteType); FunctionGetPaletteSize : Integer; Procedure SetAllPalette(var Palette); Procedure SetBkColor( Color : Word ); Procedure SetColor(Color : Word); Procedure SetPalette( PalEntry, NewColor : Integer ); Procedure SetRGBPalette( PalEntry, Red, Green, Blue : Integer ); { Device Routines } Procedure ClearDevice; Procedure CloseGraph; Procedure DetectGraph(var GraphDriver, GraphMode : Integer); FunctionGetDriverName : string; FunctionGetGraphMode : Integer; FunctionGetMaxMode : Integer; FunctionGetMaxX : Integer; FunctionGetMaxY : Integer; FunctionGetModeName(ModeNumber : Integer) : string; Procedure GetModeRange(GraphDriver :Integer; var LoMode, HiMode :Integer); Procedure GraphDefaults; Procedure InitGraph(var GraphDriver, GraphMode: Integer; Path: string); Procedure RestoreCrtMode; Procedure SetActivePage(Page : Word); Procedure SetGraphMode(Mode : Integer); Procedure SetVisualPage(Page : Word); { Error-Handling Routines } FunctionGraphErrorMsg(ErrorCode : Integer) : string; FunctionGraphResult : Integer; { Fill Routines } Procedure FillEllipse(X, Y: Integer; XRadius, YRadius: Word); Procedure FloodFill(X, Y : Integer; Border : Word); Procedure GetFillPattern(var FillPattern : FillPatternType); Procedure GetFillSettings(var FillInfo : FillSettingsType); Procedure SetFillPattern(Pattern : FillPatternType; Color : Word); Procedure SetFillStyle(Pattern : Word; Color : Word); { Image Routines } FunctionImageSize(x1, y1, x2, y2 : Integer) : LongInt; Procedure GetImage(x1, y1, x2, y2 : Integer; var BitMap); Procedure PutImage(X, Y : Integer; var BitMap; BitBlt : Word); { Line Routines } Procedure GetLineSettings(var LineInfo : LineSettingsType); Procedure Line(x1, y1, x2, y2 : Integer); Procedure LineRel(Dx, Dy : Integer); Procedure LineTo(X,Y : Integer); Procedure SetLineStyle(LineStyle, Pattern, Thickness : Word); { Pixel Routines } FunctionGetPixel(X,Y : Integer) : Word; Procedure PutPixel(X, Y : Integer; Pixel : Word); { Poly Routines } Procedure DrawPoly(NumPoints : Word; var PolyPoints); Procedure FillPoly(NumPoints : Word; var PolyPoints); { Text Routines } Procedure GetTextSettings(var TextInfo : TextSettingsType); Procedure OutText(TextString : string); Procedure OutTextXY(X,Y : Integer; TextString : string); Procedure SetTextJustify(Horiz, Vert : Word); Procedure SetTextStyle(Font, Direction, CharSize : Word); FunctionTextHeight(TextString : string) : Word; FunctionTextWidth(TextString : string) : Word; { Viewport Routines } Procedure ClearViewPort; Procedure GetViewSettings(var ViewPort : ViewPortType); Procedure SetViewPort(x1, y1, x2, y2 : Integer; newClip : Boolean); { Miscellaneous Routines } Procedure Arc(X,Y : Integer; StAngle, EndAngle, Radius : Word); Procedure Circle(X,Y : Integer; Radius : Word); Procedure Ellipse(X, Y : Integer; StAngle, EndAngle, XRad, YRad : Word); Procedure GetArcCoords(var ArcCoords : ArcCoordsType); FunctionGetX : Integer; FunctionGetY : Integer; Procedure MoveRel(Dx, Dy : Integer); Procedure MoveTo(X, Y : Integer); Procedure PieSlice(X, Y : Integer; StAngle, EndAngle, Radius : Word); Procedure Rectangle(x1, y1, x2, y2 : Integer); Procedure Sector(x, y: Integer; StAngle,EndAngle, XRadius, YRadius: Word); Procedure SetWriteMode(WritMode : Integer); :BB   # 3   # 3   # 3   #3   # 3   # 3   # 3   # 3   # 3   # 3   # 3   # 3   #3  # 3   # 3 # These are the routines implemented in the GemAES unit: See also: GemDecl, GemVDI, Graph appl_findappl_readappl_tplayappl_trecord appl_writeevnt_button evnt_dclick evnt_mesag evnt_mouseevnt_multievnt_timer form_alert form_centerform_dialform_doform_error fsel_exinputfsel_inputgraf_dragbox graf_growbox graf_handlegraf_mkstate graf_mousegraf_movebox graf_rubboxgraf_shrinkboxgraf_slidebox graf_watchbox menu_barmenu_icheckmenu_ienablemenu_register menu_textmenu_tnormalobjc_addobjc_change objc_deleteobjc_drawobjc_editobjc_find objc_offsetobjc_orderrsrc_gaddrrsrc_load rsrc_obfixrsrc_saddrscrp_readscrp_write shel_envrnshel_findshel_get shel_put shel_readshel_write wind_calcwind_close wind_createwind_deletewind_findwind_get wind_openwind_setwind_update Unit GemAES; INTERFACE Uses GemDecl; Const { EVENT manager definitions : } { Flags for evnt_multi : } MU_KEYBD= 1; { Wait for keyboard message } MU_BUTTON= 2;{ Wait for mouse button message } MU_M1= 4;{ Wait for mouse to enter/leave rectangle 1 } MU_M2= 8;{ Wait for mouse to enter/leave rectangle 2 } MU_MESAG= 16;{ Wait for a message to be ready in pipe } MU_TIMER= 32;{ Wait for timer message } { Keyboard states : } K_RSHIFT= 1; { Right key } K_LSHIFT= 2; { Left key } K_CTRL= 4;{ key } K_ALT= 8;{ key } { Message types : } MN_SELECTED = 10;{ Menu item selected } WM_REDRAW= 20; { Window redraw requested } WM_TOPPED= 21; { Window topped } WM_CLOSED= 22; { Window close "button" was hit } WM_FULLED= 23; { Window full "button" was hit } WM_ARROWED = 24;{ One of the slider bar arrows was hit } WM_HSLID= 25;{ Horizontal slider moved } WM_VSLID= 26;{ Vertical slider moved } WM_SIZED= 27;{ Window re-sized } WM_MOVED= 28;{ Window moved } WM_NEWTOP= 29; { New window on top (activated) } AC_OPEN= 40;{ Accessory opened } AC_CLOSE= 41;{ Accessory closed } { FORM Manager definitions } { Form flags (for form_dial) : } FMD_START= 0;{ Start form (reserve memory) } FMD_GROW= 1; { Draw "growing box" image } FMD_SHRINK = 2;{ Draw "shrinking box" image } FMD_FINISH = 3;{ Finish form (release memory) } { RESOURCE Manager Definitions } { Resource data structure types : } R_TREE= 0;{ An entire tree } R_OBJECT= 1; { An object } R_TEDINFO= 2;{ Text info block (TEDINFO) } R_ICONBLK= 3;{ Icon data block (ICONBLK) } R_BITBLK= 4; { Raster block (BITBLK) } R_STRING= 5; { String } R_IMAGEDATA = 6;{ Image } R_OBSPEC= 7; { Object specification } R_TEPTEXT= 8;{ Text } R_TEPTMPLT = 9;{ Text template } R_TEPVALID = 10;{ Text validation } R_IBPMASK= 11; { Icon display mask } R_IBPDATA= 12; { Icon bit map } R_IBPTEXT= 13; { Icon text string } R_BIPDATA= 14; { Pointer to bit mapped graphics } R_FRSTR= 15;{ Address of pointer to free string } R_FRIMG= 16;{ Address of pointer to free image } { WINDOW Manager Definitions } { Window elements : } NAME=1; { Window name field } CLOSER=2; { Close fields } FULLER=4; { Full field } MOVER=8; { Movable } INFO=16; { Info line } SIZER=32; { Size field } UPARROW=64; { UpArrow at vertical slider field } DNARROW= 128; { DownArrow at vertical slider field } VSLIDE= 256; { Vertical slider field } LFARROW= 512; { LeftArrow at horizontal slider field } RTARROW= 1024; { RightArrow at horizontal slider field } HSLIDE= 2048; { Horizontal slider } { wind_calc flags : } WC_BORDER= 0; { Calculate border area from known work area } WC_WORK= 1;{ Calculate work area from known border area } { wind_get flags } WF_KIND= 1;{ Window kind } WF_NAME= 2;{ Window name } WF_INFO= 3;{ Window info } WF_WORKXYWH = 4;{ Window work area x, y, w, h } WF_CURRXYWH = 5;{ Current border area x, y, w, h } WF_PREVXYWH = 6;{ Previous border area x, y, w, h } WF_FULLXYWH = 7;{ Max border area size x, y, w, h } WF_HSLIDE= 8; { Horizontal slider position [0..1000] } WF_VSLIDE= 9; { Vertical slider position [0..1000] } WF_TOP= 10;{ Active window's handle } WF_FIRSTXYWH= 11;{ First rectangle in rectangle list } WF_NEXTXYWH = 12;{ Next rectangle in rectangle list } WF_RESVD= 13;{ Reserved! } WF_NEWDESK = 14; WF_HSLSIZE = 15;{ Relative size of horizontal slider } WF_VSLSIZE = 16;{ Relative size of vertical slider } WF_SCREEN= 17; { wind_update flags } END_UPDATE = 0;{ End update } BEG_UPDATE = 1;{ Begin update } END_MCTRL= 2; { End mouse control } BEG_MCTRL= 3; { Begin mouse control } { GRAPHICS Manager Definitions } { Mouse Forms : } ARROW=0; { The normal arrow } TEXT_CRSR= 1; { Text cursor } BUSYBEE=2; { The busy bee } HOURGLASS= 2; { Same as BUSYBEE } POINT_HAND =3; { Pointing hand } FLAT_HAND= 4; { Flat hand } THIN_CROSS =5; { Thin cross } THICK_CROSS =6; { Thick cross } OUTLN_CROSS =7; { Outlined cross } USER_DEF= 255; { User defined mouse pattern } M_OFF= 256; { Turn mouse off } M_ON= 257; { Turn mouse on } { Graphic objects : } G_BOX= 20;{ A box } G_TEXT= 21;{ Text } G_BOXTEXT= 22; { Text within a box } G_IMAGE= 23;{ Raster image } G_USERDEF= 24; { User defined object } G_IBOX= 25;{ Invisible (transparent) box } G_BUTTON= 26;{ Centered text in a box } G_BOXCHAR= 27; { Char within a box } G_STRING= 28;{ Text (menu item) } G_FTEXT= 29;{ Formatted text } G_FBOXTEXT = 30;{ Text within a box } G_ICON= 31;{ Icon } G_TITLE= 32;{ Text (menu title) } { Object flags : } NONE=0; { No flags } SELECTABLE =1; { Object is selectable } DEFAULT=2; { Object is default } F_EXIT=4; { Object causes exit } EDITABLE=8; { Object is editable } RBUTTON= 16; { Object is radiobutton } LASTOB= 32; { Object is last in tree } TOUCHEXIT= 64; { Object touch causes exit } HIDETREE= 128; { Hide subordinate objects } INDIRECT= 256; { Object specification is a pointer } { Object states : } NORMAL= 0;{ Normal state } SELECTED= 1;{ Object is selected } CROSSED= 2;{ Object is crossed } CHECKED= 4;{ Object is checked } DISABLED= 8;{ Object is disabled } OUTLINED= 16;{ Object is outlined } SHADOWED= 32;{ Object is shadowed } { Object color numbers : } White= 0; Black= 1; Red= 2; Green= 3; Blue= 4; Cyan= 5; Yellow= 6; Magenta= 7; LWhite= 8; LBlack= 9; LRed= 10; LGreen= 11; LBlue= 12; LCyan= 13; LYellow= 14; LMagenta= 15; { Editable text field definitions : } EDSTART= 0; EDINIT= 1; EDCHAR= 2; EDEND= 3; { Editable text justification : } TE_LEFT= 0;{ Left justified } TE_RIGHT= 1; { Right justified } TE_CNTR= 2;{ Centered } { Scancodes for evnt_multi and evnt_keybd : } BackSpace = $0E08; Tab= $0F09; S_Delete = $537F; S_Insert = $5200; Shift_Ins = $5230; Return= $1C0D; Enter= $720D; Undo= $6100; Help = $6200; Home= $4700; Cur_Up= $4800; Cur_Down = $5000; Cur_Left = $4B00; Cur_Right = $4D00; Shift_Home= $4737; Shift_CU = $4838; Shift_CD = $5032; Shift_CL = $4B34; Shift_CR = $4D36; Esc= $011B; Ctrl_A = $1E01; Ctrl_B = $3002; Ctrl_C = $2E03; Ctrl_D = $2004; Ctrl_E = $1205; Ctrl_F = $2106; Ctrl_G = $2207; Ctrl_H = $2308; Ctrl_I = $1709; Ctrl_J = $240A; Ctrl_K = $250B; Ctrl_L = $260C; Ctrl_M = $320D; Ctrl_N = $310E; Ctrl_O = $180F; Ctrl_P = $1910; Ctrl_Q = $1011; Ctrl_R = $1312; Ctrl_S = $1F13; Ctrl_T = $1414; Ctrl_U = $1615; Ctrl_V = $2F16; Ctrl_W = $1117; Ctrl_X = $2D18; Ctrl_Y = $2C19; Ctrl_Z = $151A; Ctrl_1 = $0211; Ctrl_2 = $0300; Ctrl_3 = $0413; Ctrl_4 = $0514; Ctrl_5 = $0615; Ctrl_6 = $071E; Ctrl_7 = $0817; Ctrl_8 = $0918; Ctrl_9 = $0A19; Ctrl_0 = $0B10; Alt_A = $1E00; Alt_B = $3000; Alt_C = $2E00; Alt_D = $2000; Alt_E = $1200; Alt_F = $2100; Alt_G = $2200; Alt_H = $2300; Alt_I = $1700; Alt_J = $2400; Alt_K = $2500; Alt_L = $2600; Alt_M = $3200; Alt_N = $3100; Alt_O = $1800; Alt_P = $1900; Alt_Q = $1000; Alt_R = $1300; Alt_S = $1F00; Alt_T = $1400; Alt_U = $1600; Alt_V = $2F00; Alt_W = $1100; Alt_X = $2D00; Alt_Y = $2C00; Alt_Z = $1500; Alt_1 = $7800; Alt_2 = $7900; Alt_3 = $7A00; Alt_4 = $7B00; Alt_5 = $7C00; Alt_6 = $7D00; Alt_7 = $7E00; Alt_8 = $7F00; Alt_9 = $8000; Alt_0 = $8100; F1 = $3B00; F2 = $3C00; F3 = $3D00; F4 = $3E00; F5 = $3F00; F6 = $4000; F7 = $4100; F8 = $4200; F9 = $4300; F10 = $4400; Shift_F1 = $5400; Shift_F2 = $5500; Shift_F3 = $5600; Shift_F4 = $5700; Shift_F5 = $5800; Shift_F6 = $5900; Shift_F7 = $5A00; Shift_F8 = $5B00; Shift_F9 = $5C00; Shift_F10 = $5D00; { Language dependent scan codes : } Ctrl_AE= $2804; Ctrl_OE = $2714; Ctrl_UE= $1A01; Alt_AE= $285D; Alt_OE= $275B; Alt_UE = $1A40; SH_Alt_AE = $287D; SH_Alt_OE = $277B; SH_Alt_UE = $1A5C; Function GemError : Integer; (*** APPLICATION LIBRARY ***) Function appl_init: Integer; Function appl_find(ap_fpname: Pointer): Integer; Function appl_trecord(ap_trmem: Pointer; ap_trcount: Integer): Integer; Procedure appl_read(ap_rid, ap_rlength: Integer; ap_rpbuff: Pointer); Procedure appl_write(ap_wid, ap_wlength: Integer; ap_wpbuff: Pointer); Procedure appl_tplay(ap_tpmem: Pointer; ap_tpnum, ap_tpscale: Integer); Procedure appl_exit; (*** EVENT LIBRARY ****) Function evnt_keybd: Integer; Function evnt_dclick(ev_dnew, ev_dgtest: Integer): Integer; Procedure evnt_mesag(ev_mgpbuff: Pointer); Procedure evnt_timer(ev_tlocount, ev_thicount: Integer); Function evnt_multi( ev_mflags, ev_mbclicks, ev_mbmask, ev_mbstate, ev_mm1flags, ev_mm1x, ev_mm1y, ev_mm1width, ev_mm1height, ev_mm2flags, ev_mm2x, ev_mm2y, ev_mm2width, ev_mm2height: Integer; ev_mmgpbuff: Pointer; ev_mtlocount, ev_mthicount: Integer; VAR ev_mmox, ev_mmoy, ev_mmobutton, ev_mmokstate, ev_mkreturn, ev_mbreturn: Integer): Integer; Function evnt_button(ev_bclicks, ev_bmask, ev_bstate: Integer; VAR ev_bmx,ev_bmy,ev_bmb,ev_bks: Integer): Integer; Procedure evnt_mouse(ev_moflags, ev_mox, ev_moy, ev_mowidth, ev_moheight: Integer; VAR ev_momx, ev_momy, ev_momb, ev_momks : Integer); (*** MENU LIBRARY ***) Procedure menu_bar(me_btree: Pointer; me_bshow: Integer); Procedure menu_icheck(me_ctree: Pointer; me_citem, me_ccheck: Integer); Procedure menu_ienable(me_etree: Pointer; me_eitem, me_eenable: Integer); Procedure menu_tnormal(me_ntree: Pointer; me_ntitle,me_nnormal: Integer); Procedure menu_text(me_ttree: Pointer; me_titem: Integer; me_ttext: Pointer); Function menu_register(me_raccapid: Integer; me_rpstring: Pointer): Integer; (*** OBJECT LIBRARY ***) Procedure objc_add(ob_atree: Pointer; ob_aparent, ob_achild: Integer); Procedure objc_delete(ob_dltree: Pointer; ob_dlobject: Integer); Procedure objc_draw(ob_dtree: Pointer;  ob_drstartob, ob_drdepth, ob_drxclip,  ob_dryclip, ob_drwclip, ob_drhclip: Integer); Function objc_find(ob_ftree: Pointer; ob_fstartob, ob_fdepth, ob_fmx, ob_fmy: Integer): Integer; Procedure objc_offset(ob_oftree: Pointer; ob_ofobject: Integer; VAR ob_ofxoff, ob_ofyoff: Integer); Procedure objc_order(ob_ortree: Pointer; ob_orobject, ob_ornewpos: Integer); Procedure objc_edit(ob_edtree: Pointer;  ob_edobject: Integer;  ob_edchar: Char;  ob_edidx, ob_edkind: Integer;  VAR ob_ednewidx: Integer); Procedure objc_change(ob_ctree: Pointer; ob_cobject, ob_cresvd, ob_cxclip, ob_cyclip, ob_cwclip, ob_chclip, ob_cnewstate, ob_credraw: Integer); (*** FORM LIBRARY ***) Function form_do(fo_dotree: Pointer; fo_dostartob: Integer): Integer; Function form_alert(fo_adefbttn: Integer; fo_aastring: Pointer): Integer; Function form_error(fo_enum: Integer): Integer; Procedure form_center(fo_ctree: Pointer; VAR fo_cx, fo_cy, fo_cw, fo_ch: Integer); Procedure form_dial(fo_diflag, fo_dilx, fo_dily, fo_dilw,fo_dilh,  fo_dibigx, fo_dibigy,fo_dibigw, fo_dibigh: Integer); (*** GRAPHICS LIBRARY ****) Procedure graf_mouse(gr_monumber: Integer; gr_mofaddr: Pointer); Procedure graf_mkstate(VAR gr_mkmx,gr_mkmy,gr_mkmstate,gr_mkkstate: Integer); Procedure graf_rubbox(gr_rx, gr_ry, gr_rminwidth, gr_rminheight: Integer; VAR gr_rlastwidth, gr_rlastheight: Integer); Procedure graf_dragbox(gr_dwidth, gr_dheight, gr_dstx, gr_dsty, gr_dbndx, gr_dbndy, gr_dbndw, gr_dbndh: Integer; VAR gr_dfinx, gr_dfiny: Integer); Procedure graf_movebox(gr_mwidth, gr_mheight, gr_msrcex, gr_msrcey,gr_mdestx, gr_mdesty: Integer); Procedure graf_growbox(gr_gstx, gr_gsty, gr_gstwidth, gr_gstheight,gr_gfinx, gr_gfiny, gr_gfinwidth, gr_gfinheight: Integer); Procedure graf_shrinkbox(gr_sstx, gr_ssty, gr_sstwidth, gr_sstheight,gr_sfinx, gr_sfiny, gr_sfinwidth, gr_sfinheight: Integer); Function graf_watchbox(gr_wptree: Pointer; gr_wobject, gr_winstate, gr_woutstate: Integer): Integer; Function graf_slidebox(gr_slptree: Pointer; gr_slparent, gr_slobject, gr_slvh: Integer): Integer; Function graf_handle(VAR gr_hwchar, gr_hhchar, gr_hwbox, gr_hhbox: Integer): Integer; (*** SCRAP LIBRARY ****) Procedure scrp_read(sc_rpbuff: Pointer); Procedure scrp_write(sc_wpbuff: Pointer); (*** FILE SELECTOR LIBRARY ****) Procedure fsel_input(fs_iinpath, fs_iinsel: Pointer; VAR fs_iexbutton: Integer); Procedure fsel_exinput(fs_iinpath, fs_iinsel: Pointer; VAR fs_iexbutton: Integer; fs_label: Pointer); (*** WINDOW LIBRARY ***) Procedure wind_close(wi_clhandle: Integer); Procedure wind_delete(wi_dhandle: Integer); Function wind_find(wi_fmx, wi_fmy: Integer): Integer; Procedure wind_update(wi_ubegend: Integer); Procedure wind_new; Procedure wind_open(wi_ohandle, wi_owx, wi_owy, wi_oww, wi_owh: Integer); Function wind_create(wi_crkind, wi_crwx, wi_crwy, wi_crww, wi_crwh: Integer): Integer; Procedure wind_get(wi_ghandle, wi_gfield: Integer; VAR wi_gw1, wi_gw2, wi_gw3, wi_gw4: Integer); Procedure wind_set(wi_shandle, wi_sfield, wi_sw1, wi_sw2, wi_sw3, wi_sw4: Integer); Procedure wind_calc(wi_ctype, wi_ckind,wi_cx, wi_cy,  wi_cinwidth, wi_cinheight: Integer;  VAR wi_coutx, wi_couty, wi_coutwidth,  wi_coutheight: Integer); (*** RESOURCE LIBRARY ****) Procedure rsrc_load(re_lpfname: Pointer); Procedure rsrc_free; Procedure rsrc_gaddr(re_gttype, re_gtindex: Integer; VAR re_gtaddr); Procedure rsrc_saddr(re_sttype, re_stindex: Integer; re_staddr: Pointer); Procedure rsrc_obfix(re_oobject: Integer; re_otree: Pointer); (*** SHELL LIBRARY ****) Procedure shel_read(sh_rpcmd, sh_rptail: Pointer); Procedure shel_get(sh_gbuff: Pointer; sh_glen: Integer); Procedure shel_put(sh_pbuff: Pointer; sh_plen: Integer); Procedure shel_find(sh_fpbuff: Pointer); Procedure shel_envrn(sh_epvalue, sh_eparm: Pointer); Procedure shel_write(sh_wdoex, sh_wisgr, sh_wiscr: Integer; sh_wpcmd, sh_wptail: Pointer); ( ( ((   These are the routines implemented in the GemDecl unit: BitTestEmptyRect HiPtr Intersect LoPtr MakeXYWH MakeXYXYMax Min See also: GemAES, GemVDI, Graph Unit GemDecl; INTERFACE Const { High-indices for arrays. Low-indice = 0 } control_max= 11; { Max size of control array } intin_max= 131; { Max size of intin array } intout_max= 139; { Max size of intout array } workout_max= 56; { Max size of workout array = 44+control_max } addrin_max= 15; { Max size of addrin array } addrout_max= 15; { Max size of addrout array } global_max= 14; { Max size of global array } pts_max= 144; { Max size of ptsin/ptsout arrays } Type { Parameter blocks } AES_param= Array[0..5] Of ^global_Array; { AES } VDI_param= Array[0..4] Of ^global_Array; { VDI } { Other strictly GEM-related arrays } global_Array = Array[0..global_max] Of Integer; control_Array = Array[0..control_max] Of Integer; intin_Array= Array[0..intin_max] Of Integer; intout_Array = Array[0..intout_max] Of Integer; ptsin_Array= Array[0..pts_max]Of Integer; ptsout_Array = Array[0..pts_max]Of Integer; addrin_Array = Array[0..addrin_max] Of Pointer; addrout_Array = Array[0..addrout_max] Of Pointer; workout_Array = Array[0..workout_max] Of Integer; { Multipurpose } Array_2= Array[0..1] Of Integer; Array_3= Array[0..2] Of Integer; Array_4= Array[0..3] Of Integer; Array_5= Array[0..4] Of Integer; Array_6= Array[0..5] Of Integer; Array_8= Array[0..7] Of Integer; Array_10= Array[0..9] Of Integer; Array_16= Array[0..15] Of Integer; Array_37= Array[0..36] Of Integer; { A graphic rectangle } GRect= Record  x,y,w,h: Integer End; Var { Global GEM & VDI arrays } AES_pb: AES_param;{ AES parameter block } VDI_pb: VDI_param;{ VDI parameter block } control: control_Array; { General arrays : } intin: intin_Array;{ Input parameters } intout: intout_Array;{ Output parameters } ptsin: ptsin_Array;{ VDI arrays : } ptsout: ptsout_Array; addrin: addrin_Array;{ AES arrays } addrout: addrout_Array; global: global_Array;{ Global information } Function Min(a,b: Integer): Integer; Function Max(a,b: Integer): Integer; Function HiPtr(VAR V): Integer; Function LoPtr(VAR V): Integer; Function BitTest(No: Integer; Value: LongInt): Boolean; Function Intersect(R1: GRect; VAR R2: GRect): Boolean; Function EmptyRect(R: GRect): Boolean; Procedure MakeXYXY(xywh: GRect; VAR xyxy: Array_4); Procedure MakeXYWH(xyxy: Array_4; VAR xywh: GRect); .:v #6 # 6 # 6  # 6   # 6   # 6   # 6   # 6   # 6   # 6  #6   # 6   #6  # 6   #6  # 6 #6  #6  #6# 6   # 6 #6 #6   # 6  #6 #6 # 6   # 6!!!# These are the routines implemented in the GemVDI unit: See also: GemAES, GemDecl, Graph vex_butvvex_curvvex_motvvex_timv vm_filenamevqf_attributesvqin_modevql_attributes vqm_attributesvqp_errorvqp_filmsvqp_state vqt_attributesvqt_extentvqt_fontinfovqt_name vqt_widthvq_cellarrayvq_chcellsvq_color vq_curaddressvq_extendvq_key_svq_mouse vq_tabstatusvro_cpyfmvrq_choicevrq_locator vrq_stringvrq_valuatorvrt_cpyfmvr_recfl vr_trnfmvsc_formvsf_colorvsf_interior vsf_perimetervsf_stylevsf_udpatvsin_mode vsl_colorvsl_ends vsl_typevsl_udsty vsl_widthvsm_choicevsm_colorvsm_height vsm_locatorvsm_string vsm_typevsm_valuator vsp_messagevsp_savevsp_statevst_alignment vst_colorvst_effectsvst_fontvst_height vst_load_fontsvst_pointvst_rotation vst_unload_fonts vswr_modevs_clipvs_colorvs_curaddress vs_palettev_arcv_barv_bit_image v_cellarrayv_circlev_clear_disp_listv_clrwk v_clsvwkv_clswk v_contourfillv_curdown v_curhomev_curleftv_currightv_curtext v_curupv_dspcurv_eeolv_eeos v_ellarcv_ellipsev_ellpiev_enter_cur v_exit_curv_fillareav_form_advv_get_pixel v_gtextv_hardcopyv_hide_cv_justified v_meta_extentsv_opnvwkv_opnwkv_output_window v_pieslicev_plinev_pmarkerv_rbox v_rfboxv_rmcurv_rvoffv_rvon v_show_cv_updwk v_write_meta Unit GemVDI; INTERFACE Uses GemDecl; Const  { Fill interior styles : } HOLLOW= 0;{ no fill } SOLID= 1;{ solid fill in current color } PATTERN= 2;{ bit pattern } HATCH= 3;{ hatch } UDFILLSTYLE= 4;{ user defined }  { Some fill patterns : } DOTS= 3; GRID= 6; BRICKS= 9; WEAVE= 16;  { PolyLine line styles : } { SOLID= 1;same as above } LDASHED= 2;{ * .... bit layout } DOTTED= 3;{ ***.***. } DASHDOT= 4;{ *...***... } DASHED= 5;{ *. } DASHDOTDOT = 6;{ ****...**..**... }  { PolyLine end styles : } SQUARED= 0; ARROWED= 1; ROUNDED= 2;  { Text effects : } NORMAL= 0;{ normal appearance } BOLD= 1;{ boldface } SHADED= 2;{ shaded } SKEWED= 4;{ italic } UNDERLINED = 8;{ underlined } OUTLINE= 16; { outlined } SHADOW= 32; { shadowed }  { Writing modes : } MD_REPLACE = 1;{ replace } MD_TRANS= 2; { transparent } MD_XOR= 3;{ XOR } MD_ERASE= 4; { erase }  { Bit-Blit flags : } ALL_WHITE = 0; S_AND_D= 1; S_AND_NOTD = 2; S_ONLY= 3; NOTS_AND_D = 4; D_ONLY= 5; S_XOR_D= 6; S_OR_D= 7; NOT_SORD= 8; NOT_SXORD = 9; NOT_D= 10; S_OR_NOTD = 11; NOT_S= 12; NOTS_OR_D = 13; NOT_SANDD = 14; ALL_BLACK = 15;  { Input modes : } REQUEST= 1;{ request mode } SAMPLE= 2;{ sample mode } Type MFDB = Record{ MFDB layout (MemoryForm) } mptr: Pointer;{ raster address } formwidth,{ width of raster in pixels } formheight,{ height of raster in pixels } widthword,{ width in terms of 16-bit words } formatflag,{ device specific/standard : 0/1 } memplanes,{ raster planes } res1,{ reserved... } res2, res3: Integer; End; String80 = String[80]; String125 = String[125]; {*** CONTROL FUNCTIONS ***} Procedure v_clswk(handle : Integer); Procedure v_clsvwk(handle : Integer); Procedure v_clrwk(handle : Integer); Procedure v_updwk(handle : Integer); Procedure vst_unload_fonts(handle, select : Integer); Procedure vs_clip(handle, clipflag: Integer; pxyarray : Array_4); Function vst_load_fonts(handle, select : Integer) : Integer; Procedure v_opnwk(workin: intin_Array; Var handle: Integer; Var workout : workout_Array); Procedure v_opnvwk(workin: intin_Array; Var handle: Integer; Var workout : workout_Array); {*** OUTPUT FUNCTIONS ***} Procedure v_pline(handle, count : Integer; pxyarray : ptsin_Array); Procedure v_pmarker(handle, count : Integer; pxyarray : ptsin_Array); Procedure v_gtext(handle, x, y : Integer; chstring : String80); Procedure v_fillarea(handle, count : Integer; pxyarray : ptsin_Array); Procedure v_contourfill(handle, x, y, index : Integer); Procedure vr_recfl(handle : Integer; pxyarray : Array_4); Procedure v_cellarray(handle: Integer; pxyarray: Array_4; rowlength, elused, numrows, wrtmode : Integer; colarray: intin_Array); {*** GDP 's ***} Procedure v_bar(handle : Integer; pxyarray : Array_4); Procedure v_arc(handle, x, y, radius, begang, endang : Integer); Procedure v_pieslice(handle, x, y, radius, begang, endang : Integer); Procedure v_circle(handle, x, y, radius : Integer); Procedure v_ellipse(handle, x, y, xradius, yradius : Integer); Procedure v_rbox(handle : Integer; xyarray : Array_4); Procedure v_rfbox(handle : Integer; xyarray : Array_4); Procedure v_ellarc(handle, x, y, xradius, yradius, begang, endang : Integer); Procedure v_ellpie(handle, x, y, xradius, yradius, begang, endang: Integer); Procedure v_justified(handle, x, y : Integer; gstring: String80; jlength, wordspace, charspace: Integer); {*** SET ATTRIBUTE FUNCTIONS ***} { In the proper GEM definition, most of the below procedures are defined as functions returning the actual mode set. This has a meaning, if the user requests a mode not available on the device. However, these function definitions have been changed to procedures in this library, because most - if not all - applications written for the ST will use the screen, and the programmer will most often be aware of the parameters, he can use to obtain the desired results. If the return values are desired, they can be found via the GemAES.GemError function, as most of them are returned in intout[0]. A few of them also return a value in ptsout[1], but consult a dedi- cated GEM book for a discussion of this. } Procedure vswr_mode(handle, mode : Integer); Procedure vs_color(handle, index : Integer; rgbin : Array_3); Procedure vsl_type(handle, style : Integer); Procedure vsl_udsty(handle, pattern : Integer); Procedure vsl_color(handle, colindex : Integer); Procedure vsl_ends(handle, begstyle, endstyle : Integer); Procedure vsm_type(handle, symbol : Integer); Procedure vsm_color(handle, colindex : Integer); Procedure vst_rotation(handle, angle : Integer); Procedure vst_font(handle, font : Integer); Procedure vst_color(handle, colindex : Integer); Procedure vst_effects(handle, effect : Integer); Procedure vsf_interior(handle, style : Integer); Procedure vsf_style(handle, styleindex : Integer); Procedure vsf_color(handle, colorindex : Integer); Procedure vsf_perimeter(handle, pervis : Integer); Procedure vsf_udpat(handle : Integer; Var pfillpat; planes : Integer); Procedure vr_trnfm(handle : Integer; psrcMFDB, pdesMFDB : MFDB); Procedure v_get_pixel(handle, x, y : Integer; Var pel, index : Integer); Procedure vsm_height(handle, height : Integer); Procedure vsl_width(handle, width : Integer); Procedure vst_height(handle, height: Integer; Var charwidth, charheight, cellwidth, cellheight: Integer); Procedure vst_point(handle, point: Integer;  Var charwidth, charheight, cellwidth, cellheight : Integer); Procedure vst_alignment(handle, horin, vertin : Integer; Var horout, vertout: Integer); {*** RASTER OPS ***} Procedure vro_cpyfm(handle, wrmode: Integer;  pxyarray: Array_8;  psrcMFDB, pdesMFDB : MFDB); Procedure vrt_cpyfm(handle, wrmode: Integer;  pxyarray: Array_8;  psrcMFDB, pdesMFDB : MFDB;  color_index: Array_2); {*** INPUT FUNCTIONS ***} Procedure vsin_mode(handle, devtype, mode : Integer); Procedure vrq_choice(handle, ch_in : Integer; Var ch_out : Integer); Procedure vsc_form(handle : Integer; pcurform: Array_37); Procedure v_show_c(handle, Reset : Integer); Procedure v_hide_c(handle : Integer); Procedure vq_key_s(handle : Integer; Var pstatus : Integer); Procedure vq_mouse(handle : Integer; Var pstatus, x, y : Integer); Function vsm_choice(handle : Integer; Var choice : Integer) : Integer; Procedure vrq_valuator(handle, valin: Integer; Var valout, term : Integer); Procedure vrq_locator(handle, x, y: Integer; Var xout, yout, term : Integer); Function vsm_locator(handle, x, y: Integer; Var xout, yout, term : Integer) : Integer; Procedure vsm_valuator(handle, valin: Integer; Var valout, term, status : Integer); Procedure vrq_string(handle, maxlen, echomode : Integer; echo_xy: Array_2; Var instring: String80); Function vsm_string(handle, maxlen, echomode : Integer;  echo_xy: Array_2;  Var instring: String80) : Integer; Procedure vex_timv(handle: Integer; timaddr: Pointer; Var otimaddr : Pointer; Var timconv: Integer); Procedure vex_butv(handle: Integer; pusrcode: Pointer; Var psavcode : Pointer); Procedure vex_motv(handle: Integer; pusrcode: Pointer; Var psavcode : Pointer); Procedure vex_curv(handle: Integer; pusrcode: Pointer; Var psavcode : Pointer); {*** INQUIRE FUNCTIONS ***} Procedure vq_extend(handle, owflag: Integer; Var workout : workout_Array); Procedure vql_attributes(handle : Integer; Var attrib : Array_6); Procedure vqm_attributes(handle : Integer; Var attrib : Array_5); Procedure vqf_attributes(handle : Integer; Var attrib : Array_5); Procedure vqt_attributes(handle : Integer; Var attrib : Array_10); Function vq_color(handle, colorindex, setflag: Integer; Var rgb: Array_3) : Integer; Procedure vqt_extent(handle: Integer; chstring: String80; Var extent : Array_8); Function vqt_width(handle: Integer; character: Char; Var cellwidth, leftdelta, rightdelta : Integer) : Integer; Function vqt_name(handle, elementnum : Integer; Var name: String80) : Integer; Procedure vq_cellarray(handle: Integer; pxyarray: Array_4; rowlen, numrows: Integer; Var elused, rowsused : Integer; status: Integer; Var colarray : intout_Array); Procedure vqin_mode(handle, dev_type : Integer;  Var inputmode: Integer); Procedure vqt_fontinfo(handle: Integer; Var minADE, maxADE: Integer; Var distances : Array_4; Var maxwidth: Integer; effects: Array_3); {***ESCAPES ***} Procedure vq_chcells(handle : Integer; Var rows, columns : Integer); Procedure v_exit_cur(handle : Integer); Procedure v_enter_cur(handle : Integer); Procedure v_curup(handle : Integer); Procedure v_curdown(handle : Integer); Procedure v_curright(handle : Integer); Procedure v_curleft(handle : Integer); Procedure v_curhome(handle : Integer); Procedure v_eeos(handle : Integer); Procedure v_eeol(handle : Integer); Procedure vs_curaddress(handle, row, column : Integer); Procedure v_curtext(handle : Integer; chstring : String80); Procedure v_rvon(handle : Integer); Procedure v_rvoff(handle : Integer); Procedure vq_curaddress(handle : Integer; Var row, column : Integer); Procedure v_hardcopy(handle : Integer); Procedure v_dspcur(handle, x, y : Integer); Procedure v_rmcur(handle : Integer); Procedure v_form_adv(handle : Integer); Procedure v_output_window(handle : Integer; xyarray : Array_4); Procedure v_clear_disp_list(handle : Integer); Procedure vqp_films(handle : Integer; Var filmnames : String125); Procedure vsp_save(handle : Integer); Procedure vsp_message(handle : Integer); Procedure v_meta_extents(handle, minx, miny, maxx, maxy : Integer); Procedure vm_filename(handle : Integer; filename: String80); Function vq_tabstatus(handle : Integer) : Integer; Function vs_palette(handle, palette : Integer) : Integer; Function vqp_error(handle : Integer) : Integer; Procedure vqp_state(handle: Integer;  Var port, filmname, lightness, interlace, planes : Integer;  Var indexes: Array_16); Procedure vsp_state(handle,  port,  filmnum,  lightness,  interlace,  planes: Integer;  indexes: Array_16); Procedure v_write_meta(handle, numintin : Integer; int_in: intin_Array; numptsin: Integer; pts_in: ptsin_Array); Procedure v_bit_image(handle: Integer; filename : String80; aspect, scaling, num_pts: Integer; xyarray: Array_4);  Function GemError : Integer; GemError returns the value of intout[0] which GEM uses to report error messages most of the time. See also: GemAES    * 5   Function appl_init : Integer; Initialize application and return application's identification. This call must be made before staring using GEM! See also: GemAES, appl_read, appl_write, appl_find, appl_tplay, appl_trecord, appl_exit Cl    * 5  Procedure appl_read(ap_rid, ap_rlength : Integer;  ap_rpbuff: Pointer); Read a number of bytes from the event buffer. ap_rpbuff: event buffer to read from ap_rid: receiving application's id ap_rlength : number of bytes to read See also: GemAES, appl_init, appl_write, appl_find, appl_tplay, appl_trecord, appl_exit Eo    ) 4  Procedure appl_write(ap_wid, ap_wlength : Integer; ap_wpbuff: Pointer); Write a number of bytes to the event buffer. ap_wpbuff: event buffer to store in ap_wid: the receiving application's id ap_wlength : number of bytes to read See also: GemAES, appl_init, appl_read, appl_find, appl_tplay, appl_trecord, appl_exit     ) 5  Function appl_find(ap_fpname : Pointer) : Integer; Find the application id of another application in the system. ap_fpname: points to a string ("C" format, null terminated) which have to be eight characters long, i.e. it might be necessary to fill up with spaces. The string is the application's file name Return value : application's id or -1 if not found See also: GemAES, appl_init, appl_read, appl_write, appl_tplay, appl_trecord, appl_exit a   ) 5   Procedure appl_tplay(ap_tpmem: Pointer; ap_tpnum, ap_tpscale : Integer); Replay user actions. The AES is capable of recording user actions and "replaying" them. The latter is exactly what appl_tplay does : Replays a piece of a recording. ap_tpmem: address of recorded data ap_tpnum: number of actions to play ap_tpscale : play back speed : Range 0..10000 : 0 = slowest speed 10000 = highest speed 100 = normal speed See also: GemAES, appl_init, appl_read, appl_write, appl_find, appl_trecord, appl_exit w    ) 5  Function appl_trecord(ap_trmem: Pointer; ap_trcount : Integer) : Integer; Records user actions. ap_trmem: address of recording buffer ap_trcount: max number of recordings, the buffer can hold = buffer size DIV 6 (size of a recording) Return value : the number of actions recorded See also: GemAES, appl_init, appl_read, appl_write, appl_find, appl_tplay, appl_exit    ) 5  Procedure appl_exit; Exit application. Should be done before returning to the GEM Desktop (or whatever invoked this application). See also: GemAES, appl_init, appl_read, appl_write, appl_find, appl_tplay, appl_trecord    , 8   Function evnt_keybd : Integer; Wait for keypress and return key's code. See also: GemAES, evnt_button, evnt_mouse, evnt_mesag, evnt_timer, evnt_multi, evnt_dclick L   + 7   Function evnt_button(ev_bclicks, ev_bmask, ev_bstate: Integer; VAR ev_bmx, ev_bmy, ev_bmb, ev_bks: Integer) : Integer; Wait for one or more mouse buttons to be pressed. GEM allows a mouse to have as many as 16 buttons, where each bit in ev_bmb represents a button. A set bit represents a pressed button. ev_bclicks : the number of mouse clicks GEM should look for, most often 1 or 2 = double click ev_bmask: the keys allowed to generate the event. A set bit represents a "legal" key ev_bstate: whether the in ev_bmask given keys should be : 0 = released or 1 = pressed in order to generate the event ev_bmb: returned mouse button state ev_bks: keyboard state (CTRL, ALT, etc.) ev_bmx, ev_bmy: mouse position at time of the "click" See also: GemAES, evnt_keybd, evnt_mouse, evnt_mesag, evnt_timer, evnt_multi, evnt_dclick f   , 8   Procedure evnt_mouse(ev_moflags, ev_mox, ev_moy, ev_mowidth, ev_moheight: Integer; VAR ev_momx, ev_momy, ev_momb, ev_momks: Integer); Wait for the mouse to enter or leave a rectangle. ev_moflags: entry/exit flag : 0 = leave; 1 = enter rect. ev_mox, ev_moy: rectangle specification : upper left corner ev_mowidth, ev_moheight : rectangle specification : height and width ev_momx, ev_momy: mouse position at event-time ev_momb: mouse button state at time of event. ev_momks: keyboard state at time of event. See also: GemAES, evnt_keybd, evnt_button, evnt_mesag, evnt_timer, evnt_multi, evnt_dclick    , 8   Procedure evnt_mesag(ev_mgpbuff : Pointer); Wait for a report to be present in the message pipe. ev_mgpbuff : message pipe See also: GemAES, evnt_keybd, evnt_button, evnt_mouse, evnt_timer, evnt_multi, evnt_dclick +    , 8   Procedure evnt_timer(ev_tlocount, ev_thicount : Integer); Wait for a number of milliseconds. The period is given by the four-byte integer value formed by ev_thicount and ev_tlocount. ev_tlocount : low word ev_thicount : high word Total period time = ev_thicount * 2^16 + ev_tlocount milliseconds See also: GemAES, evnt_keybd, evnt_button, evnt_mouse, evnt_mesag, evnt_multi, evnt_dclick VAR time : LongInt; ... Write('How many milliseconds? '); ReadLn(time); evnt_timer(loword(time), hiword(time)); WriteLn('Here we are again...'); A A A A, A8 B B Function evnt_multi ( ev_mflags, ev_mbclicks, ev_mbmask, ev_mbstate, ev_mm1flags, ev_mm1x, ev_mm1y, ev_mm1width, ev_mm1height, ev_mm2flags, ev_mm2x, ev_mm2y, ev_mm2width, ev_mm2height : Integer; ev_mmgpbuff: Pointer; ev_mtlocount, ev_mthicount: Integer; VAR ev_mmox, ev_mmoy, ev_mmobutton, ev_mmokstate, ev_mkreturn, ev_mbreturn: Integer ) : Integer; Wait for one or more events. This is one of the more tough ones! Unlike the other event procedures, evnt_multi allows for any kind of events to occur. The allowed events are given via ev_mflags : ev_mflagsCONSTevent type 1MU_KEYBDwait for keyboard event 2MU_BUTTONwait for mouse button event 4MU_M1wait for mouse to enter/leave one of two rectangles 8MU_M2wait for mouse to enter/leave the second of the two rectangles 16MU_MESAGwait for event message to be present 32MU_TIMERwait for timer event It is suggested for the reader to scan through the other event- procedures, as they give additional information about the para- meters to evnt_multi. ev_mbclicks: mouse button clicks required ev_mbmask: mouse button mask ev_mbstate: mouse button state ev_mm1flags: rectangle 1 entry/exit flag ev_mm1x, ev_mm1y, ev_mm1width, ev_mm1height: rectangle 1 The same layout applies to rectangle 2. ev_mmgpbuff: message pipe address ev_mtlocount, ev_mthicount: time in milliseconds ev_mmox, ev_mmoy: mouse (x,y) at event-time ev_mmobutton: mouse button pressed ev_mmokstate: keyboard state (SHIFT, CTRL etc.) ev_mkreturn: keyboard key pressed ev_mbreturn: number of mouse clicks Return value: "occurred-events" flag evnt_multi is one of the vital functions in a "normal" GEM application using menus, windows, dialog boxes etc. as it allows the user to generate a multitude of events, which the application then can dispatch easily. See also: GemAES, evnt_keybd, evnt_button, evnt_mouse, evnt_mesag, evnt_timer, evnt_dclick     , 8  Function evnt_dclick(ev_dnew, ev_dgtest : Integer) : Integer; Set double click speed. ev_dnew: new value or dummy ev_dgtest: set new speed or return current speed value? 0 = return current (ev_dnew is dummy) 1 = set new Return value : current speed/set speed See also: GemAES, evnt_keybd, evnt_button, evnt_mouse, evnt_mesag, evnt_timer, evnt_multi VAR currentspeed : Integer; ... currentspeed := evnt_dclick(0, 0); { return current speed } "+   . < Procedure menu_bar(me_btree : Pointer; me_bshow : Integer); Display or erase a menu bar. Should always be called before appl_exit. me_btree : menu tree me_bshow : show/erase flag : 0 = erase; 1 = show See also: GemAES, menu_icheck, menu_ienable, menu_tnormal, menu_text, menu_register %f    + 9 Procedure menu_icheck(me_ctree: Pointer; me_citem, me_ccheck : Integer); Check a menu item. me_ctree: menu tree me_citem: item to check me_ccheck : check flag : 0 = erase check mark 1 = set check mark See also: GemAES, menu_bar, menu_ienable, menu_tnormal, menu_text, menu_register %l    * 8 Procedure menu_ienable(me_etree: Pointer; me_eitem, me_eenable : Integer); Enable a menu item. me_etree: menu tree me_eitem: item to enable me_eenable : enable flag : 0 = disable entry 1 = enable entry See also: GemAES, menu_bar, menu_icheck, menu_tnormal, menu_text, menu_register   * 8  Procedure menu_tnormal(me_ntree: Pointer; me_ntitle, me_nnormal : Integer); Normalize a menu title-bar. me_ntree: menu tree me_ntitle: title index me_nnormal : normalize flag : 0 = reverse video 1 = normal video menu_tnormal is used after the application has completed doing an operation requested via a menu. In that case, the menu bar is still drawn in reverse video, so it has to be reset to normal video again. It can also be used to indicate to the user, that he selected a menu item from, say, the "Compile" menu when he pressed the Alt-C key, as in the HighSpeed Pascal shell. See also: GemAES, menu_bar, menu_icheck, menu_ienable, menu_text, menu_register   * 8  Procedure menu_text(me_ttree : Pointer;  me_titem : Integer;  me_ttext : Pointer); Change the text of a menu item (me_titem) in a tree (me_ttree). Note that the string must be of same length as the old one, and that it must be globally declared (very important!). me_ttree : menu tree me_titem : string index me_ttext : address of new text ("C" format) See also: GemAES, menu_bar, menu_icheck, menu_ienable, menu_tnormal, menu_register     * 8 Function menu_register(me_raccapid : Integer; me_rpstring : Pointer) : Integer; Register application as a desk accessory. me_raccapid : application id (from appl_init) me_rpstring : address of the "Desk" menu entry title string menu_register returns the accessory number [0..5] or -1 of no more accessory slots are available. See also: GemAES, menu_bar, menu_icheck, menu_ienable, menu_tnormal, menu_text 6T   + 6  " Procedure objc_add(ob_atree : Pointer; ob_aparent, ob_achild : Integer); Add a new object to an object tree. ob_atree: the object tree ob_aparent : parent object's index ob_achild: child object's index See also: GemAES, objc_delete, objc_draw, objc_find, objc_offset, objc_order, objc_edit, objc_change 2    ( 3  " Procedure objc_delete(ob_dltree: Pointer; ob_dlobject : Integer); Delete an object from an object tree. ob_dltree: object tree ob_dlobject : index of object to delete See also: GemAES, objc_add, objc_draw, objc_find, objc_offset, objc_order, objc_edit, objc_change 3  * 5   " Procedure objc_draw(ob_dtree: Pointer;  ob_drstartob, ob_drdepth,  ob_drxclip, ob_dryclip,  ob_drwclip, ob_drhclip: Integer); Draw part or whole of a tree, possibly clipped. ob_dtree: object tree ob_drstartob : index of starting object ob_drdepth: levels to be drawn ob_drxclip: clipping rectangle x ob_dryclip: y ob_drwclip: width ob_drhclip: height See also: GemAES, objc_add, objc_delete, objc_find, objc_offset, objc_order, objc_edit, objc_change c  * 5   " Function objc_find(ob_ftree: Pointer; ob_fstartob, ob_fdepth, ob_fmx, ob_fmy: Integer) : Integer; Determine, if an element of a given object tree is at the given coordinate. Mainly used for mouse selection. ob_ftree: object tree to check ob_fstartob: object index from where to start search ob_fdepth: levels to search ob_fmx, ob_fmy: coordinate to check Return value : -1 = no object found, otherwise object index See also: GemAES, objc_add, objc_delete, objc_draw, objc_offset, objc_order, objc_edit, objc_change     * 5   " Procedure objc_offset(ob_oftree: Pointer; ob_ofobject: Integer; VAR ob_ofxoff, ob_ofyoff: Integer); Object's offset relative to screen origin. ob_oftree: object tree ob_ofobject : object index ob_ofxoff: object x relative to screen ob_ofyoff: object y relative to screen See also: GemAES, objc_add, objc_delete, objc_draw, objc_find, objc_order, objc_edit, objc_change   * 5   # Procedure objc_order(ob_ortree: Pointer; ob_orobject, ob_ornewpos : Integer); Move a child object to a new position within its parent's child list. ob_ortree: object tree ob_orobject : index of object to move ob_ornewpos : new position : -1 = top 0 = bottom n = n from the bottom See also: GemAES, objc_add, objc_delete, objc_draw, objc_find, objc_offset, objc_edit, objc_change ^  * 5   $ Procedure objc_edit(ob_edtree: Pointer;  ob_edobject: Integer;  ob_edchar: Char;  ob_edidx, ob_edkind : Integer;  VAR ob_ednewidx: Integer); Let the user edit text in objects of types G_TEXT and G_BOXTEXT. ob_edtree: object tree ob_edobject : editable object's index ob_edchar: char typed by the user ob_edidx: next char position in raw text string ob_edkind: how objc_edit should behave : valueCONSToperation 0EDSTARTreserved! 1EDINITTEDINFO fields te_ptext and  te_ptmplt are combined into  a formatted string and the  text cursor is turned on 2EDCHARtest if char is contained  in te_ptext and display  string 3EDENDturn off text cursor ob_ednewidx : index of next char pos in raw string when objc_edit is finished See also: GemAES, objc_add, objc_delete, objc_draw, objc_find, objc_offset, objc_order, objc_change ;  * 5   $ Procedure objc_change(ob_ctree: Pointer; ob_cobject, ob_cresvd, ob_cxclip, ob_cyclip, ob_cwclip, ob_chclip, ob_cnewstate, ob_credraw : Integer); Change an object's state. ob_ctree: object tree ob_cobject: index of object to change ob_cresvd: reserved! Set to zero (0) ob_cxclip: clip rectangle coordinates : x ob_cyclip: y ob_cwclip: width ob_chclip: height ob_cnewstate : the new state value ob_credraw: redraw flag : 0 = no redraw; 1 = redraw object See also: GemAES, objc_add, objc_delete, objc_draw, objc_find, objc_offset, objc_order, objc_edit [    * 6 Function form_do(fo_dotree: Pointer; fo_dostartob : Integer) : Integer; Let the AES handle user input via a dialog box. fo_dotree: dialog box object tree fo_dostartob : starting text input field or 0 Return value : index of object that terminated input (e.g. OK button etc.) See also: GemAES, form_dial, form_alert, form_error, form_center w  ( 4 Procedure form_dial(fo_diflag, fo_dilx,  fo_dily, fo_dilw,  fo_dilh, fo_dibigx,  fo_dibigy, fo_dibigw,  fo_dibigh: Integer); Dialog form handling. Contains four different functions :  fo_diflag : operation to perform : valueCONSToperation 0FMD_STARTreserve memory for dialog box 1FMD_GROWdraw growing box outline 2FMD_SHRINKdraw shrinking box outline 3FMD_FINISHrelease dialog box memory fo_dilx, fo_dily: growing/shrinking rectangle's smallest size (x,y) fo_dilw: width fo_dilh: height fo_dibigx, fo_dibigy : growing/shrinking rectangle's largest size (x,y) fo_dibigw : width fo_dibigh : height See also: GemAES, form_do, form_alert, form_error, form_center   ' 3 Function form_alert(fo_adefbttn : Integer;  fo_aastring : Pointer) : Integer; Display an alert box. fo_adefbttn : The default key number; i.e. the one with the thick border around. If 0 then there is no default key. fo_aastring : The address of the string to be output. Note that it must be presented as "C" format, that is, no length element, and it must end with #00. The returned value is the index of the key that terminated the dialog box. The string format is as follows: '[a][b][c]' where : a = 0..3 = the icon to be shown; 0 = no icon; 1 = '!' icon; 2 = '?' icon; 3 = 'STOP' icon. b = the string; c = the keys. The string can contain more lines; they are separated by '|', and so are the different keys, as shown in the examples below : See also: GemAES, form_do, form_dial, form_error, form_center VAR s: String; key : Integer; ... s := '[0][This is a one-line alert][ Ok ]' + #00; key := form_alert(1, addr(s[1])); { Note how the string-length element (s[0]) is skipped in the addr() expression } s := '[1][ This is a multi-line alert | with an icon |' + ' and 3 keys][ Great! | Oh yeah? | So what?! ]' + #00; key := form_alert(2, addr(s[1]));   ' 3 Function form_error(fo_enum : Integer) : Integer; Display an alert box with a TOS error code (fo_enum) in it. See also: GemAES, form_do, form_dial, form_alert, form_center $^    ' 3 Procedure form_center(fo_ctree: Pointer; VAR fo_cx, fo_cy, fo_cw, fo_ch: Integer); Center object tree's representation on screen. fo_ctree: the object tree fo_cx, fo_cy : upper left corner fo_cw, fo_ch : width and height See also: GemAES, form_do, form_dial, form_alert, form_error f   ! /   * 9   Procedure graf_rubbox(gr_rx, gr_ry, gr_rminwidth, gr_rminheight : Integer; VAR gr_rlastwidth, gr_rlastheight: Integer); Draw a "rubber box". The upper left corner is set (used on the GEM desktop to select more than one file). graf_rubbox must be called with the mouse button pressed, as the procedure is ended when the user releases the button. gr_rx: upper left corner x of rectangle gr_ry: upper left corner y of rectangle gr_rminwidth: smallest allowed width of rectangle gr_rminheight: smallest allowed height of rectangle gr_rlastwidth: final width of rectangle gr_rlastheight : final height of rectangle See also: GemAES, graf_dragbox, graf_movebox, graf_growbox, graf_shrinkbox, graf_watchbox, graf_slidebox, graf_handle, graf_mouse, graf_mkstate CONST minW = 10; minH = 20; VAR mouseX, mouseY, mouseButton : Integer;{ mouse info} boxW, boxH: Integer;{ rubber box w, h } ... { wait for user to press button : } REPEAT vq_mouse(VDI_handle, mouseButton, mouseX, mouseY) UNTIL mouseButton = 1;{ 1 = button pressed } { drag the box : } graf_rubbox(mouseX, mouseY, minW, minH, boxW, boxH); |    .   * 9   Procedure graf_dragbox(gr_dwidth, gr_dheight, gr_dstx, gr_dsty, gr_dbndx, gr_dbndy, gr_dbndw, gr_dbndh: Integer; VAR gr_dfinx, gr_dfiny : Integer); Drag (move) a rectangle within another rectangle. gr_dwidth: movable rectangle's width gr_dheight : height gr_dstx: starting x position gr_dsty: starting y position gr_dbndx: surrounding rectangle's x gr_dbndy: y gr_dbndw: width gr_dbndh: height gr_dfinx: movable rectangle's finish x position gr_dfiny: finish y position See also: GemAES, graf_rubbox, graf_movebox, graf_growbox, graf_shrinkbox, graf_watchbox, graf_slidebox, graf_handle, graf_mouse, graf_mkstate     .   * 9   Procedure graf_movebox(gr_mwidth, gr_mheight, gr_msrcex, gr_msrcey, gr_mdestx, gr_mdesty: Integer); Move box. The AES will all by it self make a rectangle of constant size move from one screen area to the other - fastly! gr_mwidth: rectangle's width gr_mheight : height gr_msrcex: start x (upper left corner) gr_msrcey: start y gr_mdestx: end x(upper left corner) gr_mdesty: end y See also: GemAES, graf_rubbox, graf_dragbox, graf_growbox, graf_shrinkbox, graf_watchbox, graf_slidebox, graf_handle, graf_mouse, graf_mkstate graf_movebox(10,10, 100,120, 600,380); moves a rectangle of size 10 * 10 from position (100,120) to position (600,380).     .   * 9   Procedure graf_growbox(gr_gstx, gr_gsty, gr_gstwidth, gr_gstheight, gr_gfinx, gr_gfiny, gr_gfinwidth, gr_gfinheight : Integer); Draw a "growing box" outline. Its appearance should be quite familiar, as this procedure is used in the GEM desktop when opening a window. gr_gstx, gr_gsty: upper left corner of smallest box gr_gstwidth: width of smallest box gr_gstheight: height of smallest box gr_gfinx, gr_gfiny: upper left corner of largest box gr_gfinwidth: width of largest box gr_gfinheight : height of largest box See also: GemAES, graf_rubbox, graf_dragbox, graf_movebox, graf_shrinkbox, graf_watchbox, graf_slidebox, graf_handle, graf_mouse, graf_mkstate graf_growbox (310,190,20,20, 0,0,640,400); { grow... } graf_shrinkbox(310,190,20,20, 0,0,640,400); { ...and shrink } /    .   ( 7   Procedure graf_shrinkbox(gr_sstx, gr_ssty, gr_sstwidth, gr_sstheight, gr_sfinx, gr_sfiny, gr_sfinwidth, gr_sfinheight : Integer); Draw shrinking box outline. This is the reverse to graf_growbox. gr_sstx, gr_ssty: upper left corner coordinates of large box gr_sstwidth: width gr_sstheight: height gr_sfinx, gr_sfiny: upper left corner coordinates of small box gr_sfinwidth: width gr_sfinheight : height See also: GemAES, graf_rubbox, graf_dragbox, graf_movebox, graf_growbox, graf_watchbox, graf_slidebox, graf_handle, graf_mouse, graf_mkstate     .  ) 8   Function graf_watchbox(gr_wptree : Pointer; gr_wobject, gr_winstate, gr_woutstate : Integer) : Integer; Watch if the mouse enters or leaves a rectangle. The rectangle mentioned above represents an object which will have its state changed accordingly if the mouse button is re- leased. gr_wptree: parent tree gr_wobject: object's index gr_winstate: object's state at entering the rectangle gr_woutstate : object's state when leaving the rectangle Return value : was the mouse inside the rectangle when the button was released? 0 = no; 1 = yes See also: GemAES, graf_rubbox, graf_dragbox, graf_movebox, graf_growbox, graf_shrinkbox, graf_slidebox, graf_handle, graf_mouse, graf_mkstate     .  ) 8   Function graf_slidebox(gr_slptree: Pointer; gr_slparent, gr_slobject, gr_slvh : Integer): Integer; Slide a rectangle within another rectangle with the mouse. Both rectangles (objects) are contained in a resource tree. Call with pressed mouse button only. gr_slptree: parent tree gr_slparent: parent index gr_slobject: movable object's index gr_slvh: direction flag : 0 = horizontal movement only 1 = vertical movement only Return value : movable rectangle's position relative to parent object's border See also: GemAES, graf_rubbox, graf_dragbox, graf_movebox, graf_growbox, graf_shrinkbox, graf_watchbox, graf_handle, graf_mouse, graf_mkstate 3    .  ) 8   Function graf_handle(VAR gr_hwchar, gr_hhchar, gr_hwbox, gr_hhbox : Integer) : Integer; Return graphics handle (VDI handle). graf_handle is used before a v_opnvwk (Open Virtual Workstation). The returned handle is the one used by all graphics operations. gr_hhchar : height of a character gr_hwchar : width of a character gr_hhbox: height of a character box gr_hwbox: width of a character box See also: GemAES, graf_rubbox, graf_dragbox, graf_movebox, graf_growbox, graf_shrinkbox, graf_watchbox, graf_slidebox, graf_mouse, graf_mkstate VAR VDI_handle: Integer; chW, chH, boxW, boxH : Integer; workIn: intin_Array; workOut: workout_Array; ... VDI_handle := graf_handle(chW, chH, boxW, boxH); v_opnvwk(workIn, VDI_handle, workOut); ... v_gtext(VDI_handle, 100,200, 'HighSpeed Pascal is super!'#00); A    .  ) 8   &Procedure graf_mouse(gr_monumber : Integer; gr_mofaddr : Pointer); Change mouse shape. gr_monumber : mouse shape index : valueCONSTshape 0ARROWarrow 1TEXT_CRSRtext cursor 2BUSYBEEthe busy bee 2HOURGLASSalso the busy bee 3POINT_HANDpointing hand 4FLAT_HANDflat hand 5THIN_CROSSthin cross 6THICK_CROSSthick cross 7OUTLN_CROSSoutlined cross 255USER_DEFuser defined shape 256M_OFFturn mouse off 257M_ONturn mouse on gr_mofaddr: mouse form address (or NIL for standard shape) See also: GemAES, graf_rubbox, graf_dragbox, graf_movebox, graf_growbox, graf_shrinkbox, graf_watchbox, graf_slidebox, graf_handle, graf_mkstate, vsc_form graf_mouse(BUSYBEE, NIL);{ set bee shape} graf_mouse(M_OFF, NIL);{ turn mouse off } graf_mouse(M_ON, NIL);{ turn it back on } graf_mouse(ARROW, NIL);{ arrow shape} graf_mouse(USER_DEF, addr(MyMouse)); { set user mouse }    .  ) 8   Procedure graf_mkstate(VAR gr_mkmx, gr_mkmy, gr_mkmstate, gr_mkkstate : Integer); Return current mouse position, mouse button status and keyboard status. gr_mkmx: mouse x gr_mkmy: mouse y gr_mkmstate : mouse button status gr_mkkstate : keyboard status : SHIFT left, right, CTRL and ALT See also: GemAES, graf_rubbox, graf_dragbox, graf_movebox, graf_growbox, graf_shrinkbox, graf_watchbox, graf_slidebox, graf_handle, graf_mouse   Procedure scrp_read(sc_rpbuff : Pointer); Read scrap directory from clipboard. sc_rpbuff : address of buffer into which the scrap directory is read See also: GemAES, scrp_write   Procedure scrp_write(sc_wpbuff : Pointer); Write scrap directory to clipboard. sc_wpbuff : address of buffer holding the scrap directory See also: GemAES, scrp_read  !  Procedure fsel_input(fs_iinpath, fs_iinsel : Pointer; VAR fs_iexbutton: Integer); File selector input. fs_iinpath: default search path/chosen path : #00 terminated fs_iinsel: default file name/chosen name : #00 terminated fs_iexbutton : OK or CANCEL key code : 0 = CANCEL 1 = OK After using fsel_input, you can't just add the two strings, fs_iinpath and fs_iinsel, to obtain a full file name, as two obstructions lay in the way : The #00 string terminators, and the search pattern at the end of the path (e.g. "*.PAS"), so they have to be stripped off first as the example below shows. See also: GemAES, fsel_exinput VAR path: String; name: String[13];{ filename.ext + #00 } code: Integer; fullname : String; i: Integer; ... path := 'D:\PASCAL\SOURCE\*.PAS'#00; name := 'MYPROG.PAS'#00; fsel_input(addr(path[1]), addr(name[1]), code); IF code = 1 THEN BEGIN{ OK button } path[0] := #255;{ fool Pos into believing, we're } { dealing with a big string} path[0] := Chr(Pos(#00, path)-1); { set length} WHILE path[ Length(path) ] <> '\' DO Delete(path, Length(path), 1);{ remove search } { pattern} { now, path contains the "pure" path} name[0] := #255; name[0] := Chr(Pos(#00, name)-1);{ set length } fullname := path + name; { full file specification is now present in fullname} END ELSE { CANCEL button } ; A few "tricks" are used above : First of all, the length of the path string is set to 255 (path[0] := #255) so that the Pos function used below doesn't all of a sudden stops working in the middle of the path string because it believes that the string has an (undefined) length. With a such string length of 255 chars, Pos is guaranteed to find the #00 string terminator, which is used for determining the length of the string. After that, the search pattern is stripped off (e.g. "*.PAS"). Next, the length of the file name is determined, and finally added together with the path to create a full file name. This method has the disadvantage of corrupting the two variables path and name. H  Procedure fsel_exinput(fs_iinpath, fs_iinsel : Pointer; VAR fs_iexbutton: Integer; fs_label: Pointer); Extended file selector input. Instead of writing "ITEM SELECTOR" in the file selector box, a user defined message such as "INPUT FILE", "OUTPUT FILE" etc. is written. Requires TOS 1.4. fs_iinpath: default search path/chosen path fs_iinsel: default file name/chosen name fs_iexbutton : exit button : OK (1) or CANCEL (0) fs_label: address of title string (max. 30 chars) See also: GemAES, fsel_input 0 ! ! ! !* !7" " " "- "8Function wind_create(wi_crkind, wi_crwx, wi_crwy, wi_crww, wi_crwh : Integer) : Integer; Create window. Sets type of window border elements and its maximum size. wi_crkind: window border elements : valueCONSTelement type 1NAMEname bar 2CLOSERclose box 4FULLERfull box 8MOVERmovable 16INFOinfo line 32SIZERsize box 64UPARROWup arrow box 128DNARROWdown arrow box 256VSLIDEvertical slider 512LFARROWleft arrow 1024RTARROWright arrow 2048HSLIDEhorizontal slider wi_crwx: upper left corner x of border rectangle wi_crwy: y wi_crww: width wi_crwh: height Return value : window handle or < 0 if no more windows are avail- able See also: GemAES, wind_open, wind_close, wind_delete, wind_get, wind_set, wind_find, wind_update, wind_calc, wind_new VAR window : Integer; ... window := wind_create(NAME + CLOSER + SIZER, 10,20,400,250); IF window < 0 THEN WriteLn('No more windows available!'); creates a window with a NAME bar, a CLOSE box being sizable with upper left corner at (10,20), width of 400 and height of 250.     , 9   - 8Procedure wind_open(wi_ohandle,  wi_owx, wi_owy,  wi_oww, wi_owh: Integer); Open window, i.e. draw it on the screen. wi_ohandle : window handle from wind_create wi_owx: upper left corner x of border rectangle wi_owy: y wi_oww: width wi_owh: height A window can never be opened with a larger size than that given to wind_create. See also: GemAES, wind_create, wind_close, wind_delete, wind_get, wind_set, wind_find, wind_update, wind_calc, wind_new VAR window : Integer; ... window := wind_create(0, 100,100,100,100); { create window } IF window >= 0 THEN BEGIN wind_open(window, 100,100,100,100);{ open with max size } { another example would be this : wind_open(window, 150,150,50,50); upper left corner at (150,150), width and height = 50 but the following would merely result in a max. size draw : wind_open(window,0,0,640,400); upper left = (100,100); width and height = 100 } Zc    + 8   - 8Procedure wind_close(wi_clhandle : Integer); Close window, i.e. remove it from the screen. wi_clhandle : window handle (from wind_create) See also: GemAES, wind_create, wind_open, wind_delete, wind_get, wind_set, wind_find, wind_update, wind_calc, wind_new wind_close(MyTextWindow); wind_close should always be called before a wind_delete.     + 7   - 8Procedure wind_delete(wi_dhandle : Integer); Delete window, i.e. release memory and window handle. wi_dhandle : window handle from wind_create See also: GemAES, wind_create, wind_open, wind_close, wind_get, wind_set, wind_find, wind_update, wind_calc, wind_new wind_close(MyTextWindow);{ remove from screen } wind_delete(MyTextWindow);{ and memory} wind_delete should never be called before a wind_close. z & & & &+ &7 ' ' ' '- '8Procedure wind_get(wi_ghandle, wi_gfield : Integer; VAR wi_gw1, wi_gw2, wi_gw3, wi_gw4 : Integer); Return information about a window (or the desktop). wi_ghandle : window handle wi_gfield: desired information type : valueCONST information returned 1WF_KINDwindow kind 2WF_NAMEwindow name 3WF_INFOinfo line 4WF_WORKXYWHcurrent work area x, y, w, h 5WF_CURRXYWHcurrent border x, y, w, h 6WF_PREVXYWHprevious border x, y, w, h 7WF_FULLXYWHlargest possible border xywh 8WF_HSLIDEhorizontal slider position 9WF_VSLIDEvertical slider position 10WF_TOPactive window's handle 11WF_FIRSTXYWHfirst rectangle from list 12WF_NEXTXYWHnext rectangle from list 13WF_RESVDreserved! 14WF_NEWDESKnew desktop background 15WF_HSLSIZEsize of horizontal slider 16WF_VSLSIZEsize of vertical slider 17WF_SCREEN wi_gw1, wi_gw2, wi_gw3, wi_gw4: return values (operation dependent) A handle of 0 denotes the desktop. Slider measurements are in relative units : 1..1000. See also: GemAES, wind_create, wind_open, wind_close, wind_delete, wind_set, wind_find, wind_update, wind_calc, wind_new VAR x, y, w, h, dummy, window : Integer; { determine maximum possible size, a window can have (useful if } { an application is to run in more resolutions) :} wind_get(0, WF_FULLXYWH, x, y, w, h); { get the position of the vertical slider :} wind_get(window, WF_VSLIDE, x, dummy, dummy, dummy); @    + 7    - 8Procedure wind_set(wi_shandle, wi_sfield, wi_sw1, wi_sw2, wi_sw3, wi_sw4: Integer); Set new window information (title, info line, border appearance etc.). wi_shandle : window handle wi_sfield: set operation required wi_sw1, wi_sw2, wi_sw3, wi_sw4: new values (operation dependent) See also: GemAES, wind_create, wind_open, wind_close, wind_delete, wind_get, wind_find, wind_update, wind_calc, wind_new VAR window : Integer; wname : String; ... window := wind_create(NAME, 100,100,200,200); wname := ' Yeahooo! ' + #00 + #00; { requires two #00 ! } wind_set(window, WF_NAME, HiPtr(wname[1]), LoPtr(wname[1]), 0,0); { set the window title. should be done before opening window } { to avoid flicker } wind_open(window, 100,100,200,200); Xz   + 7    , 7Function wind_find(wi_fmx, wi_fmy : Integer) : Integer; Find window at the given coordinates. wi_fmx, wi_fmy : coordinates to check Return value: 0 = no window; <> 0 = window handle This procedure is mainly used when the mouse is clicked somewhere on the screen, and the application wants to determine, if it's to top a window. See also: GemAES, wind_create, wind_open, wind_close, wind_delete, wind_get, wind_set, wind_update, wind_calc, wind_new VAR x, y, window_handle : Integer; ... window_handle := wind_find(x, y); IF window_handle = 0 THEN NoWindow ELSE TopMyWindow(window_handle);     + 7   * 5Procedure wind_update(wi_ubegend : Integer); Send window update message to the AES. wi_ubegend : message type : valueCONSTfunction 0END_UPDATEend window update 1BEG_UPDATEbegin window update 2END_MCTRLend mouse control 3BEG_MCTRLbegin mouse control The term "update" covers an application's wish to be let alone while it's reconstructing the screen area, whereas "mouse con- trol" is the way of saying to the AES, that the user controls, what's going on. See also: GemAES, wind_create, wind_open, wind_close, wind_delete, wind_get, wind_set, wind_find, wind_calc, wind_new wind_update(BEG_UPDATE);{ do screen recreation} ... wind_update(END_UPDATE);{ completed } ... wind_update(END_MCTRL);{ disallow AES mouse actions} { now the application is on its own - mouse actions won't } { interfere anymore} wind_update(BEG_MCTRL);{ allow the AES to handle mouse } { actions again} Yl    + 7    * 7Procedure wind_calc(wi_ctype, wi_ckind,  wi_cx, wi_cy,  wi_cinwidth, wi_cinheight: Integer;  VAR wi_coutx, wi_couty, wi_coutwidth, wi_coutheight : Integer); Calculate window size. As a window can be viewed at as consisting of two rectangles, the border rectangle and the work rectangle, and as an intimate relation- ship between these two sizes exists, it is possible to calculate the one rectangle if the second is known together with the border elements. wi_ctype: type of operation : valueCONSTcalculates 0WC_BORDERborder rectangle 1WC_WORKwork area rectangle wi_ckind: border elements : NAME, CLOSER etc. wi_cx, wi_cy: upper left corner of known rectangle wi_cinwidth: width wi_cinheight: height wi_coutx, wi_couty: upper left corner of unknown rectangle wi_coutwidth: width wi_coutheight : height See also: GemAES, wind_create, wind_open, wind_close, wind_delete, wind_get, wind_set, wind_find, wind_update, wind_new Assume we've just created a window, and wants to know the work area rectangle : VAR window: Integer; x, y, w, h : Integer;{ work area size } ... window := wind_create(NAME + CLOSER + UPARROW + DNARROW, 10, 10, 200, 200); wind_calc(WC_WORK, NAME + CLOSER + UPARROW + DNARROW, 10, 10, 200, 200, x, y, w, h); { now we know the size of the work area, so now we can clear it, } { set clipping rectangle etc.}    + 7    * 7 Procedure wind_new; Reset internal GEM information. Clears all "left-over" information about the GEM appearance, e.g. the number of v_show_c calls, window handles, etc. Used in shells when the shell wants to make absolutely sure, that its state is what it expects it to be when an applications has been run from the shell and returns. Requires TOS 1.4 or higher. See also: GemAES, wind_create, wind_open, wind_close, wind_delete, wind_get, wind_set, wind_find, wind_update, wind_calc \^   * 6 Procedure rsrc_load(re_lpfname : Pointer); Load a resource file with the name pointed to by re_lpfname. Remember that it must end in #00 ("C" convention). See also: GemAES, rsrc_free, rsrc_gaddr, rsrc_saddr, rsrc_obfix VAR resource_name : String; ... resource_name := 'MYPROG.RSC'#00; rsrc_load( addr(resource_name[1]) ); { note [1] index }    * 6 Procedure rsrc_free; Release memory allocated to the resource file. Well-behaved programs uses this procedure to release the resource memory when they're through using it. See also: GemAES, rsrc_load, rsrc_gaddr, rsrc_saddr, rsrc_obfix d" " " ") "5 Procedure rsrc_gaddr(re_gttype, re_gtindex : Integer; VAR re_gtaddr: Pointer); Get resource data structure address. Used for determining e.g. a menu tree's address. re_gttype: type of data structure : valueCONSTobject type 0R_TREEtree 1R_OBJECTobject 2R_TEDINFOTEDINFO block 3R_ICONBLKICONBLK block 4R_BITBLKBITBLK block 5R_STRINGstring/text 6R_IMAGEDATA image data 7R_OBSPECobject specification 8R_TEPTEXTtext/string 9R_TEPTMPLTtext template 10R_TEPVALIDtext input validator 11R_IBPMASKicon display mask 12R_IBPDATAicon bit map 13R_IBPTEXTicon text 14R_BIPDATAbit-mapped graphics 15R_FRSTRfree string 16R_FRIMGfree bit-mapped graphics re_gtindex : object index re_gtaddr: data structure address See also: GemAES, rsrc_load, rsrc_free, rsrc_saddr, rsrc_obfix Assume, that we've created a resource file with a menu tree containing two menus, DESK and FILE. Now we want to determine the address of the FILE tree : CONST DESK_MENU = 0; FILE_MENU = 1; { menu index, randomly chosen for this example } VAR address: Pointer; ... rsrc_load... rsrc_gaddr(R_TREE, FILE_MENU, address); 7X    ) 5 Procedure rsrc_saddr(re_sttype, re_stindex : Integer; re_staddr: Pointer); Set the address of a resource object. re_sttype: data structure type. See rsrc_gaddr re_stindex : index of element to be changed re_staddr: address of new structure See also: GemAES, rsrc_load, rsrc_free, rsrc_gaddr, rsrc_obfix     ) 5 Procedure rsrc_obfix(re_oobject : Integer; re_otree : Pointer); Convert object's coordinates from char coordinates to pixel coordinates. re_oobject : object to fix re_otree: object tree See also: GemAES, rsrc_load, rsrc_free, rsrc_gaddr, rsrc_saddr v    * 6 Procedure shel_read(sh_rpcmd, sh_rptail : Pointer); Identify command invoking this application. sh_rpcmd: address of area where to put command part of command line (string is in "C" format) sh_rptail : address of area where to put arguments from the command line (string is in Pascal format!!!) See also: GemAES, shel_write, shel_find, shel_envrn, shel_get, shel_put    ) 5 Procedure shel_write(sh_wdoex, sh_wisgr, sh_wiscr : Integer; sh_wpcmd, sh_wptail: Pointer); Run another application or return to the desktop when the user exits the current application. sh_wdoex: what to do when the user exits this application : 0 = exit to desktop 1 = run another application sh_wisgr: is the next application a graphic application? 0 = no (TOS/TTP);1 = yes (PRG/APP) sh_wiscr: is it an AES application? 0 = no;1 = yes Note : is currently ignored on the ST; set to zero sh_wpcmd: address of string containing the next application's filename (remember, "C" format so add #0) sh_wptail : address of string containing the next application's parameters, but this time it's in Pascal format!!! See also: GemAES, shel_read, shel_find, shel_envrn, shel_get, shel_put 0D    * 5 Procedure shel_get(sh_gbuff : Pointer; sh_glen : Integer); Read data from the internal AES shell buffer into our own buffer. sh_gbuff : address of our buffer (size >= 4192 bytes (strange size!)) sh_glen: length of the buffer See also: GemAES, shel_read, shel_write, shel_find, shel_envrn, shel_put Lq    * 5 Procedure shel_put(sh_pbuff : Pointer; sh_plen : Integer); Put data into the internal AES shell buffer. sh_pbuff : address of our own buffer sh_plen: bytes to write to the AES buffer on old TOS (<1.4) max 1024 bytes on new TOS (>= 1.4) max 4192 bytes See also: GemAES, shel_read, shel_write, shel_find, shel_envrn, shel_get     * 6 Procedure shel_find(sh_fpbuff : Pointer); Search for a file in the current directory and in all directories in the path. Returns full DOS specification. sh_fpbuff : address of filename to search for ("C" format). Will also contain the full DOS specification at return. Must be at least 81 characters long. See also: GemAES, shel_read, shel_write, shel_envrn, shel_get, shel_put Procedure shel_envrn(sh_epvalue, sh_eparm : Pointer); Search for a DOS environment string. sh_epvalue : pointer to address pointing to the first character following the parameter string sh_eparm: the parameter string to search for ("C" format)  Function Min(a, b : Integer) : Integer; Return the smallest number of a and b. See also: GemDecl, Max a := min(5,2)returns a = 2.  Function Max(a, b : Integer) : Integer; Return the largest number of a and b. See also: GemDecl, Min a := max(20,40) returns a = 40. vv Function HiPtr(VAR v) : Integer; Return the high-word of v's address. See also: GemDecl, LoPtr hi_word := HiPtr(a) !!  Function LoPtr(VAR v) : Integer; Return the low-word of v's address. HiPtr and LoPtr especially find their use with GemAES.wind_set, as it - depending on how it is called - requires a four-byte address in the form of two two-byte integers. See also: GemDecl, HiPtr lo_word := LoPtr(a)  Function BitTest(No : Integer; Value : LongInt) : Boolean; Test if bit No in Value is set. See also: GemDecl IF BitTest(3, 200) THEN WriteLn('Bit 3 set') ELSE WriteLn('Bit 3 clear')    Function Intersect(r1 : GRect;VAR r2 : GRect) : Boolean; Test if two rectangles intersect (have an area in common). Used for window redraws. r2's contents are changed to hold the resulting rectangle, and hence contains junk if no intersection was found. See also: GemDecl, EmptyRect PROGRAM Itersection; Uses GemDecl; VAR r1, r2 : GRect; BEGIN r1.x := 10; r1.y := 10; r1.w := 200; r1.h := 100; r2.x := 125; r2.y := 55; r2.w := 100; r2.h := 100; IF Intersect(r1, r2) THEN WITH r2 DO WriteLn('Intersection : x=', x, ' y=', y, ' w=', w,' h=', h) ELSE WriteLn('No intersection!') END. produces as output : Intersection : x=125 y=55 w=85 h=55   Function EmptyRect(r : GRect) : Boolean; Test if the rectangle r is empty, i.e. w <= 0 or h <= 0. See also: GemDecl, Intersect IF NOT EmptyRect(r) THEN DoMyOwnDrawing KO Procedure MakeXYXY(xywh : GRect; VAR xyxy : Array_4); Convert between x1, y1, x2, y2 and x, y, w, h format. See also: GemDecl, MakeXYWH MakeXYXY and MakeXYWH are complementary, as the following example shows : VAR xyxy : Array_4; xywh : GRect; ... MakeXYXY(xywh, xyxy); MakeXYWH(xyxy, xywh) won't bring any change to xywh. }~ Procedure MakeXYWH(xyxy : Array_4;VAR xywh : GRect); Convert from XYXY system to XYWH system. See also: GemDecl, MakeXYXY x &09Procedure v_opnwk(WorkIn: intin_Array; VAR handle: Integer; VAR WorkOut : workout_Array); Open workstation (load device drivers). WorkIn specifies what the workstation should look like, handle is the workstation handle, whereas WorkOut returns what the workstation does look like. Note : This procedure is not properly implemented on all ST-GEM versions and tend to crash system if used. This is due to the ST's missing device drivers for plotters, graphics tablets etc. WorkIn: input parameters handle: workstation/device handle WorkOut : return parameters See also: GemVDI, v_clswk, v_opnvwk, v_clsvwk, v_clrwk, v_updwk  &09Procedure v_clswk(handle : Integer); Close the workstation opened by v_opnwk. handle : workstation/device See also: GemVDI, v_opnwk, v_opnvwk, v_clsvwk, v_clrwk, v_updwk     %/8Procedure v_opnvwk(WorkIn: intin_Array;  VAR handle: Integer;  VAR WorkOut : workout_Array); Open a virtual workstation. On the ST, this means opening the screen. The WorkIn parameters are the same as the ones used by v_opnwk, but they are all ignored by the ST, so all attributes must be set by using the proper attribute procedures. This call must be preceded by a call to GemAES.appl_init. handle is the value obtained by an earlier call to graf_handle. WorkIn: input parameters handle: workstation/device handle (normally from graf_handle) WorkOut : output parameters See also: GemVDI, v_opnwk, v_clswk, v_clsvwk, v_clrwk, v_updwk     % / 8Procedure v_clsvwk(handle : Integer); Close the virtual workstation (screen). This is usually one of the last calls, a program makes before terminating. handle : workstation/device See also: GemVDI, v_opnwk, v_clswk, v_opnvwk, v_clrwk, v_updwk YY    % / 9Procedure v_clrwk(handle : Integer); Clear workstation, i.e. clear the screen and set it to the background color. On a printer or a plotter this would indicate paging, whereas the opcode would be written to a Metafile in case the device was a such. handle : workstation/device See also: GemVDI, v_opnwk, v_clswk, v_opnvwk, v_clsvwk, v_updwk     % / 9Procedure v_updwk(handle : Integer); Update workstation. This procedure is only of interest when using devices such as printers, plotters etc. but not the screen. It flushes the internal output-buffer and thereby makes sure that what the application wrote to the device really is printed. handle : workstation/device See also: GemVDI, v_opnwk, v_clswk, v_opnvwk, v_clsvwk, v_clrwk KW %/9 Function vst_load_fonts(handle, select : Integer) : Integer; Load fonts. It loads a character set (select) from a specified device. It returns 0 if no (other) character set(s) exist. This implies that 0 is returned if it is attempted to load a font for the ST screen, as it has one font only for each resolution. Is mainly used together with GDOS. handle: device select: the character set to load Return value : loaded font, or 0 = no font loaded See also: GemVDI, vst_unload_fonts, vst_font, vqt_name, vqt_fontinfo IF vst_load_fonts(VDI_handle, 2) = 0 THEN WriteLn('No font 2');  #-7 Procedure vst_unload_fonts(handle, select : Integer); Free up memory used by a font. GDOS related. handle : device select : font to remove See also: GemVDI, vst_load_fonts, vst_font, vqt_name, vqt_fontinfo vst_unload_fonts(VDI_handle, 2); R~ Procedure vs_clip(handle, clipflag : Integer; pxyarray: Array_4); Turn clipping on/off. Graphical operations are only performed if their coordinates lay inside the clipping rectangle. handle: device clipflag : 0 = no clipping; 1 = clipping pxyarray : corner coordinates See also: GemVDI VAR p: Array_4; BEGIN { GEM initializations goes here... } p[0] := 100; p[1] := 110; { upper left (x,y) = (100, 110) } p[2] := 400; p[3] := 310{ lower right (x,y) = (400, 310) } vs_clip(VDI_handle, 1, p); { turn clipping on } ... vs_clip(VDI_handle, 0, p); { turn clipping off again } 6  ( 3  Procedure v_pline(handle, count : Integer; pxyarray : ptsin_Array); Draw PolyLine. pxyarray contains coordinates, so that pxyarray[0] = starting x, pxyarray[1] = starting y, pxyarray[2] = to x, pxyarray[3] = to y etc. count contains the number of coordinates used = (highest array element used + 1) DIV 2. handle: device count: number of coordinate sets (x,y) (min. 2) pxyarray : coordinate sets See also: GemVDI, v_pmarker, vsl_type, vsl_udsty, vsl_width, vsl_color, vsl_ends VAR p : ptsin_Array; ... BEGIN { GEM initializations go here... } p[0] := 10; p[1] := 20; p[2] := 30; p[4] := 40; p[5] := 50; p[6] := 60; p[7] := 70; p[8] := 80; v_pline(VDI_handle, 8 DIV 2, p); { try changing it to v_pmarker } draws a line from (10,20) to (30,40) to (50,60) to (70,80). 1    & 2 Procedure v_pmarker(handle, count : Integer;  pxyarray: ptsin_Array); Set a series of points. Coordinate setup is as for v_pline. handle: device count: number of coordinate sets (x,y) pxyarray : coordinate sets See also: GemVDI, v_pline, vsm_type, vsm_height, vsm_color    , 7  # Procedure v_gtext(handle, x, y : Integer;chstring : String80); Draw graphic text starting at coordinates (x,y) = lower left corner of the text. handle: device x, y: string coordinate chstring : the string ("C" format : #00 suffix) See also: GemVDI, v_justified, vst_height, vst_point, vst_rotation, vst_color, vst_effects, vst_alignment v_gtext(VDI_handle, 10, 20, 'HighSpeed Pascal'#00);   ", 7   % Procedure v_fillarea(handle, count : Integer; pxyarray : ptsin_Array); Fill a polygonwith the color, style, pattern etc. set by the attribute functions. pxyarray holds the polygon's corner coordinates, whereas count holds the number of coordinates. handle: device count: number of coordinate sets pxyarray : corner coordinates See also: GemVDI, v_contourfill, vr_recfl, vsf_style, vsf_color, vsf_perimeter, vsf_udpat, vsf_interior /  Procedure v_cellarray(handle: Integer; pxyarray: Array_4; rowlength, elused, numrows, wrtmode : Integer; colarray: intin_Array); Create a cell array. A cell array is a rectangle divided into a number of rows and columns, where each of these subareas can be assigned their own point color. The parameters are : handle: Device handle pxyarray: Corner coordinates [0] = lower leftx; [1] = lower left y [2] = upper right x; [3] = upper right y rowlength : Line length in colarray elused: Number of zones in colarray lines numrows: Number of lines in colarray wrtmode: Character mode colarray: Color specifications See also: GemVDI, vq_cellarray IU    ) 4  % Procedure v_contourfill(handle, x, y, index : Integer); Fill an area with the current fill color, style etc. until the color given by index is met. handle : device x, y: point within area to be filled index: contour color See also: GemVDI, v_fillarea, vr_recfl, vsf_style, vsf_color, vsf_perimeter, vsf_udpat, vsf_interior      . 9  % Procedure vr_recfl(handle : Integer; pxyarray : Array_4); Fill a rectangle with the currently set color and attributes. pxyarray [0] and [1] defines one corner of the rectangle, whereas pxyarray [2] and [3] defines the diagonally opposite corner of the rectangle. handle: device pxyarray : corner coordinates See also: GemVDI, v_fillarea, v_contourfill, vsf_style, vsf_color, vsf_perimeter, vsf_udpat, vsf_interior VAR p : Array_4; ... p[0] := 10; p[1] := 40; p[2] := 200; p[3] := 100; vr_recfl(VDI_handle, p)     &0:  Procedure v_bar(handle : Integer; pxyarray : Array_4); Filled bar. Attributes must be set beforehand. handle: device pxyarray : diagonally opposite corner coordinates See also: GemVDI, v_arc, v_pieslice, v_circle, v_ellarc, v_ellpie, v_ellipse, v_rbox, v_rfbox an    & 0 :  Procedure v_arc(handle, x, y, radius, begang, endang : Integer); Draw an arc. handle : device x, y: center point radius : arc's radius begang : starting angle (degrees * 10) endang : ending angle(degrees * 10) See also: GemVDI, v_bar, v_pieslice, v_circle, v_ellarc, v_ellpie, v_ellipse, v_rbox, v_rfbox v_arc(VDI_handle, 320, 200, 100, 0, 450);  2  !+5 Procedure v_pieslice(handle, x, y, radius, begang, endang: Integer); Draw a filled arc. The arc is drawn in the same way as v_arc, except that the end points of the arc are connected to the center point, and the thereby created area is filled. handle : device x, y: center point radius : arc's radius begang : starting angle (degrees * 10) endang : ending angle(degrees * 10) See also: GemVDI, v_bar, v_arc, v_circle, v_ellarc, v_ellpie, v_ellipse, v_rbox, v_rfbox v_pieslice(VDI_handle, 320, 200, 100, 0, 450); 4?    ! - 7  Procedure v_circle(handle, x, y, radius : Integer); Draw a filled circle. All attributes must be set beforehand. handle : device x, y: center point radius : circle's radius See also: GemVDI, v_bar, v_arc, v_pieslice, v_ellarc, v_ellpie, v_ellipse, v_rbox, v_rfbox v_circle(VDI_handle, 320, 200, 100);   ! -7 Procedure v_ellarc(handle, x, y, xradius, yradius, begang,endang: Integer); Draw an elliptical arc. handle: device x, y: center point xradius : radius in the x-direction yradius : radius in the y-direction begang: starting angle (degrees * 10) endang: ending angle(degrees * 10) See also: GemVDI, v_bar, v_arc, v_pieslice, v_circle, v_ellpie, v_ellipse, v_rbox, v_rfbox v_ellarc(VDI_handle, 320, 200, 50, 70, 0, 450);   ! -7 Procedure v_ellpie(handle, x, y, xradius, yradius, begang,endang: Integer); Draw a filled elliptical arc in the same way as v_ellarc. handle: device x, y: center point xradius : radius in the x-direction yradius : radius in the y-direction begang: starting angle (degrees * 10) endang: ending angle(degrees * 10) See also: GemVDI, v_bar, v_arc, v_pieslice, v_circle, v_ellarc, v_ellipse, v_rbox, v_rfbox v_ellpie(VDI_handle, 320, 200, 50, 70, 5, 455); q    ! - 7   Procedure v_ellipse(handle, x, y,  xradius,  yradius: Integer); Draw a filled ellipse. Attributes must be set beforehand. handle: device x, y: center point xradius : radius in the x-direction yradius : radius in the y-direction See also: GemVDI, v_bar, v_arc, v_pieslice, v_circle, v_ellarc, v_ellpie, v_rbox, v_rfbox v_ellipse(VDI_handle, 320, 200, 50, 70); _l  ! -7   Procedure v_rbox(handle : Integer; xyarray : Array_4); Draw a box with rounded corners. handle: device xyarray : diagonally opposite corner coordinates See also: GemVDI, v_bar, v_arc, v_pieslice, v_circle, v_ellarc, v_ellpie, v_ellipse, v_rfbox VAR a : Array_4; ... a[0] := 10; a[1] := 30; a[2] := 150; a[3] := 200; v_rbox(VDI_handle, a);  *    ! - 7   Procedure v_rfbox(handle : Integer; xyarray : Array_4); Draw a filled box with rounded corners using the current attri- butes. handle: device xyarray : diagonally opposite corner coordinates See also: GemVDI, v_bar, v_arc, v_pieslice, v_circle, v_ellarc, v_ellpie, v_ellipse, v_rbox   ( 3   # Procedure v_justified(handle, x, y : Integer; gstring: String80; jlength, wordspace, charspace: Integer); Write justified text. handle: device x, y: where to start writing gstring: string to write (remember #00) jlength: width of output area wordspace : insert additional spaces between words? 0 = no <> 0 = yes, if required charspace : insert additional spaces between letters? 0 = no <> 0 = yes, if required See also: GemVDI, v_gtext, vst_height, vst_point, vst_rotation, vst_color, vst_effects, vst_alignment H Procedure vswr_mode(handle, mode : Integer); Set the writing mode of all following graphics operations. handle : device mode: CONST 1MD_REPLACEreplace 2MD_TRANS transparent 3MD_XORXOR 4MD_ERASE reverse transparent See also: GemVDI vswr_mode(VDI_handle, MD_REPLACE);  Procedure vs_color(handle, index : Integer; rgbin : Array_3); Set color representation. handle : device index: color index in palette rgbin: normalized red, green and blue intensity values : [0] = red [1] = green [2] = blue The normalized values are in the range [0..1000]. See also: GemVDI VAR r : Array_3; ... r[0] := 750; r[1] := 400; r[2] := 200; vs_color(VDI_handle, 3, r); { sets color index 3 to a new color }   ' 2  Procedure vsl_type(handle, style : Integer); Set PolyLine line style. The line styles are : styleCONSTpattern MSBLSB 1SOLID* 2LDASHED* .... 3DOTTED***.***. 4DASHDOT*...***... 5DASHED*. 6DASHDOTDOT****...**..**... 7user defined (see vsl_udsty below) A style is 16 bits wide; "*" = set (1); "." = clear (0). See also: GemVDI, v_pline, v_pmarker, vsl_udsty, vsl_width, vsl_color, vsl_ends vsl_type(VDI_handle, DASHDOTDOT); v    ' 1 Procedure vsl_udsty(handle, pattern : Integer); Set user defined line style with a 16-bit pattern laid out in the manner described in vsl_type. handle: device pattern : 16-bit pattern See also: GemVDI, v_pline, v_pmarker, vsl_type, vsl_width, vsl_color, vsl_ends vsl_udsty(VDI_handle, $CCCC);{ **..**..**..**.. layout } vsl_type(VDI_handle, 7);{ user line style} '  '1 Procedure vsl_width(handle, width : Integer); Set PolyLine's line width. Note that width must be an odd number. handle : device width: new line width See also: GemVDI, v_pline, v_pmarker, vsl_type, vsl_udsty, vsl_color, vsl_ends vsl_width(VDI_handle, 7);{ pretty thick line! }   '1 Procedure vsl_color(handle, colindex : Integer); Set PolyLine color. handle: device colindex : a color index from the palette See also: GemVDI, v_pline, v_pmarker, vsl_type, vsl_udsty, vsl_width, vsl_ends vsl_color(VDI_handle, Blue); y  '1   Procedure vsl_ends(handle, begstyle, endstyle : Integer); Set PolyLine start and end styles. The style layout is as follows : numeric valueCONST 1SQUARED 2ARROWED 3ROUNDED handle: device begstyle : line begin style endstyle : line end style See also: GemVDI, v_pline, v_pmarker, vsl_type, vsl_udsty, vsl_width, vsl_color vsl_ends(VDI_handle, ARROWED, ROUNDED); i  ' 3 Procedure vsm_type(handle, symbol : Integer); Set PolyMarker type. The different types are : symbol : valueshape 1point 2plus sign 3star 4square 5diagonal cross 6diamond ndevice dependent handle : device There are six shapes available on the ST screen. See also: GemVDI, v_pmarker, v_pline, vsm_height, vsm_color vsm_type(VDI_handle, 4);   '1 Procedure vsm_height(handle, height : Integer); Set PolyMarker height. handle : device height : desired height See also: GemVDI, v_pmarker, v_pline, vsm_type, vsm_color vsm_height(VDI_handle, 5);   '1 Function vsm_color(handle, colindex : Integer); Set PolyMarker color to colindex in the current palette. handle: device colindex : color index See also: GemVDI, v_pmarker, v_pline, vsm_type, vsm_height vsm_color(VDI_handle, Yellow);   ) 4   & Procedure vst_height(handle, height : Integer; VAR charwidth, charheight, cellwidth, cellheight : Integer); Set absolute graphic character height. As a result of the set height, new character cell sizes are calculated and returned. handle: device height: new height in pixels charwidth: width of a char with the new height charheight : height of character cellwidth: width of a character cell with the new height cellheight : height of cell See also: GemVDI, v_gtext, v_justified, vst_point, vst_color, vst_rotation, vst_effects, vst_alignment CONST newheight = 13; VAR chW, chH, celW, celH : Integer; ... vst_height(VDI_handle, newheight, chW, chH, celW, celH); @  ) 5   # Procedure vst_point(handle, point : Integer;  VAR charwidth, charheight, cellwidth, cellheight : Integer); Set new character height. Basically the same function as vst_height, except for character height being given in "points" = 1/72 of an inch. handle: device height: new height in points charwidth: width of a char with the new height charheight : height of character cellwidth: width of a character cell with the new height cellheight : height of cell See also: GemVDI, v_gtext, v_justified, vst_height, vst_rotation, vst_color, vst_effects, vst_alignment )  ) 5  # Procedure vst_rotation(handle, angle : Integer); Set character baseline vector to a given (GEM style) degree. handle : device angle: baseline angle See also: GemVDI, v_gtext, v_justified, vst_height, vst_point, vst_color, vst_effects, vst_alignment vst_rotation(VDI_handle, 2700); ;F #5 Procedure vst_font(handle, font : Integer); Select either the system font or a previously loaded font. handle : device font: desired font : system = 1 (6 * 6 font) See also: GemVDI, vst_load_fonts, vst_unload_fonts, vqt_name, vqt_fontinfo vst_font(VDI_handle, 1); vst_font is of most use together with GDOS.   ) 5  & Procedure vst_color(handle, colindex : Integer); Set text color. handle: device colindex : new text color See also: GemVDI, v_gtext, v_justified, vst_height, vst_point, vst_rotation, vst_effects, vst_alignment vst_color(VDI_handle, 4);   ) 5   $ Procedure vst_effects(handle, effect : Integer); Set special text effects. The available effects are : effectCONSTresulting style 0NORMALnormal 1BOLDboldface 2SHADEDshaded 4SKEWEDitalic 8UNDERLINEDunderlined 16OUTLINEoutlined 32SHADOWshadowed The effects may be combined by adding them. handle : device See also: GemVDI, v_gtext, v_justified, vst_height, vst_point, vst_rotation, vst_color, vst_alignment vst_effects(VDI_handle, BOLD + OUTLINE); vst_effects(VDI_handle, NORMAL);   ) 5   $ Procedure vst_alignment(handle, horin,vertin : Integer; VAR horout, vertout : Integer); Set horizontal and vertical text alignment. handle: device horin: horizontal alignment : 0 : left aligned 1 : centered 2 : right aligned vertin: vertical alignment 0 : base line 1 : half line 2 : ascent line 3 : bottom line 4 : descent line 5 : top line horout: the value used by the VDI vertout : the value used by the VDI See also: GemVDI, v_gtext, v_justified, vst_height, vst_point, vst_rotation, vst_color, vst_effects    .8   % Procedure vsf_interior(handle, style : Integer); Set fill interior style. The available styles are: styleCONSTsurface 0HOLLOWnot filled 1SOLIDsolid fill with fill color 2PATTERNdotted fill 3HATCHcrosshatch fill 4UDFILLSTYLEuser defined fill style handle : device See also: GemVDI, v_fillarea, v_contourfill, vr_recfl, vsf_style, vsf_color, vsf_perimeter, vsf_udpat vsf_interior(VDI_handle, PATTERN);     . 8   % Procedure vsf_style(handle, styleindex : Integer); Set fill style index. This allows the selection of one of either 24 bit patterns or 12 crosshatch patterns. Before calling this procedure, it must be selected whether the styleindex concerns a bit pattern or a cross- hatch pattern by calling vsf_interior. handle: device styleindex : new style See also: GemVDI, v_fillarea, v_contourfill, vr_recfl, vsf_color, vsf_perimeter, vsf_udpat, vsf_interior vsf_interior(VDI_handle, HATCH);{ crosshatch} vsf_style(VDI_handle, 3);{ crosshatch style 3 } vsf_interior(VDI_handle, PATTERN); { bit pattern} { a call to a fill procedure at this point would result in } { a bit pattern code 3 to be drawn}     .8  % Procedure vsf_color(handle, colorindex : Integer); Set fill color. handle: device colorindex : new fill color See also: GemVDI, v_fillarea, v_contourfill, vr_recfl, vsf_style, vsf_perimeter, vsf_udpat, vsf_interior vsf_color(VDI_handle, Magenta); *4   .8  ! Procedure vsf_perimeter(handle, pervis : Integer); Set fill frame on/off. handle : device pervis : fill frame flag : 0 = off; 1 = on (default) See also: GemVDI, v_fillarea, v_contourfill, vr_recfl, vsf_style, vsf_color, vsf_udpat, vsf_interior vsf_perimeter(VDI_handle, 0);{ turn frame off } <[    . 8  % Procedure vsf_udpat(handle : Integer; VAR pfillpat;  planes : Integer); Set user defined fill pattern. handle: device pfillpat : memory block containing the fill pattern planes: number of colors involved See also: GemVDI, v_fillarea, v_contourfill, vr_recfl, vsf_style, vsf_color, vsf_perimeter, vsf_interior *) ) ))( Procedure vro_cpyfm(handle, wrmode : Integer;  pxyarray: Array_8;  psrcMFDB,  pdesMFDB: MFDB); Copy raster, opaque. wrmode defines the logical operations that are performed on the raster when stored. HighSpeed Pascal defines some constants concerning the raster operations : valueCONSToperation performed s=source; d=destination 0ALL_WHITE0 1S_AND_Ds AND d 2S_AND_NOTDs AND NOT d 3S_ONLYs 4NOTS_AND_D(NOT s) AND d 5D_ONLYd 6S_XOR_Ds XOR d 7S_OR_Ds OR d 8NOT_SORDNOT (s OR d) 9NOT_SXORDNOT (s XOR d) 10NOT_DNOT d 11S_OR_NOTDs OR (NOT d) 12NOT_SNOT s 13NOTS_OR_D(NOT s) OR d 14NOT_SANDDNOT (s AND d) 15ALL_BLACK1 handle: device wrmode: writing mode (see above) pxyarray : [0]..[3] : source corner coordinates [4]..[7] : destination corner coordinates The coordinates are given in terms of two diagonally opposite corners. psrcMFDB : source pdesMFDB : destination See also: GemVDI, vrt_cpyfm, vr_trnfm, v_get_pixel 1  ( Procedure vrt_cpyfm(handle, wrmode : Integer;  pxyarray: Array_8;  psrcMFDB,  pdesMFDB: MFDB;  color_index: Array_2); Copy raster, transparent. handle: device wrmode: writing mode : MD_TRANS, MD_REPLACE, MD_XOR, MD_ERASE pxyarray: [0]..[3] : source corner coordinates [4]..[7] : destination corner coordinates The coordinates are given in terms of two diagonal- ly opposite corners. psrcMFDB: source pdesMFDB: destination color_index : [0] = color of set pixels [1] = color of clear pixels See also: GemVDI, vro_cpyfm, vr_trnfm, v_get_pixel %O    ) Procedure vr_trnfm(handle: Integer; psrcMFDB, pdesMFDB: MFDB); Transform form from standard format to device specific. handle: device psrcMFDB : source Memory Form Definition Block pdesMFDB : destination Memory Form Definition Block See also: GemVDI, vro_cpyfm, vrt_cpyfm, v_get_pixel ?Y    )Procedure v_get_pixel(handle, x, y : Integer; VAR pel, index : Integer); Determine if a pixel is set or clear. v_get_pixel can only be used in device-specific format. handle : device x, y: pixel to get pel: pixel set = 1 or clear = 0 index: pixel's color index See also: GemVDI, vro_cpyfm, vrt_cpyfm, vr_trnfm [  Procedure vsin_mode(handle, devtype, mode : Integer); Set input mode. handle: device devtype : input device type : 1 : position input 2 : value input 3 : selection input 4 : string input mode: Input mode : CONST 1 : REQUEST 2 : SAMPLE See also: GemVDI, vqin_mode   Procedure vrq_locator(handle, x, y: Integer; VAR xout, yout : Integer; VAR term: Integer); Input locator, request mode. handle: device x, y: graphic cursor start position xout, yout : graphic cursor end position term: the keyboard key/mouse button that ended the input #32 = left mouse button; #33 = right button; otherwise the keyboard key's ASCII value See also: GemVDI, vsm_locator   Function vsm_locator(handle, x, y: Integer; VAR xout, yout, term : Integer) : Integer; Input locator, sample mode. handle: device x, y: graphic cursor start position xout, yout: graphic cursor end position term: the keyboard key/mouse button that ended the input #32 = left mouse button; #33 = right button return value : status value : valuekey press?position change? 0nono(note the 1noyesbinary appea- 2yesno rance) 3yesyes See also: GemVDI, vrq_locator &   Procedure vrq_valuator(handle, valin : Integer; VAR valout : Integer; VAR term: Integer); Input valuator, request mode. handle : device valin: start value valout : end value term: key terminating operation See also: GemVDI, vsm_valuator ]  Procedure vsm_valuator(handle, valin : Integer; VAR valout : Integer; VAR term: Integer; VAR status : Integer); Input valuator, sample mode. handle : device valin: start value valout : end value term: key terminating operation status : valueinterpretation 0no actions 1value changed 2key pressed See also: GemVDI, vrq_valuator    Procedure vrq_choice(handle, ch_in : Integer; VAR ch_out: Integer); Input choice, request mode. handle : device ch_in: initial value ch_out : pressed key See also: GemVDI, vsm_choice    Function vsm_choice(handle : Integer; VAR choice : Integer) : Integer; Input choice, sample mode. handle: device choice: pressed key Return value : status : 0 = no key; 1 = key pressed See also: GemVDI, vrq_choice X  Procedure vrq_string(handle, maxlen, echomode : Integer; echo_xy: Array_2; VAR instring: String80); Input string, request mode. Waits for key before terminating. handle: device maxlen: maximum string length echomode : 0 = no echo; 1 = echo echo_xy: echo area (x,y) instring : the string input See also: GemVDI, vsm_string {  Function vsm_string(handle, maxlen,  echomode: Integer;  echo_xy: Array_2;  VAR instring: String80) : Integer; Input string, sample mode. handle: device maxlen: maximum string length echomode: 0 = no echo; 1 = echo echo_xy: echo area (x,y) instring: the string input Return value : 0 = illegal key pressed; otherwise length of string. See also: GemVDI, vrq_string D  Procedure vsc_form(handle : Integer; pcurform : Array_37); Set mouse form. handle: device pcurform : cursor form : [ 0], [ 1] : hot spot (x,y) [ 2]: must be 1 (!) [ 3]: mask color index [ 4]: form color index [ 5]..[20] : mask raster lines (16) [21]..[36] : form raster lines (16) See also: GemVDI, graf_mouse  'Procedure vex_timv(handle: Integer; timaddr: Pointer; VAR otimaddr : Pointer; VAR timconv: Integer); Exchange timer interrupt vector. Directs the system timer interrupt to user routine. handle: device timaddr: address of new timer routine otimaddr : address of old timer routine timconv: interrupt interval (milliseconds) See also: GemVDI, vex_butv, vex_motv, vex_curv     Procedure v_show_c(handle, reset : Integer); Show graphic cursor (mouse). Each time v_show_c is called, an internal counter is updated, so it is necessary to call v_hide_c exactly as many times as v_show_c to hide the cursor. The internal counter can, however, be cleared if reset is set to 0. In normal operation, reset should be 1. handle : device reset: reset flag : 0 = clear counter; 1 = maintain counter See also: GemVDI, v_hide_c, graf_mouse VAR i : Integer; ... FOR i := 1 TO 10 DO v_show_c(VDI_handle, 1); FOR i := 1 TO 9 DO v_hide_c(VDI_handle); { at this point, the cursor is still on } v_hide_c(VDI_handle); { now it's turned off } }}  Procedure v_hide_c(handle : Integer); Hide graphic cursor (mouse). handle : device See also: GemVDI, v_show_c, graf_mouse " Procedure vq_mouse(handle: Integer; VAR pstatus, x, y : Integer); Sample mouse button state and return graphic cursor's coordinates. handle: device pstatus : mouse button state : 0 = not pressed; 1 = pressed x, y: cursor coordinates See also: GemVDI  'Procedure vex_butv(handle: Integer; pusrcode: Pointer; VAR psavcode : Pointer); Exchange button change vector. This is one of the more "dirty" procedures, as it allows the programmer to specify, what his program should do, if the mouse button is pressed. handle: device pusrcode : address of the new routine to be installed psavcode : address of the old routine See also: GemVDI, vex_timv, vex_motv, vex_curv 5 'Procedure vex_motv(handle: Integer; pusrcode: Pointer; VAR psavcode : Pointer); Exchange mouse movement vector. As vex_butv, this is also one of the "dirty" procedures. This time, the user can specify what shall happen, each time the mouse is moved, and the mouse coordinates passed on to the application can be changed as well. "Speed mouse" utilities are often made this way. handle: device pusrcode : address of new routine psavcode : address of old routine See also: GemVDI, vex_timv, vex_butv, vex_curv j 'Procedure vex_curv(handle: Integer; pusrcode: Pointer; VAR psavcode : Pointer); Exchange cursor change vector. In this case, the routine is called, when it is required to change the graphic cursor's position on the screen. handle: device pusrcode : address of new routine psavcode : address of old routine See also: GemVDI, vex_timv, vex_butv, vex_motv P Procedure vq_key_s(handle : Integer; VAR pstatus : Integer); Sample keyboard state information. Returns the status of four special keys on the keyboard, each represented by a single bit : bitvalue CONSTkey 01K_RSHIFTright SHIFT key 12K_LSHIFTleft SHIFT key 24K_CTRLCONTROL key 38K_ALTALTERNATE key Set bits indicate a pressed key. A returned value of, say, 3 would indicate that both shift keys are pressed. See also: GemVDI Determine, if ALTERNATE key is pressed : VAR i : Integer; ... vq_key_s(VDI_handle, i); IF BitTest(3, i) THEN WriteLn('ALTERNATE pressed')  Procedure vq_extend(handle, owflag : Integer;  VAR workout: workout_Array); Extended inquire. It's used for determining either the OpenWorkstation parameters, or the extended parameters. The information about the device (handle) is returned in workout. handle: device owflag: inquiry type : 0 = Open Workstation parameters 1 = extended parameters workout : returned values See also: GemVDI   Function vq_color(handle, colorindex, setflag: Integer; VAR rgb: Array_3) : Integer; Inquire color representation. Returns the red, green and blue composition of colorindex in rgb in scaled values (0-1000). handle: device colorindex : color index setflag: 0 = passed color index; 1 = current color index. rgb: color composition : [0] = red [1] = green [2] = blue See also: GemVDI, vs_color   Procedure vql_attributes(handle: Integer; VAR attrib : Array_6); Inquire PolyLine attributes. handle : device attrib : polyline attributes See also: GemVDI, v_pline    Procedure vqm_attributes(handle: Integer; VAR attrib: Array_5); Inquire PolyMarker attributes. handle : device attrib : polymarker attributes See also: GemVDI, v_pmarker   Procedure vqf_attributes(handle: Integer; VAR attrib : Array_5); Inquire fill attributes. handle : device attrib : fill attributes See also: GemVDI, vr_recfl     Procedure vqt_attributes(handle: Integer; VAR attrib : Array_10); Inquire graphic text attributes. handle : device attrib : text attributes See also: GemVDI, v_gtext, v_justified P Procedure vqt_extent(handle: Integer; chstring: String80; VAR extent : Array_8); Inquire graphic text extent. It returns four coordinates, describing an imaginary box surrounding chstring as it would appear with the current text attributes. handle: device chstring : input string extent: extent coordinates See also: GemVDI 6 Function vqt_width(handle: Integer; character: Char; VAR cellwidth, leftdelta, rightdelta : Integer) : Integer; Inquire character cell width. handle: device character: the character to measure cellwidth: width of character cell leftdelta: left offset rightdelta : right offset See also: GemVDI O   # 5 Function vqt_name(handle, elementnum : Integer; VAR name: String80) : Integer; Inquire font name and index. handle: device elementnum: font index name: name and style of font Return value : current font index vqt_name is only usable with GDOS fonts. See also: GemVDI, vst_load_fonts, vst_unload_fonts, vst_font, vqt_fontinfo   Procedure vq_cellarray(handle: Integer; pxyarray: Array_4; rowlen, numrows: Integer; VAR elused, rowsused: Integer; status: Integer; VAR colarray : intout_Array); Inquire cell array settings. handle: device pxyarray : lower left and upper right corners of rectangle rowlen: length of each row in color index array numrows: number of rows elused: number of used elements rowsused : number of used rows status: 0 = error; <> 0 = ok colarray : returned colors See also: GemVDI, v_cellarray    Procedure vqin_mode(handle, dev_type : Integer;  VAR inputmode: Integer); Inquire input mode. handle: device dev_type: device type : Locator, valuator, choice or string inputmode : request or sample See also: GemVDI, vsin_mode Q #5?Procedure vqt_fontinfo(handle: Integer; VAR minADE, maxADE: Integer; VAR distances : Array_4; VAR maxwidth: Integer; effects: Array_3); Inquire information about the current font. handle: device minADE: ASCII value of first writable character in font maxADE: ASCII value of last writable character in font distances : bottom, descent, half line, ascent, top values maxwidth: char width (left and right delta values are not included) effects: enlargement by italic etc., left and right delta values See also: GemVDI, vst_load_fonts, vst_unload_fonts, vst_font, vqt_name Cv Procedure vq_chcells(handle: Integer; VAR rows, columns : Integer); Inquire addressable alpha character cells. Returns the number of addressable character cells in terms of rows and columns. handle: device rows: number of character rows available columns : number of character columns available See also: GemVDI   Procedure v_exit_cur(handle : Integer); Exit alpha mode and go into graphics mode (if there's a difference). handle : device See also: GemVDI, v_enter_cur   Procedure v_enter_cur(handle : Integer); Enter alpha mode (leave graphics mode). handle : device See also: GemVDI, v_exit_cur    ) 5 Procedure v_curup(handle : Integer); Move alpha cursor one line up. handle : device See also: GemVDI, v_curdown, v_curleft, v_curright, v_curhome   ' 3 Procedure v_curdown(handle : Integer); Move alpha cursor one line down. handle : device See also: GemVDI, v_curup, v_curleft, v_curright, v_curhome   ' 2 Procedure v_curright(handle : Integer); Move alpha cursor one position to the right. handle : device See also: GemVDI, v_curup, v_curdown, v_curleft, v_curhome   ' 3 Procedure v_curleft(handle : Integer); Move alpha cursor one position to the left. handle : device See also: GemVDI, v_curup, v_curdown, v_curright, v_curhome   ' 2 Procedure v_curhome(handle : Integer); Home alpha cursor. handle : device See also: GemVDI, v_curup, v_curdown, v_curleft, v_curright zz Procedure v_eeos(handle : Integer); Erase from alpha cursor to End Of Screen. handle : device See also: GemVDI, v_eeol xx Procedure v_eeol(handle : Integer); Erase from alpha cursor to End Of Line. handle : device See also: GemVDI, v_eeos >A   Procedure vs_curaddress(handle, row, column : Integer); Set alpha cursor address to row and column. If values are illegal the cursor is set as close to the desired position as possible. handle : device row: row for cursor to be placed on column : column for cursor to be placed on See also: GemVDI, vq_curaddress  Procedure v_curtext(handle : Integer; chstring : String80); Write cursor addressable text. handle: device chstring : string to output ("C" format) See also: GemVDI gg Procedure v_rvon(handle : Integer); Set reverse video on. handle : device See also: GemVDI, v_rvoff ii Procedure v_rvoff(handle : Integer); Turn reverse video off. handle : device See also: GemVDI, v_rvon    Procedure vq_curaddress(handle: Integer; VAR row, column : Integer); Return current cursor position. handle : device row: cursor's row position column : cursor's column position See also: GemVDI, vs_curaddress  Function vq_tabstatus(handle : Integer) : Integer; Return tablet status. A tablet could be a mouse, joystick etc. handle: device Return value : tablet status : 1 = available; 0 = not available See also: GemVDI dd Procedure v_hardcopy(handle : Integer); Make a hardcopy. handle : source device See also: GemVDI   Procedure v_dspcur(handle, x, y : Integer); Set the graphic cursor at position (x,y) and show it. Note the difference between a graphic cursor and an alpha cursor. handle : device x,y: cursor coordinates See also: GemVDI, v_rmcur ww Procedure v_rmcur(handle : Integer); Remove the last set graphic cursor. handle : device See also: GemVDI, v_dspcur  $7 Procedure v_form_adv(handle : Integer); Write a form feed to a printer. handle : device See also: GemVDI, v_output_window, v_clear_disp_list, v_bit_image     2 Procedure v_output_window(handle : Integer; xyarray : Array_4); Write a part of the current output window to a printer. handle: device xyarray : two diagonally opposite corners representing the source window See also: GemVDI, v_form_adv, v_clear_disp_list, v_bit_image   0 Procedure v_clear_disp_list(handle : Integer); Clear a printer's display list. handle : device See also: GemVDI, v_form_adv, v_output_window, v_bit_image   0Procedure v_bit_image(handle: Integer; filename : String80; aspect, scaling, num_pts: Integer; xyarray: Array_4); Output bit image file to a printer. handle: device filename : input file to output (remember : append #0) aspect: aspect ratio flag : 0 = ignore aspect ratio 1 = pixel aspect ratio 2 = page aspect ratio scaling: scaling flag : 0 = uniform scaling 1 = separate scaling xyarray: upper left corner and lower right See also: GemVDI, v_form_adv, v_output_window, v_clear_disp_list N    ) 4  Function vs_palette(handle, palette : Integer) : Integer; Select IBM color palette. handle: device palette : selected palette : colors : 0red, green, yellow 1cyan, blue, magenta See also: GemVDI, vqp_films, vqp_state, vsp_state, vsp_save, vsp_message, vqp_error    * 5  Procedure vqp_films(handle : Integer; VAR filmnames : String125); Inquire palette film types (filmnames). handle: device filmnames : film types : Five sets of 25 characters See also: GemVDI, vs_palette, vqp_state, vsp_state, vsp_save, vsp_message, vqp_error    * 5  Procedure vqp_state(handle: Integer;  VAR port, filmname, lightness, interlace, planes : Integer;  VAR indexes: Array_16); Inquire palette state. handle: device port: communications port : 0 = first filmname: film index : 0..4 lightness : lightness control : -3..3 interlace : interlace flag : 0 = noninterlaced; 1 = interlaced planes: number of bitplanes indexes: coded information about color indexes See also: GemVDI, vs_palette, vqp_films, vsp_state, vsp_save, vsp_message, vqp_error p   * 5  Procedure vsp_state(handle,  port,  filmnum,  lightness,  interlace,  planes: Integer;  indexes: Array_16); Set palette state. handle: device port: communications port : 0 = first filmname: film index : 0..4 lightness : lightness control : -3..3 interlace : interlace flag : 0 = noninterlaced; 1 = interlaced planes: number of bitplanes indexes: coded information about color indexes See also: GemVDI, vs_palette, vqp_films, vqp_state, vsp_save, vsp_message, vqp_error    * 5   Procedure vsp_save(handle : Integer); Save palette driver state. handle : device See also: GemVDI, vs_palette, vqp_films, vqp_state, vsp_state, vsp_message, vqp_error    * 5   Procedure vsp_message(handle : Integer); Suppress palette driver messages. handle : device See also: GemVDI, vs_palette, vqp_films, vqp_state, vsp_state, vsp_save, vqp_error    * 5   Function vqp_error(handle : Integer) : Integer; Inquire palette error. handle: device Return value : Error code See also: GemVDI, vs_palette, vqp_films, vqp_state, vsp_state, vsp_save, vsp_message e  ! Procedure v_meta_extents(handle, minx, miny, maxx, maxy: Integer); Update current metafile's extent header. handle : device minx, miny, maxx, maxy: minimum and maximum coordinates for bounding rectangle See also: GemVDI, v_write_meta, vm_filename u # Procedure v_write_meta(handle, numintin : Integer; int_in: intin_Array; numptsin : Integer; pts_in: ptsin_Array); Write a user-defined metafile item. handle: device numintin : number of elements in int_in int_in: user defined information numptsin : number of elements in pts_in pts_in: user defined information See also: GemVDI, v_meta_extents, vm_filename  # Procedure vm_filename(handle : Integer; filename : String80); Change MetaFile's name. handle: device filename : new file name ("C" format) See also: GemVDI, v_meta_extents, v_write_meta   Function ST_SHL(a,b : Long_Integer) : Long_Integer; Implementation of ST Pascal SHL (shift left) function. This function is included to ease up ST Pascal source code rewrite. All you have to do is to make a "Search and Replace" and search for "SHL" and replace with "ST_SHL". See also: STPascal, ST_SHR Your original code might read : i := SHL(2,4); Just turn it into : i := ST_SHL(2,4);   Function ST_SHR(a,b : Long_Integer) : Long_Integer; Implementation of ST Pascal SHR (shift right) function. This function is included to ease up ST Pascal source code rewrite. All you have to do is to make a "Search and Replace" and search for "SHR" and replace with "ST_SHR". See also: STPascal, ST_SHL Your original code might read : i := SHR(2,4); Just turn it into : i := ST_SHR(2,4); YK7 ST Pascal ReadV procedure The ST Pascal ReadV and WriteV procedures do not exist as the Turbo Pascal procedures Str and Val were inherited, so they require rewriting too - but that's a real simple one : ST Pascal :HighSpeed Pascal : VAR s : String;VAR s: String; r : Real;r: Real; dummy : Integer; BEGINBEGIN s := '123.45';s := '123.45'; ReadV(s, r);Val(s, r, dummy); r := 54.321;r := 54.321; WriteV(s, r);Str(r, s); To sum it up : Changing ReadV into Val and adding a dummy parameter and changing WriteV into Str and swapping parameters. See also: STPascal, WriteV YK7 ST Pascal WriteV procedure The ST Pascal ReadV and WriteV procedures do not exist as the Turbo Pascal procedures Str and Val were inherited, so they require rewriting too - but that's a real simple one : ST Pascal :HighSpeed Pascal : VAR s : String;VAR s: String; r : Real;r: Real; dummy : Integer; BEGINBEGIN s := '123.45';s := '123.45'; ReadV(s, r);Val(s, r, dummy); r := 54.321;r := 54.321; WriteV(s, r);Str(r, s); To sum it up : Changing ReadV into Val and adding a dummy parameter and changing WriteV into Str and swapping parameters. See also: STPascal, ReadV i`7 ST Pascal Put procedure The ST Pascal implements a file system based on the original Wirth philosophy of PUTting and GETting - from a system programmer's view a quite logical way, but a bit more tricky to deal with when it comes to formatted output etc. Therefore, HighSpeed Pascal implements the nowadays most commonly used method of READing and WRITEing. The actual code rewrite to perform isn't very difficult; it merely involves this : All references to a file pointer (say, f^) will have to be changed into a variable holding the file pointer's value. After that, all PUTs must be changed into WRITEs of the previously mentioned variable and all GETs will have to be changed into the corresponding READs : ST Pascal :HighSpeed Pascal : VAR f : FILE OF Integer;VAR f : FILE OF Integer; i : Integer; ...... ReWrite(f, 'JUNK.TMP');ReWrite(f, 'JUNK.TMP'); f^ := 1234;i := 1234; Put(f); { write 1234 to file }Write(f, i { or 1234 } ); Reset(f);Reset(f); WriteLn(f^);Read(f, i); Get(f);WriteLn(i); Close(f);Close(f); Erase(f); { <-- note this --> }Erase('JUNK.TMP'); See also: STPascal FF ST Pascal Get procedure Consult Put for a discussion of code rewrite 9M  variable := expression An assignment statement assigns the value of an expression to a variable. The variable and the expression must be assignment compatible. See also: Statements, Reserved_Words Examples of assignments: Var MyInt : Integer; MyPtr : Pointer; Begin MyInt := -1234; MyPtr := Nil; .                    Help is available on the following statement types: assignments procedure calls goto begin..end If..then..else case..of..else..end repeat..until while..do for..to..do for..downto..do with..do See also: Reserved_Words  Sets are declared like this: set of base-type The base-type of a set must be an ordinal type with no more than 256 possible values. The lower as well as the upper bounds of the base-type must be in the range 0..255. See also: Reserved_Words An example: Program Set_Demo; Type Characters = set of char; Var CharsAre: Characters; DigitsAre: Characters; UserInp: Char; Begin CharsAre := ['a'..'z','A'..'Z']; DigitsAre := ['0'..'9']; Repeat UserInp := ReadKey; If (UserInp IN CharsAre) then WriteLn('You entered a character.') ELSE If (UserInp IN DigitsAre) then WriteLn('You entered a digit.'); Until (UserInp = #13); End.    # Text type files are sequential files organized into lines of characters. Data is written to and read from text files using the standard procedures write and read. Non-sequential files are declared using the "file" type: type myfile = file of component-type or varmyfile : file of component-type The optional "component-type" can be any type, except a type containing text or file types. If "component-type" is omitted a typeless file will be declared. See also: Write, Read, BlockRead, BlockWrite An example: Program Dump_File; Uses Dos; Var Dummy : Text; Procedure Dump_Text_File; Var F : Text;{ A text file. } S : String; { Buffer for read data. } Begin Reset(F,ParamStr(1)); While Not(Eof(F)) Do Begin ReadLn(F,S); WriteLn(S); End; Close(F); End; Procedure Dump_NonText_File; Var F: File; { A typeless file. } C: ShortInt; { Buffer for read data. } R: Integer;{ Number of read bytes. } Count : Byte; Begin Reset(F,ParamStr(1)); Count := 1; Repeat BlockRead(F,C,1,R); Write(Chr(C)); If (Count MOD 70 = 0) then Begin WriteLn; Count := 1; End Else Inc(Count); Until (R = 0); Close(F); End; BEGIN If (ParamCount = 0) then Begin WriteLn('Enter a file name in the Options/Run dialog.'); Halt; End; {$I-} Reset(Dummy,ParamStr(1)); {$I-} If (IOresult <> 0) then Begin WriteLn('Cannot open the file: ',ParamStr(1)); Halt; End; WriteLn('Dump ASCII or Hex file (A/H): '); Case UpCase(ReadKey) Of 'A' : Dump_Text_File; 'H' : Dump_NonText_File ELSE WriteLn('Wrong input.'); End; End. 2 # (  The reserved word "label" marks the start of a label declaration part. Each of the symbols declared must be used exactly once to declare a position in the code. Each of the symbols can be used several times in Goto statements to jump directly to the marked piece of code. It should be noted that the majority of Pascal programmers consider the use of label declarations and goto statements as ill-behaved Pascal programming. See also: Goto, Reserved_Words :P - (  Goto statements are used in connection with label declarations to jump directly to a specified piece of code. It should be noted that the majority of Pascal programmers consider the use of label declarations and goto statements as ill-behaved Pascal programming. See also: Label, Reserved_Words An example: Program Goto_Label; Label StopProgram; Begin Repeat Write('Enter S to terminate program: '); If UpCase(ReadKey) = 'S' then Goto StopProgram ELSE WriteLn('You did not press S.'); Until False; StopProgram: WriteLn('Program will now terminate.'); End. dd/ When a pointer equals "nil" it means that the pointer is unused. See also: Pointer, Reserved_Words    )     # ( 1 A pointer type variable holds the address of a dynamic data structure of a specified type. Values can be assigned to pointer type variables by use of the New and GetMem procedures, the Addr and Ptr functions, and the @ operator. Pointers of type "pointer" are typeless i.e. they do not point at any specific type. See also: New, GetMem, Addr, Ptr, Nil, Integer, Real Example: Super   Variables of type boolean can assume the values True and False. The boolean type is declared as an enumerated type: Type Boolean = (False, True); See also: Integer, Real, Char, Pointer An example: Program Boolean_Demo; Var UpperCase : Boolean; Begin Write('Enter a letter (a..z or A..Z): '); UpperCase := ReadKey IN ['A'..'Z']; If UpperCase then Write('UPPERCASE') ELSE Write('lowercase'); WriteLn; End. C.'3'3'3'3'3 '3   ' 3   ' 3   ' 3   ' 3   ' 3These are the reserved words in HighSpeed Pascal: AndArrayBegin Case ConstDivDoDownto ElseEndExternalFile ForForwardFunctionGoto IfImplementationInInline InterfaceLabelModNil NotOfOr Packed ProcedureProgramRecordRepeat SetShlShrString ThenToTypeUnit UntilUsesVarWhile WithXor e (    Constant declarations are used when assigning permanent values to identifiers. Examples of constant declarations are: ConstProgVersion= 1.01; KByte = 1024; Type declarations are used to create new types, or change the identifier of existing types. Examples of type declarations are: TypeMyType= Array[1..10] OF Byte; Long_Integer = LongInt; Real= Single; Variable declarations are used to create variables of a specific type. Examples of variable declarations are: VarMyVar: Integer; RealVar: Real; See also: Reserved_Words EO &0Procedures are declared like this: Procedure Identifier [ ( Parameters ) ]; See also: Function, Forward, Inline, External, Reserved_Words The optional Parameters can be one, or a mixture, of the following 3 types: Value parameters: Procedure MyProc( X : SomeType ); When the procedure is activated a copy of the X parameter is made. The procedure will then reference this copy, and not the original variable (or constant). Variable parameters: Procedure MyProc( Var X : SomeType ); When "Var" precedes a procedure parameter name, it means that the procedure will be referencing the actual parameter, and not just a copy of it. This also means that the parameter cannot be a constant. Typeless V7ariable parameters: Procedure MyProc( Var X ); When using Typeless Variable parameters is it possible to send a variable of any type to the procedure. This is a program that uses a procedure: Program Procedure_Demo; Var MyVar : String; Procedure GetName( Var S : String ); Begin Write('Enter your name: '); ReadLn(S); End; BEGIN GetName(MyVar); WriteLn('You entered: ',MyVar); END.  '1) Functions are declared like this: Function Identifier [ ( Parameters ) ] : FuncType; See also: Procedure, Forward, Inline, External, Reserved_Words The parameter rules are the same as for procedures. This is a program that uses a function: Program Function_Demo; Function GetName : String; Var TempVar : String; Begin Write('Enter your name: '); ReadLn(TempVar); GetName := TempVar; End; BEGIN WriteLn(GetName,' is your name.'); END. t0    ! + 4This is an overview of the predefined integer types: TypeMin-Range - MaxBits -3 ShortInt-128..1278 Integer-32768..3276716 LongInt-2147483648..214748364732 Byte 0..25516 Word 0..6553532 -3 See also: Real, Single, Double, Extended, Pointer, Char p    ' - 3This is an overview of the predefined real types: TypeMin -Range - Max DigitsBytes -5 Single3.4e-38..3.4e387-84 Double,Real 1.7e-308..1.7e30815-16 8 Extended1.1e-4932..1.1e493218-1910 -5 See also: ShortInt, Integer, LongInt, Byte, Word, Char      This is a skeleton of a typical HighSpeed Pascal program: Program ... Uses ... Label ...{ These six declaration blocks } Const ...{ can be mixed in any order } Type ... Var ... Procedure ... Function ... BEGIN END. See also: Reserved_Words   8      You use the "uses" clause to specify which units you wish to use in a program or in a unit. If used in a program, "uses" must appear right after the program head. If used in a unit "uses" must appear right after the word interface. See also: Reserved_Words An example: Program MyProg; Uses GemDecl,GemVDI; . Another example: UNIT MyUnit; INTERFACE Uses Dos,Bios; .  &,  The reserved word "unit" tells the compiler that it is about to compile a unit, and not a program. See also: Interface, Implementation, Uses, Reserved_Words This is a skeleton of a simple unit: UNIT UnitName; INTERFACE Uses Unit1, Unit2, ..., Unitn; { Public symbols goes here. } IMPLEMENTATION { Private symbols goes here. } BEGIN { Initialization statements goes here. } { If no initialization is required just forget the BEGIN. } END. Q   " The reserved word "implementation" marks the beginning of private symbols in a unit. In other words: All Constants, Types, Variables, Procedures and Functions declared after the word "implementation" will only be available to the unit itself. In order to make a symbol public, it's declaration must be moved into the interface part of the unit. See also: Interface, Unit, Uses, Reserved_Words An example: UNIT MyUnit; INTERFACE Var MyPublicVar : Integer;{ Avail. to other programs/units. } Procedure MyPublicProc;{ Avail. to other programs/units. } IMPLEMENTATION Procedure MyPrivateProc;{ This procedure is ONLY available to } Begin{ other routines in this unit. Because} WriteLn('Private!');{ it's declaration is only present in } End;{ the IMPLEMENTATION part.} Procedure MyPublicProc; Begin WriteLn('Public.'); End; END.  9&1 !' The reserved word "interface" marks the beginning of public symbols in a unit. In other words: All Constants, Types, Variables, Procedures and Functions declared in between the words "interface" and implementation will be available to any program, or unit, that uses the unit. See also: Implementation, Unit, Uses, Reserved_Words An example: UNIT MyUnit; INTERFACE Procedure MyProc( P1,P2,P3 : Integer ); { Can be used by others. } IMPLEMENTATION Procedure MyProc( P1,P2,P3 : Integer ); Begin { Statements goes here } End; END. @M The reserved word "begin" is used together with the reserved word end to form compound statements. See also: End, Reserved_Words An example: If (X = 1234) then Begin { Beginning of compound statement. } WriteLn('Statement 1'); WriteLn('Statement 2'); WriteLn('Statement 3'); End;{ End of compound statement. }   ,The reserved word "end" is used in three different situations: 1. Together with Begin, to form compound statements. 2. Together with Case to form case statements. 3. Together with Record to form record types. See also: Begin, Case, Record, Statements, Reserved_Words An example: Program MyProg; Type MyType = Record{ Start record type. } Data : Char; UpCas: Boolean; End;{ End record type. } Var MyData : MyType; Begin{ Start compound statement. } Write('Enter something: '); MyData.Data := ReadKey; With MyData Do Case Data of { Start case statement. } 'A'..'Z' : UpCas := True; 'a'..'z' : UpCas := False; End;{ End case statement. } End.{ End compound statement. } s case expression of event1 : statement; event2 : statement; ... eventn : statement else{ The "else" part is optional. } statements; end; Expression is compared to the list of events. If a match is found, the statement following the event is executed, and an exit is made from the case statement. If no match is found and an "else" is present, the statements following "else" are executed. See also: Reserved_Words, Record An example: Program Case_Demo; Var MyVar : Char; Begin Write('Enter something: '); MyVar := ReadKey; DelLine; Case MyVar Of 'a'..'z' : WriteLn('Small letter.'); 'A'..'Z' : WriteLn('Big letter.'); '0'..'9' : WriteLn('Digit.') Else WriteLn('I do not recognize the data.'); WriteLn('-'); End; End. 7; $Variables of type char are used to store ASCII characters. You can obtain a characters ASCII number by using the Ord function. And you can obtain ASCII character number X, by using the Chr function. See also: Ord, Chr, Integer, Real, Reserved_Words An example: Program Char_Demo; Var MyChar : Char; Begin {$R-} Write('Enter first letter: '); MyChar := ReadKey; ClrScr; While Ord(MyChar) < 256 Do Begin Write(MyChar); MyChar := Chr(Ord(MyChar)+1); End; WriteLn; End.    Arrays are defined like this: Array[ IndexRange ] Of Element-type; The element-type can be any type, but the indexrange must an ordinal type expressed like this: StartIndex .. StopIndex If is possible to create multidimensional arrays, by separating each indexrange with a comma. See also: Record, Packed, Reserved_Words An Example: Program Array_Demo; Const MaxDisks= 10; Type SingleDisk = Record DiskLabel : String[40]; Capacity: LongInt; End; Var MyDisks: Array[1..MaxDisks] Of SingleDisk; Counter: Byte; A: Char; Begin Counter := 0; Repeat Write('Enter info on disk #',Counter+1,' (Y/N): '); Repeat A := UpCase(ReadKey); Until (A IN ['Y','N']); If (A = 'Y') then Begin DelLine; Inc(Counter); With MyDisks[Counter] Do Begin Write('Enter label: '); ReadLn(DiskLabel); Write('Enter size : '); ReadLn(Capacity); End; End; Until (A = 'N'); ClrScr; While Counter > 0 Do Begin With MyDisks[Counter] Do WriteLn('Label: ',DiskLabel:40,'. Size : ',Capacity:10); Dec(Counter); End; End.   Records are declared like this: Record field1 : field-type; field2 : field-type; ... fieldn : field-type; case tag : type of{ The "case" part is optional. } event1 : ( fields ); ... eventn : ( fields ); End; See also: With, Array, Packed, Reserved_Words An example: Program Record_Demo; Uses Dos; Type VariantRec = Record Case Byte Of 0 : (Long : LongInt); 1 : (Inte : Integer); End; Var Data: VariantRec; Begin Write('Enter a LongInt value : '); ReadLn(Data.Long); Write('Enter an integer value: '); ReadLn(Data.Inte); WriteLn; WriteLn('Notice:'); WriteLn; WriteLn('The size of DATA is only ',SizeOf(Data),' bytes,'); WriteLn('and not 6 bytes as could be expected, because DATA'); WriteLn('holds both a LongInt and an Integer variable.'); End. 5X#, #)1Strings are declared like this: string[ maximum_length ]; or string; A string can be looked upon as an array of char elements. The first element (element 0), holds the number of char elements currently in the string. The second element (element 1) holds the first character in the string. If no maximum length is specified when the string is declared, the maximum length will default to 255 characters, which is the highest number of characters a string can contain. See also: Reserved_Words, Length, Copy, Insert, Delete An example: Program String_Demo; Var NameStr: String[20]; StreetStr: String[30]; AddressStr : String[50]; Begin Write('Enter name : '); ReadLn(NameStr); Write('Enter street: '); ReadLn(StreetStr); AddressStr := NameStr+','+StreetStr; WriteLn('You entered : ',AddressStr); End.    repeat statement; .... statement; until expression The statements in between "repeat" and "until" are repeated until "expression" equals true. As can be seen from the structure of the loop, the statements are always executed at least once. See also: While_Do, For_Do, Reserved_Words An example: Program Repeat_Until_Demo; Begin Repeat WriteLn('Press any key.'); Until KeyPressed; End.   !while expression do statement The statement following "do" is executed if, and as long as, "expression" equals true. See also: For_Do, Repeat_Until, Reserved_Words An example: Program While_Do_Demo; Begin While Not(KeyPressed) Do WriteLn('Press any key.'); End. O`  #for counter := start to finish do statement or for counter := start downto finish do statement The statement following "do" will be executed once for each value in the range start to finish. If the "to" structure is used, the counter variable will be incremented by one for each loop. If the "downto" structure is used counter will be decremented by one for each loop. Counter, Start and Finish must all be ordinal types. See also: While_Do, Repeat_Until, Reserved_Words An example: Program For_Do_Demo; Var C : Integer; Begin For C := 1 to 10 DO WriteLn('Press any key.'); End.   if expression then statement else{ The "else" is optional } statement If "expression" equals true, the statement following "then" will be executed. Otherwise if "else" is present, the statement following "else" will be executed. See also: Else, Reserved_Words An example: Program If_Demo; Begin If (1 = 1) then WriteLn('Yes. 1 is the same as 1.') Else WriteLn('Something is very wrong!'); End. ``%, The reserved word "else" is used in if and case statements. See also: If, Case, Reserved_Words nn#*27  The reserved word "do" is used in while, for and with statements. See also: While, For, With, Reserved_Words lr The reserved word "of" is used in: Case statements and Array, File (See Text) and Set type declarations.     (procedure identifier [ (parameters) ];external; or function identifier [ (parameters) ] : functype; external; The reserved word "external" is used whenever separately compiled assembly routines are to be linked with your Pascal code. The {$L filename} compiler directive is used to load the object code generated by the assembler. See also: Directives, Inline, Forward, Reserved_Words Some examples: procedure fastcode( p1,p2 : integer ); external; function scrsize : longint; external; {$L fastlib.o} <=  )3The reserved word "inline" is used to insert machine code instructions directly into your Pascal programs. See also: External, Forward, Procedure, Function, Reserved_Words An example: Program Inline_Demo; Procedure Nop_Nop_Nop; Inline $4E71,$4E71,$4E71; Begin Nop_Nop_Nop; { Execute 3 NOP instructions. } End. y+/94 44The reserved word packed is primarily used in array and record declarations: Type / Var myarray= packed array[ .... ] of element-type myrecord = packed record ... end; When an array or a record is not packed, the compiler will pad an alignment-byte on those elements in the structure that take up an odd number of bytes in memory. When a structure is packed, no aligning will be used. An example: VarMyArray : Array[1..1000] Of Char; This declaration will produce an array (MyArray) that takes up 2000 bytes of memory. The reason for this is that an alignment-byte is padded on all the elements in the array. If you use packed: VarMyArray : Packed Array[1..1000] Of Char; the size of the array (MyArray) will be only 1000 bytes, because no aligning is done. Another example: VarMyRecord : Record A,B,C,D,E,F,G : Byte; End; This declaration will produce a record (MyRecord) that takes up 14 bytes of memory: (1 data-byte + 1 alignment-byte) * 7 elements. If you use packed: VarMyRecord : Packed Record A,B,C,D,E,F,G : Byte; End; the size of the record should be 7 bytes (1 data-byte * 7 elements), but it is not. The reason for this is that any data stored immediately after MyRecord, must start at an even address, so the size calculation looks like this: (1 data-byte * 7 elements) + 1 alignment-byte = 8 bytes. See also: Array, Record, Reserved_Words An example: Program Packed_Demo; Var PackedYes : packed Array[1..1000] Of Byte; PackedNo: Array[1..1000] Of Byte; Begin WriteLn('Size of packed structure is ',SizeOf(PackedYes)); {1000} WriteLn('Size of unpacked structure is ',SizeOf(PackedNo)); {2000} End.   (2The reserved word "forward" is used to make procedures and functions known before they are actually declared. The actual declaration, including the statement of the procedure or function must appear later in the program. See also: Inline, External, Procedure, Function, Reserved_Words An example: Program Forward_Demo; Procedure B; Forward; Procedure A; Begin WriteLn('In A. Going to B.'); B; End; Procedure B; Begin WriteLn('In B.'); End; BEGIN A; END.  The reserved word "with" is used as an easy way to reference the fields in a record. with recordname do statement See also: Record An example: Program With_Demo; Var MyRecord : Record Firm: String[10]; Address : String[20]; End; Begin With MyRecord Do Begin Firm:= 'D-House 1'; Address := 'Transformervej 29'; End; { This is the same as writing: } MyRecord.Firm:= 'D-House 1'; MyRecord.Address := 'Transformervej 29'; End. \ %-These are the HighSpeed Pascal operators: See also: Reserved_Words OperatorAction --4 DIVInt"eger division. MODInteger modulo. NOTInteger bitwise negation. Boolean logical negation. ANDInteger bitwise AND. Boolean logical AND. ORInteger bitwise inclusive OR. Boolean logical inclusive OR. XORInteger bitwise exclusive OR. Boolean logical exclusive OR. SHLInteger bitwise shift-left. SHRInteger bitwise shift-right. +Integer or real addition. String concatenation. Set union. -Integer or real subtraction. Set difference. *Integer or real multiplication. Set intersection. /Real division. The following operators all returns true or false as their result. =Compares ordinal, real, string, pointer, and set types. <>Compares ordinal, real, string, pointer, and set types. <Compares ordinal, real, and string types. >Compares ordinal, real, and string types. <=Compares ordinal, real, string, and set types. >=Compares ordinal, real, string, and set types. INReturns true if the left operand in present in the right operand (set type). ?Mx '0aaThis is the INTERFACE part of the STPascal unit: See also: Dos, Printer, Bios, System, System2, Graph Unit STPascal; INTERFACE Uses GemDecl, GemAES, GemVDI, Dos, Bios; {-;} {ST-PASCAL GENERALS } {-;} Const Long_MaxInt= MaxLongInt; Screen_Device = 1; Printer_Device = 21; Max_C_String= 255; Max_Fn= 12; Max_Path= 80; Type Alfa= Packed Array[1..10] of Char; Short_Integer = Integer; Long_Integer= LongInt; C_String= PACKED Array[ 0..Max_C_String ] of Char; String_Ptr= ^C_String; File_Name= String[ Max_Fn ]; Path_Name= String[ Max_Path ]; { Conversions : } Function Short_Round(r : Real) : Short_Integer; Function Short_Trunc(r : Real) : Short_Integer; Function Long_Round(r : Real) : Long_Integer; Function Long_Trunc(r : Real) : Long_Integer; Function Int(long : Long_Integer) : Integer; Procedure CtoPstr(Cstr : C_String; Var Pstr : String); Procedure PtoCstr(Pstr : String; Var Cstr : C_String); Function ST_Shl(a,b : Long_Integer) : Long_Integer; Function ST_Shr(a,b : Long_Integer) : Long_Integer; { Math : } Function PwrOfTen(n : Integer) : Real; { System : } Procedure BasePage(Var p : Pointer); { Command line : } Function Cmd_Args : Integer; Procedure Cmd_GetArg(n : Integer; Var s : String); Function Option(s : String) : Boolean; { Test : } Function Filename(s : String) : Boolean; Function Keypress : Boolean; Function IO_Result : Integer;{ NOTE : Result differences! } { Storage : } Function Peek(a : Long_Integer) : Byte; Function Wpeek(a : Long_Integer) : Integer; Function Lpeek(a : Long_Integer) : Long_Integer; Procedure Poke(a : Long_Integer; value : Byte); Procedure Wpoke(a : Long_Integer; value : Integer); Procedure Lpoke(a : Long_Integer; value : Long_Integer); Procedure Move_B(source, dest, number : Long_Integer); Procedure Move_W(source, dest, number : Long_Integer); Procedure Move_L(source, dest, number : Long_Integer); { Time/date : } Function Clock : Long_Integer; Procedure SetDate(day, month, year : Integer); Procedure SetTime(hour, minute, second : Integer); Procedure GetDate(Var day, month, year : Integer); Procedure GetTime(Var hour, minute, second : Integer); { VT-52 : } Procedure Cur_On; Procedure Cur_Off; Procedure Cur_Up; Procedure Cur_Down; Procedure Cur_Right; Procedure Cur_Left; Procedure Cur_Up_Scroll; Procedure Cur_Down_Scroll; Procedure Cur_Home; Procedure Clear_Home; { GotoXY is implemented i the System2 unit. } Procedure Save_Cursor; Procedure Restore_Cursor; Procedure Select_Color(color : Integer); Procedure Select_Background(color : Integer); Procedure Inv_On; Procedure Inv_Off; Procedure Delete_Line; Procedure Clear_Line; Procedure Insert_Line; Procedure Start_Of_Line; Procedure End_Of_Line; Procedure End_Of_Screen; Procedure Start_Of_Screen; Procedure Wrap_On; Procedure Wrap_Off; { Supervisor : } Function InSuper : Boolean; Procedure Super(on : Boolean); { Screen handling declarations : } Const Scrlen_B= 32000; Scrlen_W= 16000; Scrlen_L= 8000; Type Err_Code= Short_Integer; Screen_B= PACKED ARRAY [ 0..31999 ] OF ShortInt; Screen_I= PACKED ARRAY [ 0..15999 ] OF Short_Integer; Screen_L= PACKED ARRAY [ 0..7999 ] OF Long_Integer; Ptr_Screen= ^Screen_L; Palette= PACKED ARRAY [ 0..15 ] OF Short_Integer; Resolution= Short_Integer; Screen_Type= PACKED RECORD  Res : Resolution;  Pal : Palette;  Pic : Screen_L END; Procedure Get_Screen(var buf : Screen_Type); Procedure Put_Screen(var buf : Screen_Type); FunctionRead_Screen (format : integer; name : string; var buf : Screen_Type) : Err_Code; FunctionWrite_Screen(format : integer; name : string; var buf : Screen_Type) : Err_Code; {-;} {GEM-SECTION} {-;} Const No_Port=0; Root=0; Null_Index = -1; Max_Len= 81; Max_Depth =8; Max_Tree= 100; No_Window = -1; Max_WTitle = 80; R_Tree= 0; R_String= 5; E_Keyboard = 1; E_Button= 2; E_Mouse1= 4; E_Mouse2= 8; E_Message = 16; E_Timer= 32; Replace_Mode= 1; Trans_Mode= 2; XOR_Mode= 3; Rev_Trans_Mode = 4; Pat1 = 2; Pat2 = 3; Pat3 = 4; Pat4 = 5; Pat5 = 6; Pat6 = 7; Pat7 = 8; Pat8 = 9; Pat9 = 10; Pat10 = 11; Pat11 = 12; Pat12 = 13; Pat13 = 14; Pat14 = 15; Pat15 = 16; Pat16 = 17; Pat17 = 18; Pat18 = 19; Pat19 = 20; Pat20 = 21; Pat21 = 22; Pat22 = 23; Pat23 = 24; Pat24 = 25;  Hatch1 = 26; Hatch2 = 27; Hatch3 = 28; Hatch4 = 29; Hatch5 = 30; Hatch6 = 31; Hatch7 = 32; Hatch8 = 33; Hatch9 = 34; Hatch10 = 35; Hatch11 = 36; Hatch12 = 37; Solid= 1; LongDash= 2; Dotted= 3; DashDot= 4; Dashed= 5; DashDotDot = 6; Normal= 0; Thickened = 1; Lightened = 2; Slanted= 4; Underlined = 8; Outlined= 16; Shadowed= 32; System_Font = 3; Small_Font = 5; G_Box= 20; G_Text= 21; G_BoxText = 22; G_Image= 23; G_ProgDef = 24; G_IBox= 25; G_Button= 26; G_BoxChar = 27; G_String= 28; G_FText= 29; G_FBoxText = 30; G_Icon= 31; G_Title= 32; None= $000; Selectable = $001; Default= $002; Exit_Btn= $004; Editable= $008; Radio_Btn = $010; Last_Ob= $020; Touch_Exit = $040; Hide_Tree = $080; Indirect= $100; Selected = $01; Crossed = $02; Checked = $04; Disabled = $08; G_Name= $001; G_Close= $002; G_Full= $004; G_Move= $008; G_Info= $010; G_Size= $020; G_UpArrow = $040; G_DnArrow = $080; G_VSlide = $100; G_LArrow = $200; G_RArrow = $400; G_HSlide = $800; G_All= $FEF; White= 0;Black = 1; Red= 2;Green= 3; Blue= 4;Cyan = 5; Yellow= 6; Magenta = 7; L_White= 8;L_Black = 9; L_Red= 10;L_Green = 11; L_Blue= 12;L_Cyan = 13; L_Yellow = 14;L_Magenta = 15; MN_Selected = 10; WM_Redraw= 20; WM_Topped= 21; WM_Closed = 22; WM_Fulled= 23; WM_Arrowed = 24; WM_HSlid= 25; WM_VSlid = 26; WM_Sized= 27; WM_Moved = 28; WF_PrevXYWH = 6;WF_FullXYWH = 7; WF_HSlide= 8; WF_VSlide = 9; WF_HSlSize = 15; WF_VSlSize = 16; AC_Open= 40; AC_Close= 41; Type Color_Reg= 0..15; Draw_Modes = Replace_Mode..Rev_Trans_Mode; Line_Types = Solid..DashDotDot; Paint_Types = None..Hatch12; Gem_Device = Screen_Device..Printer_Device; Inq_Type= (Open_Vals, Ext_Vals); Mouse_Type = (M_Arrow, M_Text_Curs, M_Bee, M_Point_Hand, M_Flat_Hand, M_Thin_Cross, M_Thick_Cross, M_Outln_Cross); Text_Ptr= ^Char; Word16= Array[ 0..15 ] of Integer; Mouse_Form = Record hot_x, hot_y, res, mask_color, data_color : Integer; mask, data: Word16 End; Window_Title= String[ Max_WTitle ]; Message_Buffer = Array[ 0..15 ] of Short_Integer; Ctrl_Parms= Array[ 0..11 ] of Short_Integer; Int_In_Parms= Array[ 0..15 ] of Short_Integer; Int_Out_Parms = Array[ 0..45 ] of Short_Integer; Pts_In_Parms= Array[ 0..11 ] of Short_Integer; Pts_Out_Parms = Array[ 0..11 ] of Short_Integer; Addr_In_Parms = Array[ 0..1 ] of Pointer; Addr_Out_Parms = Array[ 0..0 ] of Pointer; Point= Record x, y : Short_Integer End; Rectangle= Record x, y, w, h : Short_Integer End; Str30= String[ 30 ]; Str255= String[ 255 ]; TE_Just= (TE_Left, TE_Right, TE_Center); Tree_Range= Root..Max_Tree; Tree_Index= Null_Index..Max_Tree; Ob_Type= G_Box..G_Title; Text_Ed_Info= Record te_ptext, te_ptmplt, te_pvalid: String_Ptr; te_font, te_junk1, te_just, te_color, te_junk2, te_thickness, te_txtlen, te_tmplen: Short_Integer End; Ted_Ptr= ^Text_Ed_Info; Spec_Info= Record CASE Ob_Type of G_Box, G_IBox, G_BoxChar: (thick,color : Short_Integer); G_Text, G_BoxText, G_FText, G_FBoxText: (info : Ted_Ptr); G_Image, G_ProgDef, G_Button, G_Icon: (ptr : Long_Integer); G_String, G_Title: (str : String_Ptr) End; Object= Record ob_next, ob_head, ob_tail : Integer; ob_type, ob_flags, ob_state : Short_Integer; ob_spec : Spec_Info; ob_x, ob_y, ob_w, ob_h: Short_Integer End; Tree= Array[ Tree_Range ] of Object; Tree_Ptr= ^Tree; Menu_Ptr= Tree_Ptr; Dialog_Ptr= Tree_Ptr; Icon_Block= Record ib_pmask, ib_pdata, ib_ptext : Long_Integer; ib_char, ib_xchar, ib_ychar, ib_xicon, ib_yicon, ib_wicon, ib_hicon, ib_xtext, ib_ytext, ib_wtext, ib_htext : Short_Integer End; Bit_Block= Record bi_pdata : Long_Integer; bi_wb, bi_hl, bi_x, bi_y, bi_color : Short_Integer End; User_Blk= Record ub_code, ub_parm : Long_Integer End; Parm_Blk= Record pb_tree: Long_Integer; pb_obj, pb_prevstate, pb_currstate, pb_x, pb_y, pb_w, pb_h, pb_xc, pb_yc, pb_wc, pb_hc: Short_Integer; pb_parm: Long_Integer End; FunctionAdd_DItem(dial : Dialog_Ptr; i_type,flags,x,y,  w,h,border,color : Short_Integer) : Tree_Index; FunctionAdd_MItem(menu : Menu_Ptr; title : Tree_Index; item : Str255) : Short_Integer; FunctionAdd_MTitle(menu : Menu_Ptr; item : Str255) : Short_Integer; Procedure AES_Call(op: Short_Integer; Var Int_in: Int_in_parms; Var INT_out: Int_out_Parms; Var addr_in: addr_in_Parms; Var Addr_out : addr_out_parms); FunctionAES_Version: Short_Integer; Procedure Begin_Mouse; Procedure Begin_Update; Procedure Border_Rect(wind : Short_Integer; Var x,y,w,h : Short_Integer); Procedure Bring_To_Front(handle : Short_Integer); Procedure Center_Dialog(dial : Dialog_Ptr); Procedure Clear_Screen; Procedure Close_Window(handle : Short_Integer); Procedure Delete_Dialog(dial : Dialog_Ptr); Procedure Delete_Menu(menu : Menu_Ptr); Procedure Delete_Window(handle : Short_Integer); FunctionDo_Alert(alert : Str255; def_btn : Short_Integer) : Short_Integer; FunctionDo_Dialog(dial : Dialog_Ptr; start_obj : Short_Integer) : Short_Integer; Procedure DragBox(x1,y1,w1,h1,x2,y2,w2,h2 : Short_Integer; Var endx,endy : Short_Integer); Procedure Draw_Menu(menu : Menu_Ptr); Procedure Draw_Mode(mode : Draw_Modes); Procedure Draw_String(x,y : Short_Integer; s : Str255); FunctionD_Color(Border, Text : Short_Integer; Mode : Boolean; Pattern, Inside : Short_Integer) : Short_Integer; Procedure End_Dialog(dial : Dialog_Ptr); Procedure End_Mouse; Procedure End_Update; Procedure Erase_Menu(menu : Menu_Ptr); Procedure Exit_Gem; Procedure Find_Alert(index : Short_Integer; Var alert : Str255); Procedure Find_Dialog(index : Short_Integer; Var dial : Dialog_Ptr); Procedure Find_Menu(index : Short_Integer; Var menu : Menu_Ptr); FunctionFind_Resource(r_type,r_index : Short_Integer) : tree_ptr; FunctionFind_Window(x,y : Short_Integer) : Short_Integer; Procedure First_Rect(wind : Short_Integer; Var x,y,w,h : Short_Integer); Procedure Frame_Arc(x,y,x_rad,y_rad,beg_ang,end_ang : Short_Integer); Procedure Frame_Oval(x,y,x_rad,y_rad : Short_Integer); Procedure Frame_Rect(x,y,w,h : Short_Integer); Procedure Frame_Round_Rect(x,y,w,h : Short_Integer); Procedure Free_Resource; FunctionFront_Window : Short_Integer; Procedure Get_DEdit(dial : Dialog_Ptr; item : Tree_Index; Var s : Str255); FunctionGet_Event(emask, bmask, bstate, n_clicks: Short_Integer;  ticks: Long_Integer;  m1_flag: boolean;  m1x, m1y, m1w, m1h: Short_Integer;  m2_flag: boolean;  m2x, m2y, m2w, m2h: Short_Integer;  Var message: Message_Buffer;  Var key,brtn,bclick,mx,my,kstate : Short_Integer  ) : Short_Integer; FunctionGet_Ex_In_File(Var path, name : Path_Name; Title: Str30) : boolean; FunctionGet_In_File(Var path, name : Path_Name) : boolean; FunctionGet_Out_File(prompt : Str255; Var name : Path_Name) : boolean; FunctionGet_Window : Short_Integer; Procedure GrowBox(kl_x,kl_y,kl_b,kl_h,gr_x,gr_y,gr_b,gr_h : Short_Integer); Procedure Hide_Mouse; FunctionInit_Gem : Short_Integer; Procedure Init_Mouse; Procedure Justified_Text(x,y,Laenge,wort,zeichen : Short_Integer; s : Str255); Procedure Line_Color(color : Color_Reg); Procedure Line_Endstyle(start_style, end_style : Short_Integer); Procedure Line_Style(style : Line_Types); Procedure Line_To(newx,newy : Short_Integer); Procedure Line_Width(width : Short_Integer); FunctionLoad_Resource(fn : Str255) : boolean; Procedure Menu_Check(menu : Menu_Ptr; item : Tree_Index; checked : boolean); Procedure Menu_Disable(menu : Menu_Ptr; item : Tree_Index); Procedure Menu_Enable(menu : Menu_Ptr; item : Tree_Index); Procedure Menu_Hilight(menu : Menu_Ptr; title : Tree_Index); Procedure Menu_Normal(menu : Menu_Ptr; title : Tree_Index); FunctionMenu_Register(id : Short_Integer; Var name : Str255) : Short_Integer; Procedure Menu_Text(menu : Menu_Ptr; item : Tree_Index; Var mtext : Str255); Procedure MoveBox(x1,y1,w,h,x2,y2: Short_Integer); Procedure Move_To(x,y : Short_Integer); FunctionNew_Dialog(n_items, x, y, w, h : Short_Integer) : Dialog_Ptr; FunctionNew_Menu(n_items : Short_Integer; about : Str255) : Menu_Ptr; FunctionNew_Window(w_type : Short_Integer; Var title : Window_Title; x_max, y_max, w_max, h_max : Short_Integer) : Short_Integer; Procedure Next_Rect(wind : Short_Integer; Var x,y,w,h : Short_Integer); Procedure Obj_Draw(t: Tree_ptr; start,tiefe : Tree_index; x_clip,y_clip,b_clip,h_clip : Short_Integer); FunctionObj_Find(obj : Dialog_ptr; start,depth,x,y : Short_Integer) : Short_Integer; FunctionObj_Flags(dial : Dialog_Ptr; index : Tree_Index) : Short_Integer; Procedure Obj_Offset(t : Dialog_ptr; index : Short_Integer; Var x,y : Short_Integer); Procedure Obj_Redraw(Box : Dialog_Ptr; item : Tree_index); Procedure Obj_SetFlags(dial : Dialog_Ptr; index : Tree_Index; flags : Short_Integer); Procedure Obj_SetState(dial : Dialog_Ptr; index : Tree_Index; state : Short_Integer; redraw : boolean); Procedure Obj_Size(t: Tree_Ptr; index: Short_Integer; Var x,y,w,h : Short_Integer); FunctionObj_State(dial : Dialog_Ptr; index : Tree_Index) : Short_Integer; Procedure Open_Window(handle, x,y,w,h : Short_Integer); Procedure Paint_Arc(x,y,x_rad,y_rad,beg_ang,end_ang : Short_Integer); Procedure Paint_Color(color : Color_Reg); Procedure Paint_Outline(on : boolean); Procedure Paint_Oval(x,y,x_rad,y_rad : Short_Integer); Procedure Paint_Rect(x,y,w,h : Short_Integer); Procedure Paint_Round_Rect(x,y,w,h : Short_Integer); Procedure Paint_Style(style : Short_Integer); Procedure PLine(x1,y1,x2,y2 : Short_Integer); procedure Line (x1,y1,x2,y2 : Short_Integer);{ same as PLine } Procedure Plot(x,y : Short_Integer); FunctionRect_Intersect(x,y,w,h: Short_Integer; Var x1,y1,w1,h1 : Short_Integer) : boolean; FunctionRedo_Dialog(dial : Dialog_Ptr; start_obj : Short_Integer) : Short_Integer; Procedure RubberBox(x,y,w1,h1:Short_Integer; Var w2,h2 :Short_Integer); Procedure Set_Clip(x,y,w,h : Short_Integer); Procedure Set_Color(reg : Color_Reg; red,green,blue : Short_Integer); Procedure Set_DEdit(dial : Dialog_Ptr; item : Tree_Index;  template, valid, initial : Str255;  font : Short_Integer; just : TE_Just); Procedure Set_DText(dial : Dialog_Ptr; item : Tree_Index; s : Str255;  font : Short_Integer; just : TE_Just); Procedure Set_MForm(Var form : Mouse_Form); Procedure Set_Mouse(m_type : Mouse_Type); Procedure Set_Window(handle : Short_Integer); Procedure Set_WInfo(handle : Short_Integer; Var info : Window_Title); Procedure Set_WName(handle : Short_Integer; Var title : Window_Title); Procedure Set_WSize(handle,x,y,w,h : Short_Integer); Procedure Show_Dialog(Box : Dialog_Ptr); Procedure Show_Mouse; Procedure ShrinkBox(kl_x,kl_y,kl_b,kl_h,gr_x,gr_y,gr_b,gr_h : Short_Integer); Procedure Sys_Font_Size(Var w_char,h_char,w_box,h_box : Short_Integer); Procedure Text_Alignment(hor,ver : Short_Integer); Procedure Text_Color(color : Color_Reg); Procedure Text_Heigth(Hoehe : Short_Integer); Procedure Text_Rotation(angle : Short_Integer); Procedure Text_Style(style : Short_Integer); Procedure VDI_Call(cmd, sub_cmd, nints, npts: Short_Integer; Var ctrl: Ctrl_Parms; Var int_in: Int_In_Parms; Var int_out: Int_Out_Parms; Var pts_in: Pts_In_Parms; Var pts_out: Pts_Out_Parms; translate: boolean); Procedure Wind_Get(handle,request : Short_Integer; Var v1,v2,v3,v4 : Short_Integer); Procedure Wind_Set(handle,request,v1,v2,v3,v4 : Short_Integer); Procedure Work_Rect(wind : Short_Integer; Var x,y,w,h : Short_Integer); aT !*1%6'n1z,&These are the routines implemented in the Bios unit. See also: Dos, Printer, System, System2, Graph, STPascal Disk related procedures and functions: Function FlopRd( Count, Side, Trck, Sector, Dev : Integer; Filler, Buffer : Pointer ) : Integer; Reads one or more sectors from a floppy drive. Function FlopWr( Count, Side, Trck, Sector, Dev : Integer; Filler, Buffer : Pointer ) : Integer; Writes one or more sectors to a floppy drive. Function FlopVer( Count, Side, Trck, Sector, Dev : Integer; Filler, Buffer : Pointer ) : Integer; Verifies one or more sectors on a floppy drive. Function FlopFmt( FillVal : Integer; Magic: LongInt; InterLv, Side, Trck, Spt, Dev : Integer; Filler, Buffer: Pointer ) : Integer; Formats a track on a floppy drive. Function Rwabs( Device, StartSect, Count : Integer; Buffer : Pointer; RwFlag : Integer ) : LongInt; Reads one or more logical sectors from a disk drive. Procedure ProTobt( BootAble, DiskType : Integer; SerialNum: LongInt; Buffer: Pointer ); Creates a prototype of a boot sector. Function DrvMap : LongInt; Returns information about the number of drives attached to the system. Function MediaCh( Device : Integer ) : LongInt; Checks to see if a media (disk) has been changed. Function GetBpb( Device : Integer ) : Pointer; Returns the BIOS parameter block for a specified drive. Function DMAread( DevNo : Integer; Buffer : Pointer; Count : Integer; Sector : LongInt) : LongInt; Reads sectors from a device into a buffer. Function DMAwrite( DevNo : Integer; Buffer : Pointer; Count : Integer; Sector : LongInt) : LongInt; Writes sectors from a buffer to a device. Screen related procedures and functions: Function PhysBase : Pointer; Returns the address of the physical screen memory. Function LogBase : Pointer; Returns the address of the logical screen memory. Function GetRez : Integer; Returns information about the current screen resolution. Procedure SetScreen( Reso : Integer; Fys,Log : Pointer ); Sets the screen resolution and the physical and logical screen memory address. Procedure ScrDmp; Dumps the screen to the printer. Procedure Vsync; Waits for the next vertical-blank interrupt. Procedure PrtBlk( P : Pointer ); - Procedure SetPalette( PalPtr : Pointer ); Sets the contents of the hardware palette register. Function SetColor( NewColor, PalEntry : Integer ) : Integer; Sets a palette entry to a given color. Function EsetShift( ShftMode : Integer ) : Integer; Sets the TT shift mode register. Function EgetShift : Integer; Returns the current shift mode register value. Function EsetBank( BankNum : Integer ) : Integer; Sets bank for active TT color lookup table. Function EsetColor( Color, ColorNum : Integer ) : Integer; Sets ColorNum in the TT color lookup table to Color. Procedure EsetPalette( PalettePtr : Pointer; Count, ColorNum : Integer); Sets the contents of a number of TT hardware palette registers.  Procedure EgetPalette( PalettePtr : Pointer; Count, ColorNum : Integer); Returns the contents of a number of TT hardware palette registers. Function EsetGray( Switch : Integer ) : Integer; Sets the manner in which the color lookup table in interpreted by the display hardware. Function EsetSmear( Switch : Integer ) : Integer; Sets the video smear mode. Parallel and Serial port procedures and functions: Function RsConf( Scr, Tsr, Rsr, Ucr, Ctr, Speed : Integer ) : LongInt; Configures the serial port. Function SetPrt( Config : Integer ) : Integer; Gets or sets the printer configuration byte. Function IoRec( Device : Integer ) : Pointer; Returns a pointer to a serial devices input buffer record. Keyboard and Cursor procedures and functions: Function CursConf( BlinkRate, State : Integer ) : Integer; Sets the state of the cursor. Function KbShift( ModeFlag : Integer ) : LongInt; Returns the status of the Control, Caps and Shift keys. Function KeyTbl( Capsed, Shifted, UnShifted : Pointer ) : Pointer; Sets pointers to the keyboard translation tables. Procedure BiosKeys; Restores the default BIOS translation tables. Procedure IKbdWs( Data : Pointer; Chars : Integer ); Writes a sequence of characters to the keyboard. Function KbdvBase : Pointer; - Function KbRate( RepRat, WaitBeforeRep : Integer ) : Integer; Sets the keyboard repeat rate. Sound procedures and functions: Function Giaccess( RegNo : Integer; Data : Byte ) : Byte; Reads or writes a register on the sound chip. Procedure OffGiBit( BitNumber : Integer ); Sets a bit in the PORT A register to zero. Procedure OnGiBit( BitNumber : Integer ); Sets a bit in the PORT A register to one. Procedure MidiWs( Data : Pointer; Chars : Integer ); Writes a sequence of characters to the midi port. Procedure DoSound( CommandPtr : Pointer ); Executes a block of sound chip commands. Interrupt procedures: Procedure jDisInt( IntNum : Integer ); Disables an interrupt. Procedure jEnabInt( IntNum : Integer ); Enables an interrupt. Procedure MfpInt( NewVector : Pointer; IntNo : Integer ); Sets an interrupt vector. Function SetExc( Vector : Pointer; VecNum : Integer ) : Pointer; Sets an interrupt vector. Procedure XbTimer( IntHandler : Pointer; Data, Ctrl, Timer : Integer ); Initializes and starts the MFP 68901-Timer. IO procedures and functions: Function BConStat( Device : Integer ) : Integer; Returns the status of a character device. Function BConIn( Device : Integer ) : LongInt; Reads a character from a device. Procedure BConOut( Character, Device : Integer ); Writes a character to a device. Function BCoStat( Device : Integer ) : LongInt; Returns the character output status for a device. Function BConMap( DevNo : Integer ) : Pointer; Maps a device. Miscellaneous procedures and functions: Function X_Random : LongInt; Returns a random number. Procedure XSetTime( DateTime : LongInt ); Sets the time and date in the keyboard. Function XGetTime : LongInt; Gets the time and date in the keyboard. Function TickCal : LongInt; Returns a system-timer calibration value. Procedure SupExec( CodePtr : Pointer ); Executes a fragment of code in Supervisor mode. Procedure PuntAES; Throws the AES away. Function SsBrk( Amount : Integer ) : Pointer; Reserves an amount of memory. Procedure GetMpb( DumpArea : Pointer ); - Procedure InitMous( Vector, Params : Pointer; Typ : integer ); Initializes the mouse packet handler. Function NVMaccess( Buffer : ShortInt; Count,Start,Op : Integer ) : Integer; Manages the non-volatile memory in the TT's real-time clock.  The following describes the Compile menu. See also: Editor Run (R) Runs the program in the active editor window, unless the "Primary File" option has been set. In which case the primary file will be run. Compile (C) Compiles the program in the active editor window, unless the "Primary File" option has been set. In which case the primary file will be compiled. Make (M) Make works like Compile, except for the following: If the program being compiled uses a unit which has been changed since it was last compiled, that unit is compiled again. Build All (B) Build works like Make, except for the following: All the units that the program uses are compiled. Even if they have not been changed. Find Error (E) The Find Error routine can find the line in a program that caused a runtime error. Destination (D) Describes where the compiled program are to be stored (in Memory or on Disk). Units being compiled will always be stored on disk. Primary file (P) Describes the name of the first file that is to be compiled when choosing Run, Compile, Make or Build in the compile menu. Get info (I) Displays some information about the most recently compiled program. p  The following describes the OPTIONS/Compiler dialog. The dialog is activated by (K) See also: Editor, Options "Range check"{$R} "Stack check"{$S} "I/O check"{$I} "Use 32 bit fixup"{$F} "Keep names for debugger"{$D} "Strict string checking"{$V} "$Define"{$Define x} See also: Directives Search Paths: Units: The path(s) that the compiler uses to find non-resident units. Multiple paths are separated by a semicolon. Program : The path that the compiler uses to place the compiled programs. Include : The path(s) that the compiler uses to find include files. Multiple paths are separated by a semicolon. Object: The path(s) that the compiler uses to locate object files containing external procedures and functions. The object path is first taken into account after the current directory has been searched. Multiple paths are separated by a semicolon.  The following describes the Edit menu. See also: Editor Undo (UNDO) Undoes the last command executed in the editor. Useful if you have deleted something important. Cut (^X) Removes the selected (inverted) text from the active window and stores it on a clipboard. The removed text can be inserted into any of the open editor windows by using the Paste (^V) command. Copy (^C) Copies the selected (inverted) text onto a clipboard. The copied text can be inserted into any of the open editor windows by using the Paste (^V) command. Paste (^V) Takes the text from the clipboard and inserts it into the active editor window, at the current cursor location. Select All (^A) Selects (inverts) all text in the active editor window. Indent (^K) Moves the selected (inverted) text one position to the right. Outdent (^J) Moves the selected (inverted) text one position to the left. Get info (^I) Displays some information about the text in the active editor window. ^g 'The following help topics are available on the editor: FILEEDIT SEARCH COMPILE OPTIONS - The following describes the File menu. (For help on the file-type "file", click on text) See also: Editor New (^N) Opens a new and empty editor window. Open (^O) Opens a file and puts it in a new editor window. Open Selection (^T) If you have selected (inverted) a file name in the editor window, you can open this file with "Open Selection". Close (^U) Closes the active editor window. If you have changed the program in the window, you will be asked if you want to save it. Save (^S) Saves the program in the active editor window. If the program is a NoName.pas program, you will be prompted for a name. Save As... Does the same as (^S), but always prompts you for a name. Revert to saved This command will replace the version of your text in the editor with the latest copy you saved to disk. Print Prints the program in the active window. Print Selection (^P) Prints a selected (inverted) area of the program in the active editor window. Execute Leaves the editor temporarily, while running another program. Quit (^Q) Quits the editor. If one of the open editor windows contains a program that has been changed, you will get a chance to save it.  The following describes the OPTIONS/General dialog. The dialog is activated by (G) See also: Editor, Options "Locate Resident Library" Tells the compiler where to locate the resident library. The default name is PASCAL.LIB, but you can create you own resident libraries with the \UNITS\LIBMAKER program. "Tab width" Sets the editor tab width. The legal range is 1-8. "Auto indent" When auto indenting is active the cursor will return to the starting column of the previous line, when pressing Return. Otherwise the cursor will end up in column 1. "Autosave Configuration" When autosave is active the configuration settings will be saved when choosing Quit (^Q) in the File menu. "Autosave Files" If this option is active the sourcecode will be saved before running the program. \\  The following describes the OPTIONS/Linker dialog. The dialog is activated by (L) See also: Editor, Options "$F Use 32 bit fixup" "$D Add symbols to program file" "$M: Stack" "$M: Heap minimum" "$M: Heap maximum" "$M: Free to DOS" See also: Directives "Postfix for programs" Defines the extension that compiled programs are to have on disk. WW The following describes the Search menu. See also: Editor Find (^F) Searches for a string in the active editor window. Find Selection (^H) Does the same as (^F) but searches for a match to a piece of selected (inverted) text. Find Next (^D) Looks for the next match. Replace (^R) Replaces all occurrences of a word with another word. Goto line (^L) Places the cursor on a specific line. Find Cursor Finds the line where the cursor is located. Cycle Windows (^W) Switches between the open editor windows. User Screen (ESC) Switches to the screen generated by the program that was last run.  "*The following describes the Options menu. See also: Editor Help (HELP) Activates the On-line Help system. Save Saves the configuration settings. Other topics are: GENERALCOMPILER LINKER RUN ?? 3.The following describes the OPTIONS/Run dialog. The dialog is activated by (J) See also: Editor, Options "Make pause after program run" If this option is active, a line reading "Press a key..." will appear after a program has finished running from within the editor. "Parameters" With the parameter line you can simulate a command line. The parameters passed on the command line can be accessed by the ParamStr function. "Memory for program": Specifies how much memory you want to reserve for the programs that you either Run (R) or Executes (through the File menu). \ s( - -  - - - -   -   -   -   -  -  "+2These are the routines implemented in the Dos unit: ChDirDiskFreeDiskSize EnvCountEnvStrExec FExpandFindFirstFindNext FSplitGetDateGetDir GetDriveGetEnvGetFAttr GetFTimeGetTimeGetVerify MkDirPackTimeParamCount ParamStrRmDirSetDate SetDriveSetFAttr SetFTime SetTimeSetVerifySuper SwapVectorsTosVersionUnPackTime See also: Printer, Bios, System, System2, Graph, STPascal UNIT Dos; INTERFACE { Public constants } Const ReadOnly = $01; Hidden= $02; SysFile= $04; VolumeID = $08; Directory= $10; Archive= $20; AnyFile= $3F; { DosError codes } EINVFN= -32;{ Invalid Function Number } EFILNF= -33;{ File Not Found} EPTHNF= -34;{ Path Not Found} ENHNDL= -35;{ File Handle Pool Exhausted} EACCDN= -36;{ Access Denied} EIHNDL= -37;{ Invalid Handle} ENSMEM= -39;{ Insufficient Memory} EIMBA= -40;{ Invalid Memory Block Address } EDRIVE= -46;{ Invalid Drive Specification} ENSAME= -48; ENMFIL= -49;{ No More Files} ERANGE= -64;{ Range Error } EINTRN= -65;{ GEMDOS Internal Error } EPLFMT= -66;{ Invalid Executable File format } EGSBF= -67;{ Memory Block Growth Failure} { Public types } Type ComStr= String[127]; PathStr= String[79]; DirStr= String[67]; NameStr= String[8]; ExtStr= String[4]; SearchRec= Record Reserved: Packed Array[0..20] OF Byte; Attr: Byte; Time: LongInt; Size: LongInt; Name: String[12]; End; DateTime = Record Year: Integer; Month: Integer; Day : Integer; Hour: Integer; Min : Integer; Sec : Integer; End; { Public variables } Var DosError : Integer;  "(/This is the INTERFACE part of the System unit: See also: System2, Dos, Printer, Bios, Graph, STPascal UNIT System; INTERFACE Type Byte= 0..255; Word= 0..65535; PtrLen= Record Base : Pointer; Size : LongInt; End; PBasePage= ^RBasePage; RBasePage= Record P_lowtpa: Pointer; P_hitpa : Pointer; Text: PtrLen; Data: PtrLen; BSS: PtrLen; P_dta: Pointer; P_parent: PBasePage; P_resrvd0: LongInt; P_env: Pointer; P_stdfh : Array[1..6] of ShortInt; P_resrvd1: ShortInt; P_curdrv: ShortInt; P_resrvd2: Array[1..18] of LongInt; P_cmdlin: String[127]; End; Var Input,Output : Text;{ Standard input and output files } IOResVar: Integer;{ Var used by IOresult } AppFlag: Boolean;{ True => application, False => ACCessory } BasePage: PBasePage; { ^BasePage Layout } HeapOrg: Pointer;{ Internal pointer to heap } DevChain: Pointer;{ Chain of known devices } HighStak: Pointer;{ Top of stack area } LowStack: Pointer;{ Bottom of stack area } RandSeed: LongInt;{ Random Seed global } ExitProc: Pointer;{ User installable exit procedures } ExitCode: Integer;{ Error number. Usable in exit procedures } ErrorAdd: Pointer;{ Error address. Usable in exit procedures } STrap5: Pointer;{ Division by zero trap address } STrap102: Pointer;{ Program terminate address } LastPC: LongInt;{ Last known address, set by range and stack check} ShftShft: Pointer;{ Pointer to Shift-state. Used for user break } $$$ $ $    ! ' .These are the routines implemented in the System2 unit: ClrEolClrEos ClrScrDelLine GotoXYInsLine KeyPressedReadKey RunFromMemoryWhereX WhereY See also: System, Dos, Printer, Bios, Graph, STPascal UNIT System2; INTERFACE { FileRec Layout } Type Char32K= Packed Array[0..32000] of Char; Char32KPtr = ^Char32K; FileRec= Record fInpFlag: Boolean; {Used for input} fOutFlag: Boolean; {Used for output} fHandle: Integer;{File handle} fBufSize: Integer; {Record size or Text: buffer size} fBufPos: Integer;{Text: buffer position} fBufEnd: Integer;{Text: buffer last used} fBuffer: Char32KPtr;{Text: buffer pointer} fInOutProc : Pointer;{Text: IO handler if fHandle is zero} End; Rc Function Abs( N ) : (Same type as parameter) Returns the absolute value of the parameter N. N is an integer-type or a real-type expression. See also: Int, Trunc, Round Program Abs_Demo; Const Negative = -1000; Positive =1000; Begin WriteLn(Negative,' becomes ',ABS(Negative)); WriteLn(Positive,' is still ',ABS(Positive)); End. 3D Function Addr( var Object ) : Pointer; Returns the address of the specified object. The Object parameter can be a variable or a procedure or function identifier. See also: SPtr, Ptr Program Addr_Demo; Var A : Pointer; L : LongInt; Begin A := Addr(L); { Another way of doing it is: } A := @L; End. ,K Procedure Append( var F : text [;Name : String [;BufSize : LongInt]] ); Prepares a text file for appending. The Append procedure can be used in 3 different ways: Append(MyFile, 'NAME.EXT'); Does the same as ReWrite, but positions the file pointer at the end of the file. Append(MyFile, 'NAME.EXT', 10000); Does the same as the above, but also creates a 10000 byte buffer. Append(MyFile); Positions the file pointer at the end of an already opened file. See also: ReWrite, Reset Program Append_Demo; Var DataFile : Text; X : Byte; Begin { Create a temporary file. } ReWrite(DataFile,'TEMP.DTA'); For X := 1 to 100 DO WriteLn(DataFile,'HELLO WORLD'); Close(DataFile); { Now let's append some data. } Append(DataFile,'TEMP.DTA'); WriteLn(DataFile,'Last line in file'); Close(DataFile); End. " Function ArcTan( N ) : Real; Returns the arctangent of the parameter N. N is an integer-type or real-type expression. The result is the principal value, in radians, of the argument of N. See also: ValidReal Program ArcTan_Demo; Var Res : Real; Begin Res := ArcTan(123); End. E Procedure BlockRead(var F:File; var Buf; Cnt:Integer [; var Res:Integer]); Reads Cnt bytes from the file F into the variable Buf. F is a file variable (Typed or Untyped) that has been opened. Cnt speci- fies the number of bytes to read from the file. The actual number of bytes read will be returned in the optional Res parameter. If Res is not specified, and Cnt bytes could not be read, an IO-error will occur. Otherwise the number of bytes actually read is returned in Res. See also: BlockWrite, Seek Program BlockRead_Demo; Uses DOS; Var F_In, F_Out: FILE; { Untyped files } Buf: Array[1..4096] OF Byte; { Disk buffer } ActualRead, ActualWritten : Integer; Begin If (ParamCount <> 2) then HALT; Reset(F_In,ParamStr(1)); {$I-} Erase(ParamStr(2)); {$I+} ReWrite(F_Out,ParamStr(2)); Repeat { Copy file In to file Out. } BlockRead(F_In,Buf,SizeOf(Buf),ActualRead); BlockWrite(F_Out,Buf,ActualRead,ActualWritten); Until (ActualRead = 0) OR (ActualWritten <> ActualRead); Close(F_In); Close(F_Out); End.  Procedure BlockWrite(var F:File; var Buf; Cnt:Integer [; var Res:Integer]); Writes Cnt bytes from the variable Buf to the file F. F is a file variable (Typed or Untyped) that has been opened. Cnt speci- fies the number of bytes to write to the file. The actual number of bytes written will be returned in the optional Res parameter. If Res is not specified, and Cnt bytes could not be written, an IO-error will occur. Otherwise the number of bytes actually written is returned in Res. See also: BlockRead, Seek &' !+5Procedure ChDir( Dir : DirStr ); Changes the current directory. It is not possible to change to another drive using this procedure. To do that use the SetDrive procedure. See also: RmDir, MkDir, GetDir, SetDrive, DosError, Dos Program ChDir_Demo; Uses DOS; Begin ChDir('C:\MYDIR'); End.  Function Chr( N ) : Char; Returns ASCII character number N. N is an integer type value in the range of 0..255. See also: Ord, Ord4 Program Chr_Demo; Var B : Byte; Begin For B := 32 to 255 DO Write(Chr(B):4); End.  Procedure Close( var F ); Closes an open file. F is a file variable of any type. Close flushes the files buffer and releases its handle. See also: Reset, ReWrite, Append e} Procedure ClrEol; Deletes all characters on the current line, starting at the current cursor position. The position of the cursor is not changed by the ClrEol procedure. See also: ClrScr, ClrEos Program ClrEol_Demo; Var Y : Byte; Begin ClrScr; For Y := 1 to 10 DO WriteLn('0123456789'); For Y := 1 to 10 DO Begin GotoXY(5,Y); ClrEol; End; End. Ke Procedure ClrEos; Clears the screen starting at the current cursor location. The position of the cursor is not changed by the ClrEos procedure. See also: ClrScr, ClrEol Program ClrEos_Demo; Var X : Integer; Begin For X := 1 to 1999 DO Begin GotoXY(Random(80),Random(25)+1); Write('*'); End; GotoXY(1,10); ClrEos; End.  Procedure ClrScr; Clears the screen. After the call to ClrScr the cursor is placed in the upper left corner of the screen (Coordinates 1,1). See also: ClrEol, ClrEos w   Function Concat( S1 [, S2, S3 ...] ) : String; Concatenates 1 or more strings into 1 string. Using standard string addition, as for example: S1 := S1 + S2; will give the same result as: S1 := Concat(S1,S2); See also: Copy, Insert, Delete Program Concat_Demo; Var A1,A2,Res : String; Begin A1 := 'HELLO '; A2 := 'WORLD'; Res := Concat(A1,A2); WriteLn(Res); End.     # +Function Copy( FromStr : String; Index, Count : Byte ) : String; Returns Count characters from FromStr, starting at position Index. Copy returns an empty string if index is 0 or greater than the length of FromStr. If Index+Count is greater than the length of FromStr, the Copy function stops at the end of FromStr and returns. See also: Concat, Insert, Delete, Length, Pos Program Copy_Demo; Const Main = 'EXTRACT THE WORD HELLO FROM THIS STRING'; Begin WriteLn(Copy(Main,18,5)); End.   Function Cos( N ) : Real; Returns the cosine of the parameter. N is an integer-type or real-type expression. N is assumed to represent an angle in radians. See also: Sin, Trunc, ValidReal Program Cos_Demo; Var R : Real; Begin R := COS(20); End.    Procedure Dec( N [, Count ] ); Decrements an ordinal variable by 1 or by Count. N and the optional parameter Count are both simple types. If Count is not specified N will be decremented by 1. Otherwise N will be decremented by Count. See also: Inc, Succ, Pred Program Dec_Demo; Var L : LongInt; Begin L := 10; Repeat Dec(L); { Decrease L by 1 } Dec(L,2);{ Decrease L by 2 } Until (L < 0); End. Procedure Delay( Ms : LongInt ); Halts machine execution for Ms milliseconds. Program Delay_Demo; Begin WriteLn('Going to sleep for 5 seconds.'); Delay( 5*1000 ); End.  'Procedure Delete( var S : String; Index, Count : Byte ); Deletes Count characters from the string S, starting at position Index. If Index is 0 or greater then the length of S, no characters are deleted from S. See also: Omit, Copy, Insert, Length, Pos Program Delete_Demo; Var S : String; Begin S := 'DELETE THE WORD HELLO FROM THIS STRING'; WriteLn('Before calling delete: ',s); Delete(S,17,6); WriteLn('After calling delete : ',S); End.  Procedure DelLine; Deletes the current line from the screen. All lines following the current line will be scrolled up, and an empty line inserted at the bottom of the screen. See also: InsLine, GotoXY Program DelLine_Demo; Var X,Y : Integer; Begin For X := 1 to 80 DO For Y := 1 to 24 DO Begin GotoXY(X,Y); Write('*'); End; GotoXY(30,10); WriteLn('Press ENTER to go on'); ReadLn; GotoXY(1,1); For Y := 1 to 24 DO DelLine; End.     )Function DiskFree( Drive : Byte ) : LongInt; Returns the number of available bytes on the disk in the specified drive. Drive numbers are ordered as follows: drive 0 = Current disk drive. -1 = Drive A: -2 = Drive B: .... See also: DiskSize, GetDrive, SetDrive, Dos Program DiskFree_Demo; Uses DOS; Begin WriteLn( DiskFree(0) DIV 1024,' Kb available on current disk.'); End. n    )Function DiskSize( Drive : Byte ) : LongInt; Returns the size of the disk in the specified drive. Drive numbers are ordered as follows: drive 0 = Current disk drive. -1 = Drive A: -2 = Drive B: .... See also: DiskFree, GetDrive, SetDrive, Dos Program DiskSize_Demo; Uses DOS; Begin WriteLn( DiskSize(0) DIV 1024,' Kb available on current disk.'); End.    Procedure Dispose( var P : Pointer ); Disposes a dynamic variable. P is a pointer variable of any type that was previously assigned by the New procedure or was assigned a value by an assignment statement. After a call to Dispose the variable referenced by P is destroyed and its space in the heap is released. See also: New, FreeMem, GetMem Program Dispose_Demo; Type PersonType = Record Name: String[20]; Age : Byte; End; Var PersonData : ^PersonType; Begin New(PersonData); { Allocate space in heap } With PersonData^ DO Begin Write('Enter name: '); ReadLn(Name); Write('Enter age : '); ReadLn(Age); End; Dispose(PersonData); { Dispose the space } End.   Var DosError : Integer; Returns the error status for some of the routines in the DOS unit. The DosError values are declared in the DOS unit: Const EINVFN= -32; { Invalid Function Number } EFILNF= -33; { File Not Found} EPTHNF= -34; { Path Not Found} ENHNDL= -35; { File Handle Pool Exhausted} EACCDN= -36; { Access Denied} EIHNDL= -37; { Invalid Handle} ENSMEM= -39; { Insufficient Memory} EIMBA= -40;{ Invalid Memory Block Address } EDRIVE= -46; { Invalid Drive Specification} ENSAME= -48; ENMFIL= -49; { No More Files} ERANGE= -64; { Range Error } EINTRN= -65; { GEMDOS Internal Error} EPLFMT= -66; { Invalid Executable File format } EGSBF= -67;{ Memory Block Growth Failure } See also: Dos, BiosErrors HI   Function EnvCount : Integer; Returns the number of environment strings in the systems environment block. Use the functions EnvStr and GetEnv to examine the contents of the environment block. See also: EnvStr, GetEnv, Dos Program EnvCount_Demo; Uses DOS; Begin WriteLn(EnvCount,' strings in the environment block.'); End.  Function EnvStr( Index : Integer ) : String; Returns the environment string number Index. If Index is 0 or greater than EnvCount, EnvStr will return an empty string. See also: EnvCount, GetEnv, Dos Program EnvStr_Demo; Uses DOS; Var Count : Integer; Begin WriteLn('Program to display the environment block.'); WriteLn; For Count := 1 to EnvCount DO WriteLn( EnvStr(Count) ); WriteLn; WriteLn('Done.'); End. 1  Function Eof [ ( var F ) ] : Boolean; Returns false if there is still data to read after the current file position. F is a file variable of any type, that has been opened. If F is omitted the standard file Input is assumed. See also: SeekEof, Eoln Program Eof_Demo; Uses DOS; Var T : Text; D : String; Begin {$I-} Reset(T, 'TEMP.TXT'); {$I+} If (IOresult = 0) then Begin While NOT(Eof(T)) DO Begin ReadLn(T,D); WriteLn(D); End; Close(T); End ELSE WriteLn('Error opening file.'); End.   Function Eoln [ ( var F : text ) ] : Boolean; Returns false if there is still data to read after the current file position, but before the next new line. F is a file variable of type text, that has been opened. If F is omitted the standard file Input is assumed. See also: SeekEoln, Eof Program Eoln_Demo; Uses DOS; Var F : Text; C : Char; Begin {$I-} Reset(F,'TEMP.TXT'); {$I+} While NOT(Eoln(F)) DO Begin Read(F,C); Write(C); End; Close(F); End. 6C Procedure Erase( F : String ); Erases a file from disk. Do not erase an open file. See also: Rename Program Erase_Demo; Var DummyFile : FILE; Begin { Create a file. } ReWrite(DummyFile,'DUMMY.DTA'); Close(DummyFile); Write('Press RETURN to erase the dummy file.'); ReadLn; Erase('DUMMY.DTA'); End.  ( Procedure Exec(Path : PathStr; Command : ComStr); Executes a specified program, with a specified command line. If insufficient free memory is available, Exec will not work. Therefore remember to limit the memory requirements by use of a {$M STACK,Hmin,Hmax,DosFree} directive. Exec errors are reported in the DosError variable. See also: SwapVectors, DosError Program Exec_Demo; {$M 5,1,1,5} Uses DOS; Begin SwapVectors; Exec(GetEnv('COMSPEC'),'Dir'); SwapVectors; If DosError <> 0 then Writeln('Error number: ',DosError); End.   Procedure Exit; Exits from the current block of code. If the current block is the main program, the call to Exit will cause the program to terminate. If the current block is a procedure or a function an exit is made, and control is passed to the caller. See also: Halt, ExitProc Program Exit_Demo; Procedure WasteTime; Begin Repeat If (Random(1000) = 999) then EXIT; Until False; End; Begin WasteTime; End. t Var ExitProc : Pointer; Points to the start of the exit chain. The idea of the ExitProc variable is to allow user written procedures or functions to be executed just before a program terminates. This feature can be very useful if for example some files need to be closed, before the program stops. As can be seen from the following example, it is very important that the original value of the ExitProc variable is first saved and later restored in the exit routine. If this is not done the systems own exit procedure will not be executed, causing unpredictable results. See also: Halt, Exit Program ExitProc_Demo; Var OldExit : Pointer; Procedure MyExit; Begin ExitProc := OldExit;{ Restore the original value! } WriteLn('End of program.'); End; Begin OldExit := ExitProc;{ Save the original value! } ExitProc := @MyExit;{ Set the new value. } { Do work here. } End.    Function Exp( N ) : Real; Returns the exponential of N. N is an integer-type or real-type expression. See also: Ln, ValidReal Program Exp_Demo; Var R : Real; Begin Write('Enter a number: '); ReadLn(r); WriteLn; WriteLn('The enponential is: ',Exp(r)); End. u  Function FExpand( Path : PathStr ) : PathStr; Expands a file path into a fully qualified file path. Assuming that the current directory is C:\PASCAL, the following results would be returned by FExpand: FExpand(''); = C:\PASCAL\ FExpand('*.PAS');= C:\PASCAL\*.PAS FExpand('..\*.INF');= C:\*.INF FExpand('..\PASCAL\..\*.PAS'); = C:\*.PAS As can be seen from the above, FExpand converts its output to uppercase. See also: FSplit, FindFirst, Dos Program FExpand_Demo; Uses DOS; Var Path : PathStr; Begin Write('Enter path to expand: '); ReadLn(Path); Path := FExpand(Path); WriteLn('Fully expanded: ',Path); End. f Function FilePos( var F ) : LongInt; Returns the number of the current record in file F. F is a file variable (Typed or Untyped) that has been opened. After a call to Reset or ReWrite, FilePos will return 0. See also: Seek, FileSize Program FilePos_Demo; Var DataFile : FILE OF Byte; B : Byte; Begin ReWrite(DataFile,'TEMP.DTA'); { Create a temporary file. } For B := 1 to 100 DO Write(DataFile,B); Repeat { Seek around in the file. } Seek(DataFile,Random(FileSize(DataFile))); WriteLn('Current file position is: ',FilePos(DataFile)); Until KeyPressed; Close(DataFile); Erase('TEMP.DTA'); End.  Function FileSize( var F ) : LongInt; Returns the number of records in file F. F is a file variable (Typed or Untyped) that has been opened. See also: FilePos, Seek   Procedure FillChar( var Object; Count : LongInt; FillVal : Byte ); Fills memory starting at the address specified by Object. Object is any variable. Count specifies how many bytes of memory that are to be filled. FillVal specifies the value that is to be used for the fill. If Count is greater than the size of Object, other data or code may be overwritten, causing unpredictable results. Therefore the SizeOf function should be used to specify the number of bytes to fill. See also: SizeOf, Move Program FillChar_Demo; Var Big : Packed Array[1..30000] OF Byte; C: Integer; Begin WriteLn('Doing it the slow way.'); For C := 1 to 30000 DO Big[c] := 0; WriteLn('Doing it the fast way.'); FillChar(Big,SizeOf(Big),0); End. 9( ( (!(+Procedure FindFirst( Path : String; Attr : Byte; var S : SearchRec ); Searches a directory for the first entry matching a specified file name and set of attributes. Path is a path to a directory on a specified drive. The path consists of a directory name, which is optional, and a file name. The file name can contain wild card characters (* and ?). The directory name must be implicit. The Attr parameter specifies the special files to search for (in addition to all normal files). The file attributes are declared in the DOS unit as follows: Const ReadOnly = $01; Hidden= $02; SysFile= $04; VolumeID = $08; Directory= $10; Archive= $20; AnyFile= $3F; Upon return FindFirst places the result of the search in the S variable. S is of the type SearchRec, which is declared in the DOS unit: Type SearchRec= Record Reserved: packed Array[0..20] OF Byte; Attr: Byte; Time: LongInt; Size: LongInt; Name: String[12]; End; After a call to FindFirst the variable DosError must be checked. If it is not 0, the contents of the S parameter will be garbage. See also: FindNext, UnPackTime, DosError, Dos Program Find_Demo; Uses DOS; Var DosData : SearchRec; Begin FindFirst( '*.*' , AnyFile, DosData ); While (DosError = 0) DO Begin With DosData DO Write(Name :20 ); FindNext(DosData); End; End. kk Procedure FindNext( var S : SearchRec ) Finds the next entry matching the specifications given in a previous call to FindFirst. The S parameter must be the same one that was used in the call to FindFirst. After a call to FindNext the variable DosError must be checked. If it is not 0, the contents of the S parameter will be garbage. See also: FindFirst, Dos .N   Procedure FreeMem( var P : Pointer; Size : LongInt ); Disposes a dynamic variable of a given size. P is a pointer variable of any type that was previously assigned by the GetMem procedure. Size specifies the size of the dynamic variable to dispose. Size must be equal to the size specified in the call to GetMem. See also: GetMem, New, Dispose Program FreeMem_Demo; Var Data : Pointer; F: FILE; R: Integer; Begin GetMem(Data,1024); { Allocate 1K in the heap } Reset(F,'TEMP.DTA'); BlockRead(F,Data^,1024,R); Close(F); FreeMem(Data,1024); End. r Procedure FSplit(P : PathStr; var D:DirStr;var N:NameStr;var E:ExtStr); Splits a file path into its 3 components: The directory specification. The file name. The file extension. Any of the 3 components can be empty on return, if the file path did not contain that component on entry. The PathStr, DirStr, NameStr and ExtStr are declared in the DOS unit. Type PathStr= String[79]; DirStr= String[67]; NameStr= String[8]; ExtStr= String[4]; See also: FExpand, GetDir, Dos Program FSplit_Demo; Uses DOS; Var FullPath : PathStr; Dir: DirStr; Name: NameStr; Ext: ExtStr; Begin Repeat Write('Enter path to split: '); ReadLn(FullPath); FSplit(FullPath,Dir,Name,Ext); WriteLn; WriteLn(FullPath,' consists of:'); WriteLn; WriteLn('The directory: ',Dir); WriteLn('The file name: ',Name); WriteLn('With the extension: ',Ext); Until (FullPath = ''); End. y   Procedure GetDate( var Year, Month, Day, DayOfWeek : Integer ); Returns the current date set in the operating system. The ranges of the returned values are: Year1980..2099 Month1..12 Day 1..31 DayOfWeek0..6 (Where 0 = Sunday, 1 = Monday ... ) See also: SetDate, GetTime, Dos Program GetDate_Demo; Uses DOS; Var Year,Month,Day,DayOfWeek: Integer; Begin GetDate(Year,Month,Day,DayOfWeek); Write('Today is '); Case DayOfWeek OF 0 : Write('Sunday'); 1 : Write('Monday'); 2 : Write('Tuesday'); 3 : Write('Wednesday'); 4 : Write('Thursday'); 5 : Write('Friday'); 6 : Write('Saturday'); End; WriteLn('.'); End.       *Procedure GetDir( Drive : Byte; var Dir : DirStr ); Returns the current directory on a specified disk drive. Drive numbers are ordered as follows: drive 0 = Current disk drive. -1 = Drive A: -2 = Drive B: .... See also: ChDir, RmDir, MkDir, GetDrive, Dos Program GetDir_Demo; Uses DOS; Var CurDir : DirStr; Begin GetDir(0,CurDir); WriteLn('Current dir on current drive is: ',CurDir); GetDir(1,CurDir); WriteLn('Current dir on drive A: is: ',CurDir); End. &   Function GetDrive : Byte; Returns the number of the current disk drive. The drive numbers are ordered as follows: 0 = Drive A: 1 = Drive B: .... See also: SetDrive, GetDir, Dos Program GetDrive_Demo; Uses DOS; Begin WriteLn('Current drive is: ',GetDrive); End. )* Function GetEnv( MatchStr : String ) : String; Returns the value of a specific environment string. If no match is found for MatchStr, GetEnv will return an empty string. See also: EnvCount, EnvStr, Dos Program GetEnv_Demo; Uses DOS; Begin WriteLn('Current PATH is: ', GetEnv('PATH')); End. tI Procedure GetFAttr( Fil : PathStr; var Attr : Integer ); Gets the attributes of a file. The file attributes and PathStr are declared in the DOS unit: Const ReadOnly = $01; Hidden= $02; SysFile= $04; VolumeID = $08; Directory= $10; Archive= $20; AnyFile= $3F; Type PathStr= String[79]; See also: SetFAttr, DosError, Dos Program GetFAttr_Demo; Uses DOS; Var Attrs: Integer; Begin If (ParamCount = 0) then HALT; GetFAttr( ParamStr(1), Attrs ); If (DosError = 0) then Begin If (Attrs AND ReadOnly > 0) then WriteLn('ReadOnly'); If (Attrs AND Hidden > 0) then WriteLn('Hidden'); If (Attrs AND SysFile > 0) then WriteLn('System'); If (Attrs AND VolumeID > 0) then WriteLn('Disk label'); If (Attrs AND Directory > 0) then WriteLn('Directory'); If (Attrs AND Archive > 0) then WriteLn('Archive'); End ELSE WriteLn('No file name specified.'); End. t   ! ( 2Procedure GetFTime( var F; var Time : LongInt ); Gets the time and date of a file. The F parameter is a file variable (Typed, Untyped or Text) that has been either Reset, Rewritten or Appended. The returned long integer can be unpacked, using the UnPackTime procedure. See also: SetFTime, UnPackTime, Reset, DosError, Dos Program GetFTime_Demo; Uses DOS; Var DiskFile : TEXT; Name: String; DatTim: DateTime; PackData : LongInt; Begin Write('Enter name of file to work with: '); ReadLn(Name); {$I-} Reset(DiskFile,Name); {$I+} If (IOresult = 0) then Begin GetFTime( DiskFile, PackData ); UnPackTime(PackData,DatTim); With DatTim DO Begin WriteLn('Date of update/creation is: ',Day,'-',Month,'/',Year); WriteLn('Time of update/creation is: ',Hour,'.',Min,',',Sec); End; Close(DiskFile); WriteLn('Done.'); End ELSE WriteLn('Error while opening file.'); End.  ",Procedure GetMem( var P : Pointer; Size : LongInt ); Creates a new dynamic variable and sets P to point to it. P is a pointer variable of any type. Size specifies the size in bytes of the dynamic variable to allocate. See also: FreeMem, Dispose, New, MemAvail, MaxAvail Program GetMem_Demo; Var Data : Pointer; F: FILE; R: Integer; Begin GetMem(Data,1024); { Allocate 1K in the heap } Reset(F,'TEMP.DTA'); BlockRead(F,Data^,1024,R); Close(F); FreeMem(Data,1024); End.  Procedure GetTime( var Hour, Min, Sec, Sec100 : Integer ); Returns the current time in the operating system. The ranges of the returned values are: Hour0..23 Min 0..59 Sec 0..58 The Sec100 parameter, which has been implemented for compatibility with Turbo Pascal, is not supported by the operating system, and will therefore always return 0. Due to the operating system, the returned seconds will always be divisible with two. See also: SetTime, GetDate, Dos Program GetTime_Demo; Uses DOS; Var Hour,Minute,Second,Hundreds : Integer; Begin Repeat GetTime(Hour,Minute,Second,Hundreds); GotoXY(1,1); ClrEol; Write(Hour,'.',Minute,',',Second); Until KeyPressed; End.   Procedure GetVerify( var Verify : Boolean ); Returns the value of the disk verify flag. When verify is on (True), TOS will check to see if data written to the disk, has been stored properly. This is done by trying to read the data just written. When off (False), TOS will simply write the data. See also: SetVerify, Dos Program GetVerify_Demo; Uses DOS; Var Res : Boolean; Begin Write('Current state of disk verify is '); GetVerify( Res ); Case Res OF True: WriteLn('ON'); False : WriteLn('OFF'); End; End.     # ,Procedure GotoXY( Col, Lin : Integer ); Positions the cursor at specific screen coordinates. On a standard monochrome screen the range for X and Y are: X1..80 Y1..25 Where position 1,1 is the upper left corner. See also: WhereX, WhereY, ClrEos, InsLine, DelLine Program GotoXY_Demo; Var X,Y : Integer; Begin For X := 1 to 80 DO For Y := 1 to 25 DO Begin GotoXY(X,Y); If (X*Y) < (80*25) then Write('*'); End; End.   Procedure Halt [ ( ExitCode : Integer ) ]; Halts the current program. If the optional parameter ExitCode is not specified, an exit code of 0 will be used. See also: Exit, ExitProc Program Halt_Demo; Uses DOS; Begin If (ParamCount = 0) then HALT(99); End.  Function Hi( N : Integer ) : Byte; Returns the high byte of N. See also: Lo, LoWord, HiWord, Swap Program Hi_Demo; Begin WriteLn(Hi($1234)); End.  Function HiWord( N : LongInt ) : Integer; Returns the high word of N. See also: LoWord, Hi, Lo, SwapWord Program HiWord_Demo; Begin WriteLn(HiWord($12345678)); End.    Procedure Inc( N [, Count ] ); Increments an ordinal variable by 1 or by Count. N and the optional parameter Count are both simple types. If Count is not specified N will be incremented by 1. Otherwise N will be incremented by Count. See also: Dec, Pred, Succ Program Inc_Demo; Var L : LongInt; Begin L := 0; Repeat Inc(L); { Increase L by 1 } Inc(L,2);{ Increase L by 2 } Until (L > 10); End. ab Function Include( NewStr, MainStr : String; Index : Byte ); Returns MainStr with NewStr inserted at position Index. MainStr is not affected by the call to Include. Except for this the rules for the Include function are the same as for the Insert procedure. See also: Insert Program Include_Demo; Begin WriteLn(Include('IS ','ATARI GREAT',7)); End.   "*Procedure Insert( New : String; var Main : String; Index : Byte ); Inserts New into Main at position Index. See also: Include, Copy, Delete, Length, Pos Program Insert_Demo; Var S : String; Begin S := 'Hello'; Insert(' World!',S,6); WriteLn(S); End.  Procedure InsLine; Inserts a blank line on the screen. All lines under and including the current line will be scrolled down, and the bottom line is lost. See also: DelLine, GotoXY Program InsLine_Demo; Var X,Y : Integer; Begin For X := 1 to 80 DO For Y := 1 to 24 DO Begin GotoXY(X,Y); Write(Random(2)); End; GotoXY(30,10); WriteLn('Press ENTER to go on'); ReadLn; GotoXY(1,1); For Y := 1 to 25 DO InsLine; End.  Function Int( N : Real ) : Real; Returns the integer part of N. See also: Trunc, Round, Abs Program Int_Demo; Var R : Real; Begin R := INT(1234.5678); { R = 1234.00 } End. Function IOresult : Integer; Returns the error status of the last IO operation. It is important to notice that IOresult is used as an error status for several IO routines in the system. Therefore it is not reliable to make a program like this: { Do some file operations here. } WriteLn('Error code: ',IOresult); Since WriteLn also uses IOresult to report errors. (Thereby setting IOresult to 0 when writing 'Error code: '). Instead do like this: { Do some file operations here. } MyVar := IOresult; WriteLn('Error code: ',MyVar); Program IOresult_Demo; Var F : FILE; Begin {$I-} Reset(F,'TEMP.TXT'); {$I+} If (IOresult <> 0) then ReWrite(F,'TEMP.TXT'); End. 5; Function KeyPressed : Boolean; Checks to see if the keyboard has been pressed. KeyPressed will return True if a key is waiting to be read, otherwise False. See also: ReadKey Program KeyPressed_Demo; Begin Repeat WriteLn('Please press a key.'); Until KeyPressed; WriteLn('You pressed ',ReadKey); End.  !*28Function Length( S : String ) : Byte; Returns the length of string S. The returned value will be in the range of 0..255. See also: Copy, Concat, Insert, Include, Delete, Omit, Pos Program Length_Demo; Var S : String; Begin Write('Enter a string: '); ReadLn(S); WriteLn; WriteLn('You entered ',Length(S),' characters'); WriteLn('You entered ',Ord(S[0]),' characters'); End.   Function Ln( R ) : Real; Returns the natural logarithm of R. N is a real-type expression. The result is the natural logarithm of R. See also: Exp, ValidReal Program Ln_Demo; Var R : Real; Begin R := LN(100); End.  Function Lo( N : Integer ) : Byte; Returns the low byte of N. See also: Hi, HiWord, LoWord Program Lo_Demo; Var X : Byte; Begin X := Lo($1234); { = $34 } End.  Function LoWord( N : LongInt ) : Integer; Returns the low word of N. See also: HiWord, Hi, Lo Program LoWord_Demo; Begin WriteLn(LoWord($12345678)); End.  Function MaxAvail : LongInt; Returns the size of the largest contiguous memory block in the heap. See also: MemAvail, New, GetMem Program MaxAvail_Demo; Var P : Pointer; Begin If (MaxAvail > 1000) then GetMem(P,1000); End.  Function MemAvail : LongInt; Returns the sum of the sizes of all free memory blocks in the heap. See also: MaxAvail Program MemAvail_Demo; Begin WriteLn('Bytes free in the heap is: ',MemAvail); End.  !+Procedure MkDir( Dir : DirStr ); Creates a new directory. See also: ChDir, RmDir, GetDir, DosError, Dos Program MkDir_Demo; Uses DOS; Begin MkDir('MYDIR'); End.   Procedure Move( var Source, Dest; Count : LongInt ); Move Count bytes from Source to Dest. Source and Dest can be any variable. Count specifies how many bytes to move. If Count is greater than the size of Dest, other code or data may be overwritten, causing unpredictable problems. Therefore it is a good idea to use the SizeOf function to specify how many bytes to move: Var Big: LongInt; Small : Integer; Begin Move(Big,Small,4);{ The very dangerous way of doing it! } Move(Big,Small,SizeOf(Small));{ The safe way of doing it. } End. See also: SizeOf, FillChar Program Move_Demo; Var Big1: Packed Array[1..2000] OF Integer; Big2: Packed Array[1..1000] OF Integer; Begin Move(Big1,Big2,SizeOf(Big2)); End. a %/Procedure New( var P : Pointer ); Creates a new dynamic variable and sets P to point to it. P is a pointer variable of any type. The size of the allocated memory block corresponds to the size of the type that P points to. See also: Dispose, GetMem, FreeMem, MemAvail, MaxAvail Program New_Demo; Type PersonType = Record Name: String[20]; Age : Byte; End; Var PersonData : ^PersonType; Begin New(PersonData); { Allocate space in heap } With PersonData^ DO Begin Write('Enter name: '); ReadLn(Name); Write('Enter age : '); ReadLn(Age); End; Dispose(PersonData); { Dispose the space } End. 1Function Odd( N ) : Boolean; Tests to see if the N parameter is an odd number. N is an integer type value. Program Odd_Demo; Var L : LongInt; Begin Repeat Write('Enter a number: '); ReadLn(L); If Odd(L) then WriteLn('ODD') ELSE WriteLn('EVEN'); Until (L = 0); End.  Function Omit( S : String; Index, Count : Integer ) : String; Returns S with Count characters deleted, starting at position Index. The rules for the Omit function are the same as for the Delete procedure, except for the fact that the S string is left untouched when using the Omit function. See also: Delete Program Omit_Demo; Begin WriteLn(Omit('ATARI IS NOT GREAT',10,4)); End.    Function Ord( x ) : Integer; Returns the ordinal number of an ordinal-type or pointer-type value. If X is an ordinal-type expression, the result is of type integer and the value is the ordinality of X. If X is a pointer-type expression, the result is of type LongInt, and the value is the address of the dynamic variable pointed to by X. See also: Ord4, Chr Program Ord_Demo; Var C : Char; Begin Write('Enter something: '); C := ReadKey; WriteLn; WriteLn('The ordinal value of ',C,' is ',Ord(C)); End.  Function Ord4( x ) : LongInt; Returns the ordinal number of an ordinal-type value. This function does the same as the Ord function, but the result is always a long integer. See also: Ord, Chr  !Procedure PackTime( D : DateTime; var Result : LongInt ); Packs a 12-byte DateTime record into a 4-byte long integer. The DateTime record is declared in the DOS unit: Type DateTime = Record Year: Integer; Month: Integer; Day : Integer; Hour: Integer; Min : Integer; Sec : Integer; End; PackTime returns a long integer with the following format: bits0 -4 seconds (divided by 2) -5 - 10minutes -11 - 15hours -16 - 20day of month -21 - 24month -25 - 31years(since 1980) The returned long integer can be used by SetFTime and UnPackTime. See also: UnPackTime, SetFTime, Dos Program PackTime_Demo; Uses DOS; Var U : DateTime;{ The unpacked time and date } P : LongInt;{ The packed time and date } Procedure WriteData; Begin With U DO Begin WriteLn('Time: ',Hour,'.',Min,',',Sec); WriteLn('Date: ',Day,'-',Month,'/',Year); End; WriteLn; End; Begin { main } With U DO Begin Year := 1990; Month := 12; Day := 24; Hour := 12; Min := 0; Sec := 0; End; WriteLn('Before packing:'); WriteData; PackTime(U,P); WriteLn('The packed time and date: ',P); UnPackTime(P,U); WriteLn('After unpacking:'); WriteData; End. uProcedure Page [ ( var F : text ) ]; Writes a formfeed character to file F. If F is omitted, the standard file Output is assumed. Page is equivalent to: Write( F, Chr(12) ); Program Page_Demo; Var T : Text; Begin ReWrite(T,'PRINTER.DTA'); WriteLn(T,'First page.'); Page(T); WriteLn(T,'Second page.'); Page(T); WriteLn(T,'Third page.'); Page(T); Close(T); End. 0 Function ParamCount : Integer; Returns the number of parameters that were passed to the program on the command line. Use the ParamStr function to obtain the value of the parameters. See also: ParamStr, Dos Program ParamCount_Demo; Uses DOS; Var Res, Count : Integer; Begin Res := ParamCount; WriteLn('You passed ',Res,' parameters to this program.'); WriteLn; If (Res = 0) then HALT; WriteLn('Here is a list of the parameters:'); WriteLn; For Count := 1 to Res DO WriteLn('Parameter #',Count:2,' := ',ParamStr(Count)); End.  Function ParamStr( Index : Byte ) : String; Returns command line parameter number Index. If Index is 0 or greater than ParamCount, ParamStr will return an empty string. See also: ParamCount, Dos Program ParamStr_Demo; { Displays 1 or more text files. } Uses DOS; Var DataFile : TEXT; Data: String; Count: Integer; Procedure DisplayFile( Number : Integer ); Begin {$I-} Reset( DataFile, ParamStr(Number) ); {$I+} If (IOresult <> 0) then Begin WriteLn('Error while opening file: ',ParamStr(Number)); EXIT; End; While NOT(Eof(DataFile)) DO Begin ReadLn(DataFile, Data); WriteLn(Data); End; Close(DataFile); End; { DisplayFile } Begin For Count := 1 to ParamCount DO DisplayFile( Count ); End. wxConst Pi = 3.14159265358979324; Returns the value of Pi. Program Pi_Demo; Begin WriteLn('Pi is: ',Pi :23:20); End.  !Function Pos( SubStr, MainStr : String ) : Byte; Searches MainStr for the first occurrence of SubStr. If SubStr does not exist in MainStr, the Pos function will return 0, else Pos will return the position in MainStr where SubStr was found. Here are some examples: Pos('HELLO','HELLO WORLD') = 1 Pos('CAL','PASCAL') = 4 Pos('TS','ATARI ST')= 0 See also: Copy, Insert, Delete, Length Program Pos_Demo; Var MainStr, SubStr: String; P: Byte; Begin Write('Enter main string: '); ReadLn(MainStr); Write('Find what: '); ReadLn(SubStr); WriteLn; P := Pos(SubStr,MainStr); If (P = 0) then WriteLn('Not found.') ELSE WriteLn('Found at position ',P); End.  Function Pred( X ) : (Same type as parameter) Returns the predecessor of the parameter. X is an ordinal-type value. See also: Succ, Dec, Inc Program Pred_Demo; Begin WriteLn(Pred(2)); { = 1 } End.  Function Ptr( Address : LongInt ) : Pointer; Converts a long integer value to a pointer type value. The result of Ptr is a pointer that points to the memory location specified by the value of Address. See also: SPtr, Addr Program Ptr_Demo; Uses DOS; Var SP : Pointer; P: ^integer; I: Integer; Begin Sp := Super(NIL); P := Ptr($4a6); I := P^; Sp := Super(Sp); WriteLn(I,' disk drives are connected to your system.'); End. B Function Random [ ( Max : Integer) : Integer ] | [ : Real ]; Returns a random number. If the optional Max parameter is specified, the result of Random will be a long integer in the range of 0..Max-1. If no parameter is given to the Random function a random real number, in the interval 0 <= x < 1, will be returned. See also: Randomize, RandSeed Program Random_Demo; Var Tries , Secret, Guess: Integer; Begin Randomize; WriteLn('Guess a number.'); WriteLn; Secret := Random(100); Tries := 0; Repeat Inc(Tries); Write('Enter your guess number ',Tries,': '); ReadLn(Guess); If (Guess < Secret) then WriteLn('Too low.') ELSE If (Guess > Secret) then WriteLn('Too high.'); Until (Guess = Secret); WriteLn('You guessed it in ',Tries,' attempts.'); End.  Procedure Randomize; Initializes the random-number generator with a random value. Every time a program is started, the random-number generator is initialized with the same value (0). The effect of this is that random numbers generated by a program will be the same every time the program is run. There are 2 ways of getting around this problem: 1. Call Randomize to re-initialize the random-number generator. 2. Change the value of the RandSeed variable. See also: Random, RandSeed Program Randomize_Demo; Begin { This will be the same every time the program is run. } WriteLn(Random(1000)); Randomize; { This will not! } WriteLn(Random(1000)); End.    Var RandSeed : LongInt; RandSeed is used as the seed for the random-number generator. Setting RandSeed to a specific value can make the Random function return the same random numbers over and over again. This feature is useful in Encryption and Simulation algorithms. See also: Random, Randomize Program RandSeed_Demo; Begin RandSeed := 1234; WriteLn(Random(9999)); { This } RandSeed := 1234; WriteLn(Random(9999)); { and this will always be the same. } End. ' Procedure Read [ ( [ var F; ] v1 [,v2,..vn] ) ]; Reads 1 or more components from file F into 1 or more variables. Read for text files: F is a file variable of type text. If omitted the standard file Input is assumed. Each of the variables (v1,v2..vn) must be of type char, integer, real or string. Read for typed files: F is a file variable of any type except text. Each of the variables (v1,v2,vn) must be of the same type as the component type of file F. See also: ReadLn, Write, WriteLn Program Read_Demo; Uses DOS; Var T : Text; C : Char; Begin {$I-} Reset(T,'TEST.TXT'); {$I+} If (IOresult = 0) then Begin While NOT(Eof(T)) DO Begin Read(T,C); Write(C); End; Close(T); End ELSE WriteLn('File not found.'); End. w| Function ReadKey : Char; Reads a character from the keyboard. If no character is waiting to be read a key must be pressed in order to exit the ReadKey function. Otherwise a character is read from the systems internal keyboard buffer. See also: KeyPressed, UpCase Program ReadKey_Demo; Begin Repeat WriteLn('Press SPACEBAR to stop this.'); Until (ReadKey = #32); End.    Procedure ReadLn [ ( [ var F : text; ] v1 [,v2,..vn] ) ]; Executes the Read procedure, and then skips to the next line in the file. If no next line can be found in the file, the Eof(F) will return true. If ReadLn is called with only a file variable as parameter, the file pointer will advance to the beginning of the next line in the file. See also: Read, WriteLn, Write Program ReadLn_Demo; Var S : String; Begin Write('What is your name: '); ReadLn(s); End. .G Procedure Rename( OldName, NewName : String ); Renames the file OldName to NewName. See also: Erase Program Rename_Demo; Uses DOS; Var Current, New: String; Begin Write('Enter current file name: '); ReadLn(Current); Write('Enter new file name: '); ReadLn(New); Rename( Current, New ); End.   Procedure Reset( var F [; FileName:String][; BufSize:LongInt] ); Opens or resets a file. F is a file variable of any type. FileName specifies the name of the file on the disk. The optional BufSize can be specified with files of type text to determine the size of a buffer. The Reset procedure can be used in 3 different ways: Reset(MyFile, 'NAME.EXT'); Opens the file MyFile. If the file is of type text it is opened as Read Only. Reset(MyFile, 'NAME.EXT', 10000); Opens the text file MyFile. A 10000 byte buffer is created for the file. Reset(MyFile); Positions the file pointer at the start of MyFile. MyFile must be open. See also: ReWrite, Append Program Reset_Demo; Var TextF : Text; Data: String; Begin {$I-} Reset(TextF,'TEST.TXT',1024); { Opens the file with a 1K buffer. } {$I+} If (IOresult = 0) then Begin While NOT(Eof(TextF)) DO Begin ReadLn(TextF,Data); WriteLn(Data); End; Close(TextF); End ELSE WriteLn('Can''t open file.'); End.  K Procedure ReWrite( var F [; FileName : String][; BufSize : LongInt] ); Creates or resets a file. F is a file variable of any type. FileName specifies the name of the file on the disk. The optional BufSize can be specified with files of type text to determine the size of a buffer. The ReWrite procedure can be used in 3 different ways: ReWrite(MyFile, 'NAME.EXT'); Creates and/or opens the file MyFile. If the file is of type text it is opened as Write Only. ReWrite(MyFile, 'NAME.EXT', 10000); Creates and/or opens the text file MyFile. A 10000 byte buffer is created for the file. ReWrite(MyFile); Positions the file pointer at the start of MyFile. MyFile must be open. See also: Reset, Append Program ReWrite_Demo; Var Data, Name : String; Out: Text; Begin Write('Create what file: '); ReadLn(Name); {$I-} ReWrite(Out,Name); {$I+} If (IOresult = 0) then Begin Repeat Write('Enter data: '); ReadLn(Data); WriteLn(Out,Data); Until (Data = ''); Close(Out); End ELSE WriteLn('Could not create ',Name); End.  !Procedure RmDir( Dir : DirStr ); Removes an existing directory. See also: ChDir, MkDir, GetDir, Dos Program RmDir_Demo; Uses DOS; Begin RmDir('MYDIR'); End.  Function Round( N : Real ) : LongInt; Rounds a real-type value to an integer-type value. See also: Int, Trunc, Abs Program Round_Demo; Var L : LongInt; Begin L := ROUND(1.40); { L = 1 } L := ROUND(1.50); { L = 2 } End.  Function RunFromMemory : Boolean; Returns True if the program is running from within the editor. If you are running the compiler/editor from within a debugger, the RunFromMemory function will probably return an incorrect result. See also: System2 Program RunFromMemory_Demo; Begin Write('You are'); Case RunFromMemory OF False : Write(' NOT'); End; WriteLn(' running from within the HIDE.'); End.   Procedure Seek( var F; Rec : LongInt ); Moves the file pointer to a specific record in file F. F is a file variable (Typed or Untyped) that has been opened. Rec is the number of the record to seek to. The number of the first record in a file is 0. See also: FilePos, FileSize 6b Function SeekEof [ ( var F : text ) ] : Boolean; As Eof, but skips over all white spaces. F is a file variable of type text, that has been opened. If F is omitted the standard file Input is assumed. See also: Eof Program SeekEof_Demo; Var T : Text; X : Integer; Begin ReWrite(T,'SPACES.DTA'); { Make a file with lots of spaces. } For X := 1 to 1000 DO Write(T,#32); Reset(T);{ Go to start of file. } If (SeekEof(T)) then WriteLn('File contains nothing or only spaces.') ELSE WriteLn('The file contains data.'); Close(T); Erase('SPACES.DTA'); End.  Function SeekEoln [ ( var F : text ) ] : Boolean; As Eoln, but skips over all white spaces. F is a file variable of type text, that has been opened. If F is omitted the standard file Input is assumed. See also: Eoln Program SeekEoln_Demo; Uses DOS; Var F : Text; Begin Reset(F,'TEMP.TXT'); If (SeekEoln(F)) then WriteLn('First line in file is empty.') ELSE WriteLn('There is data on the first line.'); Close(F); End. L   Procedure SetDate( Year, Month, Day : Integer ); Sets the current date in the operating system. The legal ranges of Year, Month and Day are: Year1980..2099 Month1..12 Day 1..31 See also: GetDate, SetTime, Dos Program SetDate_Demo; Uses DOS; Var Year,Month,Day,Dow : Integer; Begin Write('Enter Year: '); ReadLn(Year); Write('Enter Month : '); ReadLn(Month); Write('Enter Day: '); ReadLn(Day); SetDate(Year,Month,Day); GetDate(Year,Month,Day,Dow); WriteLn('Date has been set to:'); WriteLn('Year = ',Year); WriteLn('Month = ',Month); WriteLn('Day= ',Day); End. ,J   Procedure SetDrive( Drive : Byte ); Sets the active disk drive. The drive numbers are ordered as follows: 0 = Drive A: 1 = Drive B: .... See also: GetDrive, ChDir, Dos Program SetDrive_Demo; Uses DOS; Var Go : Integer; Begin Write('Enter drive number: '); ReadLn(Go); SetDrive(Go); End. O Procedure SetFAttr( Fil : PathStr; Attr : integer ); Sets the attributes of a file. The file attributes and PathStr are declared in the DOS unit: Const ReadOnly = $01; Hidden= $02; SysFile= $04; VolumeID = $08; Directory= $10; Archive= $20; AnyFile= $3F; Type PathStr= String[79]; See also: GetFAttr, Dos Program SetFAttr_Demo; Uses DOS; Var Name : PathStr; Begin Write('Hide what file?: '); ReadLn(Name); SetFAttr( Name , Hidden ); End. M    & / 7 Procedure SetFTime( var F; Time : LongInt ); Sets the time and date of a file. The F parameter is a file variable (Typed, Untyped or Text) that has been either Reset, Rewritten or Appended The Time parameter is a long integer, that has previously been packed using the PackTime procedure. See also: GetFTime, PackTime, Reset, ReWrite, Append, DosError, Dos Program SetFTime_Demo; Uses DOS; Var DiskFile : TEXT; DatTim: DateTime; PackData : LongInt; Begin {$I-} Reset(DiskFile,'TEST.TXT'); {$I+} If (IOresult = 0) then Begin With DatTim DO Begin Write('Enter Year: '); ReadLn(Year); Write('Enter Month: '); ReadLn(Month); Write('Enter Day: '); ReadLn(Day); Write('Enter Hour: '); ReadLn(Hour); Write('Enter Minute : '); ReadLn(Min); Write('Enter Second : '); ReadLn(Sec); End; PackTime(DatTim, PackData); SetFTime(DiskFile, PackData); Close(DiskFile); WriteLn('Done.'); End ELSE WriteLn('Error while opening file.'); End. 3n Procedure SetTime( Hour, Min, Sec, Sec100 : Integer ); Sets the current time in the operating system. The legal ranges of Hour, Min, Sec are: Hour0..23 Min 0..59 Sec 0..59 The Sec100 parameter, which has been implemented for compatibility with Turbo Pascal, is not supported by the operating system, and it will therefore be ignored by the SetTime procedure. See also: GetTime, SetDate, Dos Program SetTime_Demo; Uses DOS; Var Hour,Minute,Second,Hundred : Integer; Begin Write('Enter Hours: '); ReadLn(Hour); Write('Enter Minutes : '); ReadLn(Minute); Write('Enter Seconds : '); ReadLn(Second); SetTime(Hour,Minute,Second,Hundred); GetTime(Hour,Minute,Second,Hundred); WriteLn('Time has been set to:'); WriteLn('Hours= ',Hour); WriteLn('Minutes = ',Minute); WriteLn('Seconds = ',Second); End. k Procedure SetVerify( Verify : Boolean ); Sets the value of the disk verify flag. When verify is on (True), TOS will check to see if data written to the disk, has been stored properly. This is done by trying to read the data just written. When off (False), TOS will simply write the data. Setting the verify flag to False will increase the speed at which data is written to the disk. See also: GetVerify, Dos Program SetVerify_Demo; Uses DOS; Var State: Boolean; Begin GetVerify( State );{ Read current status } State := NOT(State);{ Reverse the status } SetVerify( State );{ Set the new status } End.   Function Sin( R ) : Real; Returns the sine of the parameter. R is a real-type expression. R is assumed to represent an angle in radians. See also: Cos, Trunc, ValidReal Program Sin_Demo; Var R : Real; Begin R := Sin(20); End. Ks Function SizeOf( var Object ) : Integer; Returns the size of an object. Object can be any variable or type. If the object has been word-aligned, the filler byte(s) are also included in the result that SizeOf returns. See also: FillChar, Move Program SizeOf_Demo; Var B : Byte; I : Integer; L : LongInt; R : Real; S : String; Begin WriteLn('The size of B is: ',SizeOf(b)); { notice the alignment byte. } WriteLn('The size of I is: ',SizeOf(i)); WriteLn('The size of L is: ',SizeOf(l)); WriteLn('The size of R is: ',SizeOf(r)); WriteLn('The size of S is: ',SizeOf(s)); End.  Function SPtr : LongInt; Returns the current value of the stack pointer. See also: Ptr Program SPtr_Demo; Begin WriteLn('Value of stack pointer: ',SPtr); End.   Function Sqr( N ) : (Same type as parameter) Returns the square of N. N is an integer-type or real-type expression. The result of Sqr(X) is equal to X*X. See also: Sqrt, ValidReal Program Sqr_Demo; Var R : Real; Begin R := Sqr(10); End.   Function Sqrt( N ) : Real; Returns the square root of N. N is an integer-type or real-type expression. See also: Sqr, ValidReal Program Sqrt_Demo; Var R : Real; Begin R := Sqrt(4); End. hz Procedure Str( x [:width [:decimals] ]; var Res : String ); Converts a numeric value to a string. By specifying Width and Decimals it is possible to make Res look like the output generated by Write and WriteLn. See also: Val, Copy Program Str_Demo; Var R : Real; S : String; Begin R := 1234.5678; WriteLn(R :10:4); Str(R :10:4, S); WriteLn(S); End.  Function Succ( X ) : (Same type as parameter) Returns the successor of the parameter. X is an ordinal-type value. See also: Pred, Inc, Dec Program Succ_Demo; Begin WriteLn(Succ(1)); { = 2 } End. > Function( P : Pointer ) : Pointer; Switches between User mode and Supervisor mode. If P is NIL: The system switches to Supervisor mode, returning the value of the User stack pointer. If P is not NIL: The system switches back to User mode, setting the User stack pointer to P's value. The returned value is the value of the Supervisor stack pointer. See also: Dos Program Super_Demo; Uses DOS; Var SP : Pointer;{ Used to save stack pointer. } P: ^Integer; B: Byte; Begin Sp := Super(NIL);{ Enter Supervisor mode. } P := Ptr($440); B := P^; Sp := Super(Sp);{ Exit Supervisor mode. } Write('Floppy seek rate is: '); Case B AND 3 OF 0: Write(6); 1: Write(12); 2: Write(2); 3: Write(3,' (default)'); End; WriteLn(' ms.'); End.  function Swap( N : Integer ) : Integer; Swaps the high and low bytes in N. See also: SwapWord, Hi, Lo Program Swap_Demo; Var X : Integer; Begin X := Swap($1234); { = $3412 } End. !(   Procedure SwapVectors; Swaps the contents of the STrapX variables, with the contents of the interrupt vectors. Two vectors are swapped: STrap5: Address of the "Division by zero" error handler. STrap102: Address of the "Program terminate" handler. See also: STrap5, STrap102, Exec  Function SwapWord( N : LongInt ) : LongInt; Swaps the high and low words in N. See also: Swap, HiWord, LoWord Program SwapWord_Demo; Var X : LongInt; Begin X := SwapWord($12345678); { = $56781234 } End. y Function TosVersion : Integer; Returns the version number of the operating system. The primary version number is in the low part, and the secondary version number is in the high part of the returned value. See also: Hi, Lo, Dos Program TosVersion_Demo; Uses DOS; Var Res : Integer; Begin Res := TosVersion; WriteLn('TOS version number is: ',LO(Res),'.',HI(Res)); End.  Function Trunc( R : Real ) : LongInt; Truncates a real-type value to an integer-type value. Trunc returns the value of R rounded towards 0. See also: Int, Round, Abs Program Trunc_Demo; Var L : LongInt; Begin L := Trunc(1234.5678); End. A Procedure UnPackTime( Time : LongInt; var Result : DateTime ); Unpacks a 4-byte long integer to a 12-byte DateTime record. The format of the packed long integer is: bits0 -4 seconds (divided by 2) -5 - 10minutes -11 - 15hours -16 - 20day of month -21 - 24month -25 - 31years(since 1980) The format of the returned DateTime record is: Type DateTime = Record Year: Integer; Month: Integer; Day : Integer; Hour: Integer; Min : Integer; Sec : Integer; End; See also: PackTime Qc Function UpCase( Ch : Char ) : Char; Converts the letter Ch to upper case. UpCase will only return a result different from Ch, if Ch is in the range of 'a'..'z'. See also: ReadKey Program UpCase_Demo; Var C : Char; Begin Repeat Write('Enter a letter. '); C := ReadKey; WriteLn('You pressed ',UpCase(C)); Until (C = #13); End.  Procedure Val( S : String; var R; var ErrorPos : Integer ); Converts a string to a numeric variable. R is an integer-type or real-type variable. Upon return ErrorPos holds the position of the first character in S that could not be converted. See also: Str, Copy Program Val_Demo; Var R: Real; S: String; Error : Integer; Begin Write('Enter a number: '); ReadLn(S); Val(S,R,Error); If (Error = 0) then WriteLn('OK') ELSE WriteLn('Error in number at position ',Error,' !'); End. EUFunction ValidReal( R ) : Boolean; Returns true if R is a valid real value. Use this function to test the results of calculations done with real-type values. Program ValidReal_Demo; Var R : Real; Begin R := Ln(0); { Cannot be done. } If (ValidReal(R)) then WriteLn('OK') ELSE WriteLn('Error in calculation.'); End.  Function WhereX : Integer; Returns the column in which the cursor is currently located. On a standard monochrome monitor, the range of the returned result will be 1..80. See also: WhereY, GotoXY  Function WhereY : Integer; Returns the line on which the cursor is currently located. On a standard monochrome monitor, the range of the returned result will be 1..25. See also: WhereX, GotoXY Je Procedure Write [ ( [ var F; ] v1 [:Width :Deci] [,v2,..vn] ) ]; Writes 1 or more components to file F. Write for text files: F is a file variable of type text. If omitted the standard file Output is assumed. Each of the components to write must be of type char, integer, real, string or boolean. Each of the components can be formatted using the two format parameters Width and Deci. Width specifies the minimum length of the component. Deci specifies the number of decimals a real component are to have. Write for typed files: F is a file variable of any type except text. Each of the components (v1,v2,vn) must be of the same type as the component type of file F. See also: WriteLn, Read, ReadLn Program Write_Demo; Var R : Real; X : Byte; Begin R := 1234.5678; For X := 20 to 40 DO Begin Write(R :X:5); WriteLn; End; End. ex Procedure WriteLn [([var F : text;] v1 [:Width :Deci] [,v2,..vn])]; Executes the Write procedure, and then writes an end-of-line marker to the file. WriteLn can only be used on file variables of type text. See also: Write, ReadLn, Read Program WriteLn_Demo; Var R : Real; X : Byte; Begin R := 1234.5678; For X := 10 to 30 DO WriteLn(R :X:X); End.  '.The Printer unit makes it easy for you to use a printer from within your programs. See also: Dos, Bios, System, System2, Graph, STPascal The Printer unit assigns a text file by the name of Lst to the PRN: device. Thereby making it possible for you to access the printer by writing to the Lst file. This is an example of how to use the Printer unit: Program Printer_Demo; Uses Printer; Begin WriteLn(Lst,'Hello Printer.'); End. A These are the BIOS error codes, as they are declared in the BIOS unit: See also: DosError, Bios { BIOS errors } Const E_OK=0; { Ok} ERROR=-1;{ Error } EDRVNR=-2; { Drive Not Ready} EUNCMD=-3; { Unknown Command} E_CRC=-4;{ CRC Error} EBADRG=-5; { Bad Request} E_SEEK=-6; { Seek Error} EMEDIA=-7; { Unknown Media} ESECNF=-8; { Sector Not Found} EPAPER=-9; { Out Of Paper} EWRITEF= -10;{ Write Fault} EREADF= -11; { Read Fault} EWRPRO= -13; { Write protected} E_CHNG= -14; { Media Changed} EUNDEV= -15; { Unknown Device} EBADSF= -16; { Bad Sector On Format} EOTHER= -17; { Request: Insert Other Disk } U:  ,  ..81.4/8 8The following pages describe the various run-time errors. See also: CompilerErrors 50Stack overflow. Generated by the $S+ control code. Check is performed at entry to each procedure and function. 51Range check. Generated by the additional $R+ code. You may be trying to assign an invalid value to a variable, either by using an assignment as := or by passing it to a procedure/function. 52BUS error. Generated by the 68000 CPU, when trying to access invalid memory. The memory right above address zero is also invalid for a normal program. This area can only be accessed in supervisor mode by first using the Super function from the Dos unit. 53ADDR error. Generated by the 68000 CPU, when trying to access a word or long-word element from an odd address. 54Other errors (traps) than BUS, ADDR and DIV0 errors. 55DIV0. Division by zero. 56Heap overflow. The heap is full or almost full. Use MaxAvail first. 57Other error. Same as error 54, except for the trap. The address given is the last one seen after a range or stack check call made by using the $S+ and $R+ flags. 58User break. User has used the Shift-Shift key combination. This test is only done in the range and stack check routines. Therefore it can only occur if the $S+ or $R+ flags are used. Runtime errors (file system): 60File not open. You cannot read from a file not Reset. 61File not open for read. You can only write to a text file in ReWrite mode. 62File not open for write. You can only read from a text file in Reset mode. 63No memory for device. 64Read Write error. 65Bad numeric value read. 1      & *6##&#4& ;P V5Z ]  The following pages describe some of the various compiler errors. See also: RuntimeErrors 1';' expected 2':' expected 3',' expected 4'(' expected 5')' expected 8'[' expected 9']' expected 10'.' expected 6'=' expected 7':=' expected 11'..' expected 14END expected 13DO expected 15OF expected 17THEN expected 18TO or DOWNTO expected 12BEGIN expected 111BEGIN expected The compiler expects to find BEGIN as the first word after the end of a declaration block. 16INTERFACE expected The word INTERFACE must follow a UNIT heading. 19IMPLEMENTATION expected When in a unit, the compiler expects to find IMPLEMENTATION when it cannot find any further declarations. 20Boolean expression expected The construct 'IF expression THEN" needs a boolean expression. You cannot write 'IF 2+3 THEN'. 21File variable expected 22Integer constant expected 23Integer expression expected 24Integer variable expected 25Integer or real constant expected 26Integer or real expression expected 27Integer or real variable expected 28Pointer variable expected 29Record variable expected 30Ordinal type expected 31Ordinal expression expected 32String constant expected 33String expression expected 34String variable expected 35Identifier expected 36Type identifier expected 37Field identifier expected 38Constant expected 39Variable expected 40Undefined label 41Unknown identifier An unknown identifier has been referenced. 42Undefined type in pointer definition 43Duplicate identifier An identifier has been declared twice in the same declaration block. 44Type mismatch 45Constant out of range 46Constant and CASE types do not match 47Operand types does not match operator 48Invalid result type 49Invalid string length 51Invalid subrange base type 52Lower bound greater than upper bound 53Invalid FOR control variable The FOR variable must be either global or declared in the FOR loop's declaration block. 54Illegal assignment 55String constant exceeds line You may have forgotten an apostrophe in the string. Note that a single apostrophe in a string must be written as two apostrophe's. 56Error in integer constant An integer constant with an illegal range has been declared. 57Error in real constant A real constant with an illegal range has been declared. 58Division by zero The compiler has located an attempt to divide something with zero. 59Structure too large Occurs when the size of a structure exceeds 32Kbytes. 60Constants are not allowed here 61Char expression expected 62Invalid type cast argument Type casting can only be performed when the argument is of the same size as the desired type. 63Invalid '@' argument Only works on procedures, functions and variables. 64Label already defined 65Invalid file type 66Cannot read or write variables of this type 67Files must be VAR parameters File type procedure and function parameters must be variable parameters. 68File components may not be files It is not possible to declare a component of a file type as being a file type. 69Typed Pointer variable expected 70Set base type out of range A set base type must be a subrange with it's bounds in the range 0..255, or an enumerated type with no more than 256 possible values. 71Invalid GOTO A label has been declared (LABEL MyLabel;), but not placed anywhere in the sourcecode (MyLabel:). 72Label not within current block It is not possible to jump to a label residing outside the current block. 73Undefined FORWARD procedure 75Error in type 76Error in statement 77Error in expression 78Invalid external definitionsymbol 79Invalid external referencesymbol 80Too many symbols Only 32Kbytes are set aside for the symbol table for each unit or program. 81Too many nested scopes Also given when too many units are used. Maximum is 63. 83Too many variables No more than 32Kbytes of data is allowed in a module. Split up the module into units. 84Expression too complicated All data registers in the 68000 processor are used for temporary integers. 85Too much code No more than 32Kbytes of code is allowed in a module. Split up the module into units. 86Unit not found 88Unit missing A unit cannot be found in either PASCAL.LIB or in any of the specified directories. Change the 'Units' path in the options/ compiler dialog. 87Bad unit or program name Happens if a unit named in a programs USES clause is called the same as the program itself. 89Incompatible unit versions The program is trying to use a unit compiled with another version of the compiler than the one you are currently using. 90Syntax error 91Unexpected end of text You may have more begins than ends. Maybe caused by a non-terminated remark. 92Line too long Only 127 characters are allowed on one line. 93Invalid compiler directive An unknown compiler directive has been found. 95Undefined EXTERNAL procedure An EXTERNAL procedure or function has been declared, but a {$L} directive is missing. 96Bad object file in file You cannot make BSR and BRA to externally defined labels. You MUST use JSR and JMP. 99Not enough memory The compiler cannot complete the compilation, due to insufficient memory. Ways around this problem can be: Limiting the size of the resident library or removing resident programs from memory. 100Internal error 101Too many files ($I or USES) Each file specified in a USES clause uses an include level when it is recompiled. 102No room in 16 bit fixup field, try with $F+ An attempt is made to call a fragment of code located more than 32Kbytes away from the current location in memory. 103Duplicate unit name A unit has been specified twice in the same USES clause. 104Conditional variable missing The name of a conditional variable is missing in a $DEFINE, $UNDEF, $IFDEF or $IFNDEF directive. 105Misplaced conditional directive Occurs if, for example, a {$ELSE} directive is found before a {$IFDEF} directive. 106ENDIF directive missing Either this error or the "Unexpected end of text" error will occur if a {$ENDIF} directive is missing after a {$IFDEF} and a {$ELSE} directive. 107Target address found 108Target address not found The error location given in a runtime error message could not be found. May be because some of the compiler directives are set differently than they were when the program were compiled. 109Find only works on PROGRAM files 110Error found in unit 50'.' expected after module name When using unit references, the unit name must be followed by a punctuation mark. 97? 94? 98? 82? Undocumented compiler errors. o;*Compiler Directives A compiler directive must start with a $ dollar sign right after the starting bracket, as in '{$' or a '(*$'. The next to write is the command, which can be one or more letter(s). Multi-letter directives are used for conditional compilation. The different directives has default values, set by the ALT-K dialog. Switch directives are written by using a single letter followed by a '+' or a '-'. The dialog's show this as a check-mark next to the '$R' text. A '+' (or a check-mark in the dialog) enables the feature. Several options can be given in one comment as in {$R+,S-}. {$D+} enables generation of debug information in the program file. The names saved are for all procedures and functions used. {$F+} enables the program to be greater than 32 KByte. $F makes all procedure and function calls use the 32 bit version if needed. Each unit may have to be compiled with this flag. {$I+} enables automatic input/output checking. An IO error will terminate the program. By using the $I- option, you will have to test the IOresult function yourself after each IO operation. {$R+} enables range checking on simple types. Every assignment to simple types is then checked, and every use of indexing an array or a string is also checked to be within its range. The Shift-Shift user break system is also enabled when running a program from the editor. {$S+} enables stack checking. Stack checking is done as the very first thing in each procedure that is compiled using the $S+ flag. The Shift-Shift user break system is also enabled when running a program from the editor. {$V+} enables the (normal) var-string checking. By using the $V flag, you can pass strings of any length to a procedure, that has a string variable as a VAR parameter. It is up to you to make sure the string passed is not overwritten by more than it can hold. {$M STACK,Hmin,Hmax,DosFree} sets the default memory allocation requests. $M has no use in a unit. Each of the 4 parameters specifies a number of Kilobytes wanted. Stack is the request for stack space, minimum 1. Hmin is the minimum request for heap space, minimum 1. Hmax is the maximum request for heap space. DosFree is the amount of memory, that must always be left free when the program is started. {$I FileName} makes the compiler include the named file into the source code of the program that is currently being compiled. The file is searched for using the path(s) specified in the Compiler-Option dialog. {$L FileName} makes the compiler include the named object file when all declaration has been done. The EXTERNAL procedures and functions are assumed to be in a xxxx.O file. You can specify several $L directives, one for each object file. The object file is searched for using the path(s) specified in the OPTIONS/Compiler dialog. Source code control The compiler maintains some variables, that is not part of the program being compiled. They can be used to control the way the compiler works, by enabling or disabling the compilation of certain parts of the source. Three variables are defined in this version: Atari, 68000 and Ver10. The last one is version dependent. The variables does not contain any values, you just test if they are there or not. New variables are defined with DEFINE, and removed by using the UNDEF directive. The test for their presence is done with either IFDEF (for IF Defined THEN) or IFNDEF (for IF Not Defined THEN). The compiling state can be changed using the ELSE directive. An ENDIF directive ends the $IFxx sequence. Finally you can test if a switch option is set by using the IFOPT directive. Examples of the use of conditional compilation. Unit OutStuff; {$IFOPT R+} {$Define RangeCheck} {$Else} {$UnDef RangeCheck} {$EndIF} begin {$IfDef CPU86} N:=Swap(N); {Swap bytes if using the 80x86 family} {$EndIF} {$IfDef DebugMode} WriteLn('Debug=> N is now: ',N); {$EndIF} end. Examples: {$R-,S+,M 5,10,10,20} {$S- Disable stack checking} {$R+ Make sure range checking is enabled} `*oA\"HaL+D +E+F -Є+@Ѕ+@ބޅ$GEG / G"KJg BѓBBJAg<fG``IA" A/r8 QNu&WSfBSjBBBBBBBABNupHM B,@"H SPv3f@JQf<* .$H# # # # Gp&Q/ aa EaaLNu@A g 8`fHEBE< GvxfTCTCQx KG##Q`Frp Ajg@QNu @QNu QAjNur2aJg.8D@gHg d~` ra@D` G30lNu `````` D-BUG SPv3|o DZS2N !ӫ ;hȃYY6(<؉lh ۅ&!md߭7lse"mD=hɼBkn 8t2|{04'LAJǝ7frPv`[h$d5!U#3DLL!B0>8"!2$A<`T.N>-$\1n$}#4 Q@X%_! P!!! w,1! d%P> c T4ƍL7*N--a-qime-Cj/؄ KC2VYVmӔCwҏ.6A_7#d۸FkrH>Vm)͇,1^?Q 5iLϡD)6 )!^hePOhƁ :P0/& [U효,y S6B)ػڶ؊WoԚk8:f~kؒʦUE"\KbOruYahӾfJR=uņN 7-448,SQO{Cp G7 Q1GK# xZN ;:^hX9`2B*a34„& V -4ڢ Kvx9 ^aD>l7p^h`^RvEhV&PYT $ - C0kk _ nRܻcWzIR(c!\Dǖ졀Zc.[nTq7y/M6,~ >p?i{Lam&0M 'wkX*a>>XjlX<<ȰlT9 V{<+q`g8G]1-lײƥ6%f ` J:^`vWB3U,-L{v` b_z;j;Czmz\:j;:V6ll*U5ElևAY6sVeq:xQ2m;*\#^hLF86:XR>kѵj4ajUkS:A0kL"dID2?tU ϣԼܜ0 ZM[2^~r.~&Y8 *ZѮӍZ7rA&)U'PNK et0 毲xkuv,' 6goR<,%/+1!t\@T!^*Y 6 qˁEEljn*/XYJ&,!pI;*^@q?\N  ̤6BZ 99>bhQ-$vHG@rʚY.99X9.EN\TZzRz(VC]Bh>86Gȫ e=s# \;8^n8g#Kp}qaͥX ͒"&vMoƀ!ICz3?MlfRx ВJ279JqE4[MUROPC]_.^fQ)&!Kftq)SWim? ed~W.Y-ٴ!4No+:- e좚/R! &!] ~M &!`!'8I0%16L z 66Gv2miO">u|W/J Gk ) ~WC_3-@ \:hDӿhdĈ@$);N!D`xX9ڡ\tɎ-ɫͤq䔖+I1ġ:5f}r~6R-(&6|3 c|űKNQWp jZc΋*PaVŽ+GQ/Kz 䭾W)=5u9# _ /ޟķ0x%11n6U} 55 c$`\G'u`ze& nvSDŽJ4(WbLGٴ tyibFʏmx4B G(Qx_V-- WWTP p6d{< lrj-ٲ_S y[M }GkR/''!+ejK4%^ /U,'6 Ozw'Sqt,K$d>y 񮏦mF\mvtv\z&Zb7˟_Ck)0"SJ<+= 3D=<b:vKg# NwngI*?.u $Fනck&4~js5]si8-\L̜:^"!>֓bhe`1j xp61ΡpT=|90w䱭NBhJ07\6q2NS&*npZrʓ@Q?( &G#I:yO _\Z$Ă w|3' ! 4v,zX # Ohme! P,K 10]xl d/HSކvQ8>7Kxz34 =իh^u QO+OJxzfq6vb*³̗\2/Ȳ!^Rib©e!F$rX#bbG!D:ڲ#},y<xQATo1J쀍+Wl%AmefjXosÁ8mAFg \8N_T8^A9{bIS)2h8%1 p eRkO1?j998I~;ѶUļr Ge#jY͊Jv^x́Mؤ7%W [T뮥 uNA}Kwι4YA[ޠ\eR&o)Ge*Ә8`PONw`-I-kxơ1@:< 8_h }O5-,k%9\uNe/" sp\ :FzT'*0@ˆ!tM;C*i#L!t{p^;*^˪XSAVog &q-5c4M,P]Z P\ir.9! [lĘqCl0CZ2J.8fFC/ qp( _!K2p#i=3iAd-3kʧ}7>cJ%.3ݺx @3~Gb:-Y?$-B2?0Pt?3`(ƺes3PI'8APNt $4A R"=#Ϣ?av(OJC,A*-D1i%L?%fi0F#]%Wl &LW,^xhq-r;PhxXLȒȢ0ZQ+>lh찉ĮMX8#j/ Nd^~.<#BC KU aޖ@3Bha%kOEeK)I*LOH#cXh,]mKkh ƾ::h>dđ#L e3wQ6=㨗46ʶnQ.渶s::Hʥx9kp~PPnfo_kz8- p:Q)N4\!\.5Ql|J읓K)C92o r%S -o`HK7<P?%x)5@7#Zcm&;Fp8؀˩j:.-v$ Ƴ 05e1Gt.%o8%$b g[o0]U$r* o}e &䆢B%M%}xw7B@PjbRڹE"44mUZP75˿'ߥҥ%8p w[@*9,fbԹ!兜JdᎃV/1daH62,NDM*BM0 \D,H5Ez3y[j|$3P&n/z('`V BgGl+2['UT/D*:)?#P.n't5 GD9+ukqLTM DkQC"[DoOB/v'fYnߛ kbT"Ά ')jRYGB4k|d MIWlAz #-Y{p-F8z(*+I)!k[Y8o Y{%d`/ uҸD]E-+*¢7A8a/>aRRˣ T|)_,է:VvqW<^J?r59ءkEѕ;e654"|cbUjG閤Y>6PKa7%9/TpYǗceQ}h,%ʟ-(ʁe-$l%+/ ŏIx<8 Y//*׼޾*zQG+b>*j9*VζKv7*TQ!DkM% ig5ޅe)Ш&%#ܖ*Cm^ʱrx>^kcWHjkI8k) Z:Bj,~*B&r[v.*v*hr9 )Wh*Vz@e3I WN5kځA&H%5p:#![d %I :SR[I 7^avwb݃TMqK\P]g  ! zB/<//:CTOLOhCVV-Z,X ŁX@d斑%hB$ ,F{կ >0TU˫y*8 KġR7B_֢3M<`Z$6 X&C:lPnaK 8 70ًGHK\y MAKFwĸ[]K<-v6RM6KNJ%8Є%<9>+!;N~pl6-qȽg4`W9é'0x[X_S{!=И艳t,BO>;B?'€DWod2nUG$?Z ??qB㗿|8"ۖbTK>%8cɎ^*?E9^'v-&+)_r\C+Bsb@PleC`R@B6\}a|'ꇭ?[HG5jT1V_8ŀ*?/VZ{(Pv/i~Whx9B0͐y.R9KrXVY-,@5GBKs!Ӷ/P/ՈM<̜Vyv$!3m>v 0?lנv3:lvWj(G4o59,Bc!>߈1]pu+ԱzOBv+fbZ5F&Rњ,V>^99)*wh>J(-G{PT$ehƒ>:k8bPR?gLFhGcJVcO¿3;?TSn?ښϘ]ƮY_ x{p5[6*A/ KvDd8XcE6#Z_M*k֔,@3x8 ^=M[pscvye. Sf\>|Jh2vtd/C¡O~Dvh$B-b!Z}whZfsfo`9*D2`} \/Ӆ/w{g@fXћ:.4emL-\"xF(!QB#3:4<JߌN^작j#zR6ZzWt}Jt}ς(I\iH]UV3\aJIeh9͂k8V‚MJ<6RR fߨ(a*`j6>2d5Zb(`oe]aU$ 9]!L8w"(?ZTJFZUjł<ju z g;0vz:gNG#emd}@dƝ?Db5@i3߉ >Ѽ0ub"Ƭj64SUv*)5f+0Q%,,ݥ߀́0ij)+ϲ8R%? ('D+QY#Bݐ8^V-V\ůXP9S4Q-Qt / 6ID3mH,rZ`3.g/>fm@JGmaԫ:f3֙+k]H^j&3:p*]m X- +[ Hnh=\Yӫ bq;Rނ8#g5j(jH'da6uj܊^HӒMz'x$ \:{N%{_H#5 ? yHeۆm7k!bt*1^3ynlֶ0OsՉ-$c$ON`"8tTUŘSsԄ҅UօᆓI[ցJ8v9^{l#zho6؅) kkkFQ*HQwx8MAc26E%$obAkKN"!t4kKN[1!Uv/>z ?F֓:J[>8ϩ v _Jż9K}9MH:T(q~ElRԀ͜a͖뒖5j.cde ́m9a}ȋ0F0}&GQͦaC1MLBJAT8NSoQmbD^!lXkɟAbT,mbKb`X 7;ZDI|h8:alWƴI:Kb6J1' E[Fˆ1Q<+wC~Ȣ 8 v-` D>jyR2x `lH({MRM r'X MmC)#3aGR}{1/T#BŁB0e3r"d.h$[VI{`axb.P[fXX~$4ZxBpDzk Fԍ9VaDɒ뱊zT!}%ОT* *#4^8ӣۍ-w8,T/$>p}pd C_*0( *K5N) W lk2U^$R $f xMjshʃȀQhE_|X`: ~VŮ!sȝIb_C%q )ϝ, -o$4Foq<#Ȍ (ZiAY OB% \JEM2*V嚕 #? ^S )7,U%\/H)PCEkV (k%(td?:YIe S질pkp{%/Or^:BU &MVmm@j#=,F2.@JҒt,atjOZФ iUԀ))'2qą33irM-DUhZXt.7?K܂-?5SUȤ{hp),ʼnE"V֞XbX#!<ٳ,-9}%f[yR <ׅGXCl;XXM@'N=e>Ww<J i_ %aƽ7%kkRa%6)[cj&,+EqM0AdVa&WqF*h_[vmo+wjB /%t KM`|\AS>#u-DC#~n̕2i^!lH& v.4LN-);ޫm0InN ݋ 9xދ~OIAԁer'BjoBQx'V4VG:*YXk$Rɬ(@ny/Vk Pq-g $NO h`0V(z>?k?O PN i- t J!|42Ot 1:0:?֛ Dl@1m x4Aj@5PK#utTp6̂<\Ptѕh)@P 28}^ڣSt1DW?,-S>*Taݎ!-"Ä JI9꼬Z n4>SڬdYhč$? ;T-l0MbS`>F+۹w-f<[LZ<ҋ}8cYW`l loaTżvzh~+eG!1 O%PUE -,=*6@Qy2'!Aa<]c3,=>ћI=<kV7[fXnWZ ;cYb:?]/W;hSQ}MlsK'źPSGvoe_0; c~cI>P#E/DeJ11f+a4J/Tp{.!\Lg&pmg+eǕzbC!|oǠ(&Hֱ(N+L慶;!qÓj!' 5tct~  ?gk|gDJ &kLE: #k-2;%r-l7 ږG¬8/H1k7ǒ=x!՞#"w\ E?Z4aFЄfFaCFB1G)*Aa(_oa;qBBx<6]0ޖOdG[lNzR)táKbɒlAhp>P@h ^!v)A f4^/M=L>c Ԧ]EmI\r?F؟K@ \Na+K}6B>G:`B #}>F Pmb,@(4G/x&Nw<$ES@Ӄ"1Ӊ|UU-^h)Ea٤6 a@! $ e*WC@N 16T4b.t!T3>OMIȻ?>ȡPAa$G2WCcED[K2(,e ?17j b, 9j>4*k]ǽ{-1k"vJ]J3KMhL Ik]'2]VSM펜hOxQ.R &`gY'8,6L_jgۉebwҴ!Ęg<7J bAk)zv?Ʒk &ԁc.oT:)>3cKVW#/_EbrmEtbhkm@*a Ʒ `4"Q F7QUUO9㞩/FA[! 8>:ѵ"G߼1HO`&j_^UGE6-=;Fb CU%F3\Okdž|/ x2BAxd&t8c_\};/0x8D<L?L#(ƖQo%bo{>HOnpkX#?O%/&>A#_AE|"FK*mt:Uam"{6UYV^s:gfq/ C/sG\O[CiIboR/ML\8YB&UČJLhw0\WYPP1(ea5:NH(>JB%C/03%ԏuN(>nC5?82})6%8ĊzM;o6(b{tFZs> !ޡKڍh֡1 /ʼ+hxI/Rr奲Da9Gij>0m*mI訲a pT'X;AkmA39ɩ)`a PMHx@@1 P>x NxVJ8ێ:zإ{-lp؊6qڣ>2"Cp$6s"T fl`MFEL&5Q?moklGNW$VӒ|^K"]-\_8 sn$}ޗj\ _ax!H Tx<*ToX1 VR"9G 6P@v,X]j A(" (X:dT KFpL+mN"N܁~ /t(޸6[>b)D&˾CE!4hi  H=*`xK 2,xJ' >t@yl Y'\%E>dЌĹ^ ,0hz"ޅ};dB:i(DrR Z3 x88 29.>uP2R‚ō7ŧNGa,#͌LE(((dJ" 3d. >b"!S㾝D* LpDKΎh:.V|TKtjZڽx@ZA9,8/7CU|Z%xx͎ tڢ'hhloWt6;z\?@!3B>z4bS;< :q\>8B %u7vB1K!z;>'ёhŝюXʖ1ƃl7vl|)"=MK*97.@aꌒxC>*HVnEƧ<lO~j)+؉ptX' /#F5Fb}PxUbZa|?DS)pOŚȥ"R"K>PsH"g%< h30q8_}FuiQb+hn9'Z4W,O!jesȦ)-hS+o6"wSCD \X FBMCn!V0hT><&'Ԁ'7G:ЄĮsvx`<:<#\ៜ[1B(1;޴RZPIdq[oKKo6NY xI@Z]M..x  $.G k 29<0ehbiXqg"#PnAoh[6. #:WVQdW"N(*ɉwj/ \w! P:e#Ja'C9[5)in7U @vMMvMyB 2W`B8,+ðmcK r81:oDž_<֭&Wkl~r 2l˳bnce%k1}G17zG}1{~ qn僝 #w_T;4ak\S~r<l<<0)0ݔ/?^l*j4Kt4_1nZ$U!~oFȊ;2#M( $_^Xvd] '(a`/fD8)% o6-5K"R6?Q7Ȱu ȔaRHtԃijOlB#q qNq)U{+^̞\uup7io2WA!go)Vr0K\\! - mCBi*{X,>G_O?1A [ 8_kYKdkI"̴&dUጕ-ȌfQi:%٬>lJXs tk^ʲ 6<'`kK*jP fq8i6B?0SEQ2a0:m#A7I>DV iR|TIfQ,i$\VwZq#Vu;y7'Ɇȍ_003iuI~my0N.=65Dˠ6aP t>.$vv%^x k'iJ/M@_yp8f_* [P+.ohB:Jǎ<"6 Vm61(5K k>ݦⵈ;D^( Δvj;1ۮ 3Y6>f/ϡa뼚Gx_xP @4V# +l^:bP{B)G,es$::̖L\U,1x(m:w1 ij! 8O^~[0D^#`3إvaH5~;0 V 6Ղ8"y:Uvl&ft-\n΋lNX>·6aH䴰H0咟mW?殇? zZx(:F;vؠcǎ;v>v؈cǎE]zOC̱c;v|غcǎ;j;vL>CɎ;v;vcǎ;vرoQoz⥩G$,O;POI|kKh&U;e\ ֡iL1m_}0~l]^0\5װmu[SY%6*I3ƠV,&UJGTIohؽcQYM1B WHWg}= Ŧ4G<֩u1HDɯ561t3Y@|0Hm;BW}Z)3rg $d֛k3D1i+l_𵼖m̨r/ڋbYrvGJaq[?Pbk%/eo_`66yDa)O[k~[5_\k3x܀ (@8&8X=4׶qB Ͳ|HFw-Z8&Lz[S?8v~P!9a;_}/BD T.@1P;[' u^Nz$ܝ,f \9)R"8-mh3EˠJ88TćOzf򩁹"随] )Kȃ,1>9f3^3Q׈km4 _hZAZk׎ZV?%-R~jI{ .:фR~yd07n֖khZ0 k>*ɨ~f"k zWl[]֗k*)QUvCAk$~җjt)LAHxdd{젥@̯)?ԉ`@xA.8+ZsV jD1zel 6Hn@a!:زz|/@Cjc:hNA6n},)H"-EP)=^=Qv߳0bm>b54AQ)+:6MFSQ-X*72 :F*PZ9N47̪Δ[F$5df #R(yNՊ/!RЛ&;l oΣޝ(zDm3͌a_7)8N/BEΑ_7Tf`&AٱpT0߂oWdv]* FojW`K)LwT߲u^d]v_͙Qh6/7͈Ԓͩ<} vU&Lai`wC8ذܤ?8ΎlbԗlJZ|(x>`~c(dиlT Q**2 mӪ4zL3u2Ӷ)T@Ϛ-L{sTICUYi15V',\هErcg};SA⒈׬{,^y=6~ͺqfh*X4wv!aw_0&!5}/A 9V4Է-$ڼ5[m!U {,SgC#s閍sC(!5A% {acaOU 7Wvh<!ф+~ %{` gm҂dA.vCq{h"//^D!a:Vvd!,@`'03&R5Y;-\*>x31kNXOD9\wos*'K=mopnV=Zk-ihlE vo$Sf26L+_UM:=o AC#l薓Rv L6a0>V-,!?f)k+Y]kmBVvKhN'su<,;1C S^YC?cB1)V6=߻3 dîx$'h7SD}[g;B#/qAıt+z 13Į;?xoo$ve6 p`cW.1AFglc@tZ/0e` bL/{NLHc9D[=EEU[m}oWX -#Q#y (_`~̖!DEQQ'8sʢȨ=F F~ԳlN" fx(vva3GNk!$G sԋbco1/-gQDND\smҁ`謅XD- 3=qd)^EɅQ:Jn-dPD́H!hL3* ˘B-mIhiۡh> d㘷lv!daÆ-u%+-q$t`1v5cvF g-}^C0))U)0e>$1?#A@;3 pcaȞ&"ė/Fj]ЅBOAF;Q }Cl*٪ƏG҇eі<2.6Ǭ>be[|'4yLUk"6d~޺ LFތݛܲ1%K@HƇ',%!zK 0bc*ȭDh^xPĤpTiTSC hdg& K0l"LN['{ٻwK\fo,tnmllLʠ:A; Y%ჄJT(l?{\JbC> ' DzqW#p#~(M#!061}(d1jS]3*NYH蒬m[(,uD/ )҃Wԃ_uqKc cE_N RF䔽F̱dݹX%~)9sf _Xv-'X^2-O!O7Okȴi6/+A;##*εt&rD@ܲjȑ7SUhFO8!-rt;0)ff),g}2_ZZ[,-"1V<XVH?ERM#x C?8Zl)#R?h(')޴+oKֈ\:x *MӽсtH@:JE:#~HRLyz`p<c >{ pTے fzSB0hTȔ\- r.Pr.Bd,1 v`;1z~bel>T9t-9z1vf1C>vѥC494Jow."b 4B/ƣ=q;BЧ8;)Q3ZcYoF;+S:V3S-e?C,UFOl wOQɹmJеHĠ=ׄ|NC#>MQC>~7+=#//|Rj^73fZ-c&e"x]W`Ƃ\eh.V z+ĦS1Zy*mpc!1!l"ԅ}17~K<< $ohx?l/ ЃE Vi:NJ 1SSo1:1Lm-#e1ThQ$7#0T1ʼ!D tzl: BBxc9TPbPDJ3z򛜣evU!è$H\)Q-I&Y`( /'UJ 81@[_ɽBMMS,LOL8 l< ʵ(1<ꍊ&X Xk8$D*AWЀqԁf:7 q:L,B!SaK,a8Y m;T 謀j5TX>$Z:3:M-鏊Zܟ_ǙKf8E)zRz!K ;TWXI?1]m\G52<VA-0nOHpAd>H jbIӯNĖvA^x\-j!t|I8dZK (Zbgbdz^♔e35ꂾ-jxcCge#  h>7/W [XdWVJ-FCK[DMC*< Ej~y @2K.Lh5-'Xu(-qFl-ҍ/ EP,YWMa9q,1K8oO`Rt~PGce ˙povr#4j6.ml]imek^aU5E,>WvyZ P:-D̅g~v&鰘]~vXn/;z{5٩ZV kg'gFvGKޡ`!H,8#Qa-̸?tnKqUG1𚹦lCQh b^>lJ•8Žcϊ砠 ㄥ6>4bN3iи r%\h:$ƜW)YJ5& 2' rd)R.ezFjsJa /HEiM (-NM |&kйT} h ͺe1 .B⤡B_KhB1 ^ ᗵ$q |q+8L ̪)lƬaMyXF8\ֲ,%cZgIon./y#҈wޚP0,n'9~QM>r8)ŬQH<-zitY^hQZ*d|5(#ZIuz67ZVQ3LƩdz(%j%4a&(P!ڬ[H6tT62V"EMxpx Τ@2ErBu?v zZ~l^gx}Vy0Ε ؀KQ—v6y4+”]kCFB[Fqb"cUxw Rrv(wkjUwP꜄ahZ“h3Ly^zmSP5QP6'┼V,|:j^ hÊ{?8ԭߞ+q.AK3MxMpzup%::`5(ߥ1C 1# ^f y ?:` O>?<qpn\ߊY<+K"0y1b2,A*Yh3;vFl'|Y:!_yg |o& ވ4)1K071AGzF/ Z߯yʝ j9x!,O3L&5!$1 f\ X8JOā1RQHs7̀&-%d&g6"~Gf1{Vl:htMR6u8:@$'LmX=1l~Yy_O8JDSp0.IOLIKDdq3)2앴v)3#e}JS}ݿiL7Mxx\Qj.]/Pw <0-N%>l6jkR֗6E<*7eDk%{+#Q.g"qA܌hIwjM5]*'Pce뫽:wq8V d@lȄ_wڕ6ۚc011/JwN q| 7 mlqd >)F19~10LjH(( h u+jMG]- >Uyh7QVM0]Rڝ-1,;!^(WOsSix^5(2!@et!!?X0D;:_Nfؤ_ F 41GnOߋ=A~,{*Iܡ2/Vh -/eٌ8͠<>j%S1&`0<1 Lp/Δ  gׂN "Sz;3+A/}"M;3Rł냎rLƮnƛyTٺԄ$*=jv/{i{qI>2;:3ǩ{01ic C ١C$[6.`fMOUv-bf ȥ8 ܐ8x:] /1?[ ڧ?>JDvupM m){-8>^e[(65ѧR89,&0רlb6Cd4mgb \@ 6W 6.*-%BA6YS'l$@:*6O0\hx6FzO#d!Gx#_qb*8++PeYfd86I+C677k,KM:C6bY/$Zb!2X A!v2kBN0@]"*ZwvG:$qWMIցNԎΎ6&~:E=gT::Jh,Z%" c谟ъ{<ժU#*On0[L2Q[Vbc jL&|x!,0:cP׾QU){ H88rZCP_ KGDQ=70 dQ9xp%{U nG͈B?8W$l 7.H'w+c24 ^ײ)%W($yA\OF5*%-= -6Ѱ I-<Map#eȇD䪎zÄjH>'9 %l\ ד$ w04p;0;:ܕIp|a0-[彨=%{v9wg ZS@bEw$h V>2OEKRDQxCt Z XWnkw1003fS12=Q =xs@ew"buDi^2ɮMCit1zt) 0oWJ Y'9Ф CZWC!\?@5(ϩCµM-s^LPWo;; ްVΞSalzhE䳬TT+eHs*%4Eat*ي-+ y)Y7XΥ`*~|Ngbyo dWKFtJN96vcv8ZscOij؀9ɻFј*×$wepNԡ '@#ؐy<4!͌=z0g`8n9' / {aG 6 T8CpDôـKx:R%JV9b<^$J v6QnJ 8͌4?pv(Ȗ``P TJm04d i޿:<; P˅g&Ժp_4.tIȾ:!a1e8L|yɜ.]f<=",Yl0O=$"1cCd"Tl"1w);35"?oq?8i,ž8 Ppb4AAAC:G{z,>CaC 6J2,9Jaõ,* 9?80pЯ9EqQIvk[$%56Fzi @ ;R É"}O1,{}* J(ij"$_XniTƂ0}X`Adc0 0C1c j o"H@H MO269VIApM0k,8%&DaВ[모JL`ͷ `s'3A卼iq !)&_@BeΎZbb+9bBJkBd+`\p qXf?!!z;U@`,ShB_8b(u?:9J\"f p6.A\C57بrAZ*;8Fc7A:~4/L ň- b0ihgWb@(H>'ULB 2s hcH' { a0*!`1 Q+mzg3'S&yS\t0 0BD:&,N @V==εLmvˆ1ok"J)j1x7o mNh3}kll!شG"9pqhO߼8`mUT„QV%1wNh~t~!k,)|*x=uSB^W7kXN o kgI|$<+^~9+}eIOrPwei6165]D*Φ~oҿ̬l ~ 5Cmהϒl*W FE8I10xj|ܝx=3r4]Nȝ&/?MrԴb;m#${ҔSvB#6):e@b#DE̺j&dVWlÇ<;z:;/$}/HzM[s6QCҡm03߮.zyՋ]Ovrl;&6⡵; 5u7ɜ%*h(q״B!/ oP,#Dp_B7zqb&jHB{<$!{|G*Z8)\>w%}/{e=־iЕh3 ~~zI~kQ5.ph`ȏ H0mS2#8zxr38^goߣqL NCs߉y@[ll)HvD6^À`U >Hcfn lO1xu]ըM9<4np@l Ȱ:č hmB\r-)qr@T- î%XsCVv0)OP SjOWuy:}_U􁔏hfpY^CHa ÒBqȀ{|3J01{JЦSdKVoIŤ3Fejzzb(bcIE7 E$L{W8xvxḿljv+`҂QV3@PmV+4j,оMljԇc3(.Q̳ͤF/VBCI(k${qЈaqe: eӒ%\~GTsW֒=_2`B^٘l)N[rl6et$ UͮVRׂ҄ѫewYLbQYpc+,԰?3:7g`yP $! ':5Q"u_v:9 LY *=& Ķڬ*&ɤ߅:\$)E/}I$)BѣV:(k60㉳{lU[I?D5kt9Ԧ_19h<݄, =-[3cҀvZ}-Kn(8Bdh26WI+v ̖Ԓ:Ru VoEn<#?v8qr*0cFf^*~1 v<b§9eJM-#;rȴ߃t>L'zG('lr2K˺DRvID6$s4 !iY̒w奶wei5Ӊ)vQ*9M4h=6N !8H9&Ujm ;YZKpEѵTɨw-pvىٞwjU^`Ʈ38dzHm46Zf6lfzҘ1cƌ3V *WVZV宨VʭL*M&lF^b1ckK!&?4ҡ "Eqߝh9;+j]: p7v>)+l@_Gp@S=:j5_h; k^vY@*G)ʃ˩6wu9A>AYb KEoR(h◈3a Ů]Ql0>G/T㚢>v{<yIZ x/cn@emPJY[8j)il2 :(zf-r׫s]{'X,|0o9sL&\M*fP̰ h‚x2Np: ǜH `R(Kho*cTUbpbaIcᲂmf[GZ=zbԅj>llSmq תK jQjgBxئw/) j1}_Bg(- nTpo[+&Y0[plPT$!gxz!mT(qO@y$)5b#(L%r)S@mR(o"?tz=vK,#/&uN?k|_8l\xV;D G ̘m6Q@,Ӆ60*2&3OO07ӣx-\ =|6V? `\0VUSHTb}Z^'P ꨀtAtGo:%G?~;F$@GftD q %} 8l&JE8ݲ'UyS3؀^-mSR.a:=n1+nɎ[2߷{{ٟudg`dh2A2`LN:*`n(:^-C%c6Ģ(f  7h2N$iح˴[fξC;͡; WU6)ZŲǂe3q2cv),hʒ<…-iIvMƤ;$._ؚg,YibuܬNWz*jw£2Ǩ=RD$(QɭfR؂TOQل_ QmQlIXb`^ᢷĜ[j+3_*ܣI~7]\ZohfUe ecpd<3,k֤WB9R9T~e^Y? B)#֫P$!Sl9Gl<yPmPǢp0ј<%m$*ᘸl'U&&H6Q#xusڃDPzd@\ˎv–QC-DŽ6ˎ ^=vL$v;5EuvR6# QHNāྐྵ  ޏ<(%ha%ë-EμL^929 B%TJ6U uFBS?$/$=J_lB8.!{zkI%9hbvl <,ZW5(%Ү*%lHJ T3%Giq*(('_2 < Uw&X7>9! -?BGkS0_8X=uY\ vfx&X.} {]x% h^"?Ԯyچ%ӅZ= Wp9p11q <@qo.2AN?Gxw, ަ_5Pr]>gAk@{!6蝑P q M#FxiRxcE?4m$ĉc Bo ^B)1oF8xI [C&`P15V P*'B'Y {~uCf+Dsu^9G7cw1@'-odt,1qiPiPҋll] EeW2excz Ŋc`1(2f0(iviUbyz@ouL'D0fs_!ATh;U^yccI/Cq B''Z uy8HQɪ\D_dEqƊGxfhHH!q%;sG2D[o;s0+3ؔo#"Mpd bA((@ˠd.d$bcF1,c20gsIyx@D/J !?vVѰƨmNG (0)x6o6>16*hel"!c+ꄠui:aR[ϱ@v8b\MPcXB8 \ieĈa=L2oT pA3"(wks8yhuFsO,i^6K9#'(OV:bxi $"P1owj3 Lw1,4ߢxesZНoo+Alex{G.Rbe@`YY:^^i#6n8!'w1|1xUͦ ը'991@3Jӈ< J-Іɿ*6ũ+e k!W3E"=mY 5ѷefwU 6敔M᪆ϱ9Ϋf2>ΈBB *:h $c 3Yl +LU%+(YdK?W? t GK<៥GgMr d腕m Jbo%0oxd^1W5emk|)OWQ /p8:zG{O)s7 1TVz=URƂ aOU|s2Wmz@ylHsC trM1uVnJ9i]I|%F0~QP;EcZYwEp|6 W\GASpL=k l*W`W=]L3"N}|!QM`W{~{`|*_-R7cGT6>AJTYt%UƉ|N(WWBQ M'UOfjT6-8G /S(- 9-d>)5NDw1T H"F"aG4 $lJF`_Һq^&C'7:<'k4$q#o H^3UpewX^iX1H^OBOm/^)+31HUBay\r+5Z sz x96,P7Bg1ǁf^3Sxrec 3Qu Q)8U=R KO#9gN: 51"b(VyĴK#3|b^na=E DZ1/#^m/5-b&1 6EE t7Haě0 8Ec0 1J9`(^dAiutsR1oI.pe0B#[(ycxW^WZ0*5z,ʯM*sW1]7EuilZL8{+'G9>>亟@ies+ap+B[8E?:? q*3AqnsoC8>cP819hdcb16d5F #G6#LK 37#3 #QV@ -~u3!İ;c\XmUtYOkRVQxX Ino!Htk :O3{m"3DM /er'VJHli#13yeOh9199VN,tCwhz,)؂-6ohE4Pe:kuG[T'dFQ}iHh:RX0 VOH"/O]e_Keeܢ t06/e](usr2ec.eܱch[hqhnH-eA0GA(l#@cl]u;}Objl9iǝcQeZOZs' kMk)Yu r|X-: UX3bElls`ymboUli|osix0UYs ?v>ck i{СxCu%M uqD{|Mi$$4KvAeGcĕ IyC4e2@o9lcЋ_OHV8byr eGQ::#lql (_'PP'Wx8ni$*To:.EusO\Eesivezlˎclh sckE(Gعˡw`iqcowsW1][UOkz]QWPYUkO;[]r$Wa-GuKl;'Zt=VsM8/013Y567W89&d*_Ǵ@hhP}g(l5Q0 }o"G>''ItG^smCjlw4l>BٞLGAso__L,;ijo\m (. UX \zJ8 S|r9NT @SwDt%1-wtGm޿#G)@W*!o4&BԂ%~Yw`ٌ3׿cm 5i6)7\8H 9i#,/c?;!>E IƵ_?Lk`Ѿ׿Tr!k:n=&] ̳:ɉɓdpiG:w#,䕍lu@vKbKZsv1^-M.y<G5/GFsW;o;l;fx-'7Fwt5>>0'/뿹ֶk 0\jRAG'} ?'v Krv$3lsN2KYNv盳u3Ͽk1ڿDNXLL4q:硁G#Z'S!cY}̱7, )GȍHi?;?2;.Y{Hm'r8$`/'̼.0./_G2_^8yp8$cWKHtKC^3~vT_5K _ _.x8ω,yyE^5%7Wd~5˄@?8('8# /'n{گel'.Go@WoF__o̍57e{OF,əS)ÿH?| \hOU-.[/6W//.ws.gs/ 昊.ywÿ#H}p(}fɑqKO?P. wy"bK<D K4'1KMv@vS%{lvf{{G!臨6"J#QKAqʖ9!-z%t@4 0}@F&a6QIȎEMxUin er*/x[1BHr# >Si$ť!/N H:%+E$!"t #cs4X4l餂&8ʭLt^4nR)y3}òh7<˞f 7`jA+ڃ }bRAb & 8>aq%x*y#*_(4>ׄI#?re\:rґ?"z&2=G0eB nt4&r}x9 S&v@ VCM0Āxi!/Y1+Ba2?gVZuc"P]/*XM|FXۈY5ySVZJ1}kM}ʏjQš~e~OUZ չZ0D{QD$Mb a`> U>llť̮OwO|O b >MɈc4{4F=GOU[L8aV :ŋE=F)ש<>ŨM9Q} R}^2M[o Gv#^s49gMwOYXsT {7"dROG8:?cZn ȉSk?~Oy z%qlR,H? B ]0|^D2_)0lexGvOuihou;QTd  j]J*Z1hLOq1=]#yR! U7ma TΉ7"z@$YdT?%\R %AãuNP<6:Q!Lf\%c!XFvFEqVI h8' rOO<)G  BQ)eTQ oGw[JC#DhDNA& &3~rh &Vyr͞3\o& &%;O7K 2cBUH 0 >EZ(Y lq}PA.P+[3?;ZI F FV\Ux{\vP˔DYf)7r(L-WOeu$@:T܄LbSLʞ2 8ٗ溋.Dh%蔦43pө/.31vRh]!Č_9@J? 9)OY /&mF^ r$(6ث2ɧ>l]|]8|_-?.$G:"1o6p]UϪ](v7 6V`HVkZ8tda"[5T(K`o_Mn.V+މSbZaxŜr<(((P3ʢU`օ*UIVxլOv(JQĐP ^U=SUH,X̫p򄂛k?,?G%OGo*=oMŰGtXἷ@͊OW%|Kn|j.6eXH)^-(MȰWSeO:FvY1jO-)Οٻ)]KI_\C۫~ hb5ڷ@wڢ:ׄA Zc"OV1MW|_[8 oOT vݐ0A_Ȼb?H_Z#!mB\_ZƳH8,a1 q1  ,NSD ps8Uq8~;ZmkѐNz,Nۉ&X$xQqqr]u >MOW%U}:qb|p=mcfUISaGDK_V{qVc. cwAAz1@}z98N 4SE C#p\3OkAz;Wg!up 0 ȖḂ?2̲_&*E֐3~#&i|OI!GGA2**x,W:D~0AK9@84HԝDb#`~@@njIOz ]4G^/CH~`8D^x4 KmO3~Wg%GXw/"0vq m!8H~!' 8 1K$bKr/"<+1d`c;\[>1` Pق/H}Gn\Uң pFMU.3>IwGMB͎p bp{hk<(7`*N wLi cGnkOu)gE/7i I0oLeW2"ҹ}Wh=lhZV2v MVd%m:*Ș BEeuW.m.:V: Uoș:ؘ%m{F;p*_ĒsB1|Ax~[$#9Xv38sǀ:-l :h0oev {hx /1<elo2Vfebu2RKw/izj .Ϙ ٦ʗ@9=}/%"yhдO`'~I,b!D]6BG\޻8R4=*ADt*a$_G8AÈB!e Ÿ) z5^H}jD1^ሷ Ȟ  c8]G]g"^^*4eE pA/QEFԕr L~@Xp8,@6hH 6>(a$cȯ-}ܘL0i1"*q`]B@CZ#@HGGK(aJ0tȏx%T b8JtG U8f*v0: B-W*0p@*:v"p0SVqϵ`" WjPhA A+ AIT@LO@ : ~& D;Q*(\nlI ڎ 7R&k( :|;F 9(G!F34&ک~Wtbp_\HV:8N1VF MQY5 4옵L7؂_Js]; j#CtXJc АN%7թ6pgy_Aܞoz,W/u%h'DCT0ÂhO@L{h>zztQWI.j 5k Le3PÀx238raj2BPV\҈Z7Ht獍WcEli i|ϸ+t"x9sJxJSVJGDç.gX>G7u\DZ{Bdann'!E0Bx NlR8SǬFV¬ߌ21WcgeUkɦCK!9"Ê"I:R)!/J刨>:ཬ< m"좧S"-ڙ\UY /Y߁u9dꖤ;T֖bv1'}-hxg'<'H$[[\ܑ%~@5ZMT: ՘x=n4bÉ#v0 ff$89/$5^m;QȦt(5bPmY :1M(87Q#Y Br\E!ɭ?ֵ\L!L3CIѴ_ oH ,HeK2Y<j|\eE&I ? u=Rd _!U//XD7}jP8F*_ XHp9 cx597//Yr`.ǒv ӁX҂kD| fmdC\uBOh`F3\:`\#zץzxﳹnA $/D@%6iҞh;3/sU!]_i/J& WrL+T % ?]uq{@pO+x\v怆-7 t+,)Kvڜ{Ϫe߇Tjڨ -II+zRkg9{~s :G8mM;ȣgroڔ][-YQ NGBCەgF7R Gܒv]P=8JL:x.Q丣20DЂ=Nآ=t=lOfAGbX=v>-MÈ3t:L>i৶x1o1l lxV$Ul.+8 ar-V (<ުu%o]l]92 /̊wOn,PQXAW.*6T蒬xbcҜݚk`-of9*`1{D-ا@UFp(;Ȑ`b Wl3n>6eǮXM=~B=}*@vKvTx`&=QZX 4W#/fGvPPt8*| k@ҁz&)=@j҇zJхc8Cܨ² i52 1\:e_p*21!duh.L`p @3'`BqY oQ nI%#Dmz&~(G1:/U܄4h DHr=&_u"C=:bS S@x0/<;F\OWko/|+Qf.$.>;,p _`?& &Z!jŽDm0PfDp/IGH"_h3kשi %49h?MoT+uI"zQʬ'\g14Z8 M3 &}71Y,$|W:F*__hL!ߌe*@* H8 4biߨ/LY |f5";s0I<.Ӹ7DJ=! cP53u Qyb^4@JPXD,w/8]34 6e~i73bQ @G?| &(B# uJQ?L(33_JWB)ܝ ))ש tr 0s!^%*w)73/uбׂ13,vՌѵQm5.R;oѾ8~_؏ue|>l*X |ٓH/)9#u= N|w`pV̱O.Ov Wz  ,YcD1Eލ6KerRbĸ\Υ*K+_gah_~I{jлp°: RPe >qURfl"7 #m. 7 _j6^\_4p8S HTzB*&N$Ԍ|5 2YP`vjz/~#atEA&i.X.g WU>u°Ą*ljv~XX)5yexN0RG\5(}iO5pg}949zV"kvPw-REש Mv 檩Ƽ삛h^ %^ԝ~k{ [lbVFde+(Lfq+TۀԕdL %H~MI~gDhW~2c=GVܙbG̫yU$䏒D~Hxd@vbll:mɚ1lbVɺ eP1G9dꩴ*YJڂpU:>eݒEvM ]P |5Fvڗ!5hG\XRVvܠԨ/= 8BE$| ,sDG$:׈^|~٥\$+0e)*,BN,J*LĂjҳ*$~s:)ʤdå܅,юZIk? Е蔅k-Թ ܢ@.\Vfalza=Vb-C~(xr,hTFfU=Uua<fjچׄ*-UŪXu1"6vnY҄\уGrCmBT9⑥y '`+~@jŮ+hhTOQታJ;aUU,ۇOxz*BFf28Ff:l(GƔp8l}̨m+w3<`ND_M+5 -w2Z#-B--z?4%(<%sW6o)7Ԓkiq*xb9X!+>!Q>O2<j&"6@ žp E`Sd1Y,@!xsuDh<( HQ!+h e~xYϰW8PI8-bgnx)3e?ry."BqMl0α!Rx-FO}: 3p!C=1jLa3!,{r#Fx=gg8s5ͮ† nk3>K:U7?_,мl\q*&&8kbĤc@u\2nbM(6|Ъ&Nѭy5O;)\U`u&XqkZh"W LטQ}GeWt043hUa#!Ba:UWV)bk' \l1dw6u3[V+ԘdTH=[sM- $/kz蹕b꧈Xe:e*WQ BZuTއ%U:Q%\BeĐ&ѩg]źu [3Uerbq9h L΍ël۷UAk_W yT WG񳃦 <*ofY}is V5U;%ĝ]W1-UsBک!hªF+{ KO!jIMqUեђEdžU-u Mᩘ'ɵ^bmUU@_ޫ4Ru\5 5W!X~$l;IfixRU15ԩLsbתbJ*įʩX7ϫyͫf UÛe|FQǛӣ"3yUy$;T_>DIr,rB}l?ZųWpBpjdx1HCڢ؅yo3VJY mƨڼ=h6e!zR"UhYofϵSz+&$T4hVv5 ^lm<: sҚ *r.6B3z&nb (Gg-3F߬oܔ:k-[V?ZxnZo] m/w feⶲ#v  {a' dC{"z̴^рn*ɘs Әw -Ƥ3',H?RzW0l ַpl6Cw2zM5K}?U5n8b&C6Uu~ގ]1n%cz: QHzOx%BaɪZ?6T+յkxf%ՓTGɵୂ!W3=eIѷUetw敬M[YU9rՖ'9饪 ]3u6v䠅W_r[}#nbAź~&z-㔇mll*㱴mb**/cMڏ+;/*/n D6?$s.Qa'm0ʹ!4c4##l|Zi٦N|/W#~%G%$tJhB-q@GkxlBz uT z(2ux雹לa^7m}^ƄcQ̴EQO%d O#1@Rԣ14 n M\O2.uE̎Bz$3 Ḻ`obd?v pѯ׺6 qA̛hac#$Fa#T,98V͌& -US\5&*6xα 8Trܘ]7 ȁtّ&P -G)9q/WT qO4u \uָim뱈(oEsae9:? osowu hs<>he L*\ccessZ$yevo컼PϯԺ(( ۬\0e{ɶԩV@-TEr xsbiªVƭS]/'_yצwĠ'ǚؒ̈́t `I^FȊRﲨj'a~NJ158oAgة%A鑄xi~EyA 0zBϑϑkV\Y(@ G$AW A'VrMbsYߐ#c^͍ʰ:G&(T6/A峼͜ш^mpx /C.WU)l~1nHN86SQըNHHkV# 6.<Q yzEUѽFf\j'SV\yay2Fob=QN(֟gUFQqB9O$x#Z\I2E2R|x6:؛NxtOP~LsPhv4`1ǛǞX27P"|L%\O<-6Wb<~6Dtj>B5W1 ? dyD)U 1izH#@Tsvj0aô6SwfNyjb} =MA!N\y&[Ό$VmcM\g<7>P9l3_`N$p5VKl >m*3j<,b('Ma#bZF 6F )az7,A4p%5O92N 6]Z$6v"Gh5&`g{xU8FҠnXI6vd\^L`UmOMZ쫇aPqG#%15o:QEfW&YDɨ5Z^VD} $R yBM4>K<|*K [+^=i2' ښ1ہڬ@Mb(MvL)^y@Ó jHbJ=M*#KϠ-Ji7NmP@v#@DD;]"P3h>#MYJ)^qMOkX ) oO+2OU"WB`ƬMZyGua= 5T:QDd\ AEaY҄ONy  ZTw|W_ H)MPL0p2bEA Dvp/By Ђ"ihVYzB?)K$Pd\# %M HJ`u#Q)o@^>j6-Tב [|xHL# #MDG1/bU|@_ ^h)yEu620[q ^v('g i |{j7~$z Z:`r 联= KSPWYS7).ŰyTS J>kmr  DQE>s*O8>K[czѢ) X"? آT21JS ,G@j5G2GyPz|" ixZ1^11ڰ?Ft P8P4w(:ݔ</-l4 Joj xֻ $mpQב{ cQFm `6FO yi& oseF;`aO^s o$A(f0c Ҩk;w9 OUe@9{'Mk2a91.t:K9 z<9atu/䈫r§*3p8:!? 5MK(>MZRT~>6"b5wqRDQ6Ix!oZg K8_r#:DA|[=ƊI6,a5%-⢞CX74aC!wV%O5w6oS 01=Htu7V6G Ʀ{%\N 1>x`NA~q"1X4QH6FIVL¸(bTAH@<;QD !'x1l#E:̙2D_ڧcKPH^zaiMqRM POh#bZa[t4*A5Cv)`F4: :88U8щ{Sb)T6XvJ!`N>D\ )A춶5 ~ <?/LxGPLH3MD|~P8%unX}o.r1%Mj<~ ׺b@))-R"XZn[^Sp^~7n|*l[7^b np3A><%4r;Ǔ &B(tk=E|iy=XRɣ"_ ~^G0 ]Y,۪j^Ė2P!P3G1>)S*`1pG.y re`3'Юcr/`BB/4 -Prʁ:fT>6T(/*$M`%8fU ą~%BI h(\ hbE0΂ @<Ayf}&wNӢt^1{2B ;q%j$ dZwH+3!)`TG8*e/ |3D gUUi ׺C@|H%-?m/B/ӳk؃ P&۵/Ml` \_PpX_bȬ:ǐU  \2W>oJ%w}t?FWZ,\Ĭ^8{Ɵq8S8Zz>ſrj6>K -r*`ްd ۶W!m3UJۃY /㪃̈l62 b̰ׄH$bh+DoH Qid j95+bO( )taQL4cY5KKwe6xKy?J- `o;i9\?ҬNi"/?Gs mq G j @ni5ũ6Tfa&b toJii Aܜ /F#|8Bv" mN]н,Q`5X$10?q<40P {#ɚA.Hw VEY*,gUGWE{,a;LjM9&'': ༧'4ӳj߂\qn e"1\^̰EЏDU&<4[?LOT `d&MbM&z z٠ WY~}1eo3U`X@7Ke}X&MӬihJgDJM`4 *̪LuC(]0i (& Lܬ@O'^3Q'~PtA"Ҍ8ʑb(Qfvx+25g/}W+qb 6>; Z' { '_؟5BMȟ~L)|=1* -zX ͑Yn 26YD G<'ӑ'Å$JJ n8col>O@OOSj8KHIԥh8#lRz9dO –Ҁ1'C\`mDUmCA^D/ޛZyĿԸL2XcgH)PV'N I?>݊::~:RMd~#JVTDP)<LjBt 3j"/;q~ $TD3:DOO"O>J#ʞOMp.t܅x55;j)*^2R@І^4KW@w!l&gw b<*$8h ] \HEgBJ>=# qRSEܵ= F@g.I%p bO%0|%N|Hʕ̤}MQg{,`?}H6@x" i|h4A !=Ѭ'ɧb?Y082ɹ7 ޟ!ٻ5[ E)ׅ?N#F$@vrУ2(<|IOw=JBhX_\]@(-HT,01i?ط00b@0؂S̅w=.2"p?\4Y6p^ԏ s: O<9y g<qGҹ3X G@lVDFޞ$Eb,)Tɤo2z{aĄ:-ן_;"Du#BE;☮8DR &MIIS?C- *gVR_)gȞӣQ ̥Ak:(y`|YvzB9x?8bbV'gpҏE>ry$͞l]6BIFH#r3)OkYrRQO0$$Y4 Y)x xw0MVP:(g?@Ș*"KNR=@zg'rQ'O7=h%P-+D)' <=uB TQa`pNQWdguR@_EG1V\OPLFj_5$ܤjئLONl\"vB$̈́B, &Aey'Yysem˷ NdiosV7t ((D3I&_7GWucGD#B,Dx3s!S#W/WBQ~NRcb;V^b%|, ̇1F\Gj ~x0"b<4EOȃqc#<bRĉ\\r+nlnYYxn%knrw6E w̍ߴܦȞo~܄i ?ns֏,qӝ7,%Td(HZp*816F8S+K\Jb)h[LAJ/ B~RǨTQ^* ^kwF7+ Fr[Э0rZQ?c%WVwhUr~}V/W(D C'=C˯55՜tDIGl1tH &'S[N> #44@+9H7㑔r s1$]C2Bl:y yS/RDFVy'BHQd d?LT9EȫZ\OTݟe> 97EZ{0PO//%=)=\3W`/J7K'2bS u7V ?-?#o>SzPщع{=#A QW=dU 㙨) bXD$""BEQ*Gx "į>w6H< D(ik U0qdQ7%3 1%A05ƹ$\"1 [FJWBRR ƌUxU,\"%b-vڈΜGF6NV n#gG #a ,"Za/ra#OSRS bp_Bx䈃dd,tXy8Gqqb$PĹKb ]!Zz3cY,Yqz+%֜JlVU(AW`qpP|z77dtb*X܁2@èfuǶRMLQG p  UhK/"nlC4og>x;9WޕVG<+XOn$G?! PzU@bq#L hN#M&Q9&{6p^{P`kJV\@9* `sZ ,Xq*ZՕ~]M uC]{+ ǯ#K1OqZ5nO_HZ⁢JUV40`ʥ8@)hOOκ lOH<@Vfz PiW+dePU8+^M #O BTZI!6fkG%j r%A`OhNG`m\S:Wݚ,|xEwg>5piQe+MUeUŢ 1( MOV*MVOƬ(UsXKZ%D$ Z;kQ4(.8tq(XD?$@2@P@{#pv{LsX4)+b~Rx,2c?tע*Z6u0`o4't8_kr .?Ti N',i6oA2SREq!\["[Z*Y("84t ='8Xi߂6h* 荍^8l<4J4`0}MVztD{8}/ҼSw\*,o=V`x38 0Ȭpsw  eTv*N\ ݏ^@+ы@u*=<<1H\*9!yP:ː  ^]IH >;NEWΣh X0 L:Sp_ke0p"uߑ0E"`;q09&:Xy9.V]#J*h̭(Bh=x?PTH~A/a(NA ԑXט:qޮPS@H8f~2gxFKirD%@gz#i"yJꋏT\a, ›<}2TСd@H R'UHn7`>6 |'x.,#e:*cɼ$V#R؆ Q2x* >jӂV#R*0$;eE*\qPl>w H(Q-dSF{uO (Z9J(; >v*K&bKQanRJTqS  f"(Q&q2RO 5v ;6X0{hhŞ6*`S48>򩦔) EH-s i}:H3 X`AAzc' >'Ċ:E6)$ZŞi:)yD>`'^`Ad|F[0!I @q'>|"p|f{ڬ.~m^t0|RpZHB|S g$<!5 gfa`pB0 H" RA@JDr2SNPL$ET(t,& CF4Xd|In.@ `y}vT|! dPRGBEMDEMOmycalcycalcmEMDEMOmycalc3nits{A:\PASCAL.LIBLIB1sdemo\print.pas?A:\*.*AL1\DOSDEMO\*.*0A:\*.*EMO\*.PRGzSPv3zSi ٩20hHh( MA!z8iVFR \P {$Q\XE L$gJO豨:QtX1h1 Bv.)3 1Tqњ2DaMMі;)!bc;  RYǐ,=#P$Ӭ`ܪ5vpd Jjfe0ues$akuᕨjImhsh^/ FAHF3`F`E0nHYFsfޑ~ ؘĠTiq3]F`=AJ 7( 4H?/l{;ȅ4Ze t2{9v"Z ?Q(bp%$"2ID=x9av8#y_"Zyl[3dăWHUՑeJa/|t8aeJҨ^k Q ?hS4+Zf qeeirАHu[ Qs-[OM$x*;(P<ްכL0sQ ӂsO7m6Oa(0ymxZUu&X ItD#REb0_FAN*(Y* Uc<^ea6(R3&P fQU<)+([gL N*!]$.E%@ "T\iEPhVuJZ! U)Y CR̟E@h{R>RV Wl6S\[$PAe; F53?/X$Iv"e^=dJPGO_JHBryz*ڬfcY,%z۲ WaPaM 8X41zs);.rʲ c ptmW,qII@NR‚Lb4bwQ89z #NHILFF-%51p5*vv0A{#@/;Y]J>! џ, LxH2c(voyS9hZ /ag0(DPvba 8zK4V75N| wJii ha/ď#iHg"N)8%ਐ*d2!XUW CS8h |nBc(&#l"A!؃P{LIv #]°X:S-Zd:J8"BE6!M,BmF"#: i*JTXAeI N"ͮE[zTU vA1xI9M9R$zJKyL+ aorstpieclnmAuSEdTI.DfgyRMBhL,CbNxHGOUPkw01VFvK)-:"(_23WY$]*[Z \/ ;XQz'9#<?@P q|K N~>BlUni1GemDecl UNI1 F FF p j,\| F~n0fp 4nV~ .H:@0>(GEMDECLN CONTROL_MAX\v^ INTIN_MAX\vH INTOUT_MAX \v0 WORKOUT_MAX\v8 ADDRIN_MAX \v ADDROUT_MAX\v GLOBAL_MAX \vPTS_MAX\v AES_PARAM] j lh VDI_PARAM],P Dj2  GLOBAL_ARRAY ]j vV CONTROL_ARRAY]  v INTIN_ARRAY] xvnb INTOUT_ARRAY ]"F :v0$ PTSIN_ARRAY]^ "vJ PTSOUT_ARRAY ] "v ADDRIN_ARRAY ] @Rxl ADDROUT_ARRAY]P D@R:. WORKOUT_ARRAY]V 8rvBARRAY_2] vzARRAY_3] vARRAY_4]j ^vTHARRAY_5]62 & v"ARRAY_6]n  vZARRAY_8] vARRAY_10 ]  |vrfARRAY_16 ]N B v8,ARRAY_37 ]T $Jv@GRECT]$2XQvYQvWQvHQvv AES_PB QjVDI_PB Q,TCONTROLQ,>INTINQD*INTOUT QL"*PTSINQd^PTSOUT QADDRIN QADDROUTQGLOBAL Q(jMIN6 vvvMAX6 vx(vlvfHIPTR6 vP6>DfLOPTR6 v.D>"BITTEST6 Rv INTERSECT6` EMPTYRECT6 nMAKEXYXY D|xrMAKEXYWH DLF$nSystemySystem2 GemDeclGEMDECLMINMAXHIPTRLOPTRBITTESTINTERSECEMPTYRECMAKEXYXYMAKEXYWH*(*6DR(`n0|RR "P(:P(`PPPn PPPP"P(P.P4P:P@PFPLPRPXP^PdPjPpPvP|PPPNqNqNV0. no =n `=n N^.NuNqNqNV0. nl =n `=n N^.NuNqNqNV/. H@=@ N^.NuNqNqNV/. =@ N^.NuNqNqNVp2. hHJVD@N^ _\NNqNqNV n C""U n??.N=_U n?(?.N=_U n0 nh?0.n?N=_U n0( nh?0.n?N=_0.n0.nUHnNJWD@A"n""N^ _PNNqNqNV nC""Jn_DJn_D@ N^.NuNqNqNV n C"""n2"n3n0.nS@"n3@0.nS@"n3@N^ _PNNqNqNV n C"""n2"n3n0.nR@"n3@0.nR@"n3@N^ _PNNqNqNVHy,#HyD#Hyd# HyL#$Hy#(Hy,#Hy(#HyD#HyL# Hy#Hy#N^NuGemAESlH.UNI1|| %{ ؆6߼N8`N| F~$@P``p#J $j$FDLhz,"R#JL&#t!tt"J""l !H :!#f"GEMAES NMU_KEYBD \v` MU_BUTTON\vJMU_M1\v8MU_M2\v&MU_MESAG \vMU_TIMER \v K_RSHIFT \vbK_LSHIFT \vK_CTRL \vK_ALT\v MN_SELECTED\v WM_REDRAW\vz WM_TOPPED\vd WM_CLOSED\vN WM_FULLED\v8 WM_ARROWED \v WM_HSLID \v WM_VSLID \vWM_SIZED \vWM_MOVED \v WM_NEWTOP\vAC_OPEN\v(AC_CLOSE \v)P FMD_START\vrFMD_GROW \v\ FMD_SHRINK \vD FMD_FINISH \v,R_TREE \vR_OBJECT \v R_TEDINFO\v R_ICONBLK\vR_BITBLK \vR_STRING \v R_IMAGEDATA\vR_OBSPEC \v| R_TEPTEXT\vf R_TEPTMPLT \vN R_TEPVALID \v6  R_IBPMASK\v R_IBPDATA\v R_IBPTEXT\v R_BIPDATA\vR_FRSTR\vR_FRIMG\vNAME \vCLOSER \vFULLER \v|MOVER\vjINFO \vXNSIZER\vF UPARROW\v2@DNARROW\vVSLIDE \v LFARROW\v RTARROW\vHSLIDE \v WC_BORDER\vWC_WORK\vxWF_KIND\vWF_NAME\v|WF_INFO\vh WF_WORKXYWH\vPF WF_CURRXYWH\v8 WF_PREVXYWH\v  WF_FULLXYWH\v$ WF_HSLIDE\v WF_VSLIDE\v WF_TOP \v p WF_FIRSTXYWH \v ` WF_NEXTXYWH\v WF_RESVD \v WF_NEWDESK \vh WF_HSLSIZE \vP WF_VSLSIZE \v8V WF_SCREEN\v" END_UPDATE \v BEG_UPDATE \v END_MCTRL\v BEG_MCTRL\vLARROW\v TEXT_CRSR\vBUSYBEE\v HOURGLASS\vt POINT_HAND \v\ FLAT_HAND\vF THIN_CROSS \v. THICK_CROSS\v OUTLN_CROSS\vlUSER_DEF \vDM_OFF\vM_ON \vG_BOX\vG_TEXT \v G_BOXTEXT\vG_IMAGE\vt G_USERDEF\v^G_IBOX \vJG_BUTTON \v4 G_BOXCHAR\vfG_STRING \vG_FTEXT\v G_FBOXTEXT \vG_ICON \vLG_TITLE\v NONE \v SELECTABLE \vRDEFAULT\vvF_EXIT \vbhEDITABLE \vLRBUTTON\v8LASTOB \v$  TOUCHEXIT\v@HIDETREE \vVINDIRECT \vbNORMAL \vSELECTED \vCROSSED\vCHECKED\vzDISABLED \vzOUTLINED \vdSHADOWED \vN WHITE\v<BLACK\v*RED\vfGREEN\vBLUE \vCYAN \vTYELLOW \vMAGENTA\vXLWHITE \vLBLACK \v LRED \v LGREEN \vn LBLUE\v\ LCYAN\vJ LYELLOW\v6hLMAGENTA \v ,EDSTART\v EDINIT \vEDCHAR \v@EDEND\vXTE_LEFT\vTE_RIGHT \v>TE_CNTR\vp BACKSPACE\v~TAB\vn S_DELETE \vXS S_INSERT \vBR SHIFT_INS\v,R0RETURN \v ENTER\vr UNDO \vaBHELP \vbHOME \vG(CUR_UP \vHCUR_DOWN \vPCUR_LEFT \vKN CUR_RIGHT\vzM, SHIFT_HOME \vbG7SHIFT_CU \vLH8zSHIFT_CD \v6P2.SHIFT_CL \v K4SHIFT_CR \v M6ESC\vCTRL_A \vCTRL_B \v0CTRL_C \v.`CTRL_D \v CTRL_E \vCTRL_F \v!CTRL_G \vn"CTRL_H \vZ#CTRL_I \vF <CTRL_J \v2$ CTRL_K \v% CTRL_L \v & &CTRL_M \v2 CTRL_N \v1tCTRL_O \vCTRL_P \vCTRL_Q \vCTRL_R \vCTRL_S \v~.CTRL_T \vjCTRL_U \vV CTRL_V \vB/`CTRL_W \v.RCTRL_X \v-$CTRL_Y \v,6CTRL_Z \vCTRL_1 \v0CTRL_2 \vCTRL_3 \vCTRL_4 \vCTRL_5 \v&CTRL_6 \vzCTRL_7 \vfCTRL_8 \vR CTRL_9 \v> CTRL_0 \v* ALT_A\vALT_B\v0ALT_C\v.ALT_D\v ALT_E\vALT_F\v!ALT_G\v" ALT_H\v# ALT_I\vALT_J\vv$ALT_K\vd%ALT_L\vR&ALT_M\v@2dALT_N\v.16ALT_O\v~ALT_P\v RALT_Q\vALT_R\v4ALT_S\vALT_T\vALT_U\vALT_V\v/ALT_W\vALT_X\vz-ALT_Y\vh,ALT_Z\vVALT_1\vDxALT_2\v2ytALT_3\v zALT_4\v{~ALT_5\v|ALT_6\v}ALT_7\v~ALT_8\v2ALT_9\v@ALT_0\vF1 \v;F2 \v<vF3 \vr=F4 \vb>F5 \vR?F6 \vB@dF7 \v2AF8 \v"B F9 \vCF10\vDSHIFT_F1 \vTSHIFT_F2 \vUSHIFT_F3 \vVSHIFT_F4 \vWSHIFT_F5 \vXSHIFT_F6 \v~YSHIFT_F7 \vhZSHIFT_F8 \vR[SHIFT_F9 \v<\ SHIFT_F10\v&]CTRL_AE\v(CTRL_OE\v'CTRL_UE\vALT_AE \v(]ALT_OE \v'[pALT_UE \v@, SH_ALT_AE\v(} SH_ALT_OE\v'{f SH_ALT_UE\vl\bGEMERROR 6vP APPL_INIT6v0( APPL_FIND6 v6> APPL_TRECORD 6vD>v APPL_READDRvv> APPL_WRITE D`vzvt>nn APPL_TPLAY Dn>Fv@v: APPL_EXITD|L EVNT_KEYBD 6v EVNT_DCLICK6 vvv EVNT_MESAG D > EVNT_TIMER D vzvt EVNT_MULTI 6DvXvLvFv@v:v4v.v(v"vvvv vv>vvvvvvvv EVNT_BUTTON6vvvvvvvv| EVNT_MOUSE D" vTvNvHvBv<v6v0v*v$MENU_BAR DRv MENU_ICHECKDRvvT MENU_IENABLE DRvvN MENU_TNORMAL DRdv^vX MENU_TEXTD$R2v,>& MENU_REGISTER6v2v>OBJC_ADD D@Rvv6 OBJC_DELETEDNRv OBJC_DRAWD\Rpvjvdv^vXvRvL OBJC_FIND6v2jR&v vvv OBJC_OFFSETDxRvvv OBJC_ORDER DRvv OBJC_EDITDRzvtnvhvbv\ OBJC_CHANGED R4v.v(v"vvvv v0FORM_DO6vRv FORM_ALERT 6vv> FORM_ERROR 6 vvF FORM_CENTERDR\vVvPvJvD FORM_DIALD vvvv vvvvv GRAF_MOUSE DvRR GRAF_MKSTATE Dvvvv GRAF_RUBBOXDv\vVvPvJvDv> GRAF_DRAGBOX D  vvvvvvvvvv2 GRAF_MOVEBOX D.vvvvvv GRAF_GROWBOX D<vlvfv`vZvTvNvHvBhGRAF_SHRINKBOX DJvvv vvvvvp GRAF_WATCHBOX6vXRvvv GRAF_SLIDEBOX6vfRvvzvt GRAF_HANDLE6vXtvLvFv@v: SCRP_READD > SCRP_WRITE D >. FSEL_INPUT D>>߾v߸~ FSEL_EXINPUT D>ߎ>߈v߂>|B WIND_CLOSE D vTF WIND_DELETED v, WIND_FIND6 vvv| WIND_UPDATED vWIND_NEW Dz WIND_OPENDvޒvތvކvހvz WIND_CREATE6v^vRvLvFv@v:WIND_GET DvvvvvvVWIND_SET D*vvvvݾvݸvݲ WIND_CALCD$8 v݌v݆v݀vzvtvnvhvbv\vV^ RSRC_LOADD F>0H RSRC_FREEDT RSRC_GADDR Dbvv>` RSRC_SADDR DpvܴvܮRܨF RSRC_OBFIX D~v܀Rz SHEL_READD>T>NSHEL_GET D>(v"SHEL_PUT D>v SHEL_FINDD > SHEL_ENVRN DRۨ>ۢ SHEL_WRITE Dvzvtvn>h>b0nSystemySystem2GEMDECL GemAESLNGEMERRORAPPL_INI*APPL_FINBAPPL_TREAPPL_REAAPPL_WRI6APPL_TPLNAPPL_EXIZEVNT_KEYEVNT_DCL~EVNT_MESEVNT_TIMEVNT_MULfEVNT_BUTrEVNT_MOUMENU_BARMENU_ICHMENU_IENMENU_TNOMENU_TEXMENU_REGOBJC_ADDOBJC_DELOBJC_DRAOBJC_FIN&OBJC_OFF2OBJC_ORD>OBJC_EDIJOBJC_CHAVFORM_DOnFORM_ALEzFORM_ERRFORM_CENbFORM_DIAGRAF_MOUGRAF_MKSGRAF_RUBGRAF_DRAGRAF_MOVGRAF_GROGRAF_SHRGRAF_WATGRAF_SLIGRAF_HAN SCRP_REASCRP_WRI"FSEL_INP.FSEL_EXIRWIND_CLO^WIND_DELWIND_FINWIND_UPDWIND_NEWFWIND_OPE:WIND_CREjWIND_GETvWIND_SETWIND_CALRSRC_LOARSRC_FRERSRC_GADRSRC_SADRSRC_OBFSHEL_REASHEL_GETSHEL_PUTSHEL_FIN*SHEL_ENVSHEL_WRICALLAES6 (2RB`*B666nBBDNB|Z f( rp6~x<. 4<8@@@$D2B@@N8\b0j&Z*x2N>@J\*Vr<b@np<zB6X$\* |B.X*<h6Jh6XR$fJtV$8 N. ". .F:PFX*RP$^. j. v`**X*<. 8BF. T bBp@~8:V$::*. :T T TPT"T(T TTT6P TTT6PT$P*T TTT6P TT.P4TPPT TTT2P8TDTNTXTbT TTT$T,TBPLTVT`TjTT$P TT*P TTT$T,T4T<TDTLTTT\TdTlTtT~TTTPTTTTTTT TT*P0T TT,P TTT4P TTT4P TTT4P TTT6P TT.P4T TTT4P TT,P TTT$T,T4T<TTP TTT$T,TDPJT TT,P6T@T TTT4P TTT$T,TDPNT TTT$T,T4T<TDTLTdP TT,P2T TTT$T,T4T<TDTLTbPTT.P4T T"P(T T"P,T6T@TJT TTT$T:PDTNT TTT$T,T4T<TDTZPdTnT TTT$T,T4TJP TTT$T,T4T<TDTZP TTT$T,T4T<TDTZP TTT$T<PBT TTT4P:TPT*T4T>THT TT,PP"T,T6T@TT$PT$PTT.P8TTT"T8PBT TTT$T,TBPHT TTT$T,TBP T"P T"P TT*P4T>THTRT TTT$T,T4TJP TT*P0T T"P TTT$T,T4TJPTT^ThTrTPT$PP TT,P6T TTT4P TT,PTT.P TTT&T0THP TT.P TT.PT$PTT.PNVA,000 0 0A"0<NBN^ _O NNqNqNV=yLN^NuNqNqNV?< Bg?<BgBgN3L,=yLN^NuNqNqNV3D3 F/.#?< ?<?<?<BgNN^ _PNNqNqNV3D3 F/.#?< ?<?<?<BgNN^ _PNNqNqNV/.#?< Bg?<?<BgN=yL N^.NuNqNqNV3 D3F/. #?<?<?<?<BgNN^ _PNNqNqNV3D/. #?<?<?<?<BgN=yLN^ _\NNqNqNV?<Bg?<BgBgNN^NuNqNqNV?<Bg?<BgBgN=yLN^NuNqNqNV3D3F3H?<?<?<BgBgN=yL"n2N"n2P"n 2R"n2TN^ _ONNqNqNV3 D3F3H3J3L?<?<?<BgBgN"n2N"n2P"n 2R"n2TN^ _ONNqNqNV/.#?<Bg?<?<BgNN^.NuNqNqNV3 D3F?<?<?<BgBgNN^.NuNqNqNV3BD3@F3>H3<J3:L38N36P34R32T30V3.X3,Z3*\3(^/.$#3"`3 b?<?<?<?<BgN=yLD"n2N"n2P"n2R"n2T"n 2V"n2XN^ _O ALL_WHITE\v(S_AND_D\v S_AND_NOTD \v4S_ONLY \v NOTS_AND_D \vD_ONLY \vS_XOR_D\vjS_OR_D \vNOT_SORD \v~. NOT_SXORD\vh NOT_D\vV S_OR_NOTD\v@ NOT_S\v. NOTS_OR_D\v NOT_SANDD\v ALL_BLACK\vVREQUEST\vSAMPLE \vMFDB ]MPTR QR FORMWIDTHQv| FORMHEIGHT Qvb WIDTHWORDQvJ FORMATFLAG Q v0 MEMPLANESQ vRES1 QvRES2 QvRES3 Qv STRING80 ]RP STRING125]~}V_CLSWKD vZV_CLSVWK D (v4V_CLRWKD 6vV_UPDWKD DvVST_UNLOAD_FONTS D RvvVS_CLIPD`vv VST_LOAD_FONTS 6 vhnv\vVnV_OPNWKD|*v,VV_OPNVWK DvVPV_PLINEDvv^ V_PMARKERDvv^V_GTEXTDvnvhvbP V_FILLAREA Dv4v.^  V_CONTOURFILLDvvvvVR_RECFL Dv V_CELLARRAYDvvvvvzlV_BARDvRD$V_ARCDv*v$vvvv  V_PIESLICE DvvvvvvV_CIRCLE D$vvvv V_ELLIPSED2vhvbv\vVvPV_RBOX D@v,V_RFBOXDNv(V_ELLARC D\vvvvvvvV_ELLPIE Djvvvvzvtvnvh V_JUSTIFIEDDxv@v:v4"v(v"v VSWR_MODED vvVS_COLOR Dvv`VSL_TYPE D vv VSL_UDSTYD vlvf0 VSL_COLORD v@v:*VSL_ENDS DvvvVSM_TYPE D vv VSM_COLORD vv VST_ROTATION D vvVST_FONT D vZvT. VST_COLORD v.v( VST_EFFECTSD  vv VSF_INTERIOR D .vv VSF_STYLED <vv VSF_COLORD Jvxvrx VSF_PERIMETERD XvHvB VSF_UDPATDfv>vVR_TRNFM Dtv V_GET_PIXELDvvvvv VSM_HEIGHT D vvvp VSL_WIDTHD vJvD VST_HEIGHT Dvvvv vv VST_POINTDvvvvvvH VST_ALIGNMENTDvvvv~vxx VRO_CPYFMDvRvL>4. VRT_CPYFMDvv VSIN_MODEDvvv VRQ_CHOICE DvvvVSC_FORM DvjT\V_SHOW_C D v>v8V_HIDE_C D *vVVQ_KEY_S D8vvVQ_MOUSE DFvvvvt VSM_CHOICE 6vTvv VRQ_VALUATOR DbvVvPvJvD VRQ_LOCATORDpvvvv vv VSM_LOCATOR6v~vvvvvv( VSM_VALUATOR Dvvvv|vv VRQ_STRING DvNvHvB4*L VSM_STRING 6vvvvVEX_TIMV DvRRvzVEX_BUTV DvRR(VEX_MOTV DvfR`RZdVEX_CURV Dv4R.R( VQ_EXTENDDvvV8VQL_ATTRIBUTES DvnLVQM_ATTRIBUTES D v6jVQF_ATTRIBUTES Dvf6XVQT_ATTRIBUTES D&v4&VQ_COLOR 6v4vvvD VQT_EXTENT DBv VQT_WIDTH6vPvvvvVQT_NAME 6vj^v^vXF@ VQ_CELLARRAY D lv(vvvv v": VQIN_MODEDzvvv VQT_FONTINFO Dvvvv| VQ_CHCELLS Dv\vVvP V_EXIT_CUR D v(\ V_ENTER_CURD vV_CURUPD v V_CURDOWND vV V_CURRIGHT D v V_CURLEFTD vhx V_CURHOMED vBV_EEOS D vV_EEOL D v VS_CURADDRESSD"vvv V_CURTEXTD0vV_RVON D >vtLV_RVOFFD LvP VQ_CURADDRESSDZv&v v V_HARDCOPY D hv.V_DSPCUR DvvvvV_RMCURD vJ V_FORM_ADV D vtV_OUTPUT_WINDOWDvH:V_CLEAR_DISP_LISTD v VQP_FILMSDvVSP_SAVE D vn VSP_MESSAGED vHV_META_EXTENTS Dvnvhvbv\vVj VM_FILENAMEDv. VQ_TABSTATUS 6 v v VS_PALETTE 6 vvvH VQP_ERROR6 vv6 VQP_STATED",vv~vxvrvlvfX VSP_STATED:v:v4v.v(v"v V_WRITE_META DHvvv^ V_BIT_IMAGEDVvvvv0_nSystemySystem2GEMDECL GemVDIr T V_CLSWK$V_CLSVWK0V_CLRWK<V_UPDWKTVST_UNLO`VS_CLIPHVST_LOADV_OPNWKV_OPNVWKlV_PLINExV_PMARKEV_GTEXTV_FILLARV_CONTOUVR_RECFLV_CELLARV_BARV_ARCV_PIESLIV_CIRCLEV_ELLIPSV_RBOX V_RFBOXV_ELLARCV_ELLPIE,V_JUSTIF8VSWR_MODDVS_COLORPVSL_TYPE\VSL_UDSTtVSL_COLOVSL_ENDSVSM_TYPEVSM_COLOVST_ROTAVST_FONTVST_COLOVST_EFFE VSF_INTE VSF_STYL VSF_COLO (VSF_PERI 4VSF_UDPA XVR_TRNFM dV_GET_PIVSM_HEIGhVSL_WIDTVST_HEIGVST_POINVST_ALIG @VRO_CPYF LVRT_CPYF pVSIN_MOD VRQ_CHOI VSC_FORM V_SHOW_C V_HIDE_C $VQ_KEY_S 0VQ_MOUSE VSM_CHOI VRQ_VALU |VRQ_LOCA VSM_LOCA VSM_VALU VRQ_STRI VSM_STRI <VEX_TIMV VEX_BUTV VEX_MOTV VEX_CURV HVQ_EXTEN `VQL_ATTR lVQM_ATTR xVQF_ATTR VQT_ATTR TVQ_COLOR VQT_EXTE VQT_WIDT VQT_NAME VQ_CELLA VQIN_MOD VQT_FONT VQ_CHCEL V_EXIT_C V_ENTER_ V_CURUP V_CURDOW V_CURRIG V_CURLEF ,V_CURHOM 8V_EEOS DV_EEOL PVS_CURAD \V_CURTEX hV_RVON tV_RVOFF VQ_CURAD V_HARDCO V_DSPCUR V_RMCUR V_FORM_A V_OUTPUT V_CLEAR_ VQP_FILM VSP_SAVE (VSP_MESS @V_META_E XVM_FILEN VQ_TABST VS_PALET 4VQP_ERRO VQP_STAT VSP_STAT LV_WRITE_ V_BIT_IMrGEMVDIPd*GEMVDIF~2GENSET:GENSETP4RETCONTR$ GENESCAP0| **$*(0*6<*DH*nT8R`2`lvxrr*z|<F$lt`6`6$T0\h<jh<2V0@ tN,tx8HD PV*\ h t8 < H* d6^0      P$.  <  J ( X 4 f @J LN XZt dtB pP$ |<p Z*~ l6b H R$ <T : < B @ ^0 2* * ^0 $^08 02F <H Hf0 T$4 `$ lv x$ j& B $P Z*^ 6l 6z < H F      , 8 D P" \D$0 h$> tL Z 4 & h v D$   t V 6 @ 6, *: B ( 4 @&  LV0H X^$$ TTT TTT&T TTT*P~ TTT(Pd TT TTT&PdT,T4TDPdNTxTT TTPdT"T,TDPdNTxTT TTPd TTPd TTPd TTT*P~ TTT(Pd TTTJTjPd TTFTfPd TTFTfPd\|T*T2T:TrTPd TTNTnPd TT"T*T2T:TDTN\XTnPd TTT$T,T:Pd TT@T`Pd TTTHThPd TTT$T,T4T<TDTRPd TTT$T,T4T<TDTRPd TTT"T*T2T:THPd TTT$T,T4T<TDTLTZPd TTT$T,T4T<TDTLTZPd TTT"T*T2T:THPd TTTHThPd TTTHThPd\|T,T4TlTTTTTTTPdP TTT$T0T<TJPdPP TTT T.PdP TTT"T0PdP TTT"T(T0T>PdP TTT T.Pd8TBTLTVT TTT(Pd2T<TFTPTPPPP TTT"T2P~BTPPPP TT T0\>Pd TT T6&T2TD8TDT6JTVTD\TdTTPd TT T6&T2TD8TDT6JTVTD\TdTnTzTTPd TTT6"T.TD4T@T6FTRTDXTfPd TTT"T2P~BT TTT"T0Pd TTT"T2P~BTLT TTT"T2P~BTLTRTZT TTT*P~:T TTT*P~:TDT TTT*P~ TT P~,T TT T(T2T>TLPdRT`TT TT T(T2T>TLPdRT`TTT TTT&\4Pd TTT6"T.TD4TBPdJP TTT(Pd TTPd TTT6"T.TD4TBPdJP TTT6"T.TD4TBPdJP TT P~ TT P~0T:T TTT6"T.TD4TDP~RP TTT(PdRTT TTT"T2P~`T TTPdHThT TTPdHThTtT TTPdHT TTPdHTT\|T(T`T~PdT TTT*P~8TBTLT TTT*P~@\|f\`rT\\| TTTJTjPdtT~TTT TTT*P~ TT P~0T:TDTPT\ThTrT|TT TTT(P~8TPPPPPPPPP TTT"T*T8Pd\|T(T0ThTPdPPPT&TPTP TTT"T*T8PdPP TTTHThPdP\|T&T^TTTTTPd TTT"T2P~ TTT&Pd8\|^\`jT\\|PT&T0T:TDTpT TTT"T*T2T:TBTJTzTPdPPPT TTT"T*T2T:THPd TTT&T8TPPd\|T(T0ThTPdNqNqNV3 ,38A"psNBN^.NuNqNqNV3 ,38A"psNB=yL N^.NuNqNqNVBy.323DU?. ?. N=_N^ _\NNqNqNVBy.323D?. ?. NN^ _\NNqNqNV09>HH@29@HЁ-@N^NuNqNqNVBy.By23 6?<?.NN^.NuNqNqNV nCpA"QACDpA"QBy.3 2?< n ?N"n 28pr,@m8=@=A`Rn0.H2.IAL"n30.nfp-r8@m<=@=A`Rn0.H2.A-IA"n30.nfN^ _O NNqNqNVBy.By2?<?.NN^ _TNNqNqNV nCpA"QBy.3 2ACDpA"Q?<d n ?N"n 28pr,@m8=@=A`Rn0.H2.IAL"n30.nfp-r8@m<=@=A`Rn0.H2.A-IA"n30.nfN^ _O NNqNqNVBy.By2?<e?.NN^ _TNNqNqNVBy.By2?<?.NN^ _TNNqNqNVBy.By2?<?.NN^ _TNNqNqNVBy.323DU?<w?. N=_ N^.NuNqNqNVBy.323D?<x?. NN^.NuNqNqNV3.323 Dpr@m8=@=A`Rn0.H2.I nCd30.nf?<?.NN^ _PNNqNqNV3 .By20. HS@rAm8=A=@`Rn0.H2.I nCd30.nf?<?.NN^ _PNNqNqNV3 .By20. HS@rAm8=A=@`Rn0.H2.I nCd30.nf?<?.NN^ _PNNqNqNV/.Hn?<PN3.p.323d3 fp.rAm<=A=@`Rn0.S@H2.tA0CD30.nf?<?.NN^ _O NNqNqNV3 .By20. HS@=@p2.@m8=@=A`Rn0.H2.I nCd30.nf?< ?.NN^ _PNNqNqNV3.0.323:3<3>3 @/.Hyd?<N nCDpA"Q?< ?.NN^ _ONNqNqNV3.323 d3 f3D?<g?.NN^ _PNNqNqNV3.By2pr@m8=@=A`Rn0.H2.I nCd30.nf?<r?. NN^ _\NNqNqNV3.By236pr@m8=@=A`Rn0.H2.I nCd30.nf?< ?. NN^ _\NNqNqNV3.32363 D3F3d3f3 p?< ?.NN^ _O NNqNqNV3.32363 D3F3d3f3 p?< ?.NN^ _O NNqNqNV3.By236383 d3 f3l?< ?.NN^ _PNNqNqNV3.32363 D3F3d3f3h3 j?< ?.NN^ _ONNqNqNV3.32363 D3F3d3f3h3 j?< ?.NN^ _ONNqNqNV3.By2363d3 f3 h3j?< ?.NN^ _O NNqNqNV3.By236pr@m8=@=A`Rn0.H2.I nCd30.nf?< ?. NN^ _\NNqNqNV3.By23 6pr@m8=@=A`Rn0.H2.I nCd30.nf?< ?. NN^ _\NNqNqNV/.Hn?<PN3.p.T@323 6p.rAm<=A=@`Rn0.R@H2.tA0CD30.nf3 D3F3d3f3 hByj?< ?.NN^ _ONNqNqNV?< ?. ?.NN^.NuNqNqNVBy.323 D n3F n3H n3J?<?.NN^ _PNNqNqNV?<?. ?.NN^.NuNqNqNV?<q?. ?.NN^.NuNqNqNV3.By23dByf?<?. NN^.NuNqNqNV?<?. ?.NN^.NuNqNqNVBy.323 D3F?<l?. NN^ _\NNqNqNV?<?. ?.NN^.NuNqNqNV3,3.By23 8Byd3f?<?. NN^.NuNqNqNV?<?. ?.NN^.NuNqNqNV3.By2Byd3f?< ?.N"n2"n2"n 2"n2N^ _ONNqNqNVBy.323D?<k?.N"n2"n2"n 2"n2N^ _ONNqNqNV?< ?. ?.NN^.NuNqNqNV?<?. ?.NN^.NuNqNqNV?<?. ?.NN^.NuNqNqNV?<j?. ?.NN^.NuNqNqNVBy.323D3FU?<'?.N"n 2"n2NN^ _ONNqNqNV?<?. ?.NN^.NuNqNqNV?<?. ?.NN^.NuNqNqNV?<?. ?.NN^.NuNqNqNV?<h?. ?.NN^.NuNqNqNVBy.0.H32/. HyD0.HH?N?<p?.NN^ _PNNqNqNV3.32U/. N3:U/. N3U/.N3@3Dpr@m8=@=A`Rn0.H2.I nCd30.nf?<m?.NN^ _ONNqNqNV3.32U/.N3:U/.N3U/. N3@3D n3F n3Hpr@m8=@=A`Rn0.H2.I nCd30.nf?<y?.NN^ _ONNqNqNVBy.By2U/. N3:U/. N3U/.N3@?<n?.NN^ _O NNqNqNV3.By23d3fU?<i?.N"n 2"n2NN^ _ONNqNqNVBy.323 D3F?<!?. NN^ _\NNqNqNV3.By23d3fU?<?.N"n2"n2"n 2N^ _ONNqNqNV3.By23d3fU?<?.N"n2"n2"n 2094Hy0=@N^ _ONNqNqNVBy.323DU?<?.N"n 2"n2NN^ _O NNqNqNVBy.323DU?<?.N"n2"n24"n 2NN^ _ONNqNqNVBy.323 DU?<?.N"n2N^ _PNNqNqNVBy.By2U?<?. N"n2=y4N^ _\NNqNqNV3.320.D@3D3F n 3d n 3f?<?.N094"np294@m:=@=A`Rn0.2.SAIAL40"n0.nfN^ _ONNqNqNV3.320.D@3D3F n 3d n 3f?<?.N094"np294@m:=@=A`Rn0.2.SAIAL40"n0.nf=y4N^ _ONNqNqNVBy.3%2/.HyD?<JN?<o?. NN^ _\NNqNqNVBy.By2U/. N3:U/. N3"n2@=yB p2<@m8=@=A`Rn0.H2.IAL"n30.nfN^ _ONNqNqNVBy.323 DU?<s?.N"n2N^ _PNNqNqNVBy.By2U?<?.N"n2"n2N"n2"n3y"n3y"n3y"n 2"n2"n3y"n3yN^ _ONNqNqNVBy.By236U?<?.N"n 2"n2NN^ _O NNqNqNV?<?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV?< ?.NN^ _TNNqNqNV?< ?.NN^ _TNNqNqNVBy.323 63 D3F?<?. NN^ _\NNqNqNV/.Hn?<PNBy.p.323 6p.rAm<=A=@`Rn0.S@H2.tA0CD30.nf?<?. NN^ _\NNqNqNV?< ?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV?<?.N"n 2L"n2NN^ _O NNqNqNV?<?.N=yL N^ _TNNqNqNV?<?.NN^ _TNNqNqNV3.By2363 d3f?<?. NN^ _\NNqNqNV?<?.NN^ _TNNqNqNV?<?.NN^ _TNNqNqNV3.By236pr@m8=@=A`Rn0.H2.I nCd30.nf?<?. NN^ _\NNqNqNV?<?.NN^ _TNNqNqNV/.Hn?<PN3D3Fp.rAm<=A=@`Rn0.R@H2.tA0CD30.nfpr@m8=@=A`Rn0.H2.I nCd30.nf3 .p.T@3236?<?.NN^ _ONNqNqNVBy.323<63DU?<?. N=_ N^.NuNqNqNVBy.By23[6?<?. NHz/.?<}Npr|@mf=@=A`Rn/.HnN0.HAL20AA=AHnHnNHn/.?<}N0.nfN^ _\N NqNqNV?<\?. N"n2L"n2N"n2P"n2R"n 2Tpr@m:=@=A`Rn0.H2.ZAIAL"n30.nfN^ _ONNqNqNVBy.323]63]83D3F3H3J3 Lpr@m:=@=A`Rn0.X@H2.I nCD30.nf?<?.NN^ _ONNqNqNV?<^?.NN^ _TNNqNqNV?<_?.NN^ _TNNqNqNV?<`?.N=yL N^ _TNNqNqNV3.By23b63d3 f3 h3j?<?.NN^ _O NNqNqNV3.3 23c6 nCDpA"Q nCdpG"Q2?<?.NN^ _ONNqNqNV/.Hn?<PNBy.p.323d6p.rAm<=A=@`Rn0.S@H2.tA0CD30.nf?<?. NN^ _\NGraphIlpUNI1 e U:zFv@ -7`   fp   e l HU F~V\ pxL> ,z H<FHJ\x D* V N \t*$,j .6 GRAPHN GRAPHVERSION \^?GROK \vF GRNOINITGRAPH\v, GRNOTDETECTED\vGRFILENOTFOUND \vGRINVALIDDRIVER\v GRNOLOADMEM\vj GRNOSCANMEM\v GRNOFLOODMEM \vGRFONTNOTFOUND \vt GRNOFONTMEM\v\ GRINVALIDMODE\vBGRERROR\v. GRIOERROR\v GRINVALIDFONT\vGRINVALIDFONTNUM \vDETECT \vCGA\vMCGA \vEGA\vlEGA64\v\EGAMONO\vtIBM8514\v`HERCMONO \vJLATT400 \v6VGA\v& PC3270 \v STCOLOR\v STMONO \v .STLOW\vSTMEDIUM \vNSTHIGH \vCGAC0\vCGAC1\vCGAC2\vxCGAC3\vfCGAHI\vTMCGAC0 \v@MCGAC1 \v,MCGAC2 \vLMCGAC3 \vMCGAMED\v|MCGAHI \vEGALO\vEGAHI\vEGA64LO\vEGA64HI\v EGAMONOHI\vz HERCMONOHI \vbATT400C0 \vLATT400C1 \v6\ATT400C2 \v ATT400C3 \v ` ATT400MED\vATT400HI \vVGALO\vVGAMED \vVGAHI\vDPC3270HI \v IBM8514LO\vz IBM8514HI\vdRBLACK\vRBLUE \v@GREEN\v.*CYAN \vRED\v MAGENTA\vBROWN\vl LIGHTGRAY\vDARKGRAY \vT LIGHTBLUE\v LIGHTGREEN \v LIGHTCYAN\vv LIGHTRED \v`  LIGHTMAGENTA \vF YELLOW \v2WHITE\v :EGABLACK \v >EGABLUE\vEGAGREEN \vEGACYAN\vEGARED \v EGAMAGENTA \vEGABROWN \vJ EGALIGHTGRAY \vp EGADARKGRAY\vX8 EGALIGHTBLUE \v>9 EGALIGHTGREEN\v$: EGALIGHTCYAN \v ; EGALIGHTRED\v<EGALIGHTMAGENTA\v= EGAYELLOW\v>EGAWHITE \v?SOLIDLN\vPDOTTEDLN \v CENTERLN \vjDASHEDLN \vT USERBITLN\v>L NORMWIDTH\v( THICKWIDTH \v0 DEFAULTFONT\v TRIPLEXFONT\v SMALLFONT\v SANSSERIFFONT\v GOTHICFONT \vHORIZDIR \vVERTDIR\vn USERCHARSIZE \vTLEFTTEXT \v> CENTERTEXT \v& RIGHTTEXT\v BOTTOMTEXT \vTOPTEXT\v\CLIPON \CLIPOFF\FTOPON\TOPOFF \ EMPTYFILL\v SOLIDFILL\vj>LINEFILL \vT LTSLASHFILL\v< SLASHFILL\v& BKSLASHFILL\v LTBKSLASHFILL\v4 HATCHFILL\v XHATCHFILL \vINTERLEAVEFILL \v WIDEDOTFILL\v 6 CLOSEDOTFILL \vx USERFILL \vb NORMALPUT\vLCOPYPUT\v8XORPUT \v$ORPUT\vANDPUT \vNOTPUT \v MAXCOLORS\v PALETTETYPE] SIZE QvCOLORS Q l tj J : LINESETTINGSTYPE ] 0 LINESTYLEQDPATTERNQD THICKNESSQD > ~TEXTSETTINGSTYPE ]2^FFONT QD DIRECTIONQD~CHARSIZE QDfHORIZQ DRVERT QD>  $FILLSETTINGSTYPE ]PATTERNQDCOLORQD` :FILLPATTERNTYPE] "r POINTTYPE]$ZXQv\YQvL& F VIEWPORTTYPE ]P<X1 QvY1 QvX2 QvY2 QvCLIP Q N ARCCOORDSTYPE]\vh<NXQvxYQvhXSTART QvRYSTART Qv<XEND Qv(YEND Q v  RESTORECRTMODE D GETARCCOORDS D (\ SETVISUALPAGED 6D SETACTIVEPAGED DD^ SETWRITEMODE D Rv4 GRAPHDEFAULTSD` SETBKCOLOR D nD GETBKCOLOR 6D|^ SETALLPALETTED > GETPALETTE D  X~ SETPALETTE D vLvFGETPALETTESIZE 6v&GETDEFAULTPALETTED   SETRGBPALETTEDvvvvSETCOLOR D D"GETCOLOR 6DvL GETMAXCOLOR6DTOUTTEXTD * OUTTEXTXYDvv TEXTHEIGHT 6 D$ TEXTWIDTH6 D2SETTEXTJUSTIFY D@D~Dx* SETTEXTSTYLE DNDNDHDB|GETTEXTSETTINGSD \2 CLEARVIEWPORTDj SETVIEWPORTDxvvvv~GETVIEWSETTINGSD jGETX 6vpGETY 6vTXMOVETO D v*v$MOVERELD vv& DETECTGRAPHDvv INITGRAPHDvv$ CLOSEGRAPH D GRAPHERRORMSG6 ZvN| GRAPHRESULT6v2GETMAXX6vFGETMAXY6v GETMAXMODE 6v. GETGRAPHMODE 6v< GETDRIVERNAME6JR GETMODENAME6 jXv^ GETMODERANGE Dfv4v.v( SETGRAPHMODE D tv2SETASPECTRATIO DDD"GETASPECTRATIO DDD. CLEARDEVICED FLOODFILLDvRvLDFSETFILLPATTERN DD SETFILLSTYLE DDDGETFILLPATTERN D GETFILLSETTINGSD p IMAGESIZE6rvfv`vZvTGETIMAGE Dv.v(v"v>PUTIMAGE Dvv>DLINE DvvvvXLINETO D *vvLINERELD 8v\vV SETLINESTYLE DFD,D&D jGETLINESETTINGSD T PUTPIXEL DbvvDGETPIXEL 6 DpvvBARD~vvvpvjvd"BAR3DDvBv<v6v0D*$ FILLELLIPSEDvvDDDRAWPOLY DD>xFILLPOLY DD>nARCDvrvlDfD`DZ$CIRCLE Dv6v0D*PIESLICE DvvDDDR RECTANGLEDvvvvPELLIPSEDvvDD~DxDrFSECTOR D vNvHDBD<D6D0 HALFX6v,HALFY6v&`nSystemySystem2JSTPASCALGEMDECLGEMAES _GEMVDIBBIOS Graph4 GRAPH RESTOREC GETARCCORSETVISUAFSETACTIV SETWRITEGRAPHDEFSETBKCOLGETBKCOL"SETALLPA.GETPALET:SETPALET GETPALETGETDEFAUFSETRGBPASETCOLORGETCOLORGETMAXCOOUTTEXTOUTTEXTXvTEXTHEIGTEXTWIDTSETTEXTJSETTEXTSGETTEXTS VCLEARVIE >SETVIEWP JGETVIEWShGETXtGETYPMOVETO\MOVERELDETECTGR,INITGRAP CLOSEGRA GRAPHERR bGRAPHRES nGETMAXX zGETMAXYGETMAXMOGETGRAPH GETDRIVE GETMODENGETMODER &SETGRAPHSETASPEC~GETASPEC 2CLEARDEVfFLOODFILSETFILLPSETFILLSGETFILLPGETFILLSRIMAGESIZ^GETIMAGEjPUTIMAGELINELINETOLINERELSETLINESGETLINESPUTPIXELGETPIXELBBARZBAR3D*FILLELLIDRAWPOLYFILLPOLYARCNCIRCLEPIESLICErRECTANGLELLIPSE6SECTOR4HALFX@HALFY@&ZZARLttE_REfEE_R: GET_@GE l$ b OU**_MOUDDNE_C6P \4h:$t((EST _DISP NU_H*Z0$$n| &"b.:\ F*R0^*jbNvN$B2BNl*Nh@*\,T*L*8\FZT*l&r*B6< BB~Nd0ZZf^HrF$~T20pP$bFH`<XN^b$>N( . *:"f:D,FZDRj$6lt*l^xZZF> `t<~fd.,<  J fX ` &*t 2p* >2*x JH V*j brN n  z   $  l( ~R 8  @PPl.l|Pl&lt,l4l PX PPF PBPfPl|"P,l|6P@l|JPTl|^Phl|rP|l|Pl|Pl|Pl|Pl|Pl|Pl|PP l|Pl|"P,l|6P@l|JPTl|^Phl|rP|l|Pl|Pl|Pl|Pl|Pl|Pl|Pl|Pl|&P0l| PPPPP$P*P P6PP P*P0P P6PP P P6PP P4T$:P*P8T$P6PRPrPPPPPP,PJPjPPPPPPP$XVPlPrPTPPPPPP"P P6P&P,P8X>PJXPP P6PP P6PPP P6PP P P6P@PlP.PvPPP:P P62PDPRX`PjPvP P6rPPPPPXP P6$Pf>PfnPxlDl(P P6$Pf>PfPllPPPP8PNXTP P6l&l2lxLllPPPPTPlXrPl|P6$P.P6X<PJXB`PjPtXzPl|P6$P.P6X<PJXB`PjPtXzPl|P6*PJP2TlDtP2~lDP2PPPXPl|P&P0P6PXP2`P P6,PRP^PrPzX PX PX PX PX Pl(PPP X(P8P>PZX P6BPJPRPhPXP P6P"P P6P"P0P>PHPNPTX\\fPtXzPXP PP"P,P2P<PBP PP>PHPRP P6FPLP^PjXrPzPPP XPXtP~XP P6P P P6Pl$P2lDlVlflPPPPPl(l(X\PP P6$PL*P4P@PNP\lbPplllll(l(XjPP(PP P60P6P<PFPRPll(zl(X\PP P6P"P,PFX2LPRPrX\xP~P P6PP&P@l(Nl(VXjtP~P(PP P6P"P0P>PHPRXXP P6PP P,P:PHlNP\lnlllX\PPl(l8lVPfpPfP~PPPP0PFP P6PP&P4X:P P6P"P0PJPlPrPxX\PXPXP P6PP P6PP$P P6PP&P6XFP PP0P:P P6P2ltPPPPX\PXP X&P0X<PP6PlP PFP`PnXPPP,P6lDPJPVP6PP6PPXfPXJPX.P P&P2P P6PP P6Pl$P TPP&P.P 4P^lpP|PlPlRPPPlP PP"P(P6P>P DPNlTPbPjP pPlPDP6 P6"PDPNTTP`P P6"P@PNTXP^PjP P^&d@<d@Rd@ P^&d@<d@Rd@Bl|HPVP^Trl|lllxPPllllx"P:PDPNPZTf\(\tPPXPPT0PxBPRPpPxPPPPXPPPPPXXlPPl PP6PD"PR(P.P`4PPP "Px(P2P@PFLPRP`PNlP@ PTrPVP P6PPf P6PP P6P*l|Hl|NP P6P"P2l`@lNlZP fPvllPPlll|P*P<l|NP^l`ll~l|P P6PPfDPNPTPbP PX6PP P$P*P P6BPbPjPrPzPPlPPX`P P6P P Pl"P,P|2P8PBXPPVPZP`PdPjP PP P6PP P6PP h6T PPlP,$P*P0P6X(<\|JTTP^PlPx~PPTPT~ P6P:lLl^lplllllllll$l6lFlbltllPP,P PP&PNV09=@N^NuNV09=@N^NuNV n "n "N^ _PNNV n 0"n02N^ _PNNqNqNV0.H/BgHn?<NHn/. ?<NN^ _TNNqNqNVHn?.NXHyHnBgNNBgNN^ _TNNqNqNV?9BgNN^NuNVHG//+/+N&_N^NuNVHG .6 .7@ .7@ .7@0+klHkHkN . 7@ .7@ &_N^ _ONNqNqNVHzHy"?<NHzHy,?<NHzHy6?<NHzHy@?<NHzHyJ?<NHzHyT?<NHzHy^?<NHzHyh?<NHzHyr?<NHzHy|?<NHzHy?<NHzHy?<NHy,Hy?<NN^Nu   @  p8 Hy?<*NHzLHy?<*NHzTHyf?<*NHz^Hy:?<*NHz`Hy?<*NHzlHy?<*NHzHy?<*NHzHy?<*NHzHy^?<*NHzHy2?<*NN^NuNo error Graph not initialized. Graphics hardware not detected.Device driver not found. Invalid device driver. !Not enough memory to load driver.Out of memory in scan fill.Out of memory in flood fill. Font file not found. Not enough memory to load font.*Invalid graphics mode for selected driver. Graphics error.Graphics I/O error.Invalid font file. Invalid font number. NqNqNVJ9 f ?=@=A`Rn0.HU?=@=A`Rn?9?.0.AHpN0.nfpr@m.=@=A`Rn0.2.C0.nfAC""""UN0 @f8pr@m*=@=A`Rn?.?.N0.nf`b @f:BgBgN?<?<N?<?<N?<?<N`" @fBgBgN?<?<NN^NuNqNqNVNYN .n0 .3?9 .?N?9 .?NByN^.NuNqNqNVN09H-@ByN^NuNqNqNVN09H-@ByN^NuNqNqNVBg .?NN^.NuNqNqNVN9HH-@ByN^NuNqNqNVYN R=@N^NuNVHN&nUN60S@rAm4=A=@`Rn0.2.AC0.nf&_N^.NuNqNqNV/.Hn?<NUN0._n`By0.S@rAmH=A=@`Rn0.A 0o?.0.A0H?N0.nf` 3N^.NuNVH&nUN60S@rAm4=A=@`Rn0.2.AC0.nf&_N^.NuNqNqNVN n _D n_DgL0.AAC"2?9?. HnN0. 2.CBy` 3N^.NuNqNqNVN nnJn \D n@ ]DgJn \D n@ ]DgJn\D n@]Dgr0.2. C30.2. C30.2.C3?9?.0.AHpNByN^ _PNNqNqNVN0.n oHnHn N0. noHn HnN0. nR@2. nRAHHAtAB=@0.HrN2.n RAHN-@ .-@ByN^ _PNNqNqNVN0.noHnHnN0.n oHnHn N0.n=@0. n=@/. X-@0.R@2.RAHHAtAB=@0.R@=@0.H=@Bn=yHn/.?<N/. -@Hn/.?<NB0.y=@0.y=@0.y=@0. y=@BnBn0.R@=@=n?9?<HnHnHnNByN^ _O NNqNqNVN .?HnNBg?<NXHnNg8B/. Hn?<N/. X-@/. -@/.Hn?<N=n=nBnBn=n=n09n=@09n=@09nn=@09nn=@ . f-|`V f-|`@ f-|`* f-|` f -| ?9 .?HnHnHnNByN^ _O NNqNqNV/.Hn?<NN y(f?9BgN?9HnHnN0.nH-@ y(f?9?<NByN^.NuNqNqNV/.Hn?<NN y(f?9BgN?9HnHnN0.nH-@ y(f?9?<NByN^.NuNVH/.Hn?<NNBnBnG fPJf YHnN rN=@`* fYHnN rND=@ nl&Yp.@@=@HnN =@?909nn?09n n?HnNBy&_N^ _PNNVH/.Hn?<NUNUNHnNGJWDJ WDgYHnN y&_N^.NuNqNqNVNJ]D ^Dg3`,J ]D  ^Dg3`# . f?9BgN`t f?9BgN`X f?9?<N`: f?9?<N` f?9?<N#  . "<N3(?9?9(N# .Z-@By?9 .?HnHnHnHnNN^ _O NNqNqNVNJ \D  _DJ\D _DgLBy# #Jf -|?9 . ? .?HnHnN` 3N^ _PNNqNqNVNA"np"QByN^.NuNqNqNVN0.y=@0. y=@0. y=@0.y=@?9?9 NUN=_?9?<HnN?9?.NByN^ _PNNqNqNVUNUN?. ?.N0. y30.y3 N^.NuNqNqNVUN=_UN=_?.?.0.n ?0.n?N0. y0.y N^.NuNqNqNVN WD WDJ\D _DgDByJ9f -|?9 .?N###  f l\Bnpr@mJ=@=A`Rn . J^DHn=@ . -@ 0.H=@0.nf`=|?9?<N?9?.N`b . f =|`: f =|`& f =|` f=|?9?.N` 3N^ _O NNqNqNVNA"n"""ByN^.NuNqNqNVNHyHn?<DNHyHn?< NHnHn?<DNHnHn?< NHnB?< SN=@0.H/0.H//./. /.0.H/NN?90.y?0.y? .??. .r N? . r N?NNByN^ _ONNqNqNVN . oHnHn N?90.y?0.y? .?HyHn?<DNHyHn?< NHnHn?<DNHnHn?< NHnB?< SN? .r N? . r N?N?.?././. /.NHnN?.?.?.?.N?.?.?.?.NN^ _ONNqNqNVN0.H/0.H//././. /.NN?90.y?0.y? . ? .? .r N? .r N?NNByN^ _ONNqNqNVN0.y=@0.y=@?9?.?. . ? .?NN?9?.?. . ? .?Bg?<NNByN^ _O NNqNqNVN?90.y?0.y? . ? .? .r N? .r N?N?.?./././. /.NHnN?.?.?.?.N?.?.?.?.NN^ _ONNqNqNVN0.y=@0. y=@0. y=@0.y=@?9HnNByN^ _PNNqNqNVNN?90.y?0. y? .?HyHn?<DNHyHn?< NHnHn?<DNHnHn?< NHnB?< SN?Bg?<NNByN^ _PNNqNqNVHn Hn?<DNHz8Hn?< NHnB?< SN=@0.nlHnHnN0.nlHnHnN?.?.?.?.N?.?.?.?.N0.HЮ =@0.HЮ =@0.n=@?.?.?.0.n?N?.0.n??.?.NJ.gD?.?.?.?.N?.?.?.?.N?.?.?.?.NN^ _ON?NqNqNVN?90.y?0. y? .?NByN^ _PNNqNqNVN0.y=@0. y=@0. y=@=n=n0.y=@=n=n=n=n?9?9 NUN=_?9?<HnN?9?.NByN^ _PNNqNqNVN09H"n "09H"n"N^ _PNNqNqNVN . 3 .3ByN^ _PNNqNqNVN?90. y?0.y?HnHnN0.H-@ ByN^.NuNqNqNVYN-_/.N?.?. ?.?. N/.NN^ _PNNqNqNVN H n By/.Hn . ?N . SrAmn=A=@`Rn0.d(0.H2.IA40yC3`$0.H2.IA40yC30.ܰnf?9?9 NUN=_?9 . ?HnN . HC3 . RHC3?9 . R?HnN?9?.N` 3N^ _PNNqNqNVBnp n"( @mr=@=A`RnTn0.H n2( nA޲pWD2.RAI n4( nA޴pWDg0.R@=@ `0.nf n ( =@ N^.NuNqNqNVN H nBy/.Hn . ?NU/N=_0.HS@rAmn=A=@`Rn0.d(0.H2.IA40yC3`$0.H2.IA40yC30.ڰnf?9?.HnN0.H J o/. 0.HHAHpN` 3N^ _PNNqNqNV n C""YN .n.HnHy?<NHx /.NBy` 3N^ _PNNqNqNVpr@m=@=A`Rn n ( 2.ArA"0=A0.S@n2."n0.n2."n0.n@2."n0.n@2."n0.nfvN^.NuNqNqNVNJ \D _DgZ/N?9Hn?<N?9 .?N?9?<N# #By` 3N^ _PNNqNqNVNA"n""ByN^.NuNqNqNVNHy/.?<NByN^.NuNVHYN#*By$YBgBgUNUNN -@pr@m=@=A`RnN o3$0.HA*Hp/.N0.H2.I4.J&A* 0 ("<N"<A*Ұ@C*#00.HA*/0 .?BgN`0.HA*B0.nf@LN^NuNqNqNV y$f y&f4/9./9*YBgBgUNUNN ?NHy.YBgBgUNUNN /NBNBNN^NuNqNqNVN _D".IA*JVDg*?h/:(/1p7B302<5;=f4,(<15.*)6;78$<>1n8z,(t>6=/=969;8!6L8(.=35$0*d; 811d7nSTPASCAL N LONG_MAXINT\\ SCREEN_DEVICE\vBPRINTER_DEVICE \v& MAX_C_STRING \v MAX_FN \v MAX_PATH \vPALFA ]     SHORT_INTEGER]v LONG_INTEGER ]|C_STRING ].N V B8 STRING_PTR ]V. FILE_NAME]|  PATH_NAME]RP SHORT_ROUND6 v SHORT_TRUNC6 vx(l LONG_ROUND 6 P6D LONG_TRUNC 6 (DINT6 vRCTOPSTRD`.PTOCSTRDn.ST_SHL 6|~ST_SHR 6fZTPWROFTEN 6 :v.BASEPAGE D RCMD_ARGS 6v CMD_GETARG DvOPTION 6 FILENAME 6 |pKEYPRESS 6V IO_RESULT6v6PEEK 6 WPEEK6 v0LPEEK6 $POKE D2WPOKED@vzLPOKEDNXRMOVE_B D\.("zMOVE_W DjMOVE_L DxCLOCK6SETDATEDvv|vvSETTIMEDvRvLvF8GETDATEDv"vvGETTIMEDvvvCUR_ON DCUR_OFFDCUR_UP DCUR_DOWN D CUR_RIGHTD`CUR_LEFT D CUR_UP_SCROLLD "CUR_DOWN_SCROLLD.CUR_HOME D< CLEAR_HOME DJp SAVE_CURSORDXRESTORE_CURSOR Df SELECT_COLOR D tv.SELECT_BACKGROUNDD vINV_ON DINV_OFFD DELETE_LINED CLEAR_LINE D< INSERT_LINED START_OF_LINED END_OF_LINEDP END_OF_SCREENDSTART_OF_SCREEND WRAP_ONDdWRAP_OFF DINSUPER6x*SUPERD 8PnSCRLEN_B \v<}SCRLEN_W \v&>BSCRLEN_L \v@ERR_CODE ]vSCREEN_B ] |} rSCREEN_I ] >}v pSCREEN_L ] X ?`}V 6 PTR_SCREEN ] 8  PALETTE] p  v \| RESOLUTION ]v SCREEN_TYPE] *RESQvPALQ pzPICQ" h}" ^ 8 GET_SCREEN D F . PUT_SCREEN D T  READ_SCREEN6vbv WRITE_SCREEN 6vpv NO_PORT\vROOT \vl NULL_INDEX \v|bMAX_LEN\vhQ MAX_DEPTH\vRMAX_TREE \v<d NO_WINDOW\v& MAX_WTITLE \vPR_TREE \vTR_STRING \v E_KEYBOARD \vE_BUTTON \vE_MOUSE1 \vE_MOUSE2 \v E_MESSAGE\vtE_TIMER\v` REPLACE_MODE \vF TRANS_MODE \v.XOR_MODE \v(REV_TRANS_MODE \vPAT1 \vjPAT2 \vPAT3 \vRPAT4 \vPAT5 \vPAT6 \vPAT7 \v~PAT8 \vl PAT9 \vZ PAT10\vH PAT11\v6 PAT12\v$ PAT13\vPAT14\vPAT15\vPAT16\vHPAT17\vPAT18\vPAT19\v^PAT20\v^PAT21\v^PAT22\vp^PAT23\v^^PAT24\vLbHATCH1 \v8`HATCH2 \v$^HATCH3 \v\HATCH4 \vZHATCH5 \vXHATCH6 \vVHATCH7 \v THATCH8 \v!HATCH9 \v"HATCH10\v#HATCH11\vp$HATCH12\v\%SOLID\vJnLONGDASH \v4DOTTED \v &DASHDOT\v DASHED \vT DASHDOTDOT \v\NORMAL \vn THICKENED\vz LIGHTENED\v0SLANTED\v UNDERLINED \vtOUTLINED \v^pSHADOWED \vH $ SYSTEM_FONT\v0 SMALL_FONT \v`G_BOX\vBG_TEXT \v< G_BOXTEXT\vDG_IMAGE\v G_PROGDEF\vG_IBOX \vG_BUTTON \v G_BOXCHAR\vrDG_STRING \v\6G_FTEXT\vHf G_FBOXTEXT \v0fG_ICON \vzG_TITLE\v VNONE \v SELECTABLE \vDEFAULT\vXEXIT_BTN \vEDITABLE \v RADIO_BTN\v LAST_OB\vt TOUCH_EXIT \v\@ HIDE_TREE\vFPINDIRECT \v0SELECTED \vCROSSED\vCHECKED\vDISABLED \vG_NAME \vG_CLOSE\vhG_FULL \vG_MOVE \vrG_INFO \vxG_SIZE \vd  G_UPARROW\vN@ G_DNARROW\v82G_VSLIDE \v"XG_LARROW \v G_RARROW \vVG_HSLIDE \vG_ALL\vnWHITE\vBLACK\vRED\vGREEN\vBLUE \vvCYAN \vdTYELLOW \vPMAGENTA\v<L_WHITE\v(LL_BLACK\v L_RED\v :L_GREEN\v L_BLUE \v L_CYAN \v L_YELLOW \v L_MAGENTA\v MN_SELECTED\v WM_REDRAW\vl WM_TOPPED\vV WM_CLOSED\v@ WM_FULLED\v*< WM_ARROWED \vBWM_HSLID \vWM_VSLID \vWM_SIZED \vWM_MOVED \v WF_PREVXYWH\vL WF_FULLXYWH\v WF_HSLIDE\vt WF_VSLIDE\v^ & WF_HSLSIZE \vF WF_VSLSIZE \v.AC_OPEN\v(AC_CLOSE \v) COLOR_REG]  DRAW_MODES ] B LINE_TYPES ] R PAINT_TYPES]Z %b GEM_DEVICE ]"2 :*INQ_TYPE ]H H^ OPEN_VALS\H5EXT_VALS \H MOUSE_TYPE ] M_ARROW\ M_TEXT_CURS\|M_BEE\j M_POINT_HAND \P M_FLAT_HAND\8 M_THIN_CROSS \\ M_THICK_CROSS\` M_OUTLN_CROSS\PTEXT_PTR ] XWORD16 ]  v MOUSE_FORM ]tv*HOT_XQvrHOT_YQv^RESQvL MASK_COLOR Qv2 DATA_COLOR QvMASK Q DATA Q*J WINDOW_TITLE ]RPMESSAGE_BUFFER ]~  v|\L CTRL_PARMS ]&B  Jv@  INT_IN_PARMS ]d   vP INT_OUT_PARMS] -\v PTS_IN_PARMS ]  vft PTS_OUT_PARMS]J  RvH ( ADDR_IN_PARMS]\ R HADDR_OUT_PARMS ]  RPOINT]XQvYQvb RECTANGLE]XF$2XQvHYQv8WQv(HQv STR30]z STR255 ]TE_JUST] ~*TE_LEFT\nZTE_RIGHT \X TE_CENTER\B TREE_RANGE ] ** d2: TREE_INDEX ] R d *OB_TYPE] v  ` TEXT_ED_INFO ]!ߴdTE_PTEXT QVߒ TE_PTMPLTQVz TE_PVALIDQVbTE_FONTQ vhTE_JUNK1 QvPTE_JUSTQv:TE_COLOR Qv"TE_JUNK2 Qv TE_THICKNESS Qv TE_TXTLENQv TE_TMPLENQv޾ ޘ TED_PTR]!~!t SPEC_INFO]"fX0R>THICKQvVCOLORQvBINFO Q!PTRQSTRQV! OBJECT ]#OB_NEXTQvOB_HEADQvݰOB_TAILQvݚOB_TYPEQv݄OB_FLAGS QvlOB_STATE Q vTxOB_SPECQ "f"OB_X Qv*OB_Y Qv|OB_W QvOB_H Qv" TREE ]#ܰ x#ܦ *ܢTREE_PTR ]#܊#܀ *MENU_PTR ]#dJ DIALOG_PTR ]#P ICON_BLOCK ]%p<|"8IB_PMASK Q6IB_PDATA QIB_PTEXT QIB_CHARQ vIB_XCHAR QvIB_YCHAR QvIB_XICON QvۨIB_YICON QvېBIB_WICON QvxIB_HICON Qv`IB_XTEXT QvHIB_YTEXT Qv0IB_WTEXT QvIB_HTEXT Q v"$  BIT_BLOCK]& ھnDVBI_PDATA QڸBI_WBQvڤBI_HLQvڐBI_X Qv|BI_Y Q vhBI_COLOR Q vP%* .USER_BLK ]&|UB_CODEQ UB_PARMQ&F PARM_BLK ]'ٲPB_TREEQٮPB_OBJ Qv٘ PB_PREVSTATE Qv| PB_CURRSTATE Qv`PB_X Q vLPB_Y Q v8PB_W Qv$PB_H QvxPB_XCQvPB_YCQvPB_WCQvPB_HCQvPB_PARMQت&؄ ADD_DITEM6 Rb~ #Vvlvfv`vZvTvNvHvB ADD_MITEM6v(# R ADD_MTITLE 6v#lAES_CALL Dv׼dךה\׎׈ AES_VERSION6v׈ BEGIN_MOUSED BEGIN_UPDATE D BORDER_RECTDvvvvvBRING_TO_FRONT D v CENTER_DIALOGD #֊4 CLEAR_SCREEN D h CLOSE_WINDOW D vX8 DELETE_DIALOGD &# DELETE_MENUD 4#( DELETE_WINDOWD BvDO_ALERT 6vP՚vհ DO_DIALOG6vՖ^#nvՄHDRAGBOXD l v`vZvTvNvHvBv<v6v0v*ܞ DRAW_MENUD z# DRAW_MODED . DRAW_STRINGDvԶv԰ԎhD_COLOR6vԒvԆvԀzvtvn END_DIALOG D #*x END_MOUSED END_UPDATE D^ ERASE_MENU D #EXIT_GEM D4 FIND_ALERT DvӔr FIND_DIALOGDvf#D FIND_MENUDv:# FIND_RESOURCE6 #"v v FIND_WINDOW6 v0vv FIRST_RECT D>vҮvҨvҢvҜvҖ FRAME_ARCDLvpvjvdv^vXvR FRAME_OVAL DZv*v$vv\ FRAME_RECT DhvvvvFRAME_ROUND_RECT DvvѰvѪvѤvў0 FREE_RESOURCED FRONT_WINDOW 6v\t GET_DEDITD# R GET_EVENT6Dv vvvvvvvvvмvжvаvЪЈvОvИvВvЌvІvЀGET_EX_IN_FILE 6`82z, GET_IN_FILE6,> GET_OUT_FILE 6 GET_WINDOW 6vFGROWBOXDvϤvϞvϘvϒvόvφvπvzV HIDE_MOUSE DINIT_GEM 6v> INIT_MOUSE D\JUSTIFIED_TEXT D,vvvvvΰ LINE_COLOR D :Έ LINE_ENDSTYLED Hvzvtx LINE_STYLE D V0LINE_TOD dv(v" LINE_WIDTH D rv LOAD_RESOURCE6 ʹ& MENU_CHECK D#͌ R͆͜ MENU_DISABLE D#V RP MENU_ENABLED#( R"& MENU_HILIGHT D# R MENU_NORMALD# R MENU_REGISTER6vv̶̔ MENU_TEXTD#n RhbMOVEBOXDvZvTvNvHvBv<MOVE_TOD vv NEW_DIALOG 6# vvvvvNEW_MENU 6#˜vˬˊ NEW_WINDOW 6vˊ(v~\vrvlvfv` NEXT_RECTD6v:v4v.v(v"OBJ_DRAW DD# R Rvvvv4OBJ_FIND 6vʾR#ʖvʬvʦvʠvʚ6 OBJ_FLAGS6vʀ`#X RR OBJ_OFFSET Dn#*v@v:v4 OBJ_REDRAW D|# Rܪ OBJ_SETFLAGS D# Rɺv OBJ_SETSTATE D#Ɋ RɄvɚɔOBJ_SIZE D#Rvhvbv\vVvP OBJ_STATE6v6# R OPEN_WINDOWDvvvvv PAINT_ARCDvȾvȸvȲvȬvȦvȠ PAINT_COLORD \` PAINT_OUTLINED N PAINT_OVAL Dv&v vvߔ PAINT_RECT DvvvvPAINT_ROUND_RECT DvǬvǦvǠvǚ PAINT_STYLED $vrPLINED2vPvJvDv>LINE D@vvvv PLOT D NvvvRECT_INTERSECT 6 \vƶvưvƪvƤvƞvƘvƒvƌ REDO_DIALOG6vpj#Hv^ RUBBERBOXDxv8v2v,v&v vnSET_CLIP Dvvvvߦ SET_COLORDŠvŶvŰvŪ SET_DEDITD#h Rb\VPvfD SET_DTEXTD# Rv( SET_MFORMD  SET_MOUSED ĺX SET_WINDOW D vĮ SET_WINFODvĈf~ SET_WNAMEDv\: SET_WSIZED v0v*v$vvj SHOW_DIALOGD  #B SHOW_MOUSE D SHRINKBOXD .vèvâvÜvÖvÐvÊvÄv~ SYS_FONT_SIZED <vTvNvHvBTEXT_ALIGNMENT D  Jvv: TEXT_COLOR D  X TEXT_HEIGTHD  fv TEXT_ROTATIOND  tv–| TEXT_STYLE D  vn VDI_CALL D& vHvBv<v6&dWIND_GET D vvvvvvWIND_SET D vvvvvv WORK_RECTD vdv^vXvRvLZJnSystemySystem2GEMDECLGEMAES_GEMVDIDOSBIOS STPascal  STPASCAL SHORT_RO SHORT_TR LONG_ROU LONG_TRU INT 8CTOPSTR DPTOCSTR ST_SHL ST_SHR PWROFTEN (BASEPAGE @CMD_ARGS LCMD_GETA rOPTION ~FILENAME KEYPRESS IO_RESUL PEEK WPEEK LPEEK POKE WPOKE LPOKE MOVE_B MOVE_W ,MOVE_L 4CLOCK PSETDATE \SETTIME hGETDATE tGETTIME CUR_ON CUR_OFF CUR_UP CUR_DOWN CUR_RIGH CUR_LEFT CUR_UP_S CUR_DOWN CUR_HOME CLEAR_HO SAVE_CUR RESTORE_ SELECT_C SELECT_B (INV_ON 4INV_OFF @DELETE_L LCLEAR_LI XINSERT_L dSTART_OF pEND_OF_L |END_OF_S START_OF WRAP_ON WRAP_OFF INSUPER SUPER GET_SCRE PUT_SCRE READ_SCR WRITE_SC ADD_DITE|ADD_MITEpADD_MTITAES_CALL AES_VERSBEGIN_MO6BEGIN_UPJBORDER_RBRING_TOCENTER_DrCLEAR_SCCLOSE_WI JDELETE_DdDELETE_MDELETE_W DO_ALERT$DO_DIALODRAGBOXDRAW_MENDRAW_MODDRAW_STRD_COLORHEND_DIALEND_MOUSBEND_UPDAERASE_ME EXIT_GEMFIND_ALEFIND_DIAFIND_MENFIND_RESFIND_WINbFIRST_REFRAME_ARFRAME_OVvFRAME_REFRAME_ROFREE_RESFRONT_WI0GET_DEDI*GET_EVEN`GET_EX_ITGET_IN_FlGET_OUT_GET_WINDGROWBOXHIDE_MOU INIT_GEMINIT_MOUXJUSTIFIELINE_COL@LINE_ENDLINE_STYRLINE_TO4LINE_WID~LOAD_RESMENU_CHEMENU_DISMENU_ENAMENU_HILMENU_NORMENU_REGMENU_TEXMOVEBOX.MOVE_TO >NEW_DIAL>.NEW_MENUNEW_WINDnNEXT_RECOBJ_DRAWpOBJ_FIND OBJ_FLAG|OBJ_OFFSOBJ_REDROBJ_SETF OBJ_SETSOBJ_SIZE OBJ_STATOPEN_WINPAINT_ARPAINT_CO PAINT_OUPAINT_OVjPAINT_REPAINT_ROPAINT_ST:PLINEFLINE^PLOTzRECT_INT<REDO_DIARUBBERBOSET_CLIPSET_COLO SET_DEDI SET_DTEXSET_MFORSET_MOUSSET_WIND>SET_WINF2SET_WNAM&SET_WSIZSHOW_DIASHOW_MOU(SHRINKBOfSYS_FONTdTEXT_ALITEXT_COLTEXT_HEILTEXT_ROT"TEXT_STYVDI_CALLNWIND_GETZWIND_SETVWORK_REC 4 ( 4 6 4 D 4 R  Z |  ( 4 @Z L f2  f: X r ~* z ~ ~ T ~ n    $ 2 @ N \ 2j ,4x 84` Dfn Pt \" h$ t( ( 6 6 6 6 6 6 6. < 6J 6X 6f 6t X (X 46 @6 L6 X6 d6 p6 |6 6 6 6 6* 8 V*F T >b 6p 6 x P f 2 2BgN $ >J J ZV J&Hn J VN^Nu~ J d=| J rN J Bg" J NuB  ~ 6N  $ dN J$ 4`$$0^0<0jH$Tb`0lH,Z3xpr*H:0.J"nJDLE ""IAE .ZVdvx.S_FOf.:XT_A.HXT_C4p6| <Pf|NESSz$&F &$((t B& 20>t$Jt$V0 b0>n06z0\~8&:L $ : :8V$ $ $ ` X"$ . : 2Fl0@Rl0d^(NjN$v0hH\$ZB~6vd$6LFz0  $*6BN Z0 f0 <r8 ~h$  0 X PHH$ bl@x00(8 .48r@ HL" tX ,d0 Jp* R|2n(0""&DD<L|. f8$ & >0l&ll&ll&ll&l$l6llX(l(0l(Bl( XnX|&l|<lJlVlxl| P X,XnRX|fl|pP X~l@lNl\lhlxP P `lnlzlxll|l ll2lFll|P Xl`ll|P P "l,l6lBlx h l$l&l&ll|XxXXjXll*ltll*ltll*ltll*ltll*ltll*ltll*lt llJll*ltll*ltll*ltll*ltl6l<lHltl6l<lHltll*ltll*ltll*ltll*ltll*ltll*ltll*ltll*ltll*ltll*ltll*lt PPP,X2P>PDXJP T&l.TdT$ T&l4Tl|(l*.l^l&~l&l&llpll|(l8.l^l4~l4l4llpl `(PP P*P@`tFPLPP\PP\PVP:P$PPPrP P\(`|l|$l`2lDl|T` d:llPPPP<lNP $`P $llP $llLlP dP rP P P dP VllltlPlP HPVPdPrPllllllxl`@l|ZlhPnllPnl|(l|:l|bl|lP $llPnlPnlPn<`\PPP P&`T`l`\|`"P``V`Pn Pn2`@P`NP`lll|l|$l`2lDl|RPn`Pnv`P`P`lll|l|.P ^P~PP~PP~&PPP~tP~PP^PPP&*P2P\lhltnltP|lPPPPP ZPfP~`@P"P2Phlvl`lPPPPPP P:PTPHPTPPP`@ PP2`@Tl|zlPP:PHPVPPP6lHl|ZPPPXlblllxlxP $lll|"P2PDPTP lPnPP `@PBP P`@l|PP*P@PZPfP PPd(`@*l8Pn````"`:````$JP f`PLP f```"P l` l2l|Jd6ZdDdP l` l2l|Jd6ZdDdP "P "P "P "P Ld` PPP$P*P P PP&P .P P2P@\` P\P.\ P\P,\ P\ P\JP \.&P.\J4P>\PPZ\.tP~\.P\<P\.P\< P P\ P\ PPPP*P8PDPLPRP`\PP*P8PDPLPRP`\ PPP2PP(P0P6PD\PP.PBPNPX\^PxPhPP.P>PPPdPtPPPPP\ PP P0\26PPPZ PP P6\\PP.PBPNPX\N^PhPr\@PP.PBPNPX\@ PP P8\j>PHPRP^Pv\\ PP P8\\l|$l`2lDl|JPTP`Pl\```` P\````` `"`"`* P h6l|$l`2lDl|N`FTd`b`b`b$P` `Tl` l2l|F`24P@PJPTPZd`PjPPPPP.P PPP$P,P2P PPPP&P0P:PDPdPPPPPP6PVPxPPPPP$PHPlPPPPP PDPhPPPPPP@PbPPPPPP0PRPtPPPPP PBPdPPPPPP0PRPtPPPPPP:P^PPPPP P 2P TP2` "`"`.*`<*`J P\ P\ P\l|$l`2lDl|JPTP`Px\x P \ `j`x``b.`\"`\ PPP P&P,\`\ PPPP$P*P0P6PxNqNqNV/.Hn?< CNHnB?<SN=@ N^.NuNqNqNV/.Hn?< CNHnB?<QN=@ N^.NuNqNqNV/.Hn?< CNHnB?<SN-@ N^.NuNqNqNV/.Hn?< CNHnB?<QN-@ N^.NuNqNqNV .=@ N^.NuNqNqNVAFC2""HnHn?< NHnHn?< NA"n ""2N^ _TN@]ݩNqNqNV . ".-@N^ _PNNqNqNV . ".-@N^ _PNNqNqNV"n"N^.NuNVHHnHnHnHnN0.Hr 100 objects) - abortingNVHU/.N=_0.&nG7n0+@ n7@Bk 0. 7@0. 7@0. 7@0. 7@?.HnN?<N?<N?<N?<NXHnNgFHnHxN(nBBB9| Bl9n9n BlBl'n `7n 7n/.Bg?.N0.@LN^ _ONNVH/. Hn?<N.H&nG0+ @g @ g @f*Hk p.R@H/NHn/+ N` @fp.H2+ HA7@ ` @g @g @g @fd(k JgHT0,H/NHTp.R@H/NHn/NBB9n .H9@p.R@9@BlLN^ _ONNVH/.Hn?<N/.Hn?<N/. Hn?<N.H&n&s JgHS0+H/NJgHk0+H/NJg HkNp.HzHn&N_TC=CHS0.H/NHn/NHkp.R@H/NHn/+NHkp.R@H/NHn/+N7n .H7@7np.R@7@.H&nG0+@7@LN^ _ON_NqNqNV. H"n3 J.g/.. H?BgBgBgBgBgNN^ _O NNqNqNV.H n =p N^ _\NNVH. H&n G0+@ n7@&_N^ _PNNqNqNV.H n =pN^ _\NNqNqNV/.HyHyHyHyNN^.NuNVH&n 0+[@=@0+[@=@0+@ =@0+@ =@BgBgBgBgBg?.?.?.?.N/. Bg?<BgBgBgBgNU/. ?.N=_&_N^ _\NNqNqNV. H n p //.NN^ _O NNqNqNVU/. ?.N=_N^ _\NNVH&n0+[@=@0+[@=@0+@ =@0+@ =@?<BgBgBgBg?.?.?.?.N&_N^.NuNqNqNV/. HnN/.HnNHnHnHnNHn/. NHn/.Np n =@0.r n 0 A\g Sn`Hn/. ?<?.N/.HnNHn/.?<PN nWD@N^ _PNNqNqNV/.Hn?<NHnHnNHzHnNHnHn?<N/.HnN/. HnNHnHnHnHnNHn/.NHn/. Np n=@0.r n0 A\g Sn`Hn/.?<?.N/. HnNHn/. ?<PN nWD@N^ _O NNqNqNV/. Hn?<NY?<BgBg?<&?<N-_U/.?<Bg?<Bgp.??<??.?.4?.2?.0?..?.?.*?.(?.&?.$/. .8H? .8XH?/./. /./././.N=_DN^ _OHnNHn/.?<NU?. nHhN=_N^ _\NNqNqNV"n2$"n3n"n3n "n3n" "n3y /.# /.#/.#HyL#/. #J.g`0.HrAmR=A=@`Rn0.d0.H29 "nq`0.H29"nq0.nfHy "psNBJ.g`0.HrAmR=A=@`Rn0.d0.H29 "n q`0.H29"n q0.nfN^ _ONNqNqNV383:3 <3 >3@Hy "0<NBN^ _O NNqNqNVHy8# HyP#$/.#(/.#,/. #0/.#40. @ f?< Bg?<BgBgN` @ f?< ?<?<?<BgN` @ f?< ?<?<?<BgN` @ f?< Bg?<?<BgN` @f?<?<?<?<BgN`` @f?<?<?<?<BgN`< @f?<Bg?<BgBgN` @f?<Bg?<BgBgN` @f?<?<?<BgBgN` @f?<?<?<BgBgN` @f?<Bg?<?<BgN` @f?<?<?<BgBgN`t @f?<?<?<?<BgN`P @f?<?<?<BgBgN`. @f?<?<?<?<BgN` @f?<?<?<?<BgN` @ f?< ?<?<?<BgN` @!f?<!?<?<?<BgN` @"f?<"?<?<?<BgN`z @#f?<#?<?<?<BgN`V @(f?<(?<?<?<BgN`2 @)f?<)?<?<?<BgN` @*f?<*?<?<?<BgN` @+f?<+?<?<?<BgN` @,f?<,?<?<?<BgN` @-f?<-?<?<?<BgN`~ @.f?<.?<?<?<BgN`Z @/f?</?<?<?<BgN`6 @2f?<2?<?<?<BgN` @3f?<3?< ?<BgBgN` @4f?<4?<?<?<BgN` @5f?<5?<?<BgBgN` @6f?<6Bg?<?<BgN` @Ff?<F?<?<BgBgN`f @Gf?<G?<?<BgBgN`D @Hf?<H?<?<BgBgN`" @If?<I?<?<BgBgN` @Jf?<J?<?<BgBgN` @Kf?<K?<?<?<BgN` @Lf?<L?<?<?<BgN` @Mf?<MBg?<BgBgN`v @Nf?<N?<?<?<BgN`R @Of?<OBg?<BgBgN`2 @Pf?<PBg?<?<BgN` @Qf?<QBg?<?<BgN` @Zf?<ZBg?<?<BgN` @[f?<[Bg?<?<BgN` @df?<d?<?<BgBgN` @ef?<e?<?<BgBgN`f @ff?<f?<?<BgBgN`D @gf?<g?<?<BgBgN`" @hf?<h?<?<BgBgN` @if?<i?<?<BgBgN` @jf?<j?<?<BgBgN` @kf?<k?<?<BgBgN` @lf?<l?<?<BgBgN`x @mf?<mBgBgBgBgN`Z @nf?<nBg?<?<BgN`8 @of?<oBg?<BgBgN` @pf?<p?<?<Bg?<N` @qf?<q?<?<?<BgN` @xf?<xBg?<?<BgN` @yf?<y?<?<?<BgN` @zf?<z?<?<?<BgN`f @{f?<{?<?<?<BgN`B @|f?<|Bg?<?<BgN` @}f?<}Bg?<?<BgNN^ _ONNqNqNV?.?.?.?.?.?.?.?./. /.NN^ _ONNqNqNV?.?.?.?./. /.NN^ _ONNqNqNV?.?. ?.?.?. ?.NN^ _O NNqNqNV?.?.?.?.?.?. ?. ?.NN^ _ONNqNqNV?.?.?.?.?.?. ?. ?.NN^ _ONNqNqNV?9?.NN^ _TNNqNqNV?9?. ?.NN^.NuNqNqNV?9?.NN^ _TNNqNqNV/.Hn?<NHnHnNHz\HnNHnHn?<N?90.y?0.y ?Hn?.?.?. NN^ _ONNqNqNV?9?. ?.Hn HnNN^.NuNqNqNVU/.?.?. ?. ?.N=_N^ _O NNqNqNV/.?./. /.NN^ _ONNqNqNVU?. ?.N=_ N^.NuNqNqNV?. ?.HnN-n N^.NuNVH0.&nG"n2"n2"n 2"n2&_N^ _ONNqNqNV/..H?.H??.?. ?. ?.NN^ _ONNqNqNV0.r h2.IA2. IAn=@J. g0.@=@=nN^ _O NNqNqNV/. .H??<BgBgBgBgNN^ _\NNqNqNV?9?.HyHyHyHyNN^ _TNNqNqNV/.Bg?<BgBgBgBgNN^.NuNqNqNVByByByBy By"B9NN^NuUtilUnitbUNI1vvBk 1 aV6`v F~,P\ ff  UTILUNIT NVERSION\`?STRINQ*BSTROUT Q*,STRDATAQINT2STR6 vEXIST6 (WAITTOGO D 6NOSPACES 6 DUPPERSTR 6 lR` CLEARSTRINOUTD`HZ2006&n,nSystemySystem2DOS UtilUnit|UTILUNITINT2STREXISTWAITTOGONOSPACESUPPERSTRCLEARSTR|HZ200n"(`$6 6 D`Rx`.STRINOUT< lZ\|"\0\*4\H\pL\\,\| X(\|"\:\B\V\|\|J\p\| P\P \$\P P(\.P<PF\|Z\jPvP\PP\ P&\*\.P6\.:\>PH\L\PPX\<\\NVB?< NA-x/@/@NA\ON^NuNqNqNVX/.Hn?<ONHnZHnNHnZB?<NN=_XJnXfHnZNNJnXWD@ N^.NuNqNqNV0.H/BgHn?<NHn/. ?<NN^ _TNNqNqNVUN0nfN^ _TNNqNqNV/.Hn?<NHzDHnN0J@oHnHz,HnN?<N`Hn/. ?<NN^.Nu NqNqNV/.Hn?<Np.rAm>=A=@`Rn0.2.tA0?N2C0.nfHn/. ?<NN^.NuNqNqNVHyNJfHyNN`N^NuNVH&nJgA 4_3-# .`l\=%4ǡh LLyj]p Uye*Ңcj DB2D0sД  @҃b=A8 s h1ۮki} /SMx:;8}! *h20.钤cv &BC\ ł<^ # eratoiDd1n,lsEpc_vuxIAPy2FON-.mTS:MhY0kRGf[Vw{gC])9B(bLX$+3;U} @ {<3OJSPv3a VJŠ36-DD F[2kӑ0adFSlWrT(Io4=6{qgi4BlE 6PgQqK3:G&bX )7E@$Iǥf37w@v=T\TD'"3EZH|=vts3J6CEbb#;~Ժb)89TN[( q $JϏSTcVk۬q?ZI9##+&5[FGS,T`d%1%qYdE\Ȉ\RF(:C=҉6-' #;X?E2 m10Z01Ơ`4(hQs;`6@ 1TDG#M N8P9QcaC #P;g(=X;?2yS2m r&hg7%Tm@G:TGQcJim"v|_܍)1)hX=@"G%Mʷ @5oYsboqH ! K5B3sQbT=VAhVO[ h=)rKfƬz[+C VWuH=R&TeC!> |H&$n,%H\H|50274 %$Ix{$&0[.$,=@N*' }Q8!Ñ+r am8@ {"QKP SPv3 a `JJ`edx8#FҀU#qHf+$ěJTOc8[` Ðe~Y 'H0R&401T /fIh$=, D6rB'a -3c> 3d+@k˫' X}ӄ#vLNE# 1aH!,d.V"r&({(c^dI<;6˭FjCqQ|䄂?+'HGCa$Q94mnn#mR#Iᬇ_XNZkKsc:!Z 8 HiLb7vԎ$3Bss ,fht>A#aQxl2M( }MF`689Gx, p6(>$؊,-Zf EwRVL"<⿼='uUUpy ΠuĝPhWJ|Ù>jUz/SB6s=QSIXL0Ud7a`a ;a R< NQӰĪhBzyw 7egTK@v#P#g>69A$’tT3[y d~G7(Bv%1@Ȑ) ߴb q=G}@;ܸ;Z6'SY YU-Q MEh=Zh(@,I=0C6vĜ:0p;0(50DUrð9[ɗks1J-)cKK:S@q j FSґ=A<S@ Ŕ'd^@0w2w +5z.YJ`-4:FG\/g'E= <5d!4&v }&ʴTOEUUv4 K3p]#ٻ`iԎM:[v'@ z~iMzs~+I0&*d;h 6U.\MXu ^SaYt4 .eK#֦Ag!ANH/ & etoanr,suiEI(TlpDfNhCgcSm0AB.dO1MRUVFPL)-2W'yb$k{:wv#xG]}6X@+H[9@ {|X 20SPv3 w@dQl-Z^~hX\u:UJKD>v}aFzHl y6NĖ΀R2>a~T] /ȵR6T=ڨP+h:1d=[T#(J4Ha@qޔo0 &mHgMmgX} ST pf'$"ZdXWLJC >tm!j!P%ĥhd#/  -9H%J d@= 'vm&-6 TRƕAHVREZ\R* p!Ct S൬-׹PM9[c^arEGl u 1$QȀ=-ĭ:q߮b`%d4G(}$4i>fvrG*Fɪaǀ61G 7[r R$Gu +v 5c1 ydp*ddQWV  Ftd  -@خXWi %1L݌a}v'ut443sr7t%6Bou\3#ba J) AcTM!fϱL8ySj̍ <eg) c ^6_ޠ$0BsL3 oT#H'e Df( 6*K|ZaR5WaFǪ7,f"ҰdG?_uY<@6(A~X0>9 |_UF|iG|Gjcr mʤ !%uuLX_ڔqtj6% NtmFci#B΃ʰވk$hFPmW+sʍ>J9F8ta {w9:gHEZ@I.cÚ ]̜LWE4%~Dp@s4-#!!/<[A4aJx)X֬X3T#W񢔳6UX1DA]I0P߸ΎK4{3ױhCG,*hM3MUW c;xآ (c l;wvt qN H0rw0g0-lh`C $$W7õods$A~*F{7C=0XDY揌Q+v$$+Ww?c4C$g$%I"HAdK& 2,&!\"=Kg/3WCKS#RLCɷ E&2\pZҰ',}~j%CzE`nS7T&n=/k NWBf@f XA dBII`@v]%j"(R" R_3X @]]\L1F[]b H O8 B"Rf>.8*|bp<g3S2Hqd.rih5~0p'.I"N~yB~ dl4,4uK(URnM{W Wv(xzvCq+P$? ($`R\MSq 3 Nk1h-)CV + *0E֐]0܇dP59e0gCW^tG3JtZ|mDe >L.;Lֵ.8%H ;65G1GWDhip8Mkr3-kGFXJr CIw8wEEL0w b{넨,!AG,顰򹳈mǮf;#.:Bu!(}D2-mSBR`dTyj"22eO!.¦² 2Y F𱵍 A՝,d+\o '⡥ѓR0. oesarlintufcwpdmEbThISgACyN.,R(PO'v2ML-4UBGFDkW:)";x103}_5V*X^{H= qYP .wx+ }CzS` ` Pack-Fire!A~*H,Ha*oMGLI "grѓg f``GPM$]*$**ԓ**ԓaJ@g p`2aJ@gp`(aJ@gp`p``"agQk`U@C!!Q`  UFIRE`-L`B(HEׅP"\kf+%*Hnԁ.7v+4Yi *}hbL_YR *&nE_JC/vF10 8!0+[S'mAmF0=A=6`RHr` 0"? |0.6nf<BkL3/ ~sfeoATkfy/6 afoނZZp < Qg pakG?]__Bp֘T1(qNVj|2rC$ܶ{?bH &([uLN,XN^7q ConDevice(_w<#o^LQXDAH~?Pw"$-Fmll)$mb*/lڏ\+ED#// JNAZ tb$0֥g m$Ewi<Y,kJX#ͬN $(Y`x>#5ͫ}}FruaTA|tJXHtaBWHz;&N)xp0:mX^a"QEQOm<¼oOa2|a-粬ۦʕM\OLX,BQF#,^\.LnXB|X˵o`Z.\OLNeAUHb%2| h"h$#ɱIr 98tgp4U7bp5S=p6xαkd$gl|1`J`p7wd`Ԙ7},PjAo^an|jpa |Hn0< 'NM RuntimoɋOSa-Eofset:|1?. Not:Hnough|spafuHheap Ace8syde-roALp a&gqmVcH#Hukpk]FHR+D"{mBHW/p?3͎$j3`."ƧfŊ :/ YvBrTbp=aFdBkpa BQʃU_?3H:HNALQrT%j 3jCOa,Jg.a$KN/#GTc-Y0Bk 9mfPpr*+|! 2# p?_RpMtX u!"j"sH"yg4P/erX$tazatVyQPfAڶm~R0ԕM#H ;2v`.e,aD2B%7C~lygJ9Qgў`d肥m8aam znb|5V{a1\fHkPSYckJVX/QBNuH0Li p-rtghgAeSA6$H&I Vg RBRQtJ\:r>$""~,YV2X(,"HI| P>04&eIzP"$2F$  H .p8  N 6HT (` SPv3 X擞cD {ğD8\uD}) @DցBGfO &2I R4zHKk^{5'<e "N0WÞ2@Q:vV+ g*+q6Xߩ@qxZJ' }R@'u7BR +*|*nڳz&Y"]XNY:D&$Xdi''J0v$GF@xn"~XBOD{O.Jj&bD!BCh"ۡUd)3dO~¦s׎41Cч`mHs!m{^8DAZ'byXdL3Xg3`sѨVGI6>::87:9:GRDḏJ|n&RPHĈ< o=_?yuJ;~UvPL^&o:3DqO-OOMdX+O8Yg4"ImCgNg04Dj$4w4.pB.H$tx5ڤj*D^ XQdo44rAMh^&tUgWGa 1$7h++ g?urM~T, 4m1IGO%2gTL"OU%0]Y"|&ʁA {=&,Ē%B"6F0 Oij{4 N #R0`bXd3y37( zQ.Bf'@۲ (-_ܽhD^A9BvP9; ' OpDXa( R&NEJ!\f#H=&0]0|W0χ R50,;@%w0[x2;p̛)6pdr^HG> y3:9%@!@LҴ ւ * BFcLKR(0"%+1njz%?hR,ka{S#qD_FB˧ Rf8T+`l^l\ Q RgU@,1A)ӱ +3dH (a~$|p}#XYz )x b`bgWp?)⤏dD*E~"R=ChNQhJ rW*8`NҰaf2*P}a;(##gN?DFQI_p]H(cÿӁ'paΫVydؖNօyv)Y2PƚSJy4Vys":emDhxio"s75Ntq0)LbE6&N9z "XҸz}HޤnI,݆Aα(ر26"<)wYܰCIH)ZW"8;"_]F=% 3dإCtBWzୡekRQׇ`AbCZ]_6 ᥇E4+qoQ! 4 O^#\=_~~@%("5&x(m'Ѩcz&g?2U|81P5Hn/&iPr7}hP2 //ɲ# w;%\RZn }'uÏZudt`?N0S?<"-%)^I_idjjeݨ 6MSc.%9z,8^C$$)/ @+RNEOSTPDI FAMCB @X  V$L UWp\>H*.Ђ`YKG"n԰|(xJ2↞~tl0,` U21VH I1 1p*A0z>p8=iwjM^h8~!"0E H@WH|hW/D tX'+,*V@|hD$ FG<a^(##9@98ZԠ1H!M4N[*bbΘpb-AI ȝ~2^& /=bH*z(o2Nܦ,Xz@PU282Y(jG0fPXPhEٜ 'M|L]e ڷ, ]M4q;Ջr~ۂXZ!A2T,6"[X} !?ke *+rA+!`Ga71FZ GjHvɔZx8 Ղ`\xזxפx׸xxW9$/?ivAA`W9n;!"9,tr|qv\V1Ŏdt.53'c 2a,`[p!]%u0!ز <qK h’tH4$ܩ2* kRf|8e@\+1[S#hA-B2^Av"ЂZ;7E^Jf0ZZ(yQ, NEA IHCS TnOPRDV=XLGy_aB <`|3M rf6F.0v(l@ UsmQ?Yt~&ĶhpKecuW`  U%01%W\r@SPv3H.ڃWB[r)u Hغ+czА&JlTVer˕ҬGJdu ]*Uj5 $g>j(k rh9p5 5Ƚz6Me!^ӳ>,)OӚzrzltֲ!; ̧:s!"r\͉Y[' DoUN~V66%0) )IIheo _#Ƃ+ؒpw|KXBSJ Z0C3~ ?0ӿH;JSN q.ό#;&@3w܎Q %63kjgO'P9'}Oe O SOO8}v Vx>'U:! )B%,gq@VAD세)1HT@QvlnjgO%eGBbф/ 8q@=L5X'"&EL'PL2VB\gDZ11l8sp(lF20$k؞Wbz=e!1SaZKD43v-0߈p 7O7ZrCBbgSp VL1tǓ VW숍hX xz!"H\̍ƟXI8 1@s }Y=K- !N$tP4(C_"'0y#}O A <蠧bafgqgEab%icg)AC8gl*xtgS Ku< (Z| r!" 0#N 4EXPZ 2,:d` t?GB PB0|X`V%P>L802 7TPCs'yJ,,_t0.]||aQi$K g,Z%(kP+[B`~F7kOUDK%{ûŀA޳G9SOh, B`8O#Ap'&pz i0]j'}]0,f , x`R;>jo胥|\ >l*H9K%. R킕. /؉>U I8cS\5Ǧ  5]~u z3X'Ě@@"\H?e`[jE|[`Tk覗k[0gÌKOi`y'O UQ 1R+ &H5ѡX =m0Y6o._+pwǢot܍Ŷ+B!6C#&Circ0E:sD6@q1Ԇ|աLb ֧1iuog! H9*:{ Nu[\ z1o<>G'}to`% zfP xmse8\tO1 3o۲Pr[OI|Q?H~hu'>g$U1VK['A :e'/'BT= X:OYͪw-ȇRӰJS ^ӂҚp1oBƊr>N3vU ZVN3^O¨ʩ[*0+?caũƳ6\.Px:GmtIcd{hTȗ#bD"Y}-q9U@d! IswOT &s{S`/]T3p]TYzMLX-.5'O ,:}M5SjT~1]SxMTMΟyۛ&3dsS%Ú{7M5v|7X$IO}V47.-FQ/d4`a9]:j0?G@poG|A;M*k/KO{؄yWysB3% PR&Lem#&qUnDa*r@~ Ը%}4lgg@6yg(5y~(-&6LO* !l 'D6~ awx~&ډI gq m-~M721ÂY[;D\1Cjìum @! $4f` chL $ha2h^X]59x( H8I!wD D(880V -V+-A9˂Oc"W.HM|'5̂B+rP xxO..c7LW?.iDth Ү%"TT+XF@%HMNl b ^\эx~xTA- d7L9!`tʾg[,up'j|t~Rk><`m *'ܳ*5: *4QCH RDk>7| 2GC E0ITr x[ȸG4v< H 6V@JҠ 8!܀ӓA4i>=Xm æuT6PlI*!%Y(::v z7P%y, fXxQ1+^W=:??+Z"ϣ*[,gy5HZ} F֗^ş^Mv7x9/LV58cd\dib09c@ה+@Z1*eU d.K1I.~w[I8hjj"^,״5JBe8p4#Zz(f\nYhd֞~^ 8*j&ж@ Uw01qH%D{HSPv3 Ί0La]CGt.-\!K -t5D2gD'|W@KT,ҁn84F_P|&~pH 9 q[RpLw8z <;'N>8: w "1>%@+W2@?`3TE@Bu,ӢL0O@!0ŖB\}Kf bMcpi*"=\$g/(is64EA>Q%4Glζh9)e*³F~OOq C+?+Q (`+cyb}*W!Ms%'k6~ Hf MNҵSƔΎ>"N;{8wϹ\d/bqM9P4s6v͋`akR$*X~3^s '8DM:/GRMNǂ0NƝ)k N TQV. f6X K#.28earY@_ agr[@zѸ3fѢ QfG8:F4 :2H/ƿ8z/5Cg-&zlnҷQgr@Z83376 K8ŀ;xA+٠ryC1-fÃ0H8x`x#7j;37JP2) =DFYdX (&Df ]@ $bDU=jն@-Q !0^Ц=;2{dw5CK>vJn*s dC?9TR:t[l9^tgQXU)҅x-V⾌a%Q$7M{tJ :*u3fKZ3=! Sl>RU U+Br7'ĉs)>>7=,ͭ&y =dm`8KhL `@! VHh Jd, AxJLjŐ&rWT 3cDBCXnkҎ"KQޢhYW.*j ȈP*FDƲS%U|K7Pr5NC`( /@S)dDFd4`4'CJ " =O2d"LF $j2"Ho b)SlR9`}/C?훳hLd\:hv\hڜ:U:_yv?!?8k!v)6ahRU?g/}5&A1UIT_AiY CFG~.#|'e8J?1Yu%)o6KWƤPCIՌؙ2+AZgSxKHK593?RzJ:JRqf;(MdNF$0U҆fW)3Q ^5y1^#K z uelVu-֒TSJi$P,!6H=A@@(DRNLTA_v  "n^ H@0P SO26.,EI jJBV|(YGW:fFܞXxpM=PU 1mV@3VHCSPv3 _j Ӻ$ݶ}R5ł¼*dT02n:e;x0Q ~RP0ZlJmC?azک]GFw`][bzVPse\s&vn އX#JYZy[c*XFsVe8pE(5"b\TQDQ˞W,=!w'ĊvDJkZ7̵ГH!/U-KmKKl^=zXtIoN"j .ߺiQ&B)W,K-8AMFTE )IuQզïwYפKqb BR/GUIa3KF:!59 )`X($~YHBB/"#VI-m!'g"ꐘ ;^dAol Giᨰ^@aoG]gE+x3]_ mϘ+R^%Xk Ȧ X3 a$i*R _\aO0WOW+|%if8NM$*ˆ%Ig]eid~bew9/JB3yyrrYa#VT{`iCF-0HeOO OqOs:Q[,?o%4+\Z ylA 󇅉sV8%J˵dX22 n uh,S*:\9&Z979/3fXPGDiT Mn_k [+=X+?LF+ E33AJ&G 0Ş; `_FQ@QOO# / o j;B*;c%x/nSv8a"}nv7G+)#x>Tx@@ )S"v7LDcU gEg-$Sn#Ts?8>Y[ȔXg_(ξr[ fR5RPK 'ːːݢ'<2*z sY 1*&^BO1OT/D)%RgX`#J)?.Z߂Y^qzTX03E`Er[)Q!yt4'CS/Ds9('B2Fec"fJ#% 1c߂w9Բ+!28p"g<#g-p(*⑏B@ibE'p!B|V!\-\fL@"*8*$;_3EH^ Jէ1Qχ(A!emTU`JbpojԚYQ%410# &n Ήh3bHdEb|]-] n}OT+ @BC7+Saݓ~ F j&nD(CƠ]=F=Z,DKlSw:pCeԋ"'+hUTO O |vZ,;i(g^ g@gxH|í?}taB@K`RZp0*o=/Ϣ?TQ|gP W/z%P4ʉ˚ H2Cg}ˡ/H̑~R`dNɈ |LO̟E _w. 0M3 gw.BY@¸0N7pv)! CId@M/Th3 ǩBJCy_ dt@UҠEe{ CNT;'{yR9DTX !,s10R>><$`8; Љ-7׾&\$`IK@I ]4)VP ! 4:L̑ob}Bɦpc cg^ cs:s'VnE:$Є8,]R%pA\bnYnr ېNj_-9ҧo] 7bp+]ҥֽ"vF ޫ ~#\Py;"s,(.Wwu.K(뼶LH-l#Ch.'3\Pؾ9Zh}A(gOx|d2W@hCֲ8`sqDEQP\m4QXpZ̋V>Xy# ' rCTΣU(!A|F% N%0s$‹-?LLHP%IώC-pGHH4pD瞻癥$D 扡R@GB1r5s>iM+Z&<^"Kt89Y23ԅ)6 "7P2{iJB2G] cP.MPX憿2+,F:̏Ȥ(&N4M T!M#P0'"N^y_^dL[ K'bGaF.q; OYTDjf̙(PNi%i#-~6HůB) {vh,<3BQ8RPR~| 1WCGЪ^a_\,^Q"Q֑#޷Zq=զ繒 (EOJX aT6,K#7+PY)}yg&QysT@Tߥv#-FemĢQפTF?X3 !PjZ iHӻpvT֌ 6nd}$TlM @0*G]#dE Y:O#D%PuW,h8z/R8/JEe}kEsDDh+ $렐FJAwA$44e>Qؚe ɨBuCԩ([RbB㮐#9+!ք~g^ Ya dtB'jQ!&ڐ!]$4ăkMTƞw$7&IdIH7I :Iz%ǤOWMɱ%1 %ݟ I+8d^&T_ǫ›x.Q0)qd޺I9Kd3 Բ$%wwJFK2+I355q(m)R"yG C˟+mjZIUA&ݹ@xA@  3e= r#U DYiV;J=D!NmIvka@<ˑԶ$ڒt`It< J;:+IiR -`mH yDVw$q! V{pGlG~H]Tb;$S~FyxJ$ds&^`DJ?Ts!NP-36d< Dɖ /y4}BGip`K/# D[; o4o-?,Bʰ ʲi-T HFOY !9 ( e~HmT   8@*5o.O(SV 6kX!m~_8F?(ZvXpW | Ywj4&CBM2a'.D{,B89d()IdXXCQd=&+B8\O=ɐR=L7P_5 cn=Zsmr,#Hw2dbQŢJl---fL`q/͗[@  ~I>kFuKWA/?%Dl]l[lIʗAX l1HD-l9$j eb  ?QR'w 61|3 %-[,d}uxV76`r<$Kp5 H=WB"T[͌b̶̥Ъ A]&}q|x"'[Kv=H8{`z͹I$gc2 F- Y!nFwb6 RES[s[q.qs6'g6>î>î:8F!|$I|i %ȂeH sHAJ1 bf%0Jne |$ t1YÅ>S I2mj1__^ qi[YbV\b]R@:N 9Ymj-DWBY6YI=dAwA8+R.|zLkePHO04Ს@9 }HP.A~o <'Y C: CZjuC=ϩRrY4?h297^F2ttm>  p;Wޣ򿉆\-qښ ydaE$N7\7ISX *R +%*Pil;蝐#d!2@ 6g~Kj`ƜC !xd&=V.`dq)H..6) 9+2~ ̄  /(aeJ@^h'qiu&Y4%4$"gÊX)9mۑH Suɢߢ%>*%)Ņg砸P~ jjKݽ4,d@#`rwy X9UCyZ/4!rH !Q#00,I)x!v9 AqnR #* O?YLNYJNO !a0*]dʛT)c]a/>lFГw-jUgɖQl3"2<9 ZqE/S @yy4Sk.#zFJJ"m=FD=wˑBC|Ȣ!U'azgX&;^IwO O??qK"u[ФUnuSu\%+aM%<\(SĜ DŽ 5 RLHA NTDEPO SIF@_VCMUB2p.8n\ 0vf|r:hj4X>WJ$x^,6tz"*( 4 Qf .}nXxAzW pR] O븗9Z~^J.ƻYF`,!R,jX m+p}0lE*;õc!Y1pPѣUT}ELVZ8 eQb Vy=(riE q0BBfP&@UCQ:OT{$!Ԩ37Q@H w'3$3p44mMx tB3C$U]͛f+) ^31't1 e7\HguJ AM1QK>tU||b)~'TC7>BA"gKE A**T,@2BgLKJ7$lb1i)6΅Χ4E.3.`;@:-b5YmaQ 32~F8Iu.'U/Ze%,oDfzKm3]BPQPkm*TV1JZVrPOϖu`캎pX18]J;/9},I1G`*n,( .9"m2Jt2d=<jEF*qO#]ɏ ]B&mdA3Q`$"+ S;4Mh,I#(vH)QXPA :Ԕ(U`QH(,/Wh],@7e91+)}%+r-*reV '?]V3 Z%Ȉ"`ºy _=UAxDoae'VrML:Cz%keo<Rll,@s:I e;4zʑ ~ITZ"]"Ȋ ԫeH=>YJ!I?\5bg6zPsUpC"Ăȑ+A$G`R$jA"oAIUO"`s%-1\p]($f%"b~i3Yn'n=('ftauTA%13۶LJOWÛp~;T] | f33~xٰ$T3g/Dt/~?tÌ'Ur* # A5n1k)M](N^DİUˈ% d-~$&h&ߡPctiǶ/tbʔG@V`0wmNHg*I^I_m0֑:*ҹZ%2Oe':Vz,#dPVKL@BCiQR\OxL6ihZNYKIWZ8A!nO;L\j󒸼I<q\k ]FLK3zDbW @IP}EPCNVWU@Y R$$<KP/axjEHb#u):1JJ DjԀHV֪N1JzKOgVOʴ6 j::*\6m}r1(1PL&c:z&%JW~SoW.5 "Ar4c獋."c.*͔{gυ ڋļ+Y֒y{VY6T{x{1f=Uit4NDسn]e+دZ`))u |L)Ύ *(8; >1+z*cJd ZP:5 WLni7x L P q睨R_ІXڪTVTXXU:E0bJnQ;zbqQn|)l!`q!V)Q%UӺʼnD!TA&vUZbva,aS//37;ѱ`I ,uUUoMrk3qwQ9O1ZJ,[8j$c." n2VV DPAmb|ZERVd5Nx59̴plcQ(_[ ,РW$L+-Wefd"Kʱ,=wJ4zP!xQ}s:.YuC/)Ae.LKW]DQH2N(%K,&23 g;̫cs'\ΔWƚ2QF[< XOz"QVАNR'JPoob6`Р;1h Dje̶&(7.ψ0gKO8`aNp KToꫠL ZCXm*/ƚ2$a]z!mb)R斔RX|ͬap(-۹բ.yآ[1^ hS.8D^RݳWd0#>Ej[r0RVX (mAWtU:+R'- $T `3VEk+e؊/F@+[ m-*F_i"uIHSIEw"I7^ %:~6#I@&QTRB~dr2A5VPOw†qTj bR`UjLzTAOPe"4 P0@oPB2P8+~RX Jw'96gbY@0j@ENWpYLI]@z|_ E ) 샕pl0az14&=?Y@@99R9d5cؗui iDȧ0w/^iCa΂#^~P @-CiZlS)R]#GIS"R RӜ&1dC1< P<3C[Z zslNO븀֘ i1Fo ]S.4sj8sku*N5Rj < { {?jg TDĈ /&}ISXFb|fH8GA_ K?(?X-9ÙՄ*EE iԞ5,Kwz8:HD 0 yVAW8(  VUR)O Ě M\W&XZPk`LK`QBX ^KZ BAW!X@SA`TtUp0X e4aAu AF< АrxH |RjHc$Vp:% R4 C6)rցG 邠'Y`FpNR`!wXT59)FhԘk):T.#tѧן-b.&zXwFK`- T/ !VڄKA.m`wWV"Z`Wp]jRqHDp(mB5p T}ApBT*NpbeY x 2(Kh8.!b ~I( i(s_ Z)iC-PM H gIhB TpWba'XAD@y ^Z8J Λ @Jx0o\J{jf<1~ Rac'gl: M"|FXHwsSh9䆐fe/_D/R"Lyl?$Ux71h`=P$Py;j`' 6 ^(-(SM;vUmv%K;?M;$T16Z1s\M7툛-țnڤ!%zrsep)w7g'#dfDBܓQ$<[ٲ ADK-Z(ilB4FE݁6 3u,!j? (C«dK5Zڑ5V!ۋskN:&*1Դc*1۴jiLM;$$a9ǯl$lOM(d%q1q!(idiMiDz~iwaD$9vWT)/H_eWic<6\!~1zscabtٴuvEi)kjQ 9S,!(p4ku!VrkrugEe#yS'rangmueݞseDce' ni*gmi/cs"OT/g`ZiVe8\Tk`ai}b+wiuMmbDemLi>)l8R~5^ f P aPE 2B>P p;5:[w",̊`tKq4 q%#LƟT 6^C*Jj) EA.!n'A YB=ؤ/dX{_ _;[> ?? Cg*v)œ yKY 9Y琹:*KT)>Tr>G&pΓ Jzр@-bnQ}+*cJY v TȉK7Ah_:{pV$B)+`=$h0P0G:@oȄ@Ggl朁0Wp#` ^Ha(}Er%^FKgFrgKl[hS1);1O݋VI2\3+C@(_ P9ڒ|"w{x!!+9n3)7Pi Z3M0,H䲒غtӋxl3Q(n#(Fyl)8Ҋ dlo,Hh>pl(ÂG+lZ9V#A ]#vc:Xa86j'"]$ 56t(?V:O~,ftIɭܚIR W,q# \A6zwDmp0#5K"">,#oT:d]x G $y8 #I̡@eElP3U ޔ0R( Ydx9Rh^ё! nr@{2!@Ym)q6l C rg),u"S{@s{7>/ { . ԅ|yid!n. )2ݽG0_rha.9Z",\I69! v-y$pIYMB3ZEM 7#J13z18a)S$ 6S-!q=mau:LiL" ~ TмS}QEPyHQ#WMo<+|T8&} ё0bazb$bPTժA1F-ew۞$DQH}'KU9< Jttp܆q*:jVs4z0ӈ4m2mv+ij$$![")`nb>A3%A#M]D$?A7 N)| L&4= #Hں~c|1}1F~H#/' 0;NI! X #Qxx{_EqG+8rq&lMd* @mP#R!\LMQ6-%( M)9O _0))^sr)#6i2LIHQ6!ƞg|5G'CկY=bVaѐ?#݂摖& o$IkTf<#L2lCN4aALMѫ{PD3>SXY s d~'zLv-SZi103`BoBOIF!IV :I/I3"6IbIpuۦtULa^y$2N2! LHB( j@BqT4T.5#πt8YP (6Q,RNWDd\gg(#aˣ2XM7(y4呈qHֱE_rn2X3rdP(AҢPPe6'7:Դ/,kD(SS86;Vhiș.#ᖕY 61b&D6ݷ7~S7)7q7]SVM-Qm4#AK8GP$G8 \SRR6Eb97{ZPTˍxaQ|O] maSA' ئxt9OmODVn߁zr#aG399*( ](+3jŴG؁f b/{W$f@cD5r(mE/{RnVw >Gy] !$QRSʿJw/ LM ke~i72nnT<{P'mx t\ڕEIFxNJxLW2YMQz=g0cN ᔠsKZCfؘ]2/R4r Qk.dMWG30*Ë~ 9]32J*npm$/' |R6'no(Tv$ lG1BNmb1)'8Ie2U*'d7!G'~K7N` >"`O l/EGkoWDHt"X0Ʉe7~A#ߑi8#Ô:ߕ z͐lg /:Tu(nh )4KV=4a:‹>6'(r1q.\h(n%0K)3+ p@m-#q| .|G):Ax؏?DʬKQ0찆38rXi ƤʥUB*nГ3Nm66M⑚'L<P q lY4A57Q-nZ;[XR~Rs(u5g=]+7 *#(*)ۄ!SW2UU#'Qp"D5R7E-M-)Q== ZD=c\1Q@DS8Pa8e$nnrݞ#@ ŀb1](Ah-)}@^PVvY* vz a[Y.lWC!F'UƣNyj0;k9Z*@)BEA0$f II<j2!edvO X-v&%S!1'ZBDUmK::Q}jdL0QhB#,DU,/LƆ$0DCSLbxp a{⛝$EixRC[YhR89#VB+oxo "WY׀g%ܬ!ngEM`eG0?#8fŅ29Ur2qT#mD)K n ogN ]c9 "+M"gBͺRSG~TR&͚h"WzL!xT/)] %1>P&)k; ߧ|uQ"p9,ck1D9d9aJAyJcu|-{W5JV qJRBYHbh6HuJ򬒮a:KB$Éb'Eӵ,hڀ%DMA7W+VuUyi{JfVqx%sQ. &t.N.3@&9D 5 RAH TIDNLOBFPSEX.Cn0r*@ 2аt\6xMYU"&V,lpJ$3 ^(8G_?v4=>βf<|o:dގڮh`@UbE1%$zESPv3~rV%F)*@ L`p3E"ԺA$^"  =f1=x GG[Z6jRɢn?KSERB(r$1h&i}-x ohL|7m;1.Yi\q5j\yHjF3$\}mytfĘlTSФ T߉ iΜzp7>uʰ(x2&ѓbaNIHyRPS,*Bn rTF`VE #eQsmGi?1 q $8:\~0"(ZL24Xz^@ڤ_n3m,[WJW5W" vǟHL%1 ibX K{9vjwx-g`~e4(94 DVּ'ۇT-ħvA=Tg0gQ@+{v@YItzv^P q@]cnM:.vS@$4G68062?˜*^GZT\Gu+dB|V*>{;; ' RRG=t: A8~`L1Dŧ@pLte_g@=(~J:R׼[9uL;#l4D>2aK3TvAsiಛBlvM+"j)BlvA=dI!d 9LEbbTjR%ؤ56N/,]1>>)ȪiLRb|2>D<]XL%ظx:~s=aUĮ=1M9؇Aڮ6L8SMCLs$yq OHx^}r$6' ц="F˄#'.a {f茏1>FLGc|B~óh?'VQ@ z̘&fIĩ{0!>?F}'}Ry3ʆTjiLY 4ZȌ'WcJȈء_4a+8j#sfk*L!>Xk`)Ķ'f?ZZČl[.̡7=菜Ӓm1/mi1c_4oDbf_v;%n5N:']i2'FͲϖ@̵9cCKE95NDFgkw har ;ښiV a|l/?o6}쎘Z#G{EBGk0Mch ceڸ?APHJp ]C$ 6Fa*}[VQMgP :2Iqn"eU[}U8.0F~!]QԳ9Vx$ivLD#DZb,E(^kClJ-Ac4] CKfaUJD}/b9iIBwwQPFl} t|3.9*IιfCyS\ޗw4пbHE,Ҕi.'ks'J[xW ?PR^S恞Z'`c1|*`DВqSJ[Yn']V3Zr^O!F)-Wj *6bf+eF,og(_(e3*-[5. *PG/Έ?6J1[ ,T!,TlrYT,:#T,T7=r5(,f7d' Vgq1 'Fj1 9U|YP@e7Y,!_3 O ^PME:4Ztb@g}S,ڨW B+^^3A ^^4AoEZֵujElzUElփEbz72U׋z]!HZ9YH}Bh#(/1E*ˢKQLXnQ10O%Pߗ*qutV%ҘGW= \"}G.b'%PphWL+`<ƪd[ pt;,&+pm"DWf9f5 π( -yu11zR R\@),h WCf t(.VS#UpU[w5T[EOD 4bOC$5[QO dE`[O@SNW8f"3 !fB4 )bAh;i`hvze{LrAIv"Wy'"Uփk+ BvOC1++Oq =g|m\+K$P[{F~(~ O OBK]L'7T +h#ֺ#f'ġ)jFĐz!R-;'3 IݭWEx+ \b-P卶^1а(o@7F+А'tI҈jZs;ZǬFA-BАGi꛹֣$ޕE<[fM JZaĭZsH-b[_[?.N2OAwچѤb@z-,;:4JDܕb>@yG4\C6(zEGz28T0逘"U[;h(t6I !֖B@[ԦcRu k8gjAG1F_mp\/#EY6u ,GДz$IY s4Y)8qSI(ղldIU9ie+Vp -U DԾ<۳5EwVȸd0kI?ikHXt] ~J!2$X-;Yԡ!]3,;)Sa%K.ؐI38Q>6jDLd!UCLPoh%1! 8x]#>݁@̾1̓ oTxi!vݚ*>;XYʟaB Ǎ U2W9*k"6M8j8П ݀ 9 yGa'<|НU#|ŽP}ȅy$F#{L="d%\O,]#) Nf%0G~DgD &YsQ`dom:\RԼ>di;3ႪX8lܢdN> ۨYႢ(9hnW^ aPD~(Lm_Y c7Tߔ\[!BJKK=hMުјeUQ]@LS!C L-M^woʪ(xŌԭ:C ωb?ώbxP#' L5% #H;ĩs%!6uo{wx%T|I 0١QaS]'`nV r c%R;jːف3uX Fj7$Smb^FW< @/kMY_Ѐ0֯7kXrjt;PbhluP"YC/8Sߔ0‡C@6m_4C N1D%QM- DžQDdbB~Y{s;y݅݅݅݅݅ @bDn 8)"W  Akޘ3Q5:T"kCGHx]?sZMTqi|X׈@\8 cgwrDs☆խ"rh_U C}X-I9BAjgJg 4 6h2r%O!E$\D]'eb-k'R)=+GU4Ն)%"z(MB2TC3k#D՞h$5Ֆ&1{(jy#xM'D;p3NՆ3303&3d9x 9<  a^01]3]@֔"7>^>.l Y="Gĕ7 {'쏇aH}Đ'<=e( CDt9#N!!cJ~OjGш7=Q)h z|D]E=T;*\)s96lyJ=e58(\e3588Trwhp '+l5s"o33Ϻυ p#rTjD\Xs`2OtO!ي smD.af*a -l"gtrMQBU S.h !| h@(@1=Pu_M!H3;צa36Xm2 i8SS6-k6xSSmSH6 cLZ_DȐ8Qt Y9\"@m:Aw:C۝hSZy #bsd_áFJ'AX9.t]QpiWR9sP1 3!0LSB@J7Ϟ`ĂSp RǜiCÚAQ}rIOQ H:2ϻ2ϻ2ϻ2ϻ2ϓeR2r6Wt̰JEʑhʼɁv3vBWiFWxC3\s* =D"NJ= {U.G SCD~%Qm8G~ʹTAK  m*7{$?O_t)=ݜT'w:pƁB;ޡe6Aݦf6 E*8Li oDH {6Dդq!66 HD:S4#r(\*!m&PNݓ!&P3nc${6ZDk SS'CS\l/s9 m N!S oY.#!NY˞`˞ 62h*#t ܦcftHy(km͓Dk^]B'cEN*%N|n&˞3qiCFY])X"pO.O]2`,4%, &?Zi A OKOKץ3!Z1fN!6 t9N)6je>ަk<NK!o^P#r&el+ 8/g6S(u@?0"oO:)"r( tYN. +X˪WgBT魎? "/$KPɆ71 8;Z90ZΝ4L{()ZMM;je="w{L92cab '8w.fưGXRz<3s3Hs%ƟDg OٝYMgiVAKo?ǀPPm8j8dSB]N(bOh,1Sأzp1ř2=B4 (ɩǠ7''hd A F @_垹elDIN|ā\yn[̤X XcGn.ҲB֢0=Bj=#փ^MҐq*:9wcSb`wAQ5ʉ #VmF\`O9L^u:C``| 9vxb7rSbSnCmq4pLvD@#@M5rźs0#H$AHѲhS`t$B2nl!!Eĺ[ [PU3JFҊ~WˆI~DGHvB Ā\z/ĈaǕD{e\Aǵe,Ppqj!RpT#:xASP((y; kMD]oOOO.OtO OɄX X~[PaJZuARMư2d7{#2b&%-j"od7ldSblj pi|DϢ%sy Jz*Ogt|Ϫuwقv}/th`d)ǁ G?bL83VSٻ}9RBFHd|Ȓ(9~ShtFGlC. f%z(iIs")>Ns &o"^'z,V"lU*\>tɣZ:;m !լ(ys@eNmKe"NT^FY} @njJ@{$ JT{Юpa-scaH jG"3FS~H01CqHS7jGn:qp^Ԅ)mau0nL{LQ'Q16LtJ BV41RLLN8YLb.!*7FXQGC,ct1zeY8L9KVѮ0)&Ki>]tL@J^7685uKrIv0A"e; (y qKJj{;`90O+8b4g ـd Hd6IqHHhW'4HV(&Gk+NruG`W)uGQ,F%GAWQp<~7F۰F$̀), zy bKE%]WdD/EgMVNIZ]ȗaHCLS<6,U/&^ Fx~Kc*yIBd#y AftB0'ư^| +hP2F Ϯr>U2/bЎaW0z6 'H'UݓhrJW#:hxdTVhWc@!CheLNe3)є7pUmXrʎbf%0Lb@qJKF+}54$f2*0̹&/VIG$(Ej+x@}6*6ڀ8=i[q/1 ^I[5 Ŵ]}YemCwMEs¾,`H^ M`d&ievqZMn$m+v?ZްBZ,'I[Q@͐JuH/&Ih{;T/ʷVq:]/ޯڰ+òd:hmakMcgZ݊up]0U76QV1k L&VE:h>s7ڮ/&1jF%1i~LAv+3YmD6MWl+2XV"㳳ɲr/,6)2滴nF71 vpm KїaE.&fz0Y[H\& h/eX^BvEZ0fL JFʾi3516bmՙC\jx1,`^da,RFW]5T#b"VU֕P Q%hHʶ 2ųMJ6 }&0a;WI`V;c.B4>~knH&/T7/,eW}oh '$຃#o>L_ $|-7RQ p8%GIT͎֋Q@-0:"tRdb# Σ xQrG`"ʒpP<3C ƶ#0&U#aHqcT @,'PA?"7, 3`P9YN梉681 @c/vD§Dl\N^j! )7T<'"\G ׎DHZmMʄ 'ޝlx,Km a `HA,F0Q +cmGIBARUgAI 5I eɈH e)P X*RMcm=R_@f"Z E@3,R#H~ |RydB%0MT2P$\bQ5FR VJ5*Jb^.(dQO$ K]4HAاJ;DuQ}l $}.L >X^ t1XS׸>`TAuW_>I`J FD Y4~`"M ?/C!C1(dAnIܫ7IFl L[HF,n s I=sbCu]>6) ¦1TUN "Z 9y7>=4<7Al  Q#ԩ38*St=BBNULao2ؒilj (&%8*( 0,$a`nN@ܷrYgr&SJ iQ.) Cd*8Vcͷ]3pIȢ^_~H4JFAU*C3WQ.o%9LƔ < SCp?%sj$1mU4q GK[P~OfM#yPHޜy,}S-%KBf##ܑ)盔eT~Q$~:y"1J^gAUgat*(m4&p՗|PwE  F!w59ZfcFMsU[fL]L LUHSB02mgydz7ʹ6DR]PcrN"cmmṰRWIU|yIDLe~b*LRFђ 0* G`#"qHҚI@@Wk,mM4m9FB]^뷎x(DjP-Z"ʈx*%)n/GTNɢ*R O-P/7{MbX >XER[1C* 3F1 7}dA"1 MTWbgۛF$a2r/ܢ: /sQ`aQĝ Ror+~ hv\ =9~sw^Ds MĔ@c>st5T (*UOB%Ämؤ PR\  \Z+ / [l 2wWƖjԝSPHƑ)Ւ XOq9cF,*祮QMB( 9s'<`*KLugR/t*ՅBԄ 4a 3Z" &jf?"IcX=EM!D3Q9-E[͑(+͚d%+I)dꂜld%)L"S(MdB0Lp^)$*)xNSTUuSb#xCo 7T0K7:3i S0ݼHf)i 3iS0޼KiS0cmN^S9/߄flѱYFJ%BM!.ՕxKslT28 ^B CKr,HƘ TԷ)XP9c(g.bj(D%nTRxcb 5)NUN zjH$xޣ)̦Pꖡ:T  {JøqiMpQ Eh?&.5aOGs{#U 9 !?$2v'-[h)]ݩ@G X3S-@ߋ{3LGn]D̲K:L) s TJ-?#k"F}tA %s=H~|ma&V| oU"9QӊfG '2FbAL{oHN?qٽ[s^3 ܭǻ-(%-9ȧ>  O;5awۿ#nŲ{c؇X+?c-e`m,9mw gϞG[Bnk ?QB9(: NPj}gMG;#%wis1H4bG:vGBpU764R}>E#?.:Jql_&IHQlj(kAb.E\Ӝ?:"[>V~c| ~ _ߵoK ro9GY}8c8=w& W;ܓQ _٪/)@`x]b_qJAqYK\-e1{F?z\(zMgPZʨ*Qߑ #GM}YV>ɹG$_Ʉ} M"~V'y3{}Wi"Sy) bX >bϤi"Cium] _I33"w@3~`0pzdC #I|qo{r5:eNk\uFcsF㚑xcOk{,j{*I3/rM>뱒[b?M]^(g> y^'%TC|^8HD@c=ZHF?F?x?5?q5 ttQ:}bN -*w}ګ5[bh̆+8er!c04 X'yxO6 )s2o&!^Cph6di,ߣK2Ѱ@dEhDI&Y@N2^eQ)ʯ[ZJ 5Le!j+o[Ka~lz٣uB#ATCIA{{Id-8?ݖD@io=C̓m}͓`k; e=\ 찷dVNaqF)“"0- 10c3045ZHccessoy"t$JmNP<|.=P< =b*!:ID \R)؁k`j7+@- Bg#F7Ïk@7. rKLOUVDUvr/6K*v3EP\i-7 4ykI&@RU0S(7B߁QH:" gz(a+7Ӏ#.*)4FQesk "sօ~]*ҽ`&`7@.U"ue߳'r#=f_IQc Pk!8P2++TG zNN*NyNNS5ҍiY'IìfYS|>MJ@bO9RA%k,NӂRk 4b0_jZdv~\ #jHUIf98@Y ҼV"kdH9Lȓ=ߚXhFKY9&HX-C//+Epu7P3gv߁YbE\QpHvT ~l3,qs5,+ ԀmWy0M ./Қ8/'K K @9!( 1Z9,j m8a-?#?-͉3 N+n#cy()֓?-=)x9"HI\91AQ"Ajp}ԩ. /@:ɻ".U .j2?.W C DA`fИ^ "U  465P@NDў~6FQ͙?~9٤i`AFD h(ϒ$W >  ̇Q! &g).o'%,ʛ+ιOuV Hl>_:VmRmYdȂ$+DvMB ݃#¯ZdjF& j22ѵj=~*u3 "CȯFPI3]3)8sh 5@ cm.TNz&&yy>m!XB z: B$ B+8`2J"4~flff Ubx`(,W?Vu; E2~L^ \ Q@ 9 4J(J1 0٭L[ rxr99PJ\1@H`be~”U4ÖU|}Rp1h&gE#`źf3 T#b(QX l j ҈^u>I$& d0.'b'&P `  Oʅr7 9.#U9)DsJ'"#Cfa:\eaZ+pѾ(3:%VtĒ[Gv"4 vLlY; (N,P^,)pH^\ sH^ nzP ﵫ ~Ճ3&D&@Ɠz  ԫK}*BORm^S9&:gh_ 2N/t舩sҮ/NbSzGUI$룲7'zz,*JE3g(3BXT|(X΃n:>A=7#ߐ4hr r+NB#4C @xŒ '@ҿDm߿@zoIv᲎@@h.>^ 8Ks,A  pI`;'f=L=4On"wu, BMpU$sP((1 !! dę ȁR# 8#@ NpT A)@p) R , E01 -++U?S B$TQ- 8-ST~ ;"'/Ap/Pc36SI3&3fM44O55z6O0 mO#HI@OCpNIO}HTDrlOA Oly LO KKbDt,[cRo(~/._?W9Xҋ)Uc п(Q8Q+г@Z@Z@^O@[@[ @IW/2p\eeЃO~gGJSr((iiOO0j8jf%м@k@k`@!qDE .mV| '>+O3#/L l. `~rVf$^ʁ7BIuHyPZU1Rm?]PyL'i4?QMg?ĖKhWH H`Ĕ,(HqICI( % %X-&(#Ęj6(E(?!EY)Bd̫(lY)zrBb:zJryɓlk1\߷Ng@1M#TJu$' @5 ABR HP OT LSND V2E"IXCJ(0\@.nڊ|U&p_F6v*8ž`rlh@ U1RԎ_?HlSPv3lƘ:1xF/FD U> LN1`A}~DQ IT) | IA@[`D.#!Iр 4*&|GI "/K"o7o"-kag+:% ^͝4D# k#h!\ -bxD>(r:AHV60[!UZEYJh@G3$B(>a]v+~MѦ=p9h)Ngk;1~dhĀ,P:TCr0r 9dl$8"N6L]L>M)պ +5Ŕ-a-Kx2 D$0NATI@nOD`2tUB0R S?J XЀE/z& 6\.,VHP C=_Z*<(LyimWqug^l8>r` U21x%c  `*oA\"HaL+D +E+F -Є+@Ѕ+@ބޅ$GEG / G"KJg BѓBBJAg<fG``IA" A/r8 QNu&WSfBSjBBBBBBBABNupHM B,@"H SPv3f@JQf<* .$H# # # # Gp&Q/ aa EaaLNu@A g 8`fHEBE< GvxfTCTCQx KG##Q`Frp Ajg@QNu @QNu QAjNur2aJg.8D@gHg d~` ra@D` G30lNu `````` D-BUG SPv3hAw`Ҡ7sFclSo^S-툙/.,w,\v(^af?6*kmx5mS~I~cMG{1ܞB nި?S'Zoj4!W^ƒp.̷u} T]:746XD0=-5!Y54,P4. `8B_Rg/%7-Xb!M/idNA ak!'f2Ke$?Oϥت:4;k0a2l l@dJ^P(Q(dIɖoƎ<=x%=Ưo7~`،9 oiI_>Y9ḨvU=@p?± ([tc;H]Mg)B6)gfkzH;+<-RVý+7FSAJh4E*_Pdi^BfbDvOXi;X~v~6cT (Gk8`1+o/| jTn:ZGO'1+,PEM j=V,H#l5@g,\OKkf[x%@,nxEf"ʼnW(8!1$./0HaK@3([A=:J˥r>9H"H/@PH.I Qd4 m?,}]1\OdE:` \mb,x & OmՌH? ,@A4DXIAPA*.ڈq`CBsIu'0;M+!=!RWt _:.?1![)@!iI>`:wgL^7>בJi1'cua62E(,Ȓ f?w j'cb,[oV( ?ѽz`I1hkޱ)Qv#]AY_87jkL T.0qPpRǡճtW=h Z D֚$*{6"!Bθ-b;h!aLtnEHbMZ dʫ4 X awc)?R75no0&7*?#4f_[ٽ1{ĠHbkn@*e m%5;(L2^'y 6 y!8!w*^;36jXq{YPr>㷆KJB3ƶ/̼*+=hx/QjreD#G2>cT44Ƽ8n?-m܇Ob' ɤ))&IӃxcxC$htwNAQxVrw+~ZYyQ{+ \66b(>lC_="Mܴ`JZ @1M F!(& q?bmMHMG$ WVZ^oI]%A\Q_XU nI<}K\_#G!ڮ# f*x*X V)_ Ӡ wpv,W9]jA! (/::d.;>X rIu&'f'Ar{ /x(^u[>-E4hТ + z*_KUPxj4;RW'JDك+@yD'\vI9'>c@3 -5^"ޢ;L ":bXp*H a ue_d2<qbP N 7yՃ0,ffG(h(.a:ț %4c[ѫ:<4F "Q}r9D-*%)2LdOhJ_Dpم9*=KN ьvZ#ZA49X18RC/\|7(Um`ri% xj ?lo o.oHUrrz!cv#z4<r/5jMͥ:>o uvv1!yΊ2>'pOODH >1X|th'~*^B_A!54R8` vk"oB"uNo9M'C}3|C&>*&HV~EƧ8wl~h9T P4&p~RZ'l/%}D'ȁ P`UUZ׽o`DC)տj$,"Rp"pK0 PHQgk8Rh8P'0?8_q}~M־5~hb>RhnY}ZOW@!V 7FkzƱ* qkD&u' p.5z VΠpRůם-Cw '/*!TjeOL#ܟl @o6"PS3IDXFPEB )C߀]JV ƭhThxh& 'ڀP 7eG3ZDž%Stvx:\1B 1;m :6P9JiZ1ml>sOޝ@IDly (L:1p&KbZ+,c#͐ Wq//E\hcnbtX^+4&>!+-4oW_07<8IU6=~@odX#[Ÿď8_}`v]s'(F#TA tRtG;κ,/E\N .L=VƑ_ҥaF9__N)1"(ϕ~ A?0vz AGdBʯԕĺݧ#  $]TcvlTeUp~ 0Z508"'DxvP#9nUG H* "']jTwrg%g_k`qۊ;ZY @? 3 k]|` n_KNNI% cԖ;{EP!H%2$+ʒ"❂7I AkZ[IJFЄ2V(V3"`'g~֔-BXΐ!9 T FTz;=T*syos(93~:l ޥhPE9ަt+E5P-SQEZX``O";bׅfgC˗̅ی@be m]ye;(W `ōf!P-6P8%$\TٱA D aE4"8֪>9x$B;l.xúzYe*XI^(Xi^}"*R4ZZYq`F'-Ccapc w]q z-4]6N{t6* t6Q./ȅ!WC[2)h)ɑ G=h\K8]RIQ4bj }=vΔf~AS*#7 P5\eԌqNñ]ۃ9E tG!V[6O:w4g\}@Z-ݬ_g ])$P4 ?KYtYtl/{M_RԜ8WE"ƵgJVV ߚ/¥\1_S]Pv s<2GbLFE&/qZ^laʕLO1uPZ\\7,7O ftQ}ЈxqYQ p^" *"/9\ afxBtW^f3V>_3+kEתx"ٯ|X.0U;56*Z }*#5m- 98ck]0;B"!ӊGh@>!% !#_VvB_k56>:Zp$ht+jg^}yf\O9ѝ5[@Q ך,P\z3 Wlk=8uk +1P(K0vc͂ pjbp=1q0/ ~[mc,{<~2_ YÖXi)7Xq۶]LeK_;T/3fYҐebʎ o5UK"?(7e$ )a[}ߜ{ cOBq qnq)U+_h\i|po W gao)0K~\!e 7LkPqz*{X>K_%O^9$ԇ~_tKٖ"h eU⌙=،fQi:%ۦ4>lXOVqk^ VDViP TQDFiZS q#TVu;2Iy?7` ._ VIoy.<(N=6RJQWRNc?`^X.XHod_|/gƯ :1P?N?LC \C|3<9Qg) Q84<{:JJ©4GUV,֒[3]!eI  8YEx<62m`bP>pcĝgB@^htҡDޚ%:b`llh(6~]o:\W8 G*6թ4l0v БN^_k'i_&p8fk_&J.*Y+oABt:('Vh#{ K>{;Du Mv`k;$1ۖaz';Ef/jI뚯x_r\Hd@5fwMalAS:Fb{e%iG |sGt::2v/I?{1C.3@{C*fO9Rz9蚆pQZ0P+6Т̈́B_Q払h;E49 9Go?&#!km\*4 *!•LHN 9EN݆m8ڥ6Cl8̠BPez'V4lmMz7Vݛ 8iW'X(QrocRM'T0׿=NTN8:^*@s/(T\ 8F@wn#/88.*4'6& ,L!3dCM/J e8r@ĸ hmۼm!*B/ bczpȯQQA),#U^rm6'e؅.2RM@O6i'e'sS0_:d[6#xHt18 8E6l*|> P D10+AOVL4t-E-vPpT8jO^(yE)Ppt@ 7%.6e9,jƚ5@Z4f81L)&VfO\o~@#.3TJoad#}ZV~ğW0( P.[Vd6$\tFG̐2%ZH:v &fOF䔓>6[b$:59T䴖5TƈܱIJ W1oS?0zi)x(:_XbŊ+V XbvbŊ+V∲Q=֎z*Ŋʥ ƠbŊݾbŊ+VXѻXb2>:VXbŊ5PbŊ+VܬXرbŊo 0oHO hG$yPOovAvkgU؏lC%ǡL1m_b"~4[v^C\\m.4VYr6bh*b磳0Vi-@U84og w0PcHm21|zHg2r=W 3iCŽU@m&476m1-3% D P9봣BqZ13ͼpw8!!S1V"$_<>Q(r/3ږbrv‘F?(kK/Ȉ_•66%yDR4~o|\9`x G6F-,E7Lm$qBTH)vwZ8&.:x4,?mԂ3v~UUX8;|k#6O/ä1ʄPⵀb2@4;JA }6.#1P4V(&)PJ8-6mE hPJX81lW0O,zRr4{paSA)K=~y g87ϑkh0k> lD~3\k=4Dl+]ϗk%k$X̣ C.kW\UO̗(L0XH`d{RA)8׎.4eĢ+h..:V`j/LD8F Zlצ*/na:-> ޒl[c -6N΃nQwD-R=="ea M/> j@Q6SFΊ)c-eHI׆#D=o$$Y.47G16?dc5*5D2;#RE%S>Hh* o1iW`*Z@wѨ^Orq_]ώ|Mdh\3S0ua*wWC!8f@7!?jCel&PYUx>~cځ23 U a PJ**YBc7zY#,̖d\jJuJ8.xT a?D.e36HIӜUYi1LYX-خ,ϕ2EY֝; ?A@.,.aK:OҬD &`wԂYS_1!+h/!kVӝVZR-PKmU{j3#n ⸦֦<6U %;* pU\ vB44!9" 84%N6` g}:^d -fvǀ2WhHf  !vVNp`p!Ӓfصv1R޻*!<3k;Z@E81d%oެ'ȼ2zmYÇG98PoFϮZJihl U\Pl0DZIeQCbϝ\/* >L)ٯhϔP*.y mHoWX XbQ#, nj~K=c| l1vA s֪ʨgǰI:vU"tzf%. XYv*cK3J3dkJG+v 󢾠b01 [^Q4φh\살s*+m4D!FkE,-G[+FR,W8S(\5;+lmk"г{9>ޢ3q{d D^)eARNX\vQ:\ёPr4HCghtg*H1Zmpj\%hP X & X- v@!,47?+= ^2±)tZUJ{c} Xv3"fx&%8) )e4>$?#; caȘ bh_d-1b<34ŗ?FNEk&d?๼fޮԃLEކ ܙs%O9<8HFW_z( 0yc*xS |JUy2Rp~T TF3h˶B2U&[`rNVE~KG7\Lqtq,C)nD#OMzuMyAY*J*_Nr@eK\VNi yx'm"OsW@#~M#K@1sEHUV#]3YBqqJAdMZҹԃ_Kv?KR鮞:C""7S/O/Nin]6UoFsAt.,%Fs! C_.v@\:)"dOqCŧ\ײOk iߨN+A)MO#<#躌(jޅ4\بh bU-O8=?QJt;S)l&g%p|_vZ[&]r0b=4i0iGMCρZk(ZSS¤?R')z_]F+i:;:;piL8C4P:j>Q#Ƒ"L5p < "@ azf4BJȔt.\<\r˞rpdb 1^`v;8"3e.܈ۨ.٠9?Vf!-W&4ڦv 4j+4J'|pPa14c:`/Ȕ=e; &e!i 8όQ3YIW +SV3 V h\?UV)j| Q@QUm҃}Aj ,j,iXک#Ġ44>~xqx6+l RjfơZc/]W`ƃ@Dhi. WznǘjyHcvه!l".}\1@u[k'3n?lU ;*iuJ@m;/[1:vCW#^ Qà7 TQ%4Bt~szzX|BB7qcCƍDb`CJNz)~J !ƃ*$C7) T-''ٚLYO0/UȲ N@64%w B:?KֺL)OL/8(l< ʵ:::?$Zꢆ*^RfG8Ŕ45YT,)zzuC!})c MIJ͠TĢ)`VE*B.O"#Hqr5沣1fPy[:Gdz j#ZNj .v2ڄ^<P74n/ 8F6DZ{m6{b+#nS"3l;ꍂ-һ짊x)g=#2 @(4:7/W:nXqCdHg*.VRFF Z\MFl)U-\)jj@| ƎS$hPז TΊ'9ن/R7X:S-?' ҉OEW7pacax2$v}l_RKb~*"cwȀ̮/k#@S.pىl;hS8VSS&_5HMx?v-0 vYfPp:-h~vh*~Ąv -b@GzO.[薶=ΨkV&kJuG3Mޡ`!p48#Q4m?n2\U@x SlѴ켒Tb^4l`0^8NJ˒0 B6*[Z>Lb%c5iTWD*%#h:ҙ$Ɯ@W)YF" (2d!P.jR6ʀ[ ]/tMqli ô@@gCx ѸTݚh4Prr Z񀮒Q_h`@ 2tFt| +Կ̫)laOyXfWPj됼Z.jJ' /#VWMޚd nSζ /^[_jBwBC9)T<-z~>+JV^Q]<*db(#Z_Jj6H7K@VXLz=Q3ԱRƶNiQ 'Rn8^WҚpe" )ef|j8e(!<xH U+6>"̡#@2  ҵ 5Lzi~Rם^Ix&V* SN恹38QqysKy3:…[}M[PF4bhXU#w Q@vw";O^fUPNꓠLhKWx,5hQ˷W⠔fty^!Ŧm.ůQ)Omr橮 _ qѼ`^Qx 'oԦߞJkP{ՓRVxNVuՀ:`_@ǗT Z@#ܐS p4  ո`>)4LA1֐qnߒJ0LO+YTaP"y0x\ J!e1Â2,*w ,)U}vXm6RY٬8:_y37>`AQJ4a10wjŤ<%/f 5ЯUcʾuUj9o1&*JQz1K f HiXOŧՁ*^tꉿ,QTlU pNZ#2NUbRB"=U\=l4Vl_1Mu8\I: rB50m=~YrY`uy_8ϓ,G\ b#Ĩ9d3ɝ:4`")3J}jt6&ݿS)nȨAx\\Qղ/.*O检R0X% ڨ>pj>kȶc46dE6K*75}mߑ+7QPg8.܌TQ{>|K.Jܓ5* c g}WQuYܩOFՁ>@盌ÓV@ OlfR4ۚcdL\w@N=>+ <m X d +>)(d39 ~c 0 @ jQ Bå():u+.(iG4eUF^h7VmMa4TM5Z1e?,'Y!^'seS5jeJ۞4(2J^ . !{?;;1: Ns  !à5Oz=>~A"Y^Qܨͪ/Ch8`Ceٔ8B̠<2pK3{`iF hFC;46>樴agUU׮brf#I Gܸx.T:E/1SֲC S?a$GGuM.m!%U85R 8!,&Pרlb>37 mgb-Gͨxgs`8S6MW86./-B1ؐԖYuKlB֡Ɔ\،6Wט#!G@i#b8:8A5 P*VȸSUҦxT:â}WSe bW۲d Aѥ$yJ(i0(]mg\zad$4 Jio"X@?@?^cR(5qhvD5ב639 G}G,Lp}A t??(<$h) ´ #h'6#Wj:WXG֚Jr\V&Զ؈T&-VlhF2lՉ/:;#R3 /~uGx(ݨjW\Nƀ:NlťWFtA>2\yhy0:*R՟CkQY3{El3g5|՛G*PJ|WZ/hs!r/ b -4C~MJ,y҃m]+hUm'Șmvj:'~PUyChۛo@_06LZ{\\i>ӧ~S9l(ok @uj8>8<+/.=+&ԖCӱ 8ΰ)T<ԩ M6+ , H^(TS%Svl̔b>+(+FJP拰@{ =(d6+6 7`e K@s[Mm:T6#4=XLGKZ12Xe@+W݉vI˘"*Zvd/: qWuWJΈΎ}6l ;a9eZt"0؟ uĴhCЉ=dF 0[VbaH   q (wTOQ( )~7ȜL) 5Fd){'ߑm)SU#L ;߾~_⁨𼬩@@m40Q |$'icw:͜AU҉{ ȽHA8?Za_h / t7GDQ d x#U  ^mC[ў?WFq.'wc:w^h澺H@)w%Cy3FpϩՈ6ϢfٰP1(W0;"`0ΞEx_lE_SO4j+F~*5*f~`-3@ >#r)3oFKɹqq#ZU8Qf=*oOWgKv0F}(NĢΌvbve aG*s#wC>]C~Ԅެ>@Oܴ ̄ͽ 2?g0ăΚ /Qc n.ƎBZWܖw?1xDh<?ZC/6|4Ri.!Q3)3܍3fLAK\.Tw֧~09qlPt p}2W#(AVPG1:uY^׊T#V axYf"zrd4J>6BBx8DjKx:R%J7L5f9b<~4JHv|Qn˞>8͔4?v(Ȗ`˓R F$>024 i#T ;0 ˖e!4"+]d .K:d1Yzk'%#1:Yb>&8n0oyS ¦ .ǔ GhVw(ѣ#acRY|'Zy&ܢ;Ӂ'0'O zqjE0lM-kk&;d*BՂKRnn ix~ Rnba);a !%!8b5m˜Fa9nZ-vbۄk2|ƣf.:_d7I&"[]W&1ԯڝ: :vTW3v]i3[g# lcP. ) scp/%.)ǥa>ZS937UJI%K!ǍYsʣт:=˺sI#2* '?j7v^D"5 H ̺c#"wj 8f)z)-8j0B;*2#.8f9Jm\mFl5 #.bڡZ9<27&ZMz>ed6y tlnU O=DHl2OH"jcrGJ"'"C S\5E?o(a?j(,œ8 ЈMb\4py:a{> C %2uUQ#*9Ȃ8\0+Ag2q$v4Mǣ$ޣltFɃ 1 *X#`aq s4)nS1%8&ּxQ] 1 Ddbc۫xV=U \AUol9)1)ԹDq MmӜ Obg'kzlv BH56$"qq҈F8 .=Dm=^Qk%4wcN~ʉ⊁kuK|*MB=Q8^W5yV Qok kgK%dWj7ɲ4™ rw,16*~޲ovmb28B 5#N%ɐaF۔*W۞#B`=99a4#Ֆĝ@&}?hr|n[)x#VGaƪN̔ v#6'):} 9PX#DD5j0!FVmWS<đZ/.b/h [~ȉٞL6)mJ.+.@IA t'^Evѳ%M&>]M{euWɜ%*鞲׳x%bΖoP$Q0\A{n_bߞ)F&H$B{8!|x8H1\>wȗ}7/hlev~9WL3ԡ~lz=I4mzҦQ. \6 S2>#8@y*uWbs~j8^YoqDqkBu Bkh#씹\ll/v=v^e& >аXn"N ]SVk4  Dheϫt*\uhm\6 \r@xG /4V5>{܆k4gJVFܙA7 z6W8_U+>TYpYjXPל)٨̄J#ԌWTdKV7oA#;F@! jzbQÅXÁ&ԭXHݒ{W8x-wFY]'/+塁$kM;8aL)~:gogK\*xG鈩Ws_26C(B׷1lCVŵl6tecꩵ긊{Y.!̋[҄у/eה$&06Ypخ!ƶk?9a4~#.Pİ`V(0G ‡I0A":{M؇\Ef4*N,H*L%fE*5Y:B&II1(/FO$IUܳђ4%k$fV{3](Uʵ .I۝25kg¶_rIN<6Tnu5n![zԀJbcײKb,8\.z6u+v-:I- uVpJoEf<&޺?.v8fY-@*FY^(G81qv,`%.)gP§kɷrFM-Ĭ+Bl=b&Yzv8]:fڵ=[~j˺qoW;.-Z+⪓6.s>?ipj!- d@̂ NM9ii@1^vEqNJU T0 cEh ֹ*Ujo$ܤ֩"TsbCZr!tV$X/vpXQzvSTSL,{p:(6Zrb/̼7,]YYӗ^Ծ1:Nʺ,>Jy / *IQg+: }1Ej*(OM5GahЇ+#E/4=ݜ˜z5Y*ʋ$/-S4Yg@:_0>G&mtGf 0$ԜVlܫKV{h6҈V !iUw;u5q)av9Gt*9,n#4V5 SK!P:69Y=?Uj ۽YV>KEWHĊ4wU^.iNٞwU0`/Ů8:zYpl J&K!p \^'E R)@ekjo䦌WꗄVkDv ?:S^lɼܽ(0ĥGHJ@jK$8騨)Y5.F(Y \mJB\O8Y%_0H MG[3л 7iV` &L .>&| Z^ lz&LԘ0a„ ދFVEZVG*6.lM[l}G)M@MjF_%!T ^v/*%)ʡ WJ…sN9*hd8:L6*"ȢPT* `Lq1Lɦ8>Ae}\Rⶋߣ@h. wJ" z]@le>@/T㚢<7~4c^.5czI֑ ^4+݉& G.u\"GN Ѓ9A9HPJaR)Q|Ys4'i.:c^nj4j,$3 q :Um2''"s;e^dP'bb#šL&{ F1,4e˖ * e˖-[vCyc&l. Xf/ ?g3],ԆYjK_ ;WS[W#3@!x#ɢ, (ҖZ Hm)_䙹"臔%ic*rI V ͖CGdXOZWxS  v!.R( KhܟÕ)UTbGSpޫDјzm2-CZpzd1jܰ>lnȸ-l׽~(DA+اIT0)FjM7P3FC/∢-P U'϶[Q#IED!9#SPOT]M<8)F5JИ%䩚RF.mҩ(o@?2_z/Y676 fܭk6\L;i򁀎BQΝMd Mw\aYonZ-lV8ֹ)NCZOm\=fV¹E0 uDi_dkVp\U`=e7%1#*͓6:ږ(g̊QT~&|*b[)!\s5/nu,Uxa'1gBֈN rc%b!VէRȜ3P{̚^w4I%#n u/ՠj?eb_1o\5jY@4G.Ȕb`ƫl6@bin|z\\**YCQ.L3 O0WbJ!\,[ҧD?l0 VΪ6r3֪b^H ҴbZ4UAhx1*B'jρIKjlbR0Xhwa$&ss 0|3`o.n솰F?ظA7\_ɲBiE{KB8l_<״c/zh'Y`o$7TudA ;R[Z.5YKL<&UzdQ%6V{'bCww z mӍQu%В ComLg5km v+*~.Avt+kJjmKB5ksx16Z7cŃoDL8  dO):d]Miikz8o޵i!֔t*㠫#L(-45j"i窘/ĺWtB߳%mpv=::ik=;ڂb G57nC`a +\e| Rkxx}#~@rŠ['itU&|WGf|vXSX"xl ,Mj7I~^Y?BLJ6/%|~Hl@l56&mTHԖPk\VL6vQX5Ō56+f$ 4 vx}"5w?En傘!u-x/홴\`T((NjvR5Q%E?p% A,Mģ@U0j#xݨ2Ddb(%2*t $NJ)?/z𖠚_6~# 8Kwu{kI%El>vPPZUf5;%*%lWB7(}wD>('_Tح̪:W*Vf,+46&8MĔf\@U0fXd 7L sBV,h*k$4MyW"첣PͤW79(Ip|z ?jxw@ry_Vb$nm9p"j= ` * .*4  OiЉ8+@sb VUA.13@yRCah,])1992-Ios!hyTQhlmWk.PMca:Ў( [s]<0ui-1%LF>4@+l6. Q(xi/Gό suomR.Aq9/ycRA3Rcy#AGh/i7"oHlukM=MTk-o=ʞdsy7L=R>PR`\"YQ .#+0oB>wӬW=/=A6 t,(TLcc@Ӹf=(:tsB'K;!4C1l;C1)P f :=P [9]C`'.P Hb0g8<#a80Tlpyofo58lT3```3@c{!5h؃A,)(o`xO!u hN8ǩ8PL[ ڌRs3<7%;!  VC'lz$kow+6P hIL iеixQ4F* Dg :o aOr,rEroF]m?F o(&m`(q˕+1a@ D'.'mouu]6 su^bPG{Fq ' -!sN8uc_h1'Nz"7)J{+FX$87&O4C_P Gm$+!UUi72̄ 1# >ri$ѥH/Mҧ+U!4tUA#|C>C6l݂tР8EIN^ ʄ&_f|ƆeyXh7KC ,Аi9A+K 2R&9>ޡw%*ry%*e(id>o !ID  9̇ڣc>4 fz.C<6\C \1 6} x vp@V /&p@</}EYi0]gV-IuJ[.ccaPQs]C*"[xn$5BSOkJ^tM~}jQKCʾOU N0<{QBxMob a>x U&lŤΖON|O?*7 mho04E¥GNWZߢ2OqW3_K` He=W{(o)OvZF\NOK5.%t$P\ብ x D35m0ڴ.Dm S,8 YpV<3M(䷠`؂a >4.OW434Lc3#NM1.Da|_TCPX⤖XSLJ sQ><'V1-f  |c8+ P76'OT\҄y=쐰9byÅZ8mZƅ,Y e@ŧ ,NS<,pC8Uq8~I؟Z괷0N^?,Nډ X2Q]9̻{MOWUXg֢2|CxcfU4QL=%_{ V.^cވ.Apz1ݳ@h 胎&FpOzW!0pGಌ|6;,~枳Ĭ_*p`ֳq"~3fHO2!n!.@*1oW6"~$+2AyfKJ8?r'b3?~3'1O*L6]UD/H`h!`^!QK4O60WG5Xdw~q7xm!#;p)BNȰKK/yt뫰17X_z )0>q4`f2[0ӊkG\Ҕң0hF@MU]3yޚFGkM9 ZJphߴ!s*; XLiAcmOuL7{i l!oWp|361\hlAhkVv|M*d9m**dȘMW.{,:pdUo%im{n'Qp*ӊtXԒ 10x['' v9ߘ:-@xlhf:Boq߬{7G/{XF6OloKVyFbwu iOz5B.|nd tղ܏}. !K"ƦCfa (4>*e 6bu6,? iHrZV >: f./A z~:aa1Eӊ#5Ám{46]:ftJcr`>.*4 |^(8<4 ĝǦ eJ (@T^i`d|{H# LwGߓc3; xc}=舢^1(G֕~]i*A.e%p=GE%ЉF0ԕ L~yYŠ6Lh|()d>(aTZ$-aLi!*Ϗ]@A#>8 F|90$paTa4J⽒3@؄*<3alvBf-đK0h ɮ'SVq<Ԓ"iʓlGh `ӑ `$ZeWL. ~&*D#6џ*(\l~lHޞvń̍ȱIk#ʃz;9Q>3 !fvZ6h9b'x3X˅]\ΧEd@ɶ!9$҇ЃpT*aj9Dz!9p冐CrHI&-i9@*! |*I@J1v“) gCZ+tݖq_\hV:8M1Vɪɴ,PdYo8qr{ ,$5 hZ.q J wiIG%7k#M|6-,ֵ VRUpg;!=i{Wq B^ud'rARTƤ!{szIzWI.є]s Fgj/7ƣ? {dxr˾0`jhXEmr\9qH6>W}clF6i ipvКxd*}({ٲȠV*!"vrLó zu^AB,'fX!QiOL0yxR`œNgeR;AmVzߙrد1sjL"I཭< " S M -c i\jY\ /u N.•ꥤ;;ʕ 1va'}0=hfG<'G$ ҭ-CoIiS (]~_ ~JR@mPӳnlÉ^#v ; aFf8Q1/LPA^W;QaJ_bm f_YB9#ՠ*$U!ҒL !xLv yVv_s;8 ?,(H8FKljLX&R&>fp( @DO<gf&ipf?<=x _BIa/UY/A,w>QjlD*_.#p&69 px[nk7D//Y`]݇#׼)\\vw{~( `g6K՛Ѵxh3!|U!]_:/JD& Bz7MZq zS yV,b~kQ@U/N=P"$wNfY6IKܸQJ6jD-Iq+zGsGk79{~b:aQ[ڮU,;o+.- QjqT`C MLGF^`'(8 ܒ.v =! kI:BFx=QT̠N0RƐ`=S =]=[OhY3=v?-È Z^ {.1Z1l {Dl`$/Ur+8,Pa-ͨTQ֕^z98 wvP/)¸NؠkOue}UG1-6$4{x bCiﱓ> qk1.-$PU#.m9t1"$-WوU}Jv(JȐ€`]3>6%$..XM=*~\|*;@vhKvxL=(*A, ##,ngvP8*qkOҁz!=jFz%хTмMXCD+Yƌ 571:{x 1s uJMq fot`Hڸ3 oz ;"3 2͊D+, _?X&75&ZjŞ#mGPmW6YS(n)6Kt"y' DÈƘ]S#h|Zb u6lj6 jOk@\~#`dJX/JUSsN _/qrXl>:}{o 6?OA%X8Z yL=/KJ!?fO RxX$;QxjqfSl #n1p?lu&1Z{GžycB?]"W*zoxWHbf-o~k0C}nl %!f`JywR!1=qp <+Dh/M?@&_g3k׉i $19§|?&o JlU4äQX-Wgf44( 1$ 7Ꮁ3Z8BQ_`_ϘFS+/ 3VS4 b`ii 4M /&Y"Ҏq4upŞa D%_O"s!)ݺbP0ʂ357 Qy^OHXP.G,"4_8)k3h WiM3XD hP3~D>u+#TZ ?3Ȭ<3_* |H/)9 #t=#C9ѹCA؏ ]VY̱ފO]qU&B.Q7-Ҕ-`8 2^_(`SHМzQR (&D&I֒G.~$2Ptļ&B#4 wUA4 *~K걇Ac4yx JO-F52i-5Zw9_L97ODkvy}(\CA`&usv 橪ƅ₃.Z^m]`SwwUMD,w!J(0h |5™v^b58C, \ŽBV4"WܠԨh/?= X`^ Az# l$v :T؇\Ef4*E)I ĵԬ*&4:\$))E)܅,?0=+щ4k? ӹ蒶k% ԛ"ܢ얙˻5enSlz+V-7"~A'xTfáhF/«ª=4C3*چVQUU%JXc2vvqуGSzeB㉦ʾ!yO84~ׯo4SjJ»hDh!=QẺ*UU2lᗀx'*$d.8dاl5BƔplKe䨊(rLND=xq[|n#-u--?gHN@}W1Ʒ7FԒ9kQis*xb⊖9Xr!*?!#4X- {9]E(vE}>GYDf {VK"!axesau#!' oh~-xg9Wϵ9<$y8-g  /f&1Ⳕm? r.\BRM 9F!R-}'? !QO1"a!S].uBaÆxac1 lu48be<%3ƅcR?}Vk ' 6Sl8\e.%a{Y† k~3>:U.Xl\Rj&wܢkaB㈪XQ@uyЂ t.n'Sͥ4bCxL>3,rnsLl?ߒ(W3jpadr cwpWN Vuaf& mzh|'zP"Qb[ofΥkz+fT4hVv0 lm<: Ҧ *GBw6֨~z#)״D2F'2߬NqcoS:҂k\V?Z̡ǽ>_ ٴmu˘*wg#vO}A/Ce nH?BzAѴ[ۀ-* ;W ~.p D{ƨ(`#kLS?$cWp'WNt0ZS"[yb7:.-P(q--HdD#U6IŔ2">z|'I#T|ǡ:/#_4k^WmL}>> BSKwP(&c.ب5K@?5N8b.K61u~ގ]1V%c\z:՞z qH64zJBTɿ?6ů+f kxU˦JՓGɊ[Cͯe =fAѷu}o/wX敔M[ϱU-9W˨'9饪%?s_WWA_[#n "5~~@n-mllʹȅmb*/5ڏ+// Vsl?C`ь%=*m&4;WQX|l#W##X5kFِiWf&JͰ~baQɱ;3JM> q+2_xE یȢZ]z'($2ux(jփ-9ao7m^&Q̵, iQOQ OßE1i@HnMJ\Oe\up3.dcog?vpy~օ4Yaߜh9a>#JH98jѢhƠ֯4UYJ5͈Fd63x`ѱu5H*r߷7DԀ]&9,P[rޞq/!qOu kuZuitm=RoTs:P@?. o.oueh sX|h *\ccssyIoo ٯ#|((۬0ZTh $n*js(Zƴ9' a C/(pLy}w*ߠҬǔǒ@mnDŽLO^HCRDKRa ?F1)8߷.c`8 ~ /I!Lchcpˊ;\ pA Z V-ԃMbYpv^Y򇷗_ȰТaf(@<_ډ /j7|y5 ?[ 2JCl|؀?1)gQՕHkVs6|.^O;(6,yݗzEUѽJ{٤>W^y}2op =qU̞U nQ9ypG \>AEGp΀86S:pؓxPc(u>hQڊ`w1`sX2PiG|PP \P\'+W1<~6Gt6>MWn G|y Jޚ؉13pZ>z:'>vajwgH,9ap@6.Tvұ|ẙ[b MA>y[wVN6E c@L\)> "cg_&ό[Vז-Ł;| nm*j,Da^MNa#aZDF F+9)A1z,a%c<]O $6\F,v GZIc&q.6UnE0Fd^LU~OM˪BaHbq(5:(Xe(G1H,NOP\K2*4j\SNԮ2<ͬZdlIVz?J5oqVy~0!fGZl+J/xk"*1T0@/O|Y7PAA]}4E9_0:r6[=9A 6~ YaHNV S(I*[?$iFdv$B ]r|qQ0PwNX1b Z`-\Lwy+*/̂Y;-Y]@`K^cz @" N߇ J\ga֠~r26Kd0:M ?Mj$|phi7هX#b˨HFϔ7ۇ90^@2n:V3zm251AJN86l1WE rZHLW/oI+R p|O$ Ϲfַn dXfUcT]t h I$JWd"|f0#j1؀/:|`s=$ib`-ԍoZlw]}0xF l+s)ShfJ+* &C_e, لG QM ($wqşh1/J1/k:H9C\OO=_^'+`@ s\\=֟lˀ8=?oUSvicg: t @ Tl)R*a4_e% 5J8"Y)v( @:n#:@dU&RB*f9g3ZoeoYl:!49͍M:Hֲz` pun6H0_&JYDŀ#%5jVP$R` x .X><*>++=DN/R`*R۾77@M3A(M )ҥ_yh́Ҡe鉝=2SXM*9^2IGudgt"`zx/l@ kM.GḠz%y\O/a;R՛xY)?'VOUqM-ksg^%)Yyy'!D!Kd)f 8Y=ko@w?.O ِwyqeNaq}!C@e \@p?М.8]uaH|$nx"qEA?<>_:]E(Pn樛} ɮ9#)ȸbhHn:-8]^ar ajVILVi- nD ]#=v$ V%MYH(-MO0),o 8+ 2 0OU;zƲMh-'a@A ^>D (\pPs[ BOCN-:DA+TVC|mV? )P0yp2kA Bpp.4 heYB˜)9 d.4# Ev6 9} `mu@څQX)O-z-r@TShP Š[{HLa#C xTG 1Bb@B `^>Ku+?4*6Y0[ <"vj =` xj~e$8{`a f {vm APwْ7)nUhSH >ֻ>m !pDWED>i*8DcP8Z,= #E/BW ¢=2HG 1";jaj2Ӌ7#z :x111( ¡kA4(:;~dC-d?t لWĀ woj -x֝S8 8$fsŸ!pzs X ,[]u- `ON" O&  osZe t蜰g;8`,OsK'6ߘz Nb-cӘ_ FƂ;N9COqU9oM$ahn1EtKǬm90<ޠ9gm`*kd/_2*N:(0MK(MTd6Eʟb5DF'6!xejD&,CZe .K8BؿD"`[=(:6 59uEԢC7 ,BC"!V53SKBŸДH{lu}6G f`:X\\#N<SxLN~aq߃ XLQ AoaI$:oV(bT\@;DX߅GŽ=x0x<%Eh G?僂p:'c˾P#^szz|rqR KO#6^#[i.C*C߹̡v)pFg44>: A:8U0Ss)]67X(J!`!N>!\Z z5~ q=?dLY#pa,MpoȘ>PiL34LxP45u1a%r!w;x .Bʠ={ Ei*=NMR"_.^S\2 ]}X(xϭ^/'/3Dy1>U)C*p.ls¿٠G~LȽ'l4]+0/Y.\P4ʲy :Tk _(`/*~J $>I%QVU`~P !9t/] PRP1"hRgqd9t \nA< …~8i&O͉YZKB8ٌ{2h>%˂;[+M)PGKv8*2/ |38O U8 ZuH@Db- #+?&//|k \2PYjz0Mt+ \_½DX{S:.CU,:S\ W> o\Jǒw}v?W\,\Ĕ^8zq8k-ߑzKۢ͞rj66O )QL'gY0KKw^b y~9y?_-0 ;9( ?Q:DN:b'?G9 8Oe|揝XIY!ZensiW54ʁf>3U4ìsI듎릭i&_A/F#rv49v.BQ2M1?>`, _| ".k\\28t>qxaaxdx*[//Lᷱ/ !}%Ϳ/.qɜ]k$A}_wƮ/׉'=_5\]xH ?OIKAx9&&*&K*42J E00UKwȝ"H2y~z$ =_$&oQ0D/֠gYJj*B.NFiDny0 LzOЈM!]OVD.+0#/98Pޢ$AaϏ 転;HK􀯂73C݂݀},O.gX ;x_0NJ=߻kEb%lk0WrL4Bk/T, `W! {9c0p_eA0Gr ҒX.,ZV8%dacK\ ԑ $^@ +w`x:V#?YQ4*< Ϙ >iU˹`i^C7f`L_ax0a$&csN: :|> B  ^*ՉL  -(Ġ(  Qq^^{F?r'H.A>ʒ_uQ vo+YgJ+8|T65>oCܐZ'/ 0'awBўWD~e q| *fGz>X6VYUlYOD3t'7'Њ^V =nχޱ<>"OO#OCj4OHȧh8lRLdOOr„vti41'CX`mImw@^€G|ޛRZ>yL Xg28]{V>I>Պ::~:?R dJنV,PpވlG "o> )ԕ{0R2~"l9M:}D7Oy;OOȣϤHP&VO<>D0 iRց~DȊSMK'4'/\ !2?=4L$m- .g 0N4j4lv4?.tр]x5ہjt**^Az4\IrH w&&|g} <*$h\\Sga O->3 >0U4Q 1C2(Ig%`S1 NO=%0<[,|pʪ̤a'1{q,T!"6ix+ '|x0i4 /?=!^ Y2O $|}D.SJPrmɣD䈐v5?FCؗOf3 JF PSShP\8W %H0P?"o00-'a 0)!~ =L5_hw26p&M67p^}Ĵ !=::pۼ6gy!BxXBp^ǻ/~Hrh 10!G ÚeD؛He"nz^3A^-@CN EkCs?H.58+yA&M(IASa[>*gV'B_h( ?ӋA CӪ s(:|Ɔ^%z rxbbV5gpg~'>ϳ}H9l6CF T$)H1 aCOY$8LOC~3 Y )PNxMGA_PCLPg?IN*N,KxvzS=<ǹ7\hG[U+(' ЁCaN_(Wg69MvQ_T,G. пVr|1 _*#ܥorO9f\v , ,aDT5y,gysmN|ios7 '(D3pױHWj{,'H1尿wxc>cA~7N@7?GYI,Y'b_4OMQO1OlOVTpPLM(hU oA1 uo3OEK-YW!KW~ㄪMppB~ |m,U D2AFQxl~vOGf oj&MvSdOO{apF@CVƼo~t!l.ѧLK"VY8`DU$ #AU8`+ѼM0ύ^ OU\ڠWv37 K+[Gef0YO15MBTk2#5VMƤKb:g񢘕0@G+a6(-Р5Z 4 1 Zpr.|h% )l045&y48Bæ44`/TBR~NR!;WʈJ Ƃ(5\ެjU0x"44Tcܶ”):&8jLX {0A`fa#bZj+bbK .ClزطxJ f 5&{ fcb۲] ضȆ 5&lBmj\ "Fۂ*86Qj8<$)\\b!hdCA~R(TP*  k7vb+՜. ۭsZAQCf>vb wUr} V/q W=(ZCxD\CqCs35h5p>ARl\g> &'h[  |=nj#84{Ws_78) Ir^9qw^/.CBT~O!)R 8;{:[Rx GZ>oxU!ޤ%~'!NyFO#=2C8{%Dڙ P>'1Ad9?LT9EأZ\OT.~5|r7}EZ1 O//%)7=\GPn>}Ҟ̛!NuVp?.P?1k !MO-++@^_Əpr=LqɇyAѠ/"gE$bȳP1Q1@#zɪHfP# )/A3 ½+BADȅ@W*I# ?Pwp[i#CW!e B<w` h@Qp0Spn I 桤nP8Iq4m BDBB!b8"Q2] ^ݲ_@!xm![68*̳JA#c hgIҔ8[r}  D&K@6:d됭nib_aa+B+CGM$+T v) f) XX V ux0FMIV2`9q$swCru(vK"÷rlHrbHoc!9m$k䠔jCrh|iONn%JFXQɁYUW!9\$^0_Cr ]Cr[HVZ!9Pȣ0*YȬn#KFXQɁYUW!9\$^0_Cr ]Cr[HVZ!9PwYH]Y9p[%)ݚ ؓ )z-k9Y2b3C$ d&YX^y 6E(\ D(4UX8~dqYQ,7iIC36 E1iI05'+.!$64׀A"OFHGBB*RP9  N 4x-Zش. d.iSV:XGFxY iB=qgpG#x1రxZa/4aE!fO!!\ N*0/vxxy4׸,_ ,mlG88${(ĹGKZpC s-cazcy#KGqz<)!'JFVU<0‘S"0$9PSLҸX?3@0BH-fm؄BښMLQZdpDUKEnC<>[9oWyWa/G5OӨ@ $$+0PU?f@ `qaC hN<":MPfQ9&{6h^D{PdH yzV.g^*.؞yT` yHn֪ȁZ+'g&v:5MLZ *#F B䍵Kc!OfZܾ0vnO~شHZHE Vs28 }O6lOޯO=~KWcEi\MUU8`EbcP(MOVMrV%OMU86DZ[F"7"uxIW\*RNVLvxV8Jk0Qs h Y`!ujT*M\j iҋm{K7=!==ߍjͤH1QyFv/=2 !LB:\F4^ȢL6_dG>oŏ;W4lA:BD4 n=uHHB@'l! >DG&DD#9œV:.dUd*ӷ}hVŊT hx nDl{ CAh(4i:N#Z:) y$i@&D/g 3 GH58NFŏ?/G .q EZ䪓!"T mUln?rD'¹HH :*_gN%dw4PmhQM$fQjv\SOj ؊Bg P*nl">"j'3 @I|QeKw ZR4Lr~f'*!jbĉFR"%l$N10d((d+#ThvȮ6R.Tbê4h16g$7*X5Y=>~>t*FB?IE&&c"9MK}40 Vb$E,>VNHuBΤX*",3L~ 2$Ն8*B"!D( =F$ %:dsRYâu^ 4)I-YmD2dAC$m4Y rPd(E6:*L1B@%g\rl&JϪ  h708j.!CNi:A#6$"ZsBИ M:cFA?|ۙNih5= kKl v\aUZ'!eIo2-!$ D @5 ag`fBp " HRD0A@JrNPSCL2ET$F(t Xn=0) AND (worksno<10); IF worksno>0 THEN WriteString('Enter the number of hours worked (Range 0.0-80.0)'); REPEAT; ReadReal(hoursworked); UNTIL (hoursworked>=0.0) AND (hoursworked<=80.0); WriteString('Enter the paycode (a,b,c or d only)'); REPEAT; ReadString(paycode); UNTIL (paycode='a') OR (paycode='b') OR (paycode='c') OR (paycode='d'); WriteLn; CASE paycode OF 'a' :grosspay:=a*hoursworked |'b' :grosspay:=b*hoursworked |'c' :grosspay:=c*hoursworked |'d' :grosspay:=d*hoursworked END; IF grosspay>50.0 THEN grosspay:=grosspay-50.0; ni:=grosspay*ni_rate; tax:=grosspay*tax_rate; grosspay:=grosspay+50.0; netpay:=grosspay-ni-tax; ELSE ni:=0.0; tax:=0.0; netpay:=grosspay; END; no_of_entries:=no_of_entries+1; total_grosspay:=total_grosspay+grosspay; total_ni:=total_ni+ni; total_tax:=total_tax+tax; total_netpay:=total_netpay+netpay; DisplayPayDetails(worksno, grosspay, ni, tax, netpay); ELSE end_loop:=TRUE END; UNTIL end_loop=TRUE; WriteLn; WriteString('Total number of entries :'); WriteCard(no_of_entries,3); WriteLn; WriteString('Total grosspay :'); ConvertToMoney(total_grosspay); WriteString('Total NI :'); ConvertToMoney(total_ni); WriteString('Total tax :'); ConvertToMoney(total_tax); WriteString('Total net pay :'); ConvertToMoney(total_netpay) END Wages. ##a0 #b0 #c???000?000<00